From 3d412a4b30a9f7c7f51ea6562e694315948bd3da Mon Sep 17 00:00:00 2001 From: boris Date: Wed, 28 Nov 2018 16:00:02 +1300 Subject: cleaned up in short, the cheat and loader are now separate solutions. unused stuff was moved into the legacy solution in case anyone wants to compile it or whatever. i can change this back if you want to. also, i configured the loader to compile in x64, and have separate build types for linux and win64 --- cheat/cheat.sln | 92 + cheat/gmod/CHLClient.hpp | 83 + cheat/gmod/CInput.hpp | 44 + cheat/gmod/CLuaInterface.hpp | 246 +++ cheat/gmod/CLuaShared.hpp | 15 + cheat/gmod/CUtlVector.hpp | 47 + cheat/gmod/ClientClass.hpp | 14 + cheat/gmod/GlobalVars_t.hpp | 16 + cheat/gmod/IAppSystem.hpp | 24 + cheat/gmod/IClientEntityList.hpp | 144 ++ cheat/gmod/IClientMode.hpp | 139 ++ cheat/gmod/ICvar.hpp | 206 +++ cheat/gmod/IEngineTrace.hpp | 380 ++++ cheat/gmod/IGameEventManager.hpp | 77 + cheat/gmod/IMaterialSystem.hpp | 163 ++ cheat/gmod/IMemAlloc.hpp | 79 + cheat/gmod/IPanel.hpp | 14 + cheat/gmod/IPhysicsSurfaceProps.hpp | 79 + cheat/gmod/IPrediction.hpp | 129 ++ cheat/gmod/ISurface.hpp | 117 ++ cheat/gmod/IVEngineClient.hpp | 259 +++ cheat/gmod/IVModelInfoClient.hpp | 134 ++ cheat/gmod/IVRenderView.hpp | 21 + cheat/gmod/KeyValues.cpp | 50 + cheat/gmod/KeyValues.hpp | 38 + cheat/gmod/Source.cpp | 187 ++ cheat/gmod/Valve/dt_common.h | 180 ++ cheat/gmod/Valve/dt_recv.h | 523 ++++++ cheat/gmod/aimbot.cpp | 404 +++++ cheat/gmod/aimbot.hpp | 38 + cheat/gmod/autowall.cpp | 305 ++++ cheat/gmod/autowall.hpp | 34 + cheat/gmod/base_cheat.cpp | 3 + cheat/gmod/base_cheat.hpp | 41 + cheat/gmod/bf_write.hpp | 34 + cheat/gmod/c_base_player.cpp | 433 +++++ cheat/gmod/c_base_player.hpp | 258 +++ cheat/gmod/c_base_weapon.cpp | 87 + cheat/gmod/c_base_weapon.hpp | 48 + cheat/gmod/chams.cpp | 157 ++ cheat/gmod/chams.hpp | 45 + cheat/gmod/color.hpp | 278 +++ cheat/gmod/con_alias.hpp | 60 + cheat/gmod/con_fn.hpp | 172 ++ cheat/gmod/console.cpp | 324 ++++ cheat/gmod/console.hpp | 123 ++ cheat/gmod/context.cpp | 104 ++ cheat/gmod/context.hpp | 71 + cheat/gmod/create_move.cpp | 87 + cheat/gmod/d3d.cpp | 344 ++++ cheat/gmod/d3d.hpp | 122 ++ cheat/gmod/d3d_sprite.cpp | 13 + cheat/gmod/d3d_sprite.hpp | 169 ++ cheat/gmod/debug_show_spread.cpp | 16 + cheat/gmod/directx.cpp | 195 +++ cheat/gmod/do_post_screen_space_effects.cpp | 17 + cheat/gmod/draw_model_execute.cpp | 167 ++ cheat/gmod/emit_sound.cpp | 19 + cheat/gmod/extra.cpp | 86 + cheat/gmod/extra.hpp | 12 + cheat/gmod/factory.cpp | 110 ++ cheat/gmod/factory.hpp | 155 ++ cheat/gmod/fire_bullets.cpp | 15 + cheat/gmod/fnv.hpp | 64 + cheat/gmod/frame_stage_notify.cpp | 25 + cheat/gmod/get_screen_size.cpp | 37 + cheat/gmod/get_viewmodel_fov.cpp | 8 + cheat/gmod/gmod.vcxproj | 369 ++++ cheat/gmod/gmod.vcxproj.filters | 385 ++++ cheat/gmod/hooks.cpp | 48 + cheat/gmod/hooks.hpp | 64 + cheat/gmod/hud_process_input.cpp | 19 + cheat/gmod/icons.hpp | 5 + cheat/gmod/icons/config.hpp | 1752 +++++++++++++++++++ cheat/gmod/icons/legit.hpp | 1798 +++++++++++++++++++ cheat/gmod/icons/misc.hpp | 1721 ++++++++++++++++++ cheat/gmod/icons/rage.hpp | 1630 +++++++++++++++++ cheat/gmod/icons/visuals.hpp | 1837 ++++++++++++++++++++ cheat/gmod/identity.cpp | 98 ++ cheat/gmod/identity.hpp | 16 + cheat/gmod/iface_dllmain_impl.hpp | 84 + cheat/gmod/in_prediction.cpp | 32 + cheat/gmod/input_system.cpp | 527 ++++++ cheat/gmod/input_system.hpp | 186 ++ cheat/gmod/interface.cpp | 217 +++ cheat/gmod/interface.hpp | 165 ++ cheat/gmod/is_connected.cpp | 14 + cheat/gmod/is_hltv.cpp | 31 + cheat/gmod/is_paused.cpp | 19 + cheat/gmod/lag_mgr.cpp | 79 + cheat/gmod/lag_mgr.hpp | 70 + cheat/gmod/legitbot.cpp | 309 ++++ cheat/gmod/legitbot.hpp | 75 + cheat/gmod/legitbot_lagcomp.cpp | 155 ++ cheat/gmod/listener.cpp | 217 +++ cheat/gmod/listener.hpp | 26 + cheat/gmod/lock_cursor.cpp | 13 + cheat/gmod/math.cpp | 16 + cheat/gmod/math.hpp | 137 ++ cheat/gmod/mem.hpp | 66 + cheat/gmod/movement.cpp | 269 +++ cheat/gmod/movement.hpp | 36 + cheat/gmod/movement_recorder.cpp | 79 + cheat/gmod/movement_recorder.hpp | 29 + cheat/gmod/netvar_proxy.hpp | 37 + cheat/gmod/netvars.cpp | 93 + cheat/gmod/netvars.hpp | 44 + cheat/gmod/on_screen_size_changed.cpp | 9 + cheat/gmod/override_mouse_input.cpp | 14 + cheat/gmod/override_view.cpp | 22 + cheat/gmod/paint.cpp | 21 + cheat/gmod/paint_traverse.cpp | 28 + cheat/gmod/pattern.hpp | 68 + cheat/gmod/play_sound.cpp | 25 + cheat/gmod/player_manager.cpp | 38 + cheat/gmod/player_manager.hpp | 67 + cheat/gmod/playerlist.cpp | 114 ++ cheat/gmod/playerlist.hpp | 54 + cheat/gmod/prediction.cpp | 111 ++ cheat/gmod/prediction.hpp | 27 + cheat/gmod/proxies.cpp | 43 + cheat/gmod/ragebot_antiaim.cpp | 750 ++++++++ cheat/gmod/ragebot_lagcomp.cpp | 595 +++++++ cheat/gmod/ragebot_resolver.cpp | 471 +++++ cheat/gmod/render_view.cpp | 10 + cheat/gmod/renderer.cpp | 94 + cheat/gmod/renderer.hpp | 120 ++ cheat/gmod/run_command.cpp | 18 + cheat/gmod/scene_end.cpp | 43 + cheat/gmod/sdk.hpp | 26 + cheat/gmod/send_datagram.cpp | 29 + cheat/gmod/settings.hpp | 276 +++ cheat/gmod/simple_settings.cpp | 32 + cheat/gmod/simple_settings.hpp | 171 ++ cheat/gmod/skins.cpp | 75 + cheat/gmod/skins.hpp | 14 + cheat/gmod/strings.hpp | 162 ++ cheat/gmod/ui.h | 457 +++++ cheat/gmod/ui_base_item.h | 164 ++ cheat/gmod/ui_button.h | 56 + cheat/gmod/ui_checkbox.h | 68 + cheat/gmod/ui_color_picker.h | 201 +++ cheat/gmod/ui_draw.h | 163 ++ cheat/gmod/ui_dropdown.h | 217 +++ cheat/gmod/ui_dropdown_item.h | 183 ++ cheat/gmod/ui_form.h | 187 ++ cheat/gmod/ui_key_picker.h | 164 ++ cheat/gmod/ui_label.h | 18 + cheat/gmod/ui_menu.h | 89 + cheat/gmod/ui_render.h | 63 + cheat/gmod/ui_slider.h | 165 ++ cheat/gmod/ui_tab_manager.h | 228 +++ cheat/gmod/ui_text_input.h | 47 + cheat/gmod/util.cpp | 265 +++ cheat/gmod/util.hpp | 102 ++ cheat/gmod/vector.hpp | 329 ++++ cheat/gmod/visual.hpp | 51 + cheat/gmod/visual_draw.cpp | 64 + cheat/gmod/visual_local.cpp | 503 ++++++ cheat/gmod/visual_player.cpp | 308 ++++ cheat/gmod/visual_world.cpp | 207 +++ cheat/gmod/vmt.hpp | 94 + cheat/gmod/window_procedure.cpp | 98 ++ cheat/gmod/x86.hpp | 47 + cheat/internal_rewrite/CHLClient.hpp | 83 + cheat/internal_rewrite/CInput.hpp | 55 + cheat/internal_rewrite/CUtlVector.hpp | 47 + cheat/internal_rewrite/ClientClass.hpp | 272 +++ cheat/internal_rewrite/GlobalVars_t.hpp | 21 + cheat/internal_rewrite/IAppSystem.hpp | 28 + cheat/internal_rewrite/IClientEntityList.hpp | 143 ++ cheat/internal_rewrite/IClientMode.hpp | 163 ++ cheat/internal_rewrite/ICvar.hpp | 206 +++ cheat/internal_rewrite/IEngineTrace.hpp | 384 ++++ cheat/internal_rewrite/IGameEventManager.hpp | 77 + cheat/internal_rewrite/IMaterialSystem.hpp | 281 +++ cheat/internal_rewrite/IMemAlloc.hpp | 79 + cheat/internal_rewrite/IPanel.hpp | 10 + cheat/internal_rewrite/IPhysicsSurfaceProps.hpp | 79 + cheat/internal_rewrite/IPrediction.hpp | 153 ++ cheat/internal_rewrite/ISteamClient.hpp | 43 + cheat/internal_rewrite/ISurface.hpp | 421 +++++ cheat/internal_rewrite/IVEngineClient.hpp | 287 +++ cheat/internal_rewrite/IVModelInfoClient.hpp | 268 +++ cheat/internal_rewrite/IVRenderView.hpp | 185 ++ cheat/internal_rewrite/KeyValues.cpp | 83 + cheat/internal_rewrite/KeyValues.hpp | 43 + cheat/internal_rewrite/Source.cpp | 88 + cheat/internal_rewrite/Valve/checksum_crc.cpp | 169 ++ cheat/internal_rewrite/Valve/checksum_crc.h | 30 + cheat/internal_rewrite/Valve/dt_common.h | 161 ++ cheat/internal_rewrite/Valve/dt_recv.h | 590 +++++++ cheat/internal_rewrite/autowall.cpp | 337 ++++ cheat/internal_rewrite/autowall.hpp | 35 + cheat/internal_rewrite/base_cheat.cpp | 3 + cheat/internal_rewrite/base_cheat.hpp | 39 + cheat/internal_rewrite/begin_lock.cpp | 67 + cheat/internal_rewrite/bf_write.hpp | 34 + cheat/internal_rewrite/c_base_player.cpp | 1144 ++++++++++++ cheat/internal_rewrite/c_base_player.hpp | 468 +++++ cheat/internal_rewrite/c_base_weapon.cpp | 51 + cheat/internal_rewrite/c_base_weapon.hpp | 324 ++++ cheat/internal_rewrite/chams.cpp | 341 ++++ cheat/internal_rewrite/chams.hpp | 49 + cheat/internal_rewrite/color.hpp | 278 +++ cheat/internal_rewrite/con_alias.hpp | 60 + cheat/internal_rewrite/con_fn.hpp | 172 ++ cheat/internal_rewrite/console.cpp | 324 ++++ cheat/internal_rewrite/console.hpp | 125 ++ cheat/internal_rewrite/context.cpp | 212 +++ cheat/internal_rewrite/context.hpp | 85 + cheat/internal_rewrite/create_move.cpp | 137 ++ cheat/internal_rewrite/csm_shadows.cpp | 10 + cheat/internal_rewrite/d3d.cpp | 387 +++++ cheat/internal_rewrite/d3d.hpp | 129 ++ cheat/internal_rewrite/d3d_sprite.cpp | 12 + cheat/internal_rewrite/d3d_sprite.hpp | 158 ++ cheat/internal_rewrite/debug_show_spread.cpp | 17 + cheat/internal_rewrite/detours.cpp | 292 ++++ cheat/internal_rewrite/detours.h | 164 ++ cheat/internal_rewrite/directx.cpp | 256 +++ .../do_post_screen_space_effects.cpp | 17 + cheat/internal_rewrite/draw_model_execute.cpp | 140 ++ cheat/internal_rewrite/draw_small_entities.cpp | 31 + cheat/internal_rewrite/emit_sound.cpp | 27 + cheat/internal_rewrite/end_lock.cpp | 22 + cheat/internal_rewrite/extra.cpp | 327 ++++ cheat/internal_rewrite/extra.hpp | 41 + cheat/internal_rewrite/factory.cpp | 110 ++ cheat/internal_rewrite/factory.hpp | 156 ++ cheat/internal_rewrite/fire_event_clientside.cpp | 14 + cheat/internal_rewrite/fnv.hpp | 64 + cheat/internal_rewrite/frame_stage_notify.cpp | 109 ++ cheat/internal_rewrite/get_player_info.cpp | 10 + cheat/internal_rewrite/get_screen_size.cpp | 36 + cheat/internal_rewrite/get_viewmodel_fov.cpp | 6 + cheat/internal_rewrite/hde32.cpp | 377 ++++ cheat/internal_rewrite/hde32.h | 109 ++ cheat/internal_rewrite/hooks.cpp | 108 ++ cheat/internal_rewrite/hooks.hpp | 125 ++ cheat/internal_rewrite/icons.hpp | 5 + cheat/internal_rewrite/icons/config.hpp | 1752 +++++++++++++++++++ cheat/internal_rewrite/icons/legit.hpp | 1798 +++++++++++++++++++ cheat/internal_rewrite/icons/misc.hpp | 1721 ++++++++++++++++++ cheat/internal_rewrite/icons/rage.hpp | 1630 +++++++++++++++++ cheat/internal_rewrite/icons/visuals.hpp | 1837 ++++++++++++++++++++ cheat/internal_rewrite/identity.cpp | 110 ++ cheat/internal_rewrite/identity.hpp | 16 + cheat/internal_rewrite/iface_dllmain_impl.hpp | 82 + cheat/internal_rewrite/in_prediction.cpp | 36 + cheat/internal_rewrite/input_system.cpp | 527 ++++++ cheat/internal_rewrite/input_system.hpp | 186 ++ cheat/internal_rewrite/interface.cpp | 271 +++ cheat/internal_rewrite/interface.hpp | 185 ++ cheat/internal_rewrite/internal_rewrite.vcxproj | 572 ++++++ .../internal_rewrite.vcxproj.filters | 571 ++++++ cheat/internal_rewrite/is_connected.cpp | 14 + cheat/internal_rewrite/lag_mgr.cpp | 219 +++ cheat/internal_rewrite/lag_mgr.hpp | 65 + cheat/internal_rewrite/legitbot.cpp | 331 ++++ cheat/internal_rewrite/legitbot.hpp | 75 + cheat/internal_rewrite/legitbot_lagcomp.cpp | 155 ++ cheat/internal_rewrite/level_init_pre_entity.cpp | 18 + cheat/internal_rewrite/listener.cpp | 239 +++ cheat/internal_rewrite/listener.hpp | 29 + cheat/internal_rewrite/lock_cursor.cpp | 10 + cheat/internal_rewrite/match_framework.h | 23 + cheat/internal_rewrite/materialsystem_config.cpp | 10 + cheat/internal_rewrite/math.cpp | 301 ++++ cheat/internal_rewrite/math.hpp | 164 ++ cheat/internal_rewrite/mem.hpp | 66 + cheat/internal_rewrite/modules.hpp | 35 + cheat/internal_rewrite/movement.cpp | 345 ++++ cheat/internal_rewrite/movement.hpp | 39 + cheat/internal_rewrite/movement_recorder.cpp | 79 + cheat/internal_rewrite/movement_recorder.hpp | 29 + cheat/internal_rewrite/net_showfragments.cpp | 50 + cheat/internal_rewrite/netvar_proxy.hpp | 36 + cheat/internal_rewrite/netvars.cpp | 93 + cheat/internal_rewrite/netvars.hpp | 44 + cheat/internal_rewrite/on_screen_size_changed.cpp | 9 + cheat/internal_rewrite/override_mouse_input.cpp | 14 + cheat/internal_rewrite/override_view.cpp | 35 + cheat/internal_rewrite/packet_start.cpp | 26 + cheat/internal_rewrite/paint_traverse.cpp | 65 + cheat/internal_rewrite/pattern.hpp | 68 + cheat/internal_rewrite/play_sound.cpp | 31 + cheat/internal_rewrite/player_manager.cpp | 44 + cheat/internal_rewrite/player_manager.hpp | 68 + cheat/internal_rewrite/prediction.cpp | 627 +++++++ cheat/internal_rewrite/prediction.hpp | 95 + cheat/internal_rewrite/proxies.cpp | 116 ++ cheat/internal_rewrite/ragebot.cpp | 1142 ++++++++++++ cheat/internal_rewrite/ragebot.hpp | 349 ++++ cheat/internal_rewrite/ragebot_antiaim.cpp | 889 ++++++++++ cheat/internal_rewrite/ragebot_lagcomp.cpp | 657 +++++++ cheat/internal_rewrite/ragebot_resolver.cpp | 626 +++++++ cheat/internal_rewrite/renderer.cpp | 93 + cheat/internal_rewrite/renderer.hpp | 126 ++ cheat/internal_rewrite/run_command.cpp | 11 + cheat/internal_rewrite/scene_end.cpp | 42 + cheat/internal_rewrite/sdk.hpp | 28 + cheat/internal_rewrite/send_datagram.cpp | 32 + cheat/internal_rewrite/settings.hpp | 460 +++++ cheat/internal_rewrite/shut_down.cpp | 20 + cheat/internal_rewrite/simple_settings.cpp | 32 + cheat/internal_rewrite/simple_settings.hpp | 283 +++ cheat/internal_rewrite/simulate.cpp | 46 + cheat/internal_rewrite/skins.cpp | 271 +++ cheat/internal_rewrite/skins.hpp | 33 + cheat/internal_rewrite/strings.hpp | 162 ++ cheat/internal_rewrite/suppress_lists.cpp | 43 + cheat/internal_rewrite/table32.h | 73 + cheat/internal_rewrite/ui.h | 885 ++++++++++ cheat/internal_rewrite/ui_base_item.h | 164 ++ cheat/internal_rewrite/ui_button.h | 56 + cheat/internal_rewrite/ui_checkbox.h | 68 + cheat/internal_rewrite/ui_color_picker.h | 201 +++ cheat/internal_rewrite/ui_draw.h | 161 ++ cheat/internal_rewrite/ui_dropdown.h | 219 +++ cheat/internal_rewrite/ui_dropdown_item.h | 861 +++++++++ cheat/internal_rewrite/ui_form.h | 187 ++ cheat/internal_rewrite/ui_itemlist.h | 127 ++ cheat/internal_rewrite/ui_itemlist_def.h | 61 + cheat/internal_rewrite/ui_key_picker.h | 164 ++ cheat/internal_rewrite/ui_label.h | 18 + cheat/internal_rewrite/ui_menu.h | 89 + cheat/internal_rewrite/ui_render.h | 63 + cheat/internal_rewrite/ui_slider.h | 175 ++ cheat/internal_rewrite/ui_tab_manager.h | 227 +++ cheat/internal_rewrite/ui_text_input.cpp | 83 + cheat/internal_rewrite/ui_text_input.h | 38 + .../update_clientside_animation.cpp | 48 + cheat/internal_rewrite/util.cpp | 575 ++++++ cheat/internal_rewrite/util.hpp | 111 ++ cheat/internal_rewrite/vector.hpp | 334 ++++ cheat/internal_rewrite/visual.hpp | 126 ++ cheat/internal_rewrite/visual_draw.cpp | 94 + cheat/internal_rewrite/visual_local.cpp | 661 +++++++ cheat/internal_rewrite/visual_player.cpp | 1174 +++++++++++++ cheat/internal_rewrite/visual_world.cpp | 415 +++++ cheat/internal_rewrite/vmt.hpp | 95 + cheat/internal_rewrite/window_procedure.cpp | 58 + cheat/internal_rewrite/wipe.hpp | 70 + cheat/internal_rewrite/x86.hpp | 47 + cheat/tf2/ButtonCode_t.h | 253 +++ cheat/tf2/CAttribute.h | 41 + cheat/tf2/CBasePlayer.cpp | 264 +++ cheat/tf2/CBasePlayer.h | 241 +++ cheat/tf2/CBaseWeapon.cpp | 69 + cheat/tf2/CBaseWeapon.h | 1389 +++++++++++++++ cheat/tf2/CGlobalVarsBase.h | 14 + cheat/tf2/CHLClient.h | 32 + cheat/tf2/CInput.hpp | 55 + cheat/tf2/CUserCmd.h | 51 + cheat/tf2/ClientClass.h | 382 ++++ cheat/tf2/GlowObject.h | 43 + cheat/tf2/IAppSystem.h | 31 + cheat/tf2/IClientEntity.h | 154 ++ cheat/tf2/IClientEntityList.h | 24 + cheat/tf2/IClientMode.h | 174 ++ cheat/tf2/ICvar.h | 201 +++ cheat/tf2/IEngineTrace.h | 268 +++ cheat/tf2/IEngineVGui.h | 26 + cheat/tf2/IGameEventManager.h | 77 + cheat/tf2/IGameMovement.h | 118 ++ cheat/tf2/IInputSystem.h | 163 ++ cheat/tf2/IMaterialSystem.hpp | 222 +++ cheat/tf2/IPanel.h | 13 + cheat/tf2/IPlayerInfoManager.h | 7 + cheat/tf2/ISurface.h | 223 +++ cheat/tf2/IVDebugOverlay.h | 10 + cheat/tf2/IVEngineClient.h | 192 ++ cheat/tf2/IVModelInfo.h | 179 ++ cheat/tf2/IVRenderView.h | 185 ++ cheat/tf2/KeyValues.cpp | 62 + cheat/tf2/KeyValues.h | 46 + cheat/tf2/README.md | 3 + cheat/tf2/ScreenSpaceEffects.h | 50 + cheat/tf2/Source.cpp | 42 + cheat/tf2/UtlMem.h | 320 ++++ cheat/tf2/VFunc.h | 12 + cheat/tf2/aim.cpp | 321 ++++ cheat/tf2/aim.h | 75 + cheat/tf2/aim_lagcomp.cpp | 150 ++ cheat/tf2/base_cheat.h | 22 + cheat/tf2/chams.cpp | 321 ++++ cheat/tf2/chams.h | 49 + cheat/tf2/checksum_crc.cpp | 169 ++ cheat/tf2/checksum_crc.h | 30 + cheat/tf2/chl_createmove.cpp | 93 + cheat/tf2/clientmode_createmove.cpp | 53 + cheat/tf2/color.hpp | 278 +++ cheat/tf2/con_alias.hpp | 60 + cheat/tf2/con_fn.hpp | 172 ++ cheat/tf2/conditions.h | 106 ++ cheat/tf2/console.cpp | 324 ++++ cheat/tf2/console.hpp | 125 ++ cheat/tf2/console_log.hpp | 34 + cheat/tf2/ctx.cpp | 97 ++ cheat/tf2/ctx.hpp | 68 + cheat/tf2/d3d.cpp | 367 ++++ cheat/tf2/d3d.hpp | 126 ++ cheat/tf2/d3d_sprite.cpp | 12 + cheat/tf2/d3d_sprite.hpp | 159 ++ cheat/tf2/directx.cpp | 233 +++ cheat/tf2/do_post_screen_space_effects.cpp | 16 + cheat/tf2/draw_model_execute.cpp | 125 ++ cheat/tf2/dt_common.h | 127 ++ cheat/tf2/dt_recv.h | 479 +++++ cheat/tf2/emit_sound.cpp | 25 + cheat/tf2/extra.cpp | 91 + cheat/tf2/extra.h | 21 + cheat/tf2/factory.cpp | 110 ++ cheat/tf2/factory.h | 155 ++ cheat/tf2/factory.hpp | 190 ++ cheat/tf2/fnv.hpp | 64 + cheat/tf2/framestagenotify.cpp | 41 + cheat/tf2/get_viewmodel_fov.cpp | 8 + cheat/tf2/graphics.cpp | 107 ++ cheat/tf2/graphics.h | 80 + cheat/tf2/hooks.cpp | 41 + cheat/tf2/hooks.h | 50 + cheat/tf2/icons.hpp | 5 + cheat/tf2/icons/config.hpp | 1297 ++++++++++++++ cheat/tf2/icons/legit.hpp | 1316 ++++++++++++++ cheat/tf2/icons/misc.hpp | 1313 ++++++++++++++ cheat/tf2/icons/rage.hpp | 1293 ++++++++++++++ cheat/tf2/icons/visuals.hpp | 1318 ++++++++++++++ cheat/tf2/identity.h | 12 + cheat/tf2/input_system.cpp | 527 ++++++ cheat/tf2/input_system.hpp | 185 ++ cheat/tf2/interfaces.cpp | 241 +++ cheat/tf2/interfaces.h | 160 ++ cheat/tf2/listener.cpp | 42 + cheat/tf2/listener.hpp | 24 + cheat/tf2/math.cpp | 267 +++ cheat/tf2/math.h | 157 ++ cheat/tf2/mem.hpp | 66 + cheat/tf2/movement.cpp | 41 + cheat/tf2/movement.h | 19 + cheat/tf2/netvar_proxy.hpp | 37 + cheat/tf2/netvars.cpp | 93 + cheat/tf2/netvars.h | 44 + cheat/tf2/on_screen_size_changed.cpp | 9 + cheat/tf2/override_mouse_input.cpp | 14 + cheat/tf2/override_view.cpp | 17 + cheat/tf2/paint.cpp | 51 + cheat/tf2/pattern.hpp | 68 + cheat/tf2/prediction.cpp | 70 + cheat/tf2/prediction.h | 10 + cheat/tf2/process_movement.cpp | 12 + cheat/tf2/projectile_pred.cpp | 70 + cheat/tf2/projectile_pred.h | 15 + cheat/tf2/renderer.cpp | 93 + cheat/tf2/renderer.hpp | 120 ++ cheat/tf2/scene_end.cpp | 37 + cheat/tf2/sdk.h | 34 + cheat/tf2/settings.cpp | 4 + cheat/tf2/settings.h | 276 +++ cheat/tf2/shut_down.cpp | 16 + cheat/tf2/simple_settings.cpp | 32 + cheat/tf2/simple_settings.h | 204 +++ cheat/tf2/strings.hpp | 162 ++ cheat/tf2/test_cso2.vcxproj | 377 ++++ cheat/tf2/test_cso2.vcxproj.filters | 428 +++++ cheat/tf2/ui.h | 374 ++++ cheat/tf2/ui_base_item.h | 164 ++ cheat/tf2/ui_button.h | 56 + cheat/tf2/ui_checkbox.h | 68 + cheat/tf2/ui_color_picker.h | 201 +++ cheat/tf2/ui_draw.h | 163 ++ cheat/tf2/ui_dropdown.h | 217 +++ cheat/tf2/ui_dropdown_item.h | 83 + cheat/tf2/ui_form.h | 187 ++ cheat/tf2/ui_key_picker.h | 164 ++ cheat/tf2/ui_label.h | 18 + cheat/tf2/ui_menu.h | 89 + cheat/tf2/ui_render.h | 63 + cheat/tf2/ui_slider.h | 165 ++ cheat/tf2/ui_tab_manager.h | 227 +++ cheat/tf2/ui_text_input.h | 47 + cheat/tf2/util.cpp | 223 +++ cheat/tf2/util.hpp | 100 ++ cheat/tf2/vector.hpp | 334 ++++ cheat/tf2/visuals.hpp | 56 + cheat/tf2/visuals_draw.cpp | 94 + cheat/tf2/visuals_local.cpp | 207 +++ cheat/tf2/visuals_objects.cpp | 0 cheat/tf2/visuals_players.cpp | 551 ++++++ cheat/tf2/visuals_world.cpp | 344 ++++ cheat/tf2/vmt.h | 79 + cheat/tf2/window_procedure.cpp | 59 + cheat/tf2/x86.hpp | 47 + client/client.vcxproj | 231 --- client/client.vcxproj.filters | 36 - client/client_windows.cpp | 56 - client/connect.hpp | 282 --- client/err.hpp | 22 - client/strings.hpp | 163 -- client/util.hpp | 23 - enc_file/enc_file.vcxproj | 179 -- enc_file/enc_file.vcxproj.filters | 22 - enc_file/source.cpp | 40 - gmod/CHLClient.hpp | 83 - gmod/CInput.hpp | 44 - gmod/CLuaInterface.hpp | 246 --- gmod/CLuaShared.hpp | 15 - gmod/CUtlVector.hpp | 47 - gmod/ClientClass.hpp | 14 - gmod/GlobalVars_t.hpp | 16 - gmod/IAppSystem.hpp | 24 - gmod/IClientEntityList.hpp | 144 -- gmod/IClientMode.hpp | 139 -- gmod/ICvar.hpp | 206 --- gmod/IEngineTrace.hpp | 380 ---- gmod/IGameEventManager.hpp | 77 - gmod/IMaterialSystem.hpp | 163 -- gmod/IMemAlloc.hpp | 79 - gmod/IPanel.hpp | 14 - gmod/IPhysicsSurfaceProps.hpp | 79 - gmod/IPrediction.hpp | 129 -- gmod/ISurface.hpp | 117 -- gmod/IVEngineClient.hpp | 259 --- gmod/IVModelInfoClient.hpp | 134 -- gmod/IVRenderView.hpp | 21 - gmod/KeyValues.cpp | 50 - gmod/KeyValues.hpp | 38 - gmod/Source.cpp | 187 -- gmod/Valve/dt_common.h | 180 -- gmod/Valve/dt_recv.h | 523 ------ gmod/aimbot.cpp | 404 ----- gmod/aimbot.hpp | 38 - gmod/autowall.cpp | 305 ---- gmod/autowall.hpp | 34 - gmod/base_cheat.cpp | 3 - gmod/base_cheat.hpp | 41 - gmod/bf_write.hpp | 34 - gmod/c_base_player.cpp | 433 ----- gmod/c_base_player.hpp | 258 --- gmod/c_base_weapon.cpp | 87 - gmod/c_base_weapon.hpp | 48 - gmod/chams.cpp | 157 -- gmod/chams.hpp | 45 - gmod/color.hpp | 278 --- gmod/con_alias.hpp | 60 - gmod/con_fn.hpp | 172 -- gmod/console.cpp | 324 ---- gmod/console.hpp | 123 -- gmod/context.cpp | 104 -- gmod/context.hpp | 71 - gmod/create_move.cpp | 87 - gmod/d3d.cpp | 344 ---- gmod/d3d.hpp | 122 -- gmod/d3d_sprite.cpp | 13 - gmod/d3d_sprite.hpp | 169 -- gmod/debug_show_spread.cpp | 16 - gmod/directx.cpp | 195 --- gmod/do_post_screen_space_effects.cpp | 17 - gmod/draw_model_execute.cpp | 167 -- gmod/emit_sound.cpp | 19 - gmod/extra.cpp | 86 - gmod/extra.hpp | 12 - gmod/factory.cpp | 110 -- gmod/factory.hpp | 155 -- gmod/fire_bullets.cpp | 15 - gmod/fnv.hpp | 64 - gmod/frame_stage_notify.cpp | 25 - gmod/get_screen_size.cpp | 37 - gmod/get_viewmodel_fov.cpp | 8 - gmod/gmod.vcxproj | 369 ---- gmod/gmod.vcxproj.filters | 385 ---- gmod/hooks.cpp | 48 - gmod/hooks.hpp | 64 - gmod/hud_process_input.cpp | 19 - gmod/icons.hpp | 5 - gmod/icons/config.hpp | 1752 ------------------- gmod/icons/legit.hpp | 1798 ------------------- gmod/icons/misc.hpp | 1721 ------------------ gmod/icons/rage.hpp | 1630 ----------------- gmod/icons/visuals.hpp | 1837 -------------------- gmod/identity.cpp | 98 -- gmod/identity.hpp | 16 - gmod/iface_dllmain_impl.hpp | 84 - gmod/in_prediction.cpp | 32 - gmod/input_system.cpp | 527 ------ gmod/input_system.hpp | 186 -- gmod/interface.cpp | 217 --- gmod/interface.hpp | 165 -- gmod/is_connected.cpp | 14 - gmod/is_hltv.cpp | 31 - gmod/is_paused.cpp | 19 - gmod/lag_mgr.cpp | 79 - gmod/lag_mgr.hpp | 70 - gmod/legitbot.cpp | 309 ---- gmod/legitbot.hpp | 75 - gmod/legitbot_lagcomp.cpp | 155 -- gmod/listener.cpp | 217 --- gmod/listener.hpp | 26 - gmod/lock_cursor.cpp | 13 - gmod/math.cpp | 16 - gmod/math.hpp | 137 -- gmod/mem.hpp | 66 - gmod/movement.cpp | 269 --- gmod/movement.hpp | 36 - gmod/movement_recorder.cpp | 79 - gmod/movement_recorder.hpp | 29 - gmod/netvar_proxy.hpp | 37 - gmod/netvars.cpp | 93 - gmod/netvars.hpp | 44 - gmod/on_screen_size_changed.cpp | 9 - gmod/override_mouse_input.cpp | 14 - gmod/override_view.cpp | 22 - gmod/paint.cpp | 21 - gmod/paint_traverse.cpp | 28 - gmod/pattern.hpp | 68 - gmod/play_sound.cpp | 25 - gmod/player_manager.cpp | 38 - gmod/player_manager.hpp | 67 - gmod/playerlist.cpp | 114 -- gmod/playerlist.hpp | 54 - gmod/prediction.cpp | 111 -- gmod/prediction.hpp | 27 - gmod/proxies.cpp | 43 - gmod/ragebot_antiaim.cpp | 750 -------- gmod/ragebot_lagcomp.cpp | 595 ------- gmod/ragebot_resolver.cpp | 471 ----- gmod/render_view.cpp | 10 - gmod/renderer.cpp | 94 - gmod/renderer.hpp | 120 -- gmod/run_command.cpp | 18 - gmod/scene_end.cpp | 43 - gmod/sdk.hpp | 26 - gmod/send_datagram.cpp | 29 - gmod/settings.hpp | 276 --- gmod/simple_settings.cpp | 32 - gmod/simple_settings.hpp | 171 -- gmod/skins.cpp | 75 - gmod/skins.hpp | 14 - gmod/strings.hpp | 162 -- gmod/ui.h | 457 ----- gmod/ui_base_item.h | 164 -- gmod/ui_button.h | 56 - gmod/ui_checkbox.h | 68 - gmod/ui_color_picker.h | 201 --- gmod/ui_draw.h | 163 -- gmod/ui_dropdown.h | 217 --- gmod/ui_dropdown_item.h | 183 -- gmod/ui_form.h | 187 -- gmod/ui_key_picker.h | 164 -- gmod/ui_label.h | 18 - gmod/ui_menu.h | 89 - gmod/ui_render.h | 63 - gmod/ui_slider.h | 165 -- gmod/ui_tab_manager.h | 228 --- gmod/ui_text_input.h | 47 - gmod/util.cpp | 265 --- gmod/util.hpp | 102 -- gmod/vector.hpp | 329 ---- gmod/visual.hpp | 51 - gmod/visual_draw.cpp | 64 - gmod/visual_local.cpp | 503 ------ gmod/visual_player.cpp | 308 ---- gmod/visual_world.cpp | 207 --- gmod/vmt.hpp | 94 - gmod/window_procedure.cpp | 98 -- gmod/x86.hpp | 47 - injector/injector.vcxproj | 184 -- injector/injector.vcxproj.filters | 33 - injector/main.cpp | 121 -- injector/pe.h | 309 ---- injector/util.h | 44 - injector/winapi.h | 81 - internal_rewrite/CHLClient.hpp | 83 - internal_rewrite/CInput.hpp | 55 - internal_rewrite/CUtlVector.hpp | 47 - internal_rewrite/ClientClass.hpp | 272 --- internal_rewrite/GlobalVars_t.hpp | 21 - internal_rewrite/IAppSystem.hpp | 28 - internal_rewrite/IClientEntityList.hpp | 143 -- internal_rewrite/IClientMode.hpp | 163 -- internal_rewrite/ICvar.hpp | 206 --- internal_rewrite/IEngineTrace.hpp | 384 ---- internal_rewrite/IGameEventManager.hpp | 77 - internal_rewrite/IMaterialSystem.hpp | 281 --- internal_rewrite/IMemAlloc.hpp | 79 - internal_rewrite/IPanel.hpp | 10 - internal_rewrite/IPhysicsSurfaceProps.hpp | 79 - internal_rewrite/IPrediction.hpp | 153 -- internal_rewrite/ISteamClient.hpp | 43 - internal_rewrite/ISurface.hpp | 421 ----- internal_rewrite/IVEngineClient.hpp | 287 --- internal_rewrite/IVModelInfoClient.hpp | 268 --- internal_rewrite/IVRenderView.hpp | 185 -- internal_rewrite/KeyValues.cpp | 83 - internal_rewrite/KeyValues.hpp | 43 - internal_rewrite/Source.cpp | 88 - internal_rewrite/Valve/checksum_crc.cpp | 169 -- internal_rewrite/Valve/checksum_crc.h | 30 - internal_rewrite/Valve/dt_common.h | 161 -- internal_rewrite/Valve/dt_recv.h | 590 ------- internal_rewrite/autowall.cpp | 337 ---- internal_rewrite/autowall.hpp | 35 - internal_rewrite/base_cheat.cpp | 3 - internal_rewrite/base_cheat.hpp | 39 - internal_rewrite/begin_lock.cpp | 67 - internal_rewrite/bf_write.hpp | 34 - internal_rewrite/c_base_player.cpp | 1144 ------------ internal_rewrite/c_base_player.hpp | 468 ----- internal_rewrite/c_base_weapon.cpp | 51 - internal_rewrite/c_base_weapon.hpp | 324 ---- internal_rewrite/chams.cpp | 341 ---- internal_rewrite/chams.hpp | 49 - internal_rewrite/color.hpp | 278 --- internal_rewrite/con_alias.hpp | 60 - internal_rewrite/con_fn.hpp | 172 -- internal_rewrite/console.cpp | 324 ---- internal_rewrite/console.hpp | 125 -- internal_rewrite/context.cpp | 212 --- internal_rewrite/context.hpp | 85 - internal_rewrite/create_move.cpp | 137 -- internal_rewrite/csm_shadows.cpp | 10 - internal_rewrite/d3d.cpp | 387 ----- internal_rewrite/d3d.hpp | 129 -- internal_rewrite/d3d_sprite.cpp | 12 - internal_rewrite/d3d_sprite.hpp | 158 -- internal_rewrite/debug_show_spread.cpp | 17 - internal_rewrite/detours.cpp | 292 ---- internal_rewrite/detours.h | 164 -- internal_rewrite/directx.cpp | 256 --- internal_rewrite/do_post_screen_space_effects.cpp | 17 - internal_rewrite/draw_model_execute.cpp | 140 -- internal_rewrite/draw_small_entities.cpp | 31 - internal_rewrite/emit_sound.cpp | 27 - internal_rewrite/end_lock.cpp | 22 - internal_rewrite/extra.cpp | 327 ---- internal_rewrite/extra.hpp | 41 - internal_rewrite/factory.cpp | 110 -- internal_rewrite/factory.hpp | 156 -- internal_rewrite/fire_event_clientside.cpp | 14 - internal_rewrite/fnv.hpp | 64 - internal_rewrite/frame_stage_notify.cpp | 109 -- internal_rewrite/get_player_info.cpp | 10 - internal_rewrite/get_screen_size.cpp | 36 - internal_rewrite/get_viewmodel_fov.cpp | 6 - internal_rewrite/hde32.cpp | 377 ---- internal_rewrite/hde32.h | 109 -- internal_rewrite/hooks.cpp | 108 -- internal_rewrite/hooks.hpp | 125 -- internal_rewrite/icons.hpp | 5 - internal_rewrite/icons/config.hpp | 1752 ------------------- internal_rewrite/icons/legit.hpp | 1798 ------------------- internal_rewrite/icons/misc.hpp | 1721 ------------------ internal_rewrite/icons/rage.hpp | 1630 ----------------- internal_rewrite/icons/visuals.hpp | 1837 -------------------- internal_rewrite/identity.cpp | 110 -- internal_rewrite/identity.hpp | 16 - internal_rewrite/iface_dllmain_impl.hpp | 82 - internal_rewrite/in_prediction.cpp | 36 - internal_rewrite/input_system.cpp | 527 ------ internal_rewrite/input_system.hpp | 186 -- internal_rewrite/interface.cpp | 271 --- internal_rewrite/interface.hpp | 185 -- internal_rewrite/internal_rewrite.vcxproj | 572 ------ internal_rewrite/internal_rewrite.vcxproj.filters | 571 ------ internal_rewrite/is_connected.cpp | 14 - internal_rewrite/lag_mgr.cpp | 219 --- internal_rewrite/lag_mgr.hpp | 65 - internal_rewrite/legitbot.cpp | 331 ---- internal_rewrite/legitbot.hpp | 75 - internal_rewrite/legitbot_lagcomp.cpp | 155 -- internal_rewrite/level_init_pre_entity.cpp | 18 - internal_rewrite/listener.cpp | 239 --- internal_rewrite/listener.hpp | 29 - internal_rewrite/lock_cursor.cpp | 10 - internal_rewrite/match_framework.h | 23 - internal_rewrite/materialsystem_config.cpp | 10 - internal_rewrite/math.cpp | 301 ---- internal_rewrite/math.hpp | 164 -- internal_rewrite/mem.hpp | 66 - internal_rewrite/modules.hpp | 35 - internal_rewrite/movement.cpp | 345 ---- internal_rewrite/movement.hpp | 39 - internal_rewrite/movement_recorder.cpp | 79 - internal_rewrite/movement_recorder.hpp | 29 - internal_rewrite/net_showfragments.cpp | 50 - internal_rewrite/netvar_proxy.hpp | 36 - internal_rewrite/netvars.cpp | 93 - internal_rewrite/netvars.hpp | 44 - internal_rewrite/on_screen_size_changed.cpp | 9 - internal_rewrite/override_mouse_input.cpp | 14 - internal_rewrite/override_view.cpp | 35 - internal_rewrite/packet_start.cpp | 26 - internal_rewrite/paint_traverse.cpp | 65 - internal_rewrite/pattern.hpp | 68 - internal_rewrite/play_sound.cpp | 31 - internal_rewrite/player_manager.cpp | 44 - internal_rewrite/player_manager.hpp | 68 - internal_rewrite/prediction.cpp | 627 ------- internal_rewrite/prediction.hpp | 95 - internal_rewrite/proxies.cpp | 116 -- internal_rewrite/ragebot.cpp | 1142 ------------ internal_rewrite/ragebot.hpp | 349 ---- internal_rewrite/ragebot_antiaim.cpp | 889 ---------- internal_rewrite/ragebot_lagcomp.cpp | 657 ------- internal_rewrite/ragebot_resolver.cpp | 626 ------- internal_rewrite/renderer.cpp | 93 - internal_rewrite/renderer.hpp | 126 -- internal_rewrite/run_command.cpp | 11 - internal_rewrite/scene_end.cpp | 42 - internal_rewrite/sdk.hpp | 28 - internal_rewrite/send_datagram.cpp | 32 - internal_rewrite/settings.hpp | 460 ----- internal_rewrite/shut_down.cpp | 20 - internal_rewrite/simple_settings.cpp | 32 - internal_rewrite/simple_settings.hpp | 283 --- internal_rewrite/simulate.cpp | 46 - internal_rewrite/skins.cpp | 271 --- internal_rewrite/skins.hpp | 33 - internal_rewrite/strings.hpp | 162 -- internal_rewrite/suppress_lists.cpp | 43 - internal_rewrite/table32.h | 73 - internal_rewrite/ui.h | 885 ---------- internal_rewrite/ui_base_item.h | 164 -- internal_rewrite/ui_button.h | 56 - internal_rewrite/ui_checkbox.h | 68 - internal_rewrite/ui_color_picker.h | 201 --- internal_rewrite/ui_draw.h | 161 -- internal_rewrite/ui_dropdown.h | 219 --- internal_rewrite/ui_dropdown_item.h | 861 --------- internal_rewrite/ui_form.h | 187 -- internal_rewrite/ui_itemlist.h | 127 -- internal_rewrite/ui_itemlist_def.h | 61 - internal_rewrite/ui_key_picker.h | 164 -- internal_rewrite/ui_label.h | 18 - internal_rewrite/ui_menu.h | 89 - internal_rewrite/ui_render.h | 63 - internal_rewrite/ui_slider.h | 175 -- internal_rewrite/ui_tab_manager.h | 227 --- internal_rewrite/ui_text_input.cpp | 83 - internal_rewrite/ui_text_input.h | 38 - internal_rewrite/update_clientside_animation.cpp | 48 - internal_rewrite/util.cpp | 575 ------ internal_rewrite/util.hpp | 111 -- internal_rewrite/vector.hpp | 334 ---- internal_rewrite/visual.hpp | 126 -- internal_rewrite/visual_draw.cpp | 94 - internal_rewrite/visual_local.cpp | 661 ------- internal_rewrite/visual_player.cpp | 1174 ------------- internal_rewrite/visual_world.cpp | 415 ----- internal_rewrite/vmt.hpp | 95 - internal_rewrite/window_procedure.cpp | 58 - internal_rewrite/wipe.hpp | 70 - internal_rewrite/x86.hpp | 47 - legacy/enc_file/enc_file.vcxproj | 179 ++ legacy/enc_file/enc_file.vcxproj.filters | 22 + legacy/enc_file/source.cpp | 40 + legacy/injector/injector.vcxproj | 184 ++ legacy/injector/injector.vcxproj.filters | 33 + legacy/injector/main.cpp | 121 ++ legacy/injector/pe.h | 309 ++++ legacy/injector/util.h | 44 + legacy/injector/winapi.h | 81 + legacy/legacy.sln | 65 + legacy/loader/Source.cpp | 190 ++ legacy/loader/color.hpp | 287 +++ legacy/loader/console.h | 69 + legacy/loader/d3d.cpp | 335 ++++ legacy/loader/d3d.hpp | 126 ++ legacy/loader/d3d_sprite.cpp | 13 + legacy/loader/d3d_sprite.hpp | 107 ++ legacy/loader/http.h | 70 + legacy/loader/iface.hpp | 198 +++ legacy/loader/input_system.cpp | 523 ++++++ legacy/loader/input_system.hpp | 177 ++ legacy/loader/loader.vcxproj | 245 +++ legacy/loader/loader.vcxproj.filters | 147 ++ legacy/loader/manualmap.cpp | 109 ++ legacy/loader/manualmap.hpp | 169 ++ legacy/loader/math.hpp | 60 + legacy/loader/strings.hpp | 163 ++ legacy/loader/syscall.h | 167 ++ legacy/loader/ui.h | 123 ++ legacy/loader/ui_base_item.h | 164 ++ legacy/loader/ui_button.h | 56 + legacy/loader/ui_checkbox.h | 68 + legacy/loader/ui_color_picker.h | 201 +++ legacy/loader/ui_draw.h | 160 ++ legacy/loader/ui_dropdown.h | 217 +++ legacy/loader/ui_dropdown_item.h | 22 + legacy/loader/ui_form.h | 130 ++ legacy/loader/ui_key_picker.h | 164 ++ legacy/loader/ui_label.h | 18 + legacy/loader/ui_menu.h | 104 ++ legacy/loader/ui_progressbar.h | 44 + legacy/loader/ui_render.h | 57 + legacy/loader/ui_slider.h | 165 ++ legacy/loader/ui_tab_manager.h | 224 +++ legacy/loader/ui_text_input.cpp | 86 + legacy/loader/ui_text_input.h | 38 + legacy/loader/util.hpp | 101 ++ legacy/loader/winapi.hpp | 64 + legacy/loader/window.cpp | 148 ++ legacy/loader/window.hpp | 59 + legacy/loader/x86.h | 47 + loader.psess | 78 - loader/client/client.vcxproj | 262 +++ loader/client/client.vcxproj.filters | 12 + loader/client/client_windows.cpp | 58 + loader/client/connect.hpp | 282 +++ loader/client/err.hpp | 22 + loader/client/strings.hpp | 163 ++ loader/client/util.hpp | 33 + loader/loader.sln | 61 + loader/server/client.cpp | 201 +++ loader/server/client.hpp | 67 + loader/server/message.hpp | 8 + loader/server/server.cpp | 48 + loader/server/server.hpp | 34 + loader/server/server.vcxproj | 248 +++ loader/server/server.vcxproj.filters | 14 + loader/server/server_windows.cpp | 40 + loader/server/util.hpp | 25 + loader/x64/D_LinuxServer/client.ilk | Bin 0 -> 526908 bytes loader/x64/D_LinuxServer/server.ilk | Bin 0 -> 372064 bytes moneybot.sln | 206 --- server/client.cpp | 201 --- server/client.hpp | 67 - server/message.hpp | 8 - server/server.cpp | 48 - server/server.hpp | 34 - server/server.vcxproj | 234 --- server/server.vcxproj.filters | 42 - server/server_windows.cpp | 40 - server/util.hpp | 25 - tf2/ButtonCode_t.h | 253 --- tf2/CAttribute.h | 41 - tf2/CBasePlayer.cpp | 264 --- tf2/CBasePlayer.h | 241 --- tf2/CBaseWeapon.cpp | 69 - tf2/CBaseWeapon.h | 1389 --------------- tf2/CGlobalVarsBase.h | 14 - tf2/CHLClient.h | 32 - tf2/CInput.hpp | 55 - tf2/CUserCmd.h | 51 - tf2/ClientClass.h | 382 ---- tf2/GlowObject.h | 43 - tf2/IAppSystem.h | 31 - tf2/IClientEntity.h | 154 -- tf2/IClientEntityList.h | 24 - tf2/IClientMode.h | 174 -- tf2/ICvar.h | 201 --- tf2/IEngineTrace.h | 268 --- tf2/IEngineVGui.h | 26 - tf2/IGameEventManager.h | 77 - tf2/IGameMovement.h | 118 -- tf2/IInputSystem.h | 163 -- tf2/IMaterialSystem.hpp | 222 --- tf2/IPanel.h | 13 - tf2/IPlayerInfoManager.h | 7 - tf2/ISurface.h | 223 --- tf2/IVDebugOverlay.h | 10 - tf2/IVEngineClient.h | 192 -- tf2/IVModelInfo.h | 179 -- tf2/IVRenderView.h | 185 -- tf2/KeyValues.cpp | 62 - tf2/KeyValues.h | 46 - tf2/README.md | 3 - tf2/ScreenSpaceEffects.h | 50 - tf2/Source.cpp | 42 - tf2/UtlMem.h | 320 ---- tf2/VFunc.h | 12 - tf2/aim.cpp | 321 ---- tf2/aim.h | 75 - tf2/aim_lagcomp.cpp | 150 -- tf2/base_cheat.h | 22 - tf2/chams.cpp | 321 ---- tf2/chams.h | 49 - tf2/checksum_crc.cpp | 169 -- tf2/checksum_crc.h | 30 - tf2/chl_createmove.cpp | 93 - tf2/clientmode_createmove.cpp | 53 - tf2/color.hpp | 278 --- tf2/con_alias.hpp | 60 - tf2/con_fn.hpp | 172 -- tf2/conditions.h | 106 -- tf2/console.cpp | 324 ---- tf2/console.hpp | 125 -- tf2/console_log.hpp | 34 - tf2/ctx.cpp | 97 -- tf2/ctx.hpp | 68 - tf2/d3d.cpp | 367 ---- tf2/d3d.hpp | 126 -- tf2/d3d_sprite.cpp | 12 - tf2/d3d_sprite.hpp | 159 -- tf2/directx.cpp | 233 --- tf2/do_post_screen_space_effects.cpp | 16 - tf2/draw_model_execute.cpp | 125 -- tf2/dt_common.h | 127 -- tf2/dt_recv.h | 479 ----- tf2/emit_sound.cpp | 25 - tf2/extra.cpp | 91 - tf2/extra.h | 21 - tf2/factory.cpp | 110 -- tf2/factory.h | 155 -- tf2/factory.hpp | 190 -- tf2/fnv.hpp | 64 - tf2/framestagenotify.cpp | 41 - tf2/get_viewmodel_fov.cpp | 8 - tf2/graphics.cpp | 107 -- tf2/graphics.h | 80 - tf2/hooks.cpp | 41 - tf2/hooks.h | 50 - tf2/icons.hpp | 5 - tf2/icons/config.hpp | 1297 -------------- tf2/icons/legit.hpp | 1316 -------------- tf2/icons/misc.hpp | 1313 -------------- tf2/icons/rage.hpp | 1293 -------------- tf2/icons/visuals.hpp | 1318 -------------- tf2/identity.h | 12 - tf2/input_system.cpp | 527 ------ tf2/input_system.hpp | 185 -- tf2/interfaces.cpp | 241 --- tf2/interfaces.h | 160 -- tf2/listener.cpp | 42 - tf2/listener.hpp | 24 - tf2/math.cpp | 267 --- tf2/math.h | 157 -- tf2/mem.hpp | 66 - tf2/movement.cpp | 41 - tf2/movement.h | 19 - tf2/netvar_proxy.hpp | 37 - tf2/netvars.cpp | 93 - tf2/netvars.h | 44 - tf2/on_screen_size_changed.cpp | 9 - tf2/override_mouse_input.cpp | 14 - tf2/override_view.cpp | 17 - tf2/paint.cpp | 51 - tf2/pattern.hpp | 68 - tf2/prediction.cpp | 70 - tf2/prediction.h | 10 - tf2/process_movement.cpp | 12 - tf2/projectile_pred.cpp | 70 - tf2/projectile_pred.h | 15 - tf2/renderer.cpp | 93 - tf2/renderer.hpp | 120 -- tf2/scene_end.cpp | 37 - tf2/sdk.h | 34 - tf2/settings.cpp | 4 - tf2/settings.h | 276 --- tf2/shut_down.cpp | 16 - tf2/simple_settings.cpp | 32 - tf2/simple_settings.h | 204 --- tf2/strings.hpp | 162 -- tf2/test_cso2.vcxproj | 377 ---- tf2/test_cso2.vcxproj.filters | 428 ----- tf2/ui.h | 374 ---- tf2/ui_base_item.h | 164 -- tf2/ui_button.h | 56 - tf2/ui_checkbox.h | 68 - tf2/ui_color_picker.h | 201 --- tf2/ui_draw.h | 163 -- tf2/ui_dropdown.h | 217 --- tf2/ui_dropdown_item.h | 83 - tf2/ui_form.h | 187 -- tf2/ui_key_picker.h | 164 -- tf2/ui_label.h | 18 - tf2/ui_menu.h | 89 - tf2/ui_render.h | 63 - tf2/ui_slider.h | 165 -- tf2/ui_tab_manager.h | 227 --- tf2/ui_text_input.h | 47 - tf2/util.cpp | 223 --- tf2/util.hpp | 100 -- tf2/vector.hpp | 334 ---- tf2/visuals.hpp | 56 - tf2/visuals_draw.cpp | 94 - tf2/visuals_local.cpp | 207 --- tf2/visuals_objects.cpp | 0 tf2/visuals_players.cpp | 551 ------ tf2/visuals_world.cpp | 344 ---- tf2/vmt.h | 79 - tf2/window_procedure.cpp | 59 - tf2/x86.hpp | 47 - 1084 files changed, 103076 insertions(+), 97522 deletions(-) create mode 100644 cheat/cheat.sln create mode 100644 cheat/gmod/CHLClient.hpp create mode 100644 cheat/gmod/CInput.hpp create mode 100644 cheat/gmod/CLuaInterface.hpp create mode 100644 cheat/gmod/CLuaShared.hpp create mode 100644 cheat/gmod/CUtlVector.hpp create mode 100644 cheat/gmod/ClientClass.hpp create mode 100644 cheat/gmod/GlobalVars_t.hpp create mode 100644 cheat/gmod/IAppSystem.hpp create mode 100644 cheat/gmod/IClientEntityList.hpp create mode 100644 cheat/gmod/IClientMode.hpp create mode 100644 cheat/gmod/ICvar.hpp create mode 100644 cheat/gmod/IEngineTrace.hpp create mode 100644 cheat/gmod/IGameEventManager.hpp create mode 100644 cheat/gmod/IMaterialSystem.hpp create mode 100644 cheat/gmod/IMemAlloc.hpp create mode 100644 cheat/gmod/IPanel.hpp create mode 100644 cheat/gmod/IPhysicsSurfaceProps.hpp create mode 100644 cheat/gmod/IPrediction.hpp create mode 100644 cheat/gmod/ISurface.hpp create mode 100644 cheat/gmod/IVEngineClient.hpp create mode 100644 cheat/gmod/IVModelInfoClient.hpp create mode 100644 cheat/gmod/IVRenderView.hpp create mode 100644 cheat/gmod/KeyValues.cpp create mode 100644 cheat/gmod/KeyValues.hpp create mode 100644 cheat/gmod/Source.cpp create mode 100644 cheat/gmod/Valve/dt_common.h create mode 100644 cheat/gmod/Valve/dt_recv.h create mode 100644 cheat/gmod/aimbot.cpp create mode 100644 cheat/gmod/aimbot.hpp create mode 100644 cheat/gmod/autowall.cpp create mode 100644 cheat/gmod/autowall.hpp create mode 100644 cheat/gmod/base_cheat.cpp create mode 100644 cheat/gmod/base_cheat.hpp create mode 100644 cheat/gmod/bf_write.hpp create mode 100644 cheat/gmod/c_base_player.cpp create mode 100644 cheat/gmod/c_base_player.hpp create mode 100644 cheat/gmod/c_base_weapon.cpp create mode 100644 cheat/gmod/c_base_weapon.hpp create mode 100644 cheat/gmod/chams.cpp create mode 100644 cheat/gmod/chams.hpp create mode 100644 cheat/gmod/color.hpp create mode 100644 cheat/gmod/con_alias.hpp create mode 100644 cheat/gmod/con_fn.hpp create mode 100644 cheat/gmod/console.cpp create mode 100644 cheat/gmod/console.hpp create mode 100644 cheat/gmod/context.cpp create mode 100644 cheat/gmod/context.hpp create mode 100644 cheat/gmod/create_move.cpp create mode 100644 cheat/gmod/d3d.cpp create mode 100644 cheat/gmod/d3d.hpp create mode 100644 cheat/gmod/d3d_sprite.cpp create mode 100644 cheat/gmod/d3d_sprite.hpp create mode 100644 cheat/gmod/debug_show_spread.cpp create mode 100644 cheat/gmod/directx.cpp create mode 100644 cheat/gmod/do_post_screen_space_effects.cpp create mode 100644 cheat/gmod/draw_model_execute.cpp create mode 100644 cheat/gmod/emit_sound.cpp create mode 100644 cheat/gmod/extra.cpp create mode 100644 cheat/gmod/extra.hpp create mode 100644 cheat/gmod/factory.cpp create mode 100644 cheat/gmod/factory.hpp create mode 100644 cheat/gmod/fire_bullets.cpp create mode 100644 cheat/gmod/fnv.hpp create mode 100644 cheat/gmod/frame_stage_notify.cpp create mode 100644 cheat/gmod/get_screen_size.cpp create mode 100644 cheat/gmod/get_viewmodel_fov.cpp create mode 100644 cheat/gmod/gmod.vcxproj create mode 100644 cheat/gmod/gmod.vcxproj.filters create mode 100644 cheat/gmod/hooks.cpp create mode 100644 cheat/gmod/hooks.hpp create mode 100644 cheat/gmod/hud_process_input.cpp create mode 100644 cheat/gmod/icons.hpp create mode 100644 cheat/gmod/icons/config.hpp create mode 100644 cheat/gmod/icons/legit.hpp create mode 100644 cheat/gmod/icons/misc.hpp create mode 100644 cheat/gmod/icons/rage.hpp create mode 100644 cheat/gmod/icons/visuals.hpp create mode 100644 cheat/gmod/identity.cpp create mode 100644 cheat/gmod/identity.hpp create mode 100644 cheat/gmod/iface_dllmain_impl.hpp create mode 100644 cheat/gmod/in_prediction.cpp create mode 100644 cheat/gmod/input_system.cpp create mode 100644 cheat/gmod/input_system.hpp create mode 100644 cheat/gmod/interface.cpp create mode 100644 cheat/gmod/interface.hpp create mode 100644 cheat/gmod/is_connected.cpp create mode 100644 cheat/gmod/is_hltv.cpp create mode 100644 cheat/gmod/is_paused.cpp create mode 100644 cheat/gmod/lag_mgr.cpp create mode 100644 cheat/gmod/lag_mgr.hpp create mode 100644 cheat/gmod/legitbot.cpp create mode 100644 cheat/gmod/legitbot.hpp create mode 100644 cheat/gmod/legitbot_lagcomp.cpp create mode 100644 cheat/gmod/listener.cpp create mode 100644 cheat/gmod/listener.hpp create mode 100644 cheat/gmod/lock_cursor.cpp create mode 100644 cheat/gmod/math.cpp create mode 100644 cheat/gmod/math.hpp create mode 100644 cheat/gmod/mem.hpp create mode 100644 cheat/gmod/movement.cpp create mode 100644 cheat/gmod/movement.hpp create mode 100644 cheat/gmod/movement_recorder.cpp create mode 100644 cheat/gmod/movement_recorder.hpp create mode 100644 cheat/gmod/netvar_proxy.hpp create mode 100644 cheat/gmod/netvars.cpp create mode 100644 cheat/gmod/netvars.hpp create mode 100644 cheat/gmod/on_screen_size_changed.cpp create mode 100644 cheat/gmod/override_mouse_input.cpp create mode 100644 cheat/gmod/override_view.cpp create mode 100644 cheat/gmod/paint.cpp create mode 100644 cheat/gmod/paint_traverse.cpp create mode 100644 cheat/gmod/pattern.hpp create mode 100644 cheat/gmod/play_sound.cpp create mode 100644 cheat/gmod/player_manager.cpp create mode 100644 cheat/gmod/player_manager.hpp create mode 100644 cheat/gmod/playerlist.cpp create mode 100644 cheat/gmod/playerlist.hpp create mode 100644 cheat/gmod/prediction.cpp create mode 100644 cheat/gmod/prediction.hpp create mode 100644 cheat/gmod/proxies.cpp create mode 100644 cheat/gmod/ragebot_antiaim.cpp create mode 100644 cheat/gmod/ragebot_lagcomp.cpp create mode 100644 cheat/gmod/ragebot_resolver.cpp create mode 100644 cheat/gmod/render_view.cpp create mode 100644 cheat/gmod/renderer.cpp create mode 100644 cheat/gmod/renderer.hpp create mode 100644 cheat/gmod/run_command.cpp create mode 100644 cheat/gmod/scene_end.cpp create mode 100644 cheat/gmod/sdk.hpp create mode 100644 cheat/gmod/send_datagram.cpp create mode 100644 cheat/gmod/settings.hpp create mode 100644 cheat/gmod/simple_settings.cpp create mode 100644 cheat/gmod/simple_settings.hpp create mode 100644 cheat/gmod/skins.cpp create mode 100644 cheat/gmod/skins.hpp create mode 100644 cheat/gmod/strings.hpp create mode 100644 cheat/gmod/ui.h create mode 100644 cheat/gmod/ui_base_item.h create mode 100644 cheat/gmod/ui_button.h create mode 100644 cheat/gmod/ui_checkbox.h create mode 100644 cheat/gmod/ui_color_picker.h create mode 100644 cheat/gmod/ui_draw.h create mode 100644 cheat/gmod/ui_dropdown.h create mode 100644 cheat/gmod/ui_dropdown_item.h create mode 100644 cheat/gmod/ui_form.h create mode 100644 cheat/gmod/ui_key_picker.h create mode 100644 cheat/gmod/ui_label.h create mode 100644 cheat/gmod/ui_menu.h create mode 100644 cheat/gmod/ui_render.h create mode 100644 cheat/gmod/ui_slider.h create mode 100644 cheat/gmod/ui_tab_manager.h create mode 100644 cheat/gmod/ui_text_input.h create mode 100644 cheat/gmod/util.cpp create mode 100644 cheat/gmod/util.hpp create mode 100644 cheat/gmod/vector.hpp create mode 100644 cheat/gmod/visual.hpp create mode 100644 cheat/gmod/visual_draw.cpp create mode 100644 cheat/gmod/visual_local.cpp create mode 100644 cheat/gmod/visual_player.cpp create mode 100644 cheat/gmod/visual_world.cpp create mode 100644 cheat/gmod/vmt.hpp create mode 100644 cheat/gmod/window_procedure.cpp create mode 100644 cheat/gmod/x86.hpp create mode 100644 cheat/internal_rewrite/CHLClient.hpp create mode 100644 cheat/internal_rewrite/CInput.hpp create mode 100644 cheat/internal_rewrite/CUtlVector.hpp create mode 100644 cheat/internal_rewrite/ClientClass.hpp create mode 100644 cheat/internal_rewrite/GlobalVars_t.hpp create mode 100644 cheat/internal_rewrite/IAppSystem.hpp create mode 100644 cheat/internal_rewrite/IClientEntityList.hpp create mode 100644 cheat/internal_rewrite/IClientMode.hpp create mode 100644 cheat/internal_rewrite/ICvar.hpp create mode 100644 cheat/internal_rewrite/IEngineTrace.hpp create mode 100644 cheat/internal_rewrite/IGameEventManager.hpp create mode 100644 cheat/internal_rewrite/IMaterialSystem.hpp create mode 100644 cheat/internal_rewrite/IMemAlloc.hpp create mode 100644 cheat/internal_rewrite/IPanel.hpp create mode 100644 cheat/internal_rewrite/IPhysicsSurfaceProps.hpp create mode 100644 cheat/internal_rewrite/IPrediction.hpp create mode 100644 cheat/internal_rewrite/ISteamClient.hpp create mode 100644 cheat/internal_rewrite/ISurface.hpp create mode 100644 cheat/internal_rewrite/IVEngineClient.hpp create mode 100644 cheat/internal_rewrite/IVModelInfoClient.hpp create mode 100644 cheat/internal_rewrite/IVRenderView.hpp create mode 100644 cheat/internal_rewrite/KeyValues.cpp create mode 100644 cheat/internal_rewrite/KeyValues.hpp create mode 100644 cheat/internal_rewrite/Source.cpp create mode 100644 cheat/internal_rewrite/Valve/checksum_crc.cpp create mode 100644 cheat/internal_rewrite/Valve/checksum_crc.h create mode 100644 cheat/internal_rewrite/Valve/dt_common.h create mode 100644 cheat/internal_rewrite/Valve/dt_recv.h create mode 100644 cheat/internal_rewrite/autowall.cpp create mode 100644 cheat/internal_rewrite/autowall.hpp create mode 100644 cheat/internal_rewrite/base_cheat.cpp create mode 100644 cheat/internal_rewrite/base_cheat.hpp create mode 100644 cheat/internal_rewrite/begin_lock.cpp create mode 100644 cheat/internal_rewrite/bf_write.hpp create mode 100644 cheat/internal_rewrite/c_base_player.cpp create mode 100644 cheat/internal_rewrite/c_base_player.hpp create mode 100644 cheat/internal_rewrite/c_base_weapon.cpp create mode 100644 cheat/internal_rewrite/c_base_weapon.hpp create mode 100644 cheat/internal_rewrite/chams.cpp create mode 100644 cheat/internal_rewrite/chams.hpp create mode 100644 cheat/internal_rewrite/color.hpp create mode 100644 cheat/internal_rewrite/con_alias.hpp create mode 100644 cheat/internal_rewrite/con_fn.hpp create mode 100644 cheat/internal_rewrite/console.cpp create mode 100644 cheat/internal_rewrite/console.hpp create mode 100644 cheat/internal_rewrite/context.cpp create mode 100644 cheat/internal_rewrite/context.hpp create mode 100644 cheat/internal_rewrite/create_move.cpp create mode 100644 cheat/internal_rewrite/csm_shadows.cpp create mode 100644 cheat/internal_rewrite/d3d.cpp create mode 100644 cheat/internal_rewrite/d3d.hpp create mode 100644 cheat/internal_rewrite/d3d_sprite.cpp create mode 100644 cheat/internal_rewrite/d3d_sprite.hpp create mode 100644 cheat/internal_rewrite/debug_show_spread.cpp create mode 100644 cheat/internal_rewrite/detours.cpp create mode 100644 cheat/internal_rewrite/detours.h create mode 100644 cheat/internal_rewrite/directx.cpp create mode 100644 cheat/internal_rewrite/do_post_screen_space_effects.cpp create mode 100644 cheat/internal_rewrite/draw_model_execute.cpp create mode 100644 cheat/internal_rewrite/draw_small_entities.cpp create mode 100644 cheat/internal_rewrite/emit_sound.cpp create mode 100644 cheat/internal_rewrite/end_lock.cpp create mode 100644 cheat/internal_rewrite/extra.cpp create mode 100644 cheat/internal_rewrite/extra.hpp create mode 100644 cheat/internal_rewrite/factory.cpp create mode 100644 cheat/internal_rewrite/factory.hpp create mode 100644 cheat/internal_rewrite/fire_event_clientside.cpp create mode 100644 cheat/internal_rewrite/fnv.hpp create mode 100644 cheat/internal_rewrite/frame_stage_notify.cpp create mode 100644 cheat/internal_rewrite/get_player_info.cpp create mode 100644 cheat/internal_rewrite/get_screen_size.cpp create mode 100644 cheat/internal_rewrite/get_viewmodel_fov.cpp create mode 100644 cheat/internal_rewrite/hde32.cpp create mode 100644 cheat/internal_rewrite/hde32.h create mode 100644 cheat/internal_rewrite/hooks.cpp create mode 100644 cheat/internal_rewrite/hooks.hpp create mode 100644 cheat/internal_rewrite/icons.hpp create mode 100644 cheat/internal_rewrite/icons/config.hpp create mode 100644 cheat/internal_rewrite/icons/legit.hpp create mode 100644 cheat/internal_rewrite/icons/misc.hpp create mode 100644 cheat/internal_rewrite/icons/rage.hpp create mode 100644 cheat/internal_rewrite/icons/visuals.hpp create mode 100644 cheat/internal_rewrite/identity.cpp create mode 100644 cheat/internal_rewrite/identity.hpp create mode 100644 cheat/internal_rewrite/iface_dllmain_impl.hpp create mode 100644 cheat/internal_rewrite/in_prediction.cpp create mode 100644 cheat/internal_rewrite/input_system.cpp create mode 100644 cheat/internal_rewrite/input_system.hpp create mode 100644 cheat/internal_rewrite/interface.cpp create mode 100644 cheat/internal_rewrite/interface.hpp create mode 100644 cheat/internal_rewrite/internal_rewrite.vcxproj create mode 100644 cheat/internal_rewrite/internal_rewrite.vcxproj.filters create mode 100644 cheat/internal_rewrite/is_connected.cpp create mode 100644 cheat/internal_rewrite/lag_mgr.cpp create mode 100644 cheat/internal_rewrite/lag_mgr.hpp create mode 100644 cheat/internal_rewrite/legitbot.cpp create mode 100644 cheat/internal_rewrite/legitbot.hpp create mode 100644 cheat/internal_rewrite/legitbot_lagcomp.cpp create mode 100644 cheat/internal_rewrite/level_init_pre_entity.cpp create mode 100644 cheat/internal_rewrite/listener.cpp create mode 100644 cheat/internal_rewrite/listener.hpp create mode 100644 cheat/internal_rewrite/lock_cursor.cpp create mode 100644 cheat/internal_rewrite/match_framework.h create mode 100644 cheat/internal_rewrite/materialsystem_config.cpp create mode 100644 cheat/internal_rewrite/math.cpp create mode 100644 cheat/internal_rewrite/math.hpp create mode 100644 cheat/internal_rewrite/mem.hpp create mode 100644 cheat/internal_rewrite/modules.hpp create mode 100644 cheat/internal_rewrite/movement.cpp create mode 100644 cheat/internal_rewrite/movement.hpp create mode 100644 cheat/internal_rewrite/movement_recorder.cpp create mode 100644 cheat/internal_rewrite/movement_recorder.hpp create mode 100644 cheat/internal_rewrite/net_showfragments.cpp create mode 100644 cheat/internal_rewrite/netvar_proxy.hpp create mode 100644 cheat/internal_rewrite/netvars.cpp create mode 100644 cheat/internal_rewrite/netvars.hpp create mode 100644 cheat/internal_rewrite/on_screen_size_changed.cpp create mode 100644 cheat/internal_rewrite/override_mouse_input.cpp create mode 100644 cheat/internal_rewrite/override_view.cpp create mode 100644 cheat/internal_rewrite/packet_start.cpp create mode 100644 cheat/internal_rewrite/paint_traverse.cpp create mode 100644 cheat/internal_rewrite/pattern.hpp create mode 100644 cheat/internal_rewrite/play_sound.cpp create mode 100644 cheat/internal_rewrite/player_manager.cpp create mode 100644 cheat/internal_rewrite/player_manager.hpp create mode 100644 cheat/internal_rewrite/prediction.cpp create mode 100644 cheat/internal_rewrite/prediction.hpp create mode 100644 cheat/internal_rewrite/proxies.cpp create mode 100644 cheat/internal_rewrite/ragebot.cpp create mode 100644 cheat/internal_rewrite/ragebot.hpp create mode 100644 cheat/internal_rewrite/ragebot_antiaim.cpp create mode 100644 cheat/internal_rewrite/ragebot_lagcomp.cpp create mode 100644 cheat/internal_rewrite/ragebot_resolver.cpp create mode 100644 cheat/internal_rewrite/renderer.cpp create mode 100644 cheat/internal_rewrite/renderer.hpp create mode 100644 cheat/internal_rewrite/run_command.cpp create mode 100644 cheat/internal_rewrite/scene_end.cpp create mode 100644 cheat/internal_rewrite/sdk.hpp create mode 100644 cheat/internal_rewrite/send_datagram.cpp create mode 100644 cheat/internal_rewrite/settings.hpp create mode 100644 cheat/internal_rewrite/shut_down.cpp create mode 100644 cheat/internal_rewrite/simple_settings.cpp create mode 100644 cheat/internal_rewrite/simple_settings.hpp create mode 100644 cheat/internal_rewrite/simulate.cpp create mode 100644 cheat/internal_rewrite/skins.cpp create mode 100644 cheat/internal_rewrite/skins.hpp create mode 100644 cheat/internal_rewrite/strings.hpp create mode 100644 cheat/internal_rewrite/suppress_lists.cpp create mode 100644 cheat/internal_rewrite/table32.h create mode 100644 cheat/internal_rewrite/ui.h create mode 100644 cheat/internal_rewrite/ui_base_item.h create mode 100644 cheat/internal_rewrite/ui_button.h create mode 100644 cheat/internal_rewrite/ui_checkbox.h create mode 100644 cheat/internal_rewrite/ui_color_picker.h create mode 100644 cheat/internal_rewrite/ui_draw.h create mode 100644 cheat/internal_rewrite/ui_dropdown.h create mode 100644 cheat/internal_rewrite/ui_dropdown_item.h create mode 100644 cheat/internal_rewrite/ui_form.h create mode 100644 cheat/internal_rewrite/ui_itemlist.h create mode 100644 cheat/internal_rewrite/ui_itemlist_def.h create mode 100644 cheat/internal_rewrite/ui_key_picker.h create mode 100644 cheat/internal_rewrite/ui_label.h create mode 100644 cheat/internal_rewrite/ui_menu.h create mode 100644 cheat/internal_rewrite/ui_render.h create mode 100644 cheat/internal_rewrite/ui_slider.h create mode 100644 cheat/internal_rewrite/ui_tab_manager.h create mode 100644 cheat/internal_rewrite/ui_text_input.cpp create mode 100644 cheat/internal_rewrite/ui_text_input.h create mode 100644 cheat/internal_rewrite/update_clientside_animation.cpp create mode 100644 cheat/internal_rewrite/util.cpp create mode 100644 cheat/internal_rewrite/util.hpp create mode 100644 cheat/internal_rewrite/vector.hpp create mode 100644 cheat/internal_rewrite/visual.hpp create mode 100644 cheat/internal_rewrite/visual_draw.cpp create mode 100644 cheat/internal_rewrite/visual_local.cpp create mode 100644 cheat/internal_rewrite/visual_player.cpp create mode 100644 cheat/internal_rewrite/visual_world.cpp create mode 100644 cheat/internal_rewrite/vmt.hpp create mode 100644 cheat/internal_rewrite/window_procedure.cpp create mode 100644 cheat/internal_rewrite/wipe.hpp create mode 100644 cheat/internal_rewrite/x86.hpp create mode 100644 cheat/tf2/ButtonCode_t.h create mode 100644 cheat/tf2/CAttribute.h create mode 100644 cheat/tf2/CBasePlayer.cpp create mode 100644 cheat/tf2/CBasePlayer.h create mode 100644 cheat/tf2/CBaseWeapon.cpp create mode 100644 cheat/tf2/CBaseWeapon.h create mode 100644 cheat/tf2/CGlobalVarsBase.h create mode 100644 cheat/tf2/CHLClient.h create mode 100644 cheat/tf2/CInput.hpp create mode 100644 cheat/tf2/CUserCmd.h create mode 100644 cheat/tf2/ClientClass.h create mode 100644 cheat/tf2/GlowObject.h create mode 100644 cheat/tf2/IAppSystem.h create mode 100644 cheat/tf2/IClientEntity.h create mode 100644 cheat/tf2/IClientEntityList.h create mode 100644 cheat/tf2/IClientMode.h create mode 100644 cheat/tf2/ICvar.h create mode 100644 cheat/tf2/IEngineTrace.h create mode 100644 cheat/tf2/IEngineVGui.h create mode 100644 cheat/tf2/IGameEventManager.h create mode 100644 cheat/tf2/IGameMovement.h create mode 100644 cheat/tf2/IInputSystem.h create mode 100644 cheat/tf2/IMaterialSystem.hpp create mode 100644 cheat/tf2/IPanel.h create mode 100644 cheat/tf2/IPlayerInfoManager.h create mode 100644 cheat/tf2/ISurface.h create mode 100644 cheat/tf2/IVDebugOverlay.h create mode 100644 cheat/tf2/IVEngineClient.h create mode 100644 cheat/tf2/IVModelInfo.h create mode 100644 cheat/tf2/IVRenderView.h create mode 100644 cheat/tf2/KeyValues.cpp create mode 100644 cheat/tf2/KeyValues.h create mode 100644 cheat/tf2/README.md create mode 100644 cheat/tf2/ScreenSpaceEffects.h create mode 100644 cheat/tf2/Source.cpp create mode 100644 cheat/tf2/UtlMem.h create mode 100644 cheat/tf2/VFunc.h create mode 100644 cheat/tf2/aim.cpp create mode 100644 cheat/tf2/aim.h create mode 100644 cheat/tf2/aim_lagcomp.cpp create mode 100644 cheat/tf2/base_cheat.h create mode 100644 cheat/tf2/chams.cpp create mode 100644 cheat/tf2/chams.h create mode 100644 cheat/tf2/checksum_crc.cpp create mode 100644 cheat/tf2/checksum_crc.h create mode 100644 cheat/tf2/chl_createmove.cpp create mode 100644 cheat/tf2/clientmode_createmove.cpp create mode 100644 cheat/tf2/color.hpp create mode 100644 cheat/tf2/con_alias.hpp create mode 100644 cheat/tf2/con_fn.hpp create mode 100644 cheat/tf2/conditions.h create mode 100644 cheat/tf2/console.cpp create mode 100644 cheat/tf2/console.hpp create mode 100644 cheat/tf2/console_log.hpp create mode 100644 cheat/tf2/ctx.cpp create mode 100644 cheat/tf2/ctx.hpp create mode 100644 cheat/tf2/d3d.cpp create mode 100644 cheat/tf2/d3d.hpp create mode 100644 cheat/tf2/d3d_sprite.cpp create mode 100644 cheat/tf2/d3d_sprite.hpp create mode 100644 cheat/tf2/directx.cpp create mode 100644 cheat/tf2/do_post_screen_space_effects.cpp create mode 100644 cheat/tf2/draw_model_execute.cpp create mode 100644 cheat/tf2/dt_common.h create mode 100644 cheat/tf2/dt_recv.h create mode 100644 cheat/tf2/emit_sound.cpp create mode 100644 cheat/tf2/extra.cpp create mode 100644 cheat/tf2/extra.h create mode 100644 cheat/tf2/factory.cpp create mode 100644 cheat/tf2/factory.h create mode 100644 cheat/tf2/factory.hpp create mode 100644 cheat/tf2/fnv.hpp create mode 100644 cheat/tf2/framestagenotify.cpp create mode 100644 cheat/tf2/get_viewmodel_fov.cpp create mode 100644 cheat/tf2/graphics.cpp create mode 100644 cheat/tf2/graphics.h create mode 100644 cheat/tf2/hooks.cpp create mode 100644 cheat/tf2/hooks.h create mode 100644 cheat/tf2/icons.hpp create mode 100644 cheat/tf2/icons/config.hpp create mode 100644 cheat/tf2/icons/legit.hpp create mode 100644 cheat/tf2/icons/misc.hpp create mode 100644 cheat/tf2/icons/rage.hpp create mode 100644 cheat/tf2/icons/visuals.hpp create mode 100644 cheat/tf2/identity.h create mode 100644 cheat/tf2/input_system.cpp create mode 100644 cheat/tf2/input_system.hpp create mode 100644 cheat/tf2/interfaces.cpp create mode 100644 cheat/tf2/interfaces.h create mode 100644 cheat/tf2/listener.cpp create mode 100644 cheat/tf2/listener.hpp create mode 100644 cheat/tf2/math.cpp create mode 100644 cheat/tf2/math.h create mode 100644 cheat/tf2/mem.hpp create mode 100644 cheat/tf2/movement.cpp create mode 100644 cheat/tf2/movement.h create mode 100644 cheat/tf2/netvar_proxy.hpp create mode 100644 cheat/tf2/netvars.cpp create mode 100644 cheat/tf2/netvars.h create mode 100644 cheat/tf2/on_screen_size_changed.cpp create mode 100644 cheat/tf2/override_mouse_input.cpp create mode 100644 cheat/tf2/override_view.cpp create mode 100644 cheat/tf2/paint.cpp create mode 100644 cheat/tf2/pattern.hpp create mode 100644 cheat/tf2/prediction.cpp create mode 100644 cheat/tf2/prediction.h create mode 100644 cheat/tf2/process_movement.cpp create mode 100644 cheat/tf2/projectile_pred.cpp create mode 100644 cheat/tf2/projectile_pred.h create mode 100644 cheat/tf2/renderer.cpp create mode 100644 cheat/tf2/renderer.hpp create mode 100644 cheat/tf2/scene_end.cpp create mode 100644 cheat/tf2/sdk.h create mode 100644 cheat/tf2/settings.cpp create mode 100644 cheat/tf2/settings.h create mode 100644 cheat/tf2/shut_down.cpp create mode 100644 cheat/tf2/simple_settings.cpp create mode 100644 cheat/tf2/simple_settings.h create mode 100644 cheat/tf2/strings.hpp create mode 100644 cheat/tf2/test_cso2.vcxproj create mode 100644 cheat/tf2/test_cso2.vcxproj.filters create mode 100644 cheat/tf2/ui.h create mode 100644 cheat/tf2/ui_base_item.h create mode 100644 cheat/tf2/ui_button.h create mode 100644 cheat/tf2/ui_checkbox.h create mode 100644 cheat/tf2/ui_color_picker.h create mode 100644 cheat/tf2/ui_draw.h create mode 100644 cheat/tf2/ui_dropdown.h create mode 100644 cheat/tf2/ui_dropdown_item.h create mode 100644 cheat/tf2/ui_form.h create mode 100644 cheat/tf2/ui_key_picker.h create mode 100644 cheat/tf2/ui_label.h create mode 100644 cheat/tf2/ui_menu.h create mode 100644 cheat/tf2/ui_render.h create mode 100644 cheat/tf2/ui_slider.h create mode 100644 cheat/tf2/ui_tab_manager.h create mode 100644 cheat/tf2/ui_text_input.h create mode 100644 cheat/tf2/util.cpp create mode 100644 cheat/tf2/util.hpp create mode 100644 cheat/tf2/vector.hpp create mode 100644 cheat/tf2/visuals.hpp create mode 100644 cheat/tf2/visuals_draw.cpp create mode 100644 cheat/tf2/visuals_local.cpp create mode 100644 cheat/tf2/visuals_objects.cpp create mode 100644 cheat/tf2/visuals_players.cpp create mode 100644 cheat/tf2/visuals_world.cpp create mode 100644 cheat/tf2/vmt.h create mode 100644 cheat/tf2/window_procedure.cpp create mode 100644 cheat/tf2/x86.hpp delete mode 100644 client/client.vcxproj delete mode 100644 client/client.vcxproj.filters delete mode 100644 client/client_windows.cpp delete mode 100644 client/connect.hpp delete mode 100644 client/err.hpp delete mode 100644 client/strings.hpp delete mode 100644 client/util.hpp delete mode 100644 enc_file/enc_file.vcxproj delete mode 100644 enc_file/enc_file.vcxproj.filters delete mode 100644 enc_file/source.cpp delete mode 100644 gmod/CHLClient.hpp delete mode 100644 gmod/CInput.hpp delete mode 100644 gmod/CLuaInterface.hpp delete mode 100644 gmod/CLuaShared.hpp delete mode 100644 gmod/CUtlVector.hpp delete mode 100644 gmod/ClientClass.hpp delete mode 100644 gmod/GlobalVars_t.hpp delete mode 100644 gmod/IAppSystem.hpp delete mode 100644 gmod/IClientEntityList.hpp delete mode 100644 gmod/IClientMode.hpp delete mode 100644 gmod/ICvar.hpp delete mode 100644 gmod/IEngineTrace.hpp delete mode 100644 gmod/IGameEventManager.hpp delete mode 100644 gmod/IMaterialSystem.hpp delete mode 100644 gmod/IMemAlloc.hpp delete mode 100644 gmod/IPanel.hpp delete mode 100644 gmod/IPhysicsSurfaceProps.hpp delete mode 100644 gmod/IPrediction.hpp delete mode 100644 gmod/ISurface.hpp delete mode 100644 gmod/IVEngineClient.hpp delete mode 100644 gmod/IVModelInfoClient.hpp delete mode 100644 gmod/IVRenderView.hpp delete mode 100644 gmod/KeyValues.cpp delete mode 100644 gmod/KeyValues.hpp delete mode 100644 gmod/Source.cpp delete mode 100644 gmod/Valve/dt_common.h delete mode 100644 gmod/Valve/dt_recv.h delete mode 100644 gmod/aimbot.cpp delete mode 100644 gmod/aimbot.hpp delete mode 100644 gmod/autowall.cpp delete mode 100644 gmod/autowall.hpp delete mode 100644 gmod/base_cheat.cpp delete mode 100644 gmod/base_cheat.hpp delete mode 100644 gmod/bf_write.hpp delete mode 100644 gmod/c_base_player.cpp delete mode 100644 gmod/c_base_player.hpp delete mode 100644 gmod/c_base_weapon.cpp delete mode 100644 gmod/c_base_weapon.hpp delete mode 100644 gmod/chams.cpp delete mode 100644 gmod/chams.hpp delete mode 100644 gmod/color.hpp delete mode 100644 gmod/con_alias.hpp delete mode 100644 gmod/con_fn.hpp delete mode 100644 gmod/console.cpp delete mode 100644 gmod/console.hpp delete mode 100644 gmod/context.cpp delete mode 100644 gmod/context.hpp delete mode 100644 gmod/create_move.cpp delete mode 100644 gmod/d3d.cpp delete mode 100644 gmod/d3d.hpp delete mode 100644 gmod/d3d_sprite.cpp delete mode 100644 gmod/d3d_sprite.hpp delete mode 100644 gmod/debug_show_spread.cpp delete mode 100644 gmod/directx.cpp delete mode 100644 gmod/do_post_screen_space_effects.cpp delete mode 100644 gmod/draw_model_execute.cpp delete mode 100644 gmod/emit_sound.cpp delete mode 100644 gmod/extra.cpp delete mode 100644 gmod/extra.hpp delete mode 100644 gmod/factory.cpp delete mode 100644 gmod/factory.hpp delete mode 100644 gmod/fire_bullets.cpp delete mode 100644 gmod/fnv.hpp delete mode 100644 gmod/frame_stage_notify.cpp delete mode 100644 gmod/get_screen_size.cpp delete mode 100644 gmod/get_viewmodel_fov.cpp delete mode 100644 gmod/gmod.vcxproj delete mode 100644 gmod/gmod.vcxproj.filters delete mode 100644 gmod/hooks.cpp delete mode 100644 gmod/hooks.hpp delete mode 100644 gmod/hud_process_input.cpp delete mode 100644 gmod/icons.hpp delete mode 100644 gmod/icons/config.hpp delete mode 100644 gmod/icons/legit.hpp delete mode 100644 gmod/icons/misc.hpp delete mode 100644 gmod/icons/rage.hpp delete mode 100644 gmod/icons/visuals.hpp delete mode 100644 gmod/identity.cpp delete mode 100644 gmod/identity.hpp delete mode 100644 gmod/iface_dllmain_impl.hpp delete mode 100644 gmod/in_prediction.cpp delete mode 100644 gmod/input_system.cpp delete mode 100644 gmod/input_system.hpp delete mode 100644 gmod/interface.cpp delete mode 100644 gmod/interface.hpp delete mode 100644 gmod/is_connected.cpp delete mode 100644 gmod/is_hltv.cpp delete mode 100644 gmod/is_paused.cpp delete mode 100644 gmod/lag_mgr.cpp delete mode 100644 gmod/lag_mgr.hpp delete mode 100644 gmod/legitbot.cpp delete mode 100644 gmod/legitbot.hpp delete mode 100644 gmod/legitbot_lagcomp.cpp delete mode 100644 gmod/listener.cpp delete mode 100644 gmod/listener.hpp delete mode 100644 gmod/lock_cursor.cpp delete mode 100644 gmod/math.cpp delete mode 100644 gmod/math.hpp delete mode 100644 gmod/mem.hpp delete mode 100644 gmod/movement.cpp delete mode 100644 gmod/movement.hpp delete mode 100644 gmod/movement_recorder.cpp delete mode 100644 gmod/movement_recorder.hpp delete mode 100644 gmod/netvar_proxy.hpp delete mode 100644 gmod/netvars.cpp delete mode 100644 gmod/netvars.hpp delete mode 100644 gmod/on_screen_size_changed.cpp delete mode 100644 gmod/override_mouse_input.cpp delete mode 100644 gmod/override_view.cpp delete mode 100644 gmod/paint.cpp delete mode 100644 gmod/paint_traverse.cpp delete mode 100644 gmod/pattern.hpp delete mode 100644 gmod/play_sound.cpp delete mode 100644 gmod/player_manager.cpp delete mode 100644 gmod/player_manager.hpp delete mode 100644 gmod/playerlist.cpp delete mode 100644 gmod/playerlist.hpp delete mode 100644 gmod/prediction.cpp delete mode 100644 gmod/prediction.hpp delete mode 100644 gmod/proxies.cpp delete mode 100644 gmod/ragebot_antiaim.cpp delete mode 100644 gmod/ragebot_lagcomp.cpp delete mode 100644 gmod/ragebot_resolver.cpp delete mode 100644 gmod/render_view.cpp delete mode 100644 gmod/renderer.cpp delete mode 100644 gmod/renderer.hpp delete mode 100644 gmod/run_command.cpp delete mode 100644 gmod/scene_end.cpp delete mode 100644 gmod/sdk.hpp delete mode 100644 gmod/send_datagram.cpp delete mode 100644 gmod/settings.hpp delete mode 100644 gmod/simple_settings.cpp delete mode 100644 gmod/simple_settings.hpp delete mode 100644 gmod/skins.cpp delete mode 100644 gmod/skins.hpp delete mode 100644 gmod/strings.hpp delete mode 100644 gmod/ui.h delete mode 100644 gmod/ui_base_item.h delete mode 100644 gmod/ui_button.h delete mode 100644 gmod/ui_checkbox.h delete mode 100644 gmod/ui_color_picker.h delete mode 100644 gmod/ui_draw.h delete mode 100644 gmod/ui_dropdown.h delete mode 100644 gmod/ui_dropdown_item.h delete mode 100644 gmod/ui_form.h delete mode 100644 gmod/ui_key_picker.h delete mode 100644 gmod/ui_label.h delete mode 100644 gmod/ui_menu.h delete mode 100644 gmod/ui_render.h delete mode 100644 gmod/ui_slider.h delete mode 100644 gmod/ui_tab_manager.h delete mode 100644 gmod/ui_text_input.h delete mode 100644 gmod/util.cpp delete mode 100644 gmod/util.hpp delete mode 100644 gmod/vector.hpp delete mode 100644 gmod/visual.hpp delete mode 100644 gmod/visual_draw.cpp delete mode 100644 gmod/visual_local.cpp delete mode 100644 gmod/visual_player.cpp delete mode 100644 gmod/visual_world.cpp delete mode 100644 gmod/vmt.hpp delete mode 100644 gmod/window_procedure.cpp delete mode 100644 gmod/x86.hpp delete mode 100644 injector/injector.vcxproj delete mode 100644 injector/injector.vcxproj.filters delete mode 100644 injector/main.cpp delete mode 100644 injector/pe.h delete mode 100644 injector/util.h delete mode 100644 injector/winapi.h delete mode 100644 internal_rewrite/CHLClient.hpp delete mode 100644 internal_rewrite/CInput.hpp delete mode 100644 internal_rewrite/CUtlVector.hpp delete mode 100644 internal_rewrite/ClientClass.hpp delete mode 100644 internal_rewrite/GlobalVars_t.hpp delete mode 100644 internal_rewrite/IAppSystem.hpp delete mode 100644 internal_rewrite/IClientEntityList.hpp delete mode 100644 internal_rewrite/IClientMode.hpp delete mode 100644 internal_rewrite/ICvar.hpp delete mode 100644 internal_rewrite/IEngineTrace.hpp delete mode 100644 internal_rewrite/IGameEventManager.hpp delete mode 100644 internal_rewrite/IMaterialSystem.hpp delete mode 100644 internal_rewrite/IMemAlloc.hpp delete mode 100644 internal_rewrite/IPanel.hpp delete mode 100644 internal_rewrite/IPhysicsSurfaceProps.hpp delete mode 100644 internal_rewrite/IPrediction.hpp delete mode 100644 internal_rewrite/ISteamClient.hpp delete mode 100644 internal_rewrite/ISurface.hpp delete mode 100644 internal_rewrite/IVEngineClient.hpp delete mode 100644 internal_rewrite/IVModelInfoClient.hpp delete mode 100644 internal_rewrite/IVRenderView.hpp delete mode 100644 internal_rewrite/KeyValues.cpp delete mode 100644 internal_rewrite/KeyValues.hpp delete mode 100644 internal_rewrite/Source.cpp delete mode 100644 internal_rewrite/Valve/checksum_crc.cpp delete mode 100644 internal_rewrite/Valve/checksum_crc.h delete mode 100644 internal_rewrite/Valve/dt_common.h delete mode 100644 internal_rewrite/Valve/dt_recv.h delete mode 100644 internal_rewrite/autowall.cpp delete mode 100644 internal_rewrite/autowall.hpp delete mode 100644 internal_rewrite/base_cheat.cpp delete mode 100644 internal_rewrite/base_cheat.hpp delete mode 100644 internal_rewrite/begin_lock.cpp delete mode 100644 internal_rewrite/bf_write.hpp delete mode 100644 internal_rewrite/c_base_player.cpp delete mode 100644 internal_rewrite/c_base_player.hpp delete mode 100644 internal_rewrite/c_base_weapon.cpp delete mode 100644 internal_rewrite/c_base_weapon.hpp delete mode 100644 internal_rewrite/chams.cpp delete mode 100644 internal_rewrite/chams.hpp delete mode 100644 internal_rewrite/color.hpp delete mode 100644 internal_rewrite/con_alias.hpp delete mode 100644 internal_rewrite/con_fn.hpp delete mode 100644 internal_rewrite/console.cpp delete mode 100644 internal_rewrite/console.hpp delete mode 100644 internal_rewrite/context.cpp delete mode 100644 internal_rewrite/context.hpp delete mode 100644 internal_rewrite/create_move.cpp delete mode 100644 internal_rewrite/csm_shadows.cpp delete mode 100644 internal_rewrite/d3d.cpp delete mode 100644 internal_rewrite/d3d.hpp delete mode 100644 internal_rewrite/d3d_sprite.cpp delete mode 100644 internal_rewrite/d3d_sprite.hpp delete mode 100644 internal_rewrite/debug_show_spread.cpp delete mode 100644 internal_rewrite/detours.cpp delete mode 100644 internal_rewrite/detours.h delete mode 100644 internal_rewrite/directx.cpp delete mode 100644 internal_rewrite/do_post_screen_space_effects.cpp delete mode 100644 internal_rewrite/draw_model_execute.cpp delete mode 100644 internal_rewrite/draw_small_entities.cpp delete mode 100644 internal_rewrite/emit_sound.cpp delete mode 100644 internal_rewrite/end_lock.cpp delete mode 100644 internal_rewrite/extra.cpp delete mode 100644 internal_rewrite/extra.hpp delete mode 100644 internal_rewrite/factory.cpp delete mode 100644 internal_rewrite/factory.hpp delete mode 100644 internal_rewrite/fire_event_clientside.cpp delete mode 100644 internal_rewrite/fnv.hpp delete mode 100644 internal_rewrite/frame_stage_notify.cpp delete mode 100644 internal_rewrite/get_player_info.cpp delete mode 100644 internal_rewrite/get_screen_size.cpp delete mode 100644 internal_rewrite/get_viewmodel_fov.cpp delete mode 100644 internal_rewrite/hde32.cpp delete mode 100644 internal_rewrite/hde32.h delete mode 100644 internal_rewrite/hooks.cpp delete mode 100644 internal_rewrite/hooks.hpp delete mode 100644 internal_rewrite/icons.hpp delete mode 100644 internal_rewrite/icons/config.hpp delete mode 100644 internal_rewrite/icons/legit.hpp delete mode 100644 internal_rewrite/icons/misc.hpp delete mode 100644 internal_rewrite/icons/rage.hpp delete mode 100644 internal_rewrite/icons/visuals.hpp delete mode 100644 internal_rewrite/identity.cpp delete mode 100644 internal_rewrite/identity.hpp delete mode 100644 internal_rewrite/iface_dllmain_impl.hpp delete mode 100644 internal_rewrite/in_prediction.cpp delete mode 100644 internal_rewrite/input_system.cpp delete mode 100644 internal_rewrite/input_system.hpp delete mode 100644 internal_rewrite/interface.cpp delete mode 100644 internal_rewrite/interface.hpp delete mode 100644 internal_rewrite/internal_rewrite.vcxproj delete mode 100644 internal_rewrite/internal_rewrite.vcxproj.filters delete mode 100644 internal_rewrite/is_connected.cpp delete mode 100644 internal_rewrite/lag_mgr.cpp delete mode 100644 internal_rewrite/lag_mgr.hpp delete mode 100644 internal_rewrite/legitbot.cpp delete mode 100644 internal_rewrite/legitbot.hpp delete mode 100644 internal_rewrite/legitbot_lagcomp.cpp delete mode 100644 internal_rewrite/level_init_pre_entity.cpp delete mode 100644 internal_rewrite/listener.cpp delete mode 100644 internal_rewrite/listener.hpp delete mode 100644 internal_rewrite/lock_cursor.cpp delete mode 100644 internal_rewrite/match_framework.h delete mode 100644 internal_rewrite/materialsystem_config.cpp delete mode 100644 internal_rewrite/math.cpp delete mode 100644 internal_rewrite/math.hpp delete mode 100644 internal_rewrite/mem.hpp delete mode 100644 internal_rewrite/modules.hpp delete mode 100644 internal_rewrite/movement.cpp delete mode 100644 internal_rewrite/movement.hpp delete mode 100644 internal_rewrite/movement_recorder.cpp delete mode 100644 internal_rewrite/movement_recorder.hpp delete mode 100644 internal_rewrite/net_showfragments.cpp delete mode 100644 internal_rewrite/netvar_proxy.hpp delete mode 100644 internal_rewrite/netvars.cpp delete mode 100644 internal_rewrite/netvars.hpp delete mode 100644 internal_rewrite/on_screen_size_changed.cpp delete mode 100644 internal_rewrite/override_mouse_input.cpp delete mode 100644 internal_rewrite/override_view.cpp delete mode 100644 internal_rewrite/packet_start.cpp delete mode 100644 internal_rewrite/paint_traverse.cpp delete mode 100644 internal_rewrite/pattern.hpp delete mode 100644 internal_rewrite/play_sound.cpp delete mode 100644 internal_rewrite/player_manager.cpp delete mode 100644 internal_rewrite/player_manager.hpp delete mode 100644 internal_rewrite/prediction.cpp delete mode 100644 internal_rewrite/prediction.hpp delete mode 100644 internal_rewrite/proxies.cpp delete mode 100644 internal_rewrite/ragebot.cpp delete mode 100644 internal_rewrite/ragebot.hpp delete mode 100644 internal_rewrite/ragebot_antiaim.cpp delete mode 100644 internal_rewrite/ragebot_lagcomp.cpp delete mode 100644 internal_rewrite/ragebot_resolver.cpp delete mode 100644 internal_rewrite/renderer.cpp delete mode 100644 internal_rewrite/renderer.hpp delete mode 100644 internal_rewrite/run_command.cpp delete mode 100644 internal_rewrite/scene_end.cpp delete mode 100644 internal_rewrite/sdk.hpp delete mode 100644 internal_rewrite/send_datagram.cpp delete mode 100644 internal_rewrite/settings.hpp delete mode 100644 internal_rewrite/shut_down.cpp delete mode 100644 internal_rewrite/simple_settings.cpp delete mode 100644 internal_rewrite/simple_settings.hpp delete mode 100644 internal_rewrite/simulate.cpp delete mode 100644 internal_rewrite/skins.cpp delete mode 100644 internal_rewrite/skins.hpp delete mode 100644 internal_rewrite/strings.hpp delete mode 100644 internal_rewrite/suppress_lists.cpp delete mode 100644 internal_rewrite/table32.h delete mode 100644 internal_rewrite/ui.h delete mode 100644 internal_rewrite/ui_base_item.h delete mode 100644 internal_rewrite/ui_button.h delete mode 100644 internal_rewrite/ui_checkbox.h delete mode 100644 internal_rewrite/ui_color_picker.h delete mode 100644 internal_rewrite/ui_draw.h delete mode 100644 internal_rewrite/ui_dropdown.h delete mode 100644 internal_rewrite/ui_dropdown_item.h delete mode 100644 internal_rewrite/ui_form.h delete mode 100644 internal_rewrite/ui_itemlist.h delete mode 100644 internal_rewrite/ui_itemlist_def.h delete mode 100644 internal_rewrite/ui_key_picker.h delete mode 100644 internal_rewrite/ui_label.h delete mode 100644 internal_rewrite/ui_menu.h delete mode 100644 internal_rewrite/ui_render.h delete mode 100644 internal_rewrite/ui_slider.h delete mode 100644 internal_rewrite/ui_tab_manager.h delete mode 100644 internal_rewrite/ui_text_input.cpp delete mode 100644 internal_rewrite/ui_text_input.h delete mode 100644 internal_rewrite/update_clientside_animation.cpp delete mode 100644 internal_rewrite/util.cpp delete mode 100644 internal_rewrite/util.hpp delete mode 100644 internal_rewrite/vector.hpp delete mode 100644 internal_rewrite/visual.hpp delete mode 100644 internal_rewrite/visual_draw.cpp delete mode 100644 internal_rewrite/visual_local.cpp delete mode 100644 internal_rewrite/visual_player.cpp delete mode 100644 internal_rewrite/visual_world.cpp delete mode 100644 internal_rewrite/vmt.hpp delete mode 100644 internal_rewrite/window_procedure.cpp delete mode 100644 internal_rewrite/wipe.hpp delete mode 100644 internal_rewrite/x86.hpp create mode 100644 legacy/enc_file/enc_file.vcxproj create mode 100644 legacy/enc_file/enc_file.vcxproj.filters create mode 100644 legacy/enc_file/source.cpp create mode 100644 legacy/injector/injector.vcxproj create mode 100644 legacy/injector/injector.vcxproj.filters create mode 100644 legacy/injector/main.cpp create mode 100644 legacy/injector/pe.h create mode 100644 legacy/injector/util.h create mode 100644 legacy/injector/winapi.h create mode 100644 legacy/legacy.sln create mode 100644 legacy/loader/Source.cpp create mode 100644 legacy/loader/color.hpp create mode 100644 legacy/loader/console.h create mode 100644 legacy/loader/d3d.cpp create mode 100644 legacy/loader/d3d.hpp create mode 100644 legacy/loader/d3d_sprite.cpp create mode 100644 legacy/loader/d3d_sprite.hpp create mode 100644 legacy/loader/http.h create mode 100644 legacy/loader/iface.hpp create mode 100644 legacy/loader/input_system.cpp create mode 100644 legacy/loader/input_system.hpp create mode 100644 legacy/loader/loader.vcxproj create mode 100644 legacy/loader/loader.vcxproj.filters create mode 100644 legacy/loader/manualmap.cpp create mode 100644 legacy/loader/manualmap.hpp create mode 100644 legacy/loader/math.hpp create mode 100644 legacy/loader/strings.hpp create mode 100644 legacy/loader/syscall.h create mode 100644 legacy/loader/ui.h create mode 100644 legacy/loader/ui_base_item.h create mode 100644 legacy/loader/ui_button.h create mode 100644 legacy/loader/ui_checkbox.h create mode 100644 legacy/loader/ui_color_picker.h create mode 100644 legacy/loader/ui_draw.h create mode 100644 legacy/loader/ui_dropdown.h create mode 100644 legacy/loader/ui_dropdown_item.h create mode 100644 legacy/loader/ui_form.h create mode 100644 legacy/loader/ui_key_picker.h create mode 100644 legacy/loader/ui_label.h create mode 100644 legacy/loader/ui_menu.h create mode 100644 legacy/loader/ui_progressbar.h create mode 100644 legacy/loader/ui_render.h create mode 100644 legacy/loader/ui_slider.h create mode 100644 legacy/loader/ui_tab_manager.h create mode 100644 legacy/loader/ui_text_input.cpp create mode 100644 legacy/loader/ui_text_input.h create mode 100644 legacy/loader/util.hpp create mode 100644 legacy/loader/winapi.hpp create mode 100644 legacy/loader/window.cpp create mode 100644 legacy/loader/window.hpp create mode 100644 legacy/loader/x86.h delete mode 100644 loader.psess create mode 100644 loader/client/client.vcxproj create mode 100644 loader/client/client.vcxproj.filters create mode 100644 loader/client/client_windows.cpp create mode 100644 loader/client/connect.hpp create mode 100644 loader/client/err.hpp create mode 100644 loader/client/strings.hpp create mode 100644 loader/client/util.hpp create mode 100644 loader/loader.sln create mode 100644 loader/server/client.cpp create mode 100644 loader/server/client.hpp create mode 100644 loader/server/message.hpp create mode 100644 loader/server/server.cpp create mode 100644 loader/server/server.hpp create mode 100644 loader/server/server.vcxproj create mode 100644 loader/server/server.vcxproj.filters create mode 100644 loader/server/server_windows.cpp create mode 100644 loader/server/util.hpp create mode 100644 loader/x64/D_LinuxServer/client.ilk create mode 100644 loader/x64/D_LinuxServer/server.ilk delete mode 100644 moneybot.sln delete mode 100644 server/client.cpp delete mode 100644 server/client.hpp delete mode 100644 server/message.hpp delete mode 100644 server/server.cpp delete mode 100644 server/server.hpp delete mode 100644 server/server.vcxproj delete mode 100644 server/server.vcxproj.filters delete mode 100644 server/server_windows.cpp delete mode 100644 server/util.hpp delete mode 100644 tf2/ButtonCode_t.h delete mode 100644 tf2/CAttribute.h delete mode 100644 tf2/CBasePlayer.cpp delete mode 100644 tf2/CBasePlayer.h delete mode 100644 tf2/CBaseWeapon.cpp delete mode 100644 tf2/CBaseWeapon.h delete mode 100644 tf2/CGlobalVarsBase.h delete mode 100644 tf2/CHLClient.h delete mode 100644 tf2/CInput.hpp delete mode 100644 tf2/CUserCmd.h delete mode 100644 tf2/ClientClass.h delete mode 100644 tf2/GlowObject.h delete mode 100644 tf2/IAppSystem.h delete mode 100644 tf2/IClientEntity.h delete mode 100644 tf2/IClientEntityList.h delete mode 100644 tf2/IClientMode.h delete mode 100644 tf2/ICvar.h delete mode 100644 tf2/IEngineTrace.h delete mode 100644 tf2/IEngineVGui.h delete mode 100644 tf2/IGameEventManager.h delete mode 100644 tf2/IGameMovement.h delete mode 100644 tf2/IInputSystem.h delete mode 100644 tf2/IMaterialSystem.hpp delete mode 100644 tf2/IPanel.h delete mode 100644 tf2/IPlayerInfoManager.h delete mode 100644 tf2/ISurface.h delete mode 100644 tf2/IVDebugOverlay.h delete mode 100644 tf2/IVEngineClient.h delete mode 100644 tf2/IVModelInfo.h delete mode 100644 tf2/IVRenderView.h delete mode 100644 tf2/KeyValues.cpp delete mode 100644 tf2/KeyValues.h delete mode 100644 tf2/README.md delete mode 100644 tf2/ScreenSpaceEffects.h delete mode 100644 tf2/Source.cpp delete mode 100644 tf2/UtlMem.h delete mode 100644 tf2/VFunc.h delete mode 100644 tf2/aim.cpp delete mode 100644 tf2/aim.h delete mode 100644 tf2/aim_lagcomp.cpp delete mode 100644 tf2/base_cheat.h delete mode 100644 tf2/chams.cpp delete mode 100644 tf2/chams.h delete mode 100644 tf2/checksum_crc.cpp delete mode 100644 tf2/checksum_crc.h delete mode 100644 tf2/chl_createmove.cpp delete mode 100644 tf2/clientmode_createmove.cpp delete mode 100644 tf2/color.hpp delete mode 100644 tf2/con_alias.hpp delete mode 100644 tf2/con_fn.hpp delete mode 100644 tf2/conditions.h delete mode 100644 tf2/console.cpp delete mode 100644 tf2/console.hpp delete mode 100644 tf2/console_log.hpp delete mode 100644 tf2/ctx.cpp delete mode 100644 tf2/ctx.hpp delete mode 100644 tf2/d3d.cpp delete mode 100644 tf2/d3d.hpp delete mode 100644 tf2/d3d_sprite.cpp delete mode 100644 tf2/d3d_sprite.hpp delete mode 100644 tf2/directx.cpp delete mode 100644 tf2/do_post_screen_space_effects.cpp delete mode 100644 tf2/draw_model_execute.cpp delete mode 100644 tf2/dt_common.h delete mode 100644 tf2/dt_recv.h delete mode 100644 tf2/emit_sound.cpp delete mode 100644 tf2/extra.cpp delete mode 100644 tf2/extra.h delete mode 100644 tf2/factory.cpp delete mode 100644 tf2/factory.h delete mode 100644 tf2/factory.hpp delete mode 100644 tf2/fnv.hpp delete mode 100644 tf2/framestagenotify.cpp delete mode 100644 tf2/get_viewmodel_fov.cpp delete mode 100644 tf2/graphics.cpp delete mode 100644 tf2/graphics.h delete mode 100644 tf2/hooks.cpp delete mode 100644 tf2/hooks.h delete mode 100644 tf2/icons.hpp delete mode 100644 tf2/icons/config.hpp delete mode 100644 tf2/icons/legit.hpp delete mode 100644 tf2/icons/misc.hpp delete mode 100644 tf2/icons/rage.hpp delete mode 100644 tf2/icons/visuals.hpp delete mode 100644 tf2/identity.h delete mode 100644 tf2/input_system.cpp delete mode 100644 tf2/input_system.hpp delete mode 100644 tf2/interfaces.cpp delete mode 100644 tf2/interfaces.h delete mode 100644 tf2/listener.cpp delete mode 100644 tf2/listener.hpp delete mode 100644 tf2/math.cpp delete mode 100644 tf2/math.h delete mode 100644 tf2/mem.hpp delete mode 100644 tf2/movement.cpp delete mode 100644 tf2/movement.h delete mode 100644 tf2/netvar_proxy.hpp delete mode 100644 tf2/netvars.cpp delete mode 100644 tf2/netvars.h delete mode 100644 tf2/on_screen_size_changed.cpp delete mode 100644 tf2/override_mouse_input.cpp delete mode 100644 tf2/override_view.cpp delete mode 100644 tf2/paint.cpp delete mode 100644 tf2/pattern.hpp delete mode 100644 tf2/prediction.cpp delete mode 100644 tf2/prediction.h delete mode 100644 tf2/process_movement.cpp delete mode 100644 tf2/projectile_pred.cpp delete mode 100644 tf2/projectile_pred.h delete mode 100644 tf2/renderer.cpp delete mode 100644 tf2/renderer.hpp delete mode 100644 tf2/scene_end.cpp delete mode 100644 tf2/sdk.h delete mode 100644 tf2/settings.cpp delete mode 100644 tf2/settings.h delete mode 100644 tf2/shut_down.cpp delete mode 100644 tf2/simple_settings.cpp delete mode 100644 tf2/simple_settings.h delete mode 100644 tf2/strings.hpp delete mode 100644 tf2/test_cso2.vcxproj delete mode 100644 tf2/test_cso2.vcxproj.filters delete mode 100644 tf2/ui.h delete mode 100644 tf2/ui_base_item.h delete mode 100644 tf2/ui_button.h delete mode 100644 tf2/ui_checkbox.h delete mode 100644 tf2/ui_color_picker.h delete mode 100644 tf2/ui_draw.h delete mode 100644 tf2/ui_dropdown.h delete mode 100644 tf2/ui_dropdown_item.h delete mode 100644 tf2/ui_form.h delete mode 100644 tf2/ui_key_picker.h delete mode 100644 tf2/ui_label.h delete mode 100644 tf2/ui_menu.h delete mode 100644 tf2/ui_render.h delete mode 100644 tf2/ui_slider.h delete mode 100644 tf2/ui_tab_manager.h delete mode 100644 tf2/ui_text_input.h delete mode 100644 tf2/util.cpp delete mode 100644 tf2/util.hpp delete mode 100644 tf2/vector.hpp delete mode 100644 tf2/visuals.hpp delete mode 100644 tf2/visuals_draw.cpp delete mode 100644 tf2/visuals_local.cpp delete mode 100644 tf2/visuals_objects.cpp delete mode 100644 tf2/visuals_players.cpp delete mode 100644 tf2/visuals_world.cpp delete mode 100644 tf2/vmt.h delete mode 100644 tf2/window_procedure.cpp delete mode 100644 tf2/x86.hpp diff --git a/cheat/cheat.sln b/cheat/cheat.sln new file mode 100644 index 0000000..0748f08 --- /dev/null +++ b/cheat/cheat.sln @@ -0,0 +1,92 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.106 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "csgo", "internal_rewrite\internal_rewrite.vcxproj", "{140DEC51-B0E7-4289-BB6F-79686422318E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmod", "gmod\gmod.vcxproj", "{82E7C50B-01E3-4D65-AECC-196E9494DFF4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tf2", "tf2\test_cso2.vcxproj", "{DD486C1B-C911-42B8-AB24-A9102A23DC02}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Online|x64 = Online|x64 + Online|x86 = Online|x86 + optimize_test|x64 = optimize_test|x64 + optimize_test|x86 = optimize_test|x86 + pHit|x64 = pHit|x64 + pHit|x86 = pHit|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x64.ActiveCfg = Debug|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x64.Build.0 = Debug|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x86.ActiveCfg = Debug|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x86.Build.0 = Debug|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x64.ActiveCfg = Online|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x64.Build.0 = Online|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x86.ActiveCfg = Online|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x86.Build.0 = Online|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x64.ActiveCfg = optimize_test|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x64.Build.0 = optimize_test|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x86.ActiveCfg = optimize_test|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x86.Build.0 = optimize_test|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x64.ActiveCfg = pHit|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x64.Build.0 = pHit|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x86.ActiveCfg = pHit|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x86.Build.0 = pHit|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x64.ActiveCfg = Release|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x64.Build.0 = Release|x64 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x86.ActiveCfg = Release|Win32 + {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x86.Build.0 = Release|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x64.ActiveCfg = Debug|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x64.Build.0 = Debug|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x86.ActiveCfg = Debug|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x86.Build.0 = Debug|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x64.ActiveCfg = pHit|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x64.Build.0 = pHit|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x86.ActiveCfg = optimize_test|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x86.Build.0 = optimize_test|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.optimize_test|x64.ActiveCfg = optimize_test|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.optimize_test|x86.ActiveCfg = optimize_test|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.optimize_test|x86.Build.0 = optimize_test|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x64.ActiveCfg = pHit|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x64.Build.0 = pHit|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x86.ActiveCfg = pHit|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x86.Build.0 = pHit|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x64.ActiveCfg = Release|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x64.Build.0 = Release|x64 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x86.ActiveCfg = Release|Win32 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x86.Build.0 = Release|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x64.ActiveCfg = Debug|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x64.Build.0 = Debug|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x86.ActiveCfg = Debug|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x86.Build.0 = Debug|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x64.ActiveCfg = pHit|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x64.Build.0 = pHit|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x86.ActiveCfg = pHit|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x86.Build.0 = pHit|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x64.ActiveCfg = pHit|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x64.Build.0 = pHit|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x86.ActiveCfg = pHit|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x86.Build.0 = pHit|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x64.ActiveCfg = pHit|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x64.Build.0 = pHit|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x86.ActiveCfg = pHit|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x86.Build.0 = pHit|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x64.ActiveCfg = Release|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x64.Build.0 = Release|x64 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x86.ActiveCfg = Release|Win32 + {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F1E3E860-1001-4EF6-8658-8CA24299B239} + EndGlobalSection +EndGlobal diff --git a/cheat/gmod/CHLClient.hpp b/cheat/gmod/CHLClient.hpp new file mode 100644 index 0000000..4ed244c --- /dev/null +++ b/cheat/gmod/CHLClient.hpp @@ -0,0 +1,83 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "ClientClass.hpp" +#include "color.hpp" + +enum ClientFrameStage_t { + FRAME_UNDEFINED = -1, + FRAME_START, + FRAME_NET_UPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_END, + FRAME_NET_UPDATE_END, + FRAME_RENDER_START, + FRAME_RENDER_END +}; + +struct GlowObject_t { + IClientEntity* m_pEntity; + fclr_t color; + char junk0[ 8 ]; + float m_flBloomAmount; + char junk1[ 4 ]; + bool m_bRenderWhenOccluded; + bool m_bRenderWhenUnoccluded; + bool m_bFullBloom; + char junk2[ 14 ]; +}; + +struct GlowObjectManager_t { + GlowObject_t* DataPtr; //0000 + unsigned int Max; //0004 + unsigned int unk02; //0008 + unsigned int Count; //000C + unsigned int DataPtrBack; //0010 + int m_nFirstFreeSlot; //0014 + unsigned int unk1; //0018 + unsigned int unk2; //001C + unsigned int unk3; //0020 + unsigned int unk4; //0024 + unsigned int unk5; //0028 +}; + +class IBaseClientDLL +{ +public: + ClientClass* GetAllClasses( ) { + using fn = ClientClass*( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 8 )( this ); + } + + /* + DONTCARE + void SetCrosshairAngle( Vector& angle ) + { + typedef void( __thiscall* SetCrosshairAngleFn )( void*, Vector& ); + CallVFunction( this, 29 )( this, angle ); + } + + void HudProcessInput( bool enable ) + { + using fn = void( __thiscall* )( void*, bool ); + CallVFunction( this, 10 )( this, enable ); + } + + void HudUpdate( bool enable ) + { + using fn = void( __thiscall* )( void*, bool ); + CallVFunction( this, 11 )( this, enable ); + } + + void IN_ActivateMouse( ) + { + using fn = void( __thiscall* )( void* ); + CallVFunction( this, 15 )( this ); + } + + void IN_DeactivateMouse( ) + { + using fn = void( __thiscall* )( void* ); + CallVFunction( this, 16 )( this ); + }*/ +}; \ No newline at end of file diff --git a/cheat/gmod/CInput.hpp b/cheat/gmod/CInput.hpp new file mode 100644 index 0000000..613b849 --- /dev/null +++ b/cheat/gmod/CInput.hpp @@ -0,0 +1,44 @@ +#pragma once +#include "vector.hpp" +#include "IClientMode.hpp" + +class CInput { + void* pvftable; //0x00 +public: + bool m_fTrackIRAvailable; //0x04 + bool m_fMouseInitialized; //0x05 + bool m_fMouseActive; //0x06 + bool m_fJoystickAdvancedInit; //0x07 +private: + char pad_0x08[ 0x2C ]; //0x08 +public: + void* m_pKeys; //0x34 +private: + char pad_0x38[ 0x64 ]; //0x38 + int pad_0x41; + int pad_0x42; +public: + bool m_fCameraInterceptingMouse; //0x9C + bool m_fCameraInThirdPerson; //0x9D + bool m_fCameraMovingWithMouse; //0x9E + vec3_t m_vecCameraOffset; //0xA0 + bool m_fCameraDistanceMove; //0xAC + int m_nCameraOldX; //0xB0 + int m_nCameraOldY; //0xB4 + int m_nCameraX; //0xB8 + int m_nCameraY; //0xBC + bool m_CameraIsOrthographic; //0xC0 + vec3_t m_angPreviousViewAngles; //0xC4 + vec3_t m_angPreviousViewAnglesTilt; //0xD0 + float m_flLastForwardMove; //0xDC + int m_nClearInputState; //0xE0 +private: + char pad_0xE4[ 0x8 ]; //0xE4 +public: + user_cmd_t* m_pCommands; //0xEC + void* m_pVerifiedCommands; //0xF0 + + user_cmd_t* GetUserCmd( int slot, int seq_num ) { + return util::get_vfunc< 8, user_cmd_t* >( this, slot, seq_num ); + } +}; diff --git a/cheat/gmod/CLuaInterface.hpp b/cheat/gmod/CLuaInterface.hpp new file mode 100644 index 0000000..adc0f7b --- /dev/null +++ b/cheat/gmod/CLuaInterface.hpp @@ -0,0 +1,246 @@ +#pragma once + +#include +#include + +#include "vector.hpp" +#include "color.hpp" + +#define LUA_REGISTRYINDEX (-10000) +#define LUA_ENVIRONINDEX (-10001) +#define LUA_GLOBALSINDEX (-10002) + +class CLuaInterface; + +enum STATE_TYPE +{ + LUA_CLIENT = 0, + LUA_SERVER, + LUA_MENU +}; + + +enum LUA_SPECIAL +{ + SPECIAL_GLOB, + SPECIAL_ENV, + SPECIAL_REG, +}; + + +enum LUA_TYPE : int8_t { + TYPE_INVALID = -1, + TYPE_NIL, + TYPE_BOOL, + TYPE_LIGHTUSERDATA, + TYPE_NUMBER, + _TYPE_STRING, + TYPE_TABLE, + TYPE_FUNCTION, + TYPE_USERDATA, + TYPE_THREAD, + + TYPE_ENTITY, + TYPE_VECTOR, + TYPE_ANGLE, + TYPE_PHYSOBJ, + TYPE_SAVE, + TYPE_RESTORE, + TYPE_DAMAGEINFO, + TYPE_EFFECTDATA, + TYPE_MOVEDATA, + TYPE_RECIPIENTFILTER, + TYPE_USERCMD, + TYPE_SCRIPTEDVEHICLE, + + TYPE_MATERIAL, + TYPE_PANEL, + TYPE_PARTICLE, + TYPE_PARTICLEEMITTER, + TYPE_TEXTURE, + TYPE_USERMSG, + + TYPE_CONVAR, + TYPE_IMESH, + TYPE_MATRIX, + TYPE_SOUND, + TYPE_PIXELVISHANDLE, + TYPE_DLIGHT, + TYPE_VIDEO, + TYPE_FILE, + + TYPE_COUNT, + + TYPE_PLAYER = TYPE_ENTITY, +}; + +struct lua_State +{ + uint8_t header[ 69 ]; + CLuaInterface* m_lua_base; +}; + +struct UserData +{ + void* data; + LUA_TYPE type; +}; + +using CLuaFunction = int( __cdecl* )( lua_State* ); + +class CLuaInterface +{ +public: + virtual int Top( void ) = 0; + virtual void Push( int iStackPos ) = 0; + virtual void Pop( int iAmt = 1 ) = 0; + virtual void GetTable( int iStackPos ) = 0; + virtual void GetField( int iStackPos, const char* strName ) = 0; + virtual void SetField( int iStackPos, const char* strName ) = 0; + virtual void CreateTable( ) = 0; + virtual void SetTable( int i ) = 0; + virtual void SetMetaTable( int i ) = 0; + virtual bool GetMetaTable( int i ) = 0; + virtual void Call( int iArgs, int iResults ) = 0; + virtual int PCall( int iArgs, int iResults, int iErrorFunc ) = 0; + virtual int Equal( int iA, int iB ) = 0; + virtual int RawEqual( int iA, int iB ) = 0; + virtual void Insert( int iStackPos ) = 0; + virtual void Remove( int iStackPos ) = 0; + virtual int Next( int iStackPos ) = 0; + virtual void* NewUserdata( unsigned int iSize ) = 0; + virtual void ThrowError( const char* strError ) = 0; + virtual void CheckType( int iStackPos, int iType ) = 0; + virtual void ArgError( int iArgNum, const char* strMessage ) = 0; + virtual void RawGet( int iStackPos ) = 0; + virtual void RawSet( int iStackPos ) = 0; + + virtual const char* GetString( int iStackPos = -1, unsigned int* iOutLen = NULL ) = 0; + virtual double GetNumber( int iStackPos = -1 ) = 0; + virtual bool GetBool( int iStackPos = -1 ) = 0; + virtual CLuaFunction* GetCFunction( int iStackPos = -1 ) = 0; + virtual void* GetUserdata( int iStackPos = -1 ) = 0; + + virtual void PushNil( ) = 0; + virtual void PushString( const char* val, unsigned int iLen = 0 ) = 0; + virtual void PushNumber( double val ) = 0; + virtual void PushBool( bool val ) = 0; + virtual void PushCFunction( CLuaFunction* val ) = 0; + virtual void PushCClosure( CLuaFunction* val, int iVars ) = 0; + virtual void PushUserdata( void* ) = 0; + + // + // If you create a reference - don't forget to free it! + // + virtual int ReferenceCreate( ) = 0; + virtual void ReferenceFree( int i ) = 0; + virtual void ReferencePush( int i ) = 0; + + // + // Push a special value onto the top of the stack ( see below ) + // + virtual void PushSpecial( int iType ) = 0; + + // + // For type enums see Types.h + // + virtual bool IsType( int iStackPos, int iType ) = 0; + virtual int GetType( int iStackPos ) = 0; + virtual const char* GetTypeName( int iType ) = 0; + + // + // Creates a new meta table of string and type and leaves it on the stack. + // Will return the old meta table of this name if it already exists. + // + virtual void CreateMetaTableType( const char* strName, int iType ) = 0; + + // + // Like Get* but throws errors and returns if they're not of the expected type + // + virtual const char* CheckString( int iStackPos = -1 ) = 0; + virtual double CheckNumber( int iStackPos = -1 ) = 0; + + + virtual void ObjLen( int ) = 0; + virtual void GetAngle( int ) = 0; + virtual void GetVector( int ) = 0; + virtual void PushAngle( vec3_t const& ) = 0; + virtual void PushVector( vec3_t const& ) = 0; + virtual void SetState( lua_State * ) = 0; + virtual void CreateMetaTable( char const* ) = 0; + virtual void PushMetaTable( int ) = 0; + virtual void PushUserType( void *, int ) = 0; + virtual void SetUserType( int, void * ) = 0; + virtual void Init( void *, bool ) = 0; + virtual void Shutdown( void ) = 0; + virtual void Cycle( void ) = 0; + virtual void Global( void ) = 0; + virtual void* GetObject( int ) = 0; + virtual void PushLuaObject( void * ) = 0; + virtual void PushLuaFunction( CLuaFunction ) = 0; + virtual void LuaError( char const*, int ) = 0; + virtual void TypeError( char const*, int ) = 0; + virtual void CallInternal( int, int ) = 0; + virtual void CallInternalNoReturns( int ) = 0; + virtual void CallInternalGetBool( int ) = 0; + virtual void CallInternalGetString( int ) = 0; + virtual void CallInternalGet( int, void * ) = 0; + virtual void NewGlobalTable( char const* ) = 0; + virtual void NewTemporaryObject( void ) = 0; + virtual void isUserData( int ) = 0; + virtual void GetMetaTableObject( char const*, int ) = 0; + virtual void GetMetaTableObject( int ) = 0; + virtual void GetReturn( int ) = 0; + virtual void IsServer( void ) = 0; + virtual void IsClient( void ) = 0; + virtual void IsDedicatedServer( void ) = 0; + virtual void DestroyObject( void * ) = 0; + virtual void CreateObject( void ) = 0; + virtual void SetMember( void *, void *, void * ) = 0; + virtual void GetNewTable( void ) = 0; + virtual void SetMember( void *, float ) = 0; + virtual void SetMember( void *, float, void * ) = 0; + virtual void SetMember( void *, char const* ) = 0; + virtual void SetMember( void *, char const*, void * ) = 0; + virtual void SetIsServer( bool ) = 0; + virtual void PushLong( long ) = 0; + virtual void GetFlags( int ) = 0; + virtual void FindOnObjectsMetaTable( int, int ) = 0; + virtual void FindObjectOnTable( int, int ) = 0; + virtual void SetMemberFast( void *, int, int ) = 0; + virtual void RunString( char const* filename, char const* path, char const* stringtoun, bool run = true, bool showerrors = true ) = 0; + virtual void IsEqual( void *, void * ) = 0; + virtual void Error( char const* ) = 0; + virtual void GetStringOrError( int ) = 0; + virtual void RunLuaModule( char const* ) = 0; + virtual void FindAndRunScript( const char* path, bool run = true, bool showerrors = true, const char* type = "!CLIENT" ) = 0; + virtual void SetPathID( char const* ) = 0; + virtual void GetPathID( void ) = 0; + virtual void ErrorNoHalt( char const*, ... ) = 0; + virtual void Msg( char const*, ... ) = 0; + virtual void PushPath( char const* ) = 0; + virtual void PopPath( void ) = 0; + virtual void GetPath( void ) = 0; + virtual void GetColor( int ) = 0; + virtual void PushColor( clr_t ) = 0; + virtual int GetStack( int, void * ) = 0; + virtual void GetInfo( char const*, void * ) = 0; + virtual void GetLocal( void *, int ) = 0; + virtual void GetUpvalue( int, int ) = 0; + virtual void RunStringEx( void*, char const* filename, char const* path, char const* torun, bool run, bool showerrors, bool idk, bool idk2 ) = 0; + virtual void GetDataString( int, void ** ) = 0; + virtual void ErrorFromLua( char const*, ... ) = 0; + virtual void GetCurrentLocation( void ) = 0; + virtual void MsgColour( clr_t const&, char const*, ... ) = 0; + virtual void GetCurrentFile( std::string & ) = 0; + virtual void CompileString( int &, std::string const& ) = 0; + virtual void CallFunctionProtected( int, int, bool ) = 0; + virtual void Require( char const* ) = 0; + virtual void GetActualTypeName( int ) = 0; + virtual void PreCreateTable( int, int ) = 0; + virtual void PushPooledString( int ) = 0; + virtual void GetPooledString( int ) = 0; + virtual void AddThreadedCall( void * ) = 0; + + lua_State* L; +}; diff --git a/cheat/gmod/CLuaShared.hpp b/cheat/gmod/CLuaShared.hpp new file mode 100644 index 0000000..1a46e74 --- /dev/null +++ b/cheat/gmod/CLuaShared.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "CLuaInterface.hpp" + +class CLuaShared +{ +public: + virtual ~CLuaShared( ); + virtual void Init( ); + virtual void ShutDown( ); + virtual void DumpStats( ); + virtual CLuaInterface* CreateLuaInterface( STATE_TYPE, bool ); + virtual void CloseLuaInterface( CLuaInterface* ); + virtual CLuaInterface* GetLuaInterface( STATE_TYPE ); +}; \ No newline at end of file diff --git a/cheat/gmod/CUtlVector.hpp b/cheat/gmod/CUtlVector.hpp new file mode 100644 index 0000000..a212270 --- /dev/null +++ b/cheat/gmod/CUtlVector.hpp @@ -0,0 +1,47 @@ +#pragma once + +template +class CUtlMemory { +public: + T* GetBuffer( void ) { + return m_pMemory; + } + + int GetAllocationCount( void ) { + return m_nAllocationCount; + } + + int GetGrowSize( void ) { + return m_nGrowSize; + } + + T* OffsetBufferByIndex( size_t index ) { + return m_pMemory + index; + } + +private: + T* m_pMemory; + int m_nAllocationCount; + int m_nGrowSize; +}; + +template > +class CUtlVector { +public: + Allocator GetMemory( void ) { + return m_Memory; + } + + int GetSize( void ) { + return m_Size; + } + + T* GetElements( void ) { + return m_pElements; + } + +private: + Allocator m_Memory; + int m_Size; + T* m_pElements; +}; \ No newline at end of file diff --git a/cheat/gmod/ClientClass.hpp b/cheat/gmod/ClientClass.hpp new file mode 100644 index 0000000..b1d69dd --- /dev/null +++ b/cheat/gmod/ClientClass.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "Valve/dt_common.h" +#include "Valve/dt_recv.h" + + +class ClientClass { +public: + void* m_create_fn; + void* m_createevent_fn; + char* m_name; + RecvTable* m_rt_table; + ClientClass* m_next; + int m_class_id; +}; \ No newline at end of file diff --git a/cheat/gmod/GlobalVars_t.hpp b/cheat/gmod/GlobalVars_t.hpp new file mode 100644 index 0000000..820fe0d --- /dev/null +++ b/cheat/gmod/GlobalVars_t.hpp @@ -0,0 +1,16 @@ +#pragma once + +class global_vars_t { +public: + float m_realtime; + int m_framecount; + float m_absframetime; + float m_curtime; + float m_frametime; + int m_maxclients; + int m_tickcount; + float m_interval_per_tick; + float m_interpolation_amount; + int m_sim_ticks; + int m_network_protocol; +}; \ No newline at end of file diff --git a/cheat/gmod/IAppSystem.hpp b/cheat/gmod/IAppSystem.hpp new file mode 100644 index 0000000..a8cf475 --- /dev/null +++ b/cheat/gmod/IAppSystem.hpp @@ -0,0 +1,24 @@ +#pragma once + +class AppSystemInfo_t; + +enum InitReturnVal_t; + +enum AppSystemTier_t { + APP_SYSTEM_TIER0 = 0, + APP_SYSTEM_TIER1, + APP_SYSTEM_TIER2, + APP_SYSTEM_TIER3, + + APP_SYSTEM_TIER_OTHER, +}; + + +class IAppSystem { +public: + virtual bool Connect( void* factory ) = 0; + virtual void Disconnect( ) = 0; + virtual void* QueryInterface( const char* pInterfaceName ) = 0; + virtual InitReturnVal_t Init( ) = 0; + virtual void Shutdown( ) = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IClientEntityList.hpp b/cheat/gmod/IClientEntityList.hpp new file mode 100644 index 0000000..2a0ac28 --- /dev/null +++ b/cheat/gmod/IClientEntityList.hpp @@ -0,0 +1,144 @@ +#pragma once +#include "util.hpp" +#include "vector.hpp" +#include "ClientClass.hpp" +#include "IVEngineClient.hpp" + +class ICollideable; +class IClientNetworkable; +class IClientRenderable; +class IClientThinkable; +class IClientEntity; +class IClientAlphaProperty; +class bf_read; +using model_t = uintptr_t; + + +class c_base_player; + +class IClientUnknown { +public: + virtual ICollideable* GetCollideable( ) = 0; + virtual IClientNetworkable* GetClientNetworkable( ) = 0; + virtual IClientRenderable* GetClientRenderable( ) = 0; + virtual IClientEntity* GetIClientEntity( ) = 0; + virtual IClientEntity* GetBaseEntity( ) = 0; + virtual IClientThinkable* GetClientThinkable( ) = 0; + //virtual IClientModelRenderable* GetClientModelRenderable() = 0; + virtual IClientAlphaProperty* GetClientAlphaProperty( ) = 0; +}; + +class IClientNetworkable { +public: + virtual IClientUnknown* GetIClientUnknown( ) = 0; + virtual void Release( ) = 0; + virtual ClientClass* GetClientClass( ) = 0; + virtual void NotifyShouldTransmit( int state ) = 0; + virtual void OnPreDataChanged( int updateType ) = 0; + virtual void OnDataChanged( int updateType ) = 0; + virtual void PreDataUpdate( int updateType ) = 0; + virtual void PostDataUpdate( int updateType ) = 0; + virtual bool IsDormant( void ) = 0; + virtual int EntIndex( void ) const = 0; + virtual void ReceiveMessage( int classID, bf_read& msg ) = 0; + virtual void* GetDataTableBasePtr( ) = 0; + virtual void SetDestroyedOnRecreateEntities( void ) = 0; +}; + +class IClientEntity { +public: + void* GetClientRenderable( ) { + return reinterpret_cast< void* >( this + 0x4 ); + } + + IClientNetworkable* GetClientNetworkable( ) { + return reinterpret_cast< IClientNetworkable* >( this + 0x8 ); + } + + ICollideable* GetCollideable( ) { + using fn = ICollideable* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 2 )( this ); + } + + vec3_t& GetRenderOrigin( ) { + using fn = vec3_t& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 9 )( this ); + } + + vec3_t& GetRenderAngles( ) { + using fn = vec3_t& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 10 )( this ); + } + + ClientClass* GetClientClass( ) { + try { + return GetClientNetworkable( )->GetClientClass( ); + } + catch( ... ) { + return 0; + } + } + + bool IsDormant( ) { + return GetClientNetworkable( )->IsDormant( ); + } + + int GetIndex( ) { + return GetClientNetworkable( )->EntIndex( ); + } + + model_t* GetModel( ) { + using fn = model_t* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this->GetClientRenderable( ), 9 )( this->GetClientRenderable( ) ); + } + + int DrawModel( int flags, uint8_t alpha ) { + using fn = int( __thiscall* )( void*, int, uint8_t ); + return util::get_vfunc< fn >( this->GetClientRenderable( ), 10 )( this->GetClientRenderable( ), flags, alpha ); + } + + bool SetupBones( matrix3x4* bone_to_world, int max_bones, int mask, float time ) { + using fn = bool( __thiscall* )( void*, matrix3x4*, int, int, float ); + return util::get_vfunc< fn >( GetClientRenderable( ), 16 ) + ( GetClientRenderable( ), bone_to_world, max_bones, mask, time ); + } + + void PushEntity( ) { + return util::get_vfunc< 172, void >( this ); + } + + bool IsWeapon( ) { + return util::get_vfunc< 167, bool >( this ); + } + + template < typename t > + t* as( ) { + return reinterpret_cast< t* >( this ); + } +}; + +class IClientEntityList +{ +public: + IClientNetworkable* GetClientNetworkable( int index ) { + using fn = IClientNetworkable* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 1 )( this, index ); + } + + template < typename t = c_base_player > + t* GetClientEntity( int index ) { + using fn = t* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 3 )( this, index ); + } + + template < typename t = c_base_player > + t* GetClientEntityFromHandle( uint32_t handle ) { + using fn = t* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 4 )( this, handle ); + } + + int GetHighestEntityIndex( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 6 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IClientMode.hpp b/cheat/gmod/IClientMode.hpp new file mode 100644 index 0000000..4996af6 --- /dev/null +++ b/cheat/gmod/IClientMode.hpp @@ -0,0 +1,139 @@ +#pragma once +#include "util.hpp" +#include "vector.hpp" + +enum player_controls_t { + IN_ATTACK = 1 << 0, + IN_JUMP = 1 << 1, + IN_DUCK = 1 << 2, + IN_FORWARD = 1 << 3, + IN_BACK = 1 << 4, + IN_USE = 1 << 5, + IN_CANCEL = 1 << 6, + IN_LEFT = 1 << 7, + IN_RIGHT = 1 << 8, + IN_MOVELEFT = 1 << 9, + IN_MOVERIGHT = 1 << 10, + IN_ATTACK2 = 1 << 11, + IN_RUN = 1 << 12, + IN_RELOAD = 1 << 13, + IN_ALT1 = 1 << 14, + IN_ALT2 = 1 << 15, + IN_SCORE = 1 << 16, + IN_SPEED = 1 << 17, + IN_WALK = 1 << 18, + IN_ZOOM = 1 << 19, + IN_WEAPON1 = 1 << 20, + IN_WEAPON2 = 1 << 21, + IN_BULLRUSH = 1 << 22, + IN_GRENADE1 = 1 << 23, + IN_GRENADE2 = 1 << 24, + IN_ATTACK3 = 1 << 25, +}; + +class user_cmd_t { +public: + int m_cmd_nr; // 0x0 virtual deconstructor removed + int m_tick_count; // 0x4 + vec3_t m_viewangles; // 0x8 + float m_forwardmove; // 0x14 + float m_sidemove; // 0x18 + float m_upmove; // 0x1C + int m_buttons; // 0x20 + uint8_t m_impulse; // 0x24 + int m_weaponselect; // 0x25 + int m_weaponsubtype; // 0x29 + int m_random_seed; // 0x2D + short m_mousedx; // 0x31 + short m_mousedy; // 0x33 + bool m_predicted; // 0x35 +private: + uint8_t m_pad_0x36[ 0x6 ]; // 0x36 +public: + bool m_world_clicking; // 0x3F + vec3_t m_world_click_direction; // 0x40 + + + __forceinline user_cmd_t clamp( ) { + m_viewangles.clamp( ); + + m_forwardmove = std::clamp( m_forwardmove, -10000.f, 10000.f ); + m_sidemove = std::clamp( m_sidemove, -10000.f, 10000.f ); + m_upmove = std::clamp( m_upmove, -10000.f, 10000.f ); + + return *this; + } + +private: + uint8_t m_pad_0x52[ 0xF2 ]; // 0x52 sizeof( user_cmd_t ) = 0x144 HUGE in gmod +}; + +class CHudChat { +public: + void ChatPrintf( int iPlayerIndex, int iFilter, const char* fmt ) { + using fn = void( __cdecl* )( void*, int, int, const char* ); + util::get_vfunc< fn >( this, 26 )( this, iPlayerIndex, iFilter, fmt ); + } +}; + +enum StereoEye_t +{ + STEREO_EYE_MONO = 0, + STEREO_EYE_LEFT = 1, + STEREO_EYE_RIGHT = 2, + STEREO_EYE_MAX = 3, +}; + + +class CViewSetup +{ +public: + int x; + int m_nUnscaledX; + int y; + int m_nUnscaledY; + int width; + int m_nUnscaledWidth; + int height; + StereoEye_t m_eStereoEye; + int m_nUnscaledHeight; + + bool m_bOrtho; + float m_OrthoLeft; + float m_OrthoTop; + float m_OrthoRight; + float m_OrthoBottom; + + float fov; + float fovViewmodel; + + vec3_t origin; + + vec3_t angles; + float zNear; + float zFar; + + float zNearViewmodel; + float zFarViewmodel; + + bool m_bRenderToSubrectOfLargerScreen; + float m_flAspectRatio; + + bool m_bOffCenter; + float m_flOffCenterTop; + float m_flOffCenterBottom; + float m_flOffCenterLeft; + float m_flOffCenterRight; + + bool m_bDoBloomAndToneMapping; + bool m_bCacheFullSceneState; + bool m_bViewToProjectionOverride; +}; + + +class IClientMode { +public: + char _pad[ 28 ]; + + CHudChat* m_pChatElement; //0x2A +}; \ No newline at end of file diff --git a/cheat/gmod/ICvar.hpp b/cheat/gmod/ICvar.hpp new file mode 100644 index 0000000..8cdfca9 --- /dev/null +++ b/cheat/gmod/ICvar.hpp @@ -0,0 +1,206 @@ +#pragma once +#include "IAppSystem.hpp" +#include "util.hpp" +#include "color.hpp" + +using CVarDLLIdentifier_t = int; +class IConVar; +using FnChangeCallback_t = void( *)( IConVar *var, const char *pOldValue, float flOldValue ); +class ConCommandBase; +class ConCommand; +class ICvarQuery; + +class IConsoleDisplayFunc { +public: + virtual void ColorPrint( const uint8_t* clr, const char *pMessage ) = 0; + virtual void Print( const char *pMessage ) = 0; + virtual void DPrint( const char *pMessage ) = 0; +}; + +#define FCVAR_NONE 0 + +// Command to ConVars and ConCommands +// ConVar Systems +#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. +#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined. +#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL +#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL +#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out. + +// ConVar only +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc +#define FCVAR_NOTIFY (1<<8) // notifies players when changed +#define FCVAR_USERINFO (1<<9) // changes the client's info string +#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats + +#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar + +// It's a ConVar that's shared between the client and the server. +// At signon, the values of all such ConVars are sent from the server to the client (skipped for local +// client, of course ) +// If a change is requested it must come from the console (i.e., no remote client changes) +// If a value is changed while a server is active, it's replicated to all connected clients +#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time +#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file +#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles +#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload +#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload + +#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server +#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread +#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox + +#define FCVAR_ACCESSIBLE_FROM_THREADS (1<<25) // used as a debugging tool necessary to check material system thread convars + +#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd. +#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue). +#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command. + + +class cvar_t { +public: + void set_value( const char* value ) { + using fn = void( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 14 )( this, value ); + } + + void set_value( float value ) { + using fn = void( __thiscall* )( void*, float ); + return util::get_vfunc< fn >( this, 15 )( this, value ); + } + + void set_value( int value ) { + using fn = void( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 16 )( this, value ); + } + + void set_value( clr_t value ) { + using fn = void( __thiscall* )( void*, clr_t ); + return util::get_vfunc< fn >( this, 17 )( this, value ); + } + + char* get_name( ) { + using fn = char*( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 5 )( this ); + } + + char* get_default( ) { + return m_default; + } + + const char* get_string( ) { + return m_string; + } + + float get_float( ) { + using fn = float( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 12 )( this ); + } + + int get_int( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 13 )( this ); + } + +private: + char pad_0x0000[ 0x4 ]; //0x0000 +public: + cvar_t* m_next; //0x0004 + __int32 m_registered; //0x0008 + char* m_name; //0x000C + char* m_help_str; //0x0010 + __int32 m_flags; //0x0014 +private: + char pad_0x0018[ 0x4 ]; //0x0018 +public: + cvar_t* m_parent; //0x001C + char* m_default; //0x0020 + char* m_string; //0x0024 + __int32 m_str_len; //0x0028 + float m_flvalue; //0x002C + __int32 m_nvalue; //0x0030 + __int32 m_has_min; //0x0034 + float m_min; //0x0038 + __int32 m_hax_max; //0x003C + float m_max; //0x0040 + void* m_change_callback; //0x0044 +};//Size=0x0048 + +class ICVar : public IAppSystem +{ +public: + // Allocate a unique DLL identifier + virtual CVarDLLIdentifier_t AllocateDLLIdentifier( ) = 0; + + // Register, unregister commands + virtual void RegisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommands( CVarDLLIdentifier_t id ) = 0; + + // If there is a + on the command line, this returns the value. + // Otherwise, it returns NULL. + virtual const char* GetCommandLineValue( const char *pVariableName ) = 0; + + // Try to find the cvar pointer by name + virtual ConCommandBase* FindCommandBase( const char *name ) = 0; + virtual const ConCommandBase* FindCommandBase( const char *name ) const = 0; + virtual cvar_t *FindVar( const char *var_name ) = 0; + virtual const cvar_t *FindVar( const char *var_name ) const = 0; + virtual ConCommand *FindCommand( const char *name ) = 0; + virtual const ConCommand *FindCommand( const char *name ) const = 0; + + + + // Install a global change callback (to be called when any convar changes) + virtual void InstallGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void RemoveGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void CallGlobalChangeCallbacks( cvar_t *var, const char *pOldString, float flOldValue ) = 0; + + // Install a console printer + virtual void InstallConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void RemoveConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void ConsoleColorPrintf( const clr_t& clr, const char *pFormat, ... ) const = 0; + virtual void ConsolePrintf( const char *pFormat, ... ) const = 0; + virtual void ConsoleDPrintf( const char *pFormat, ... ) const = 0; + + // Reverts cvars which contain a specific flag + virtual void RevertFlaggedConVars( int nFlag ) = 0; + + // Method allowing the engine ICvarQuery interface to take over + // A little hacky, owing to the fact the engine is loaded + // well after ICVar, so we can't use the standard connect pattern + virtual void InstallCVarQuery( ICvarQuery *pQuery ) = 0; + + + virtual void SetMaxSplitScreenSlots( int nSlots ) = 0; + virtual int GetMaxSplitScreenSlots( ) const = 0; + + virtual void AddSplitScreenConVars( ) = 0; + virtual void RemoveSplitScreenConVars( CVarDLLIdentifier_t id ) = 0; + + virtual int GetConsoleDisplayFuncCount( ) const = 0; + virtual void GetConsoleText( int nDisplayFuncIndex, char *pchText, size_t bufSize ) const = 0; + + // Utilities for convars accessed by the material system thread + virtual bool IsMaterialThreadSetAllowed( ) const = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, const char *pValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, int nValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, float flValue ) = 0; + virtual bool HasQueuedMaterialThreadConVarSets( ) const = 0; + virtual int ProcessQueuedMaterialThreadConVarSets( ) = 0; + + class ICVarIteratorInternal + { + public: + virtual void SetFirst( ) = 0; + virtual void Next( ) = 0; + virtual bool IsAlive( ) = 0; + virtual ConCommandBase *Get( ) = 0; + }; + + virtual ICVarIteratorInternal* FactoryInternalIterator( ) = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IEngineTrace.hpp b/cheat/gmod/IEngineTrace.hpp new file mode 100644 index 0000000..142fef9 --- /dev/null +++ b/cheat/gmod/IEngineTrace.hpp @@ -0,0 +1,380 @@ +#pragma once +#include "vector.hpp" +#include "IClientEntityList.hpp" + +enum TraceType_t { + TRACE_EVERYTHING = 0, + TRACE_WORLD_ONLY, // NOTE: This does *not* test static props!!! + TRACE_ENTITIES_ONLY, // NOTE: This version will *not* test static props + TRACE_EVERYTHING_FILTER_PROPS, // NOTE: This version will pass the IHandleEntity for props through the filter, unlike all other filters +}; + +enum SurfaceFlags_t { + DISPSURF_FLAG_SURFACE = 1 << 0, + DISPSURF_FLAG_WALKABLE = 1 << 1, + DISPSURF_FLAG_BUILDABLE = 1 << 2, + DISPSURF_FLAG_SURFPROP1 = 1 << 3, + DISPSURF_FLAG_SURFPROP2 = 1 << 4, +}; + +enum Hitgroup_t { + HITGROUP_GENERIC, + HITGROUP_HEAD, + HITGROUP_CHEST, + HITGROUP_STOMACH, + HITGROUP_LEFTARM, + HITGROUP_RIGHTARM, + HITGROUP_LEFTLEG, + HITGROUP_RIGHTLEG, + HITGROUP_GEAR +}; + +struct csurface_t { + const char* name; + short surfaceProps; + unsigned short flags; +}; + +struct cplane_t { + vec3_t normal; + float dist; + uint8_t type; + uint8_t signbits; + uint8_t pad[ 2 ]; +}; + +class ITraceFilter { +public: + virtual bool ShouldHitEntity( void* pEntity, int contentsMask ) = 0; + virtual TraceType_t GetTraceType( ) const = 0; +}; + +class CTraceFilter : public ITraceFilter { +public: + CTraceFilter( ) {} + + CTraceFilter( void *ent ) + : pSkip( ent ) {} + + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == pSkip ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_EVERYTHING; + } + + void* pSkip; +}; + +class CTraceFilterOneEntity : public ITraceFilter { +public: + bool ShouldHitEntity( void* entity_handle, int contents ) override { + return entity_handle == ent; + } + + TraceType_t GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* ent; +}; + +class CTraceFilterWorldAndPropsOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return false; + } + + TraceType_t GetTraceType( ) const override { + return TRACE_EVERYTHING; + } +}; + +class CTraceFilterEntitiesOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == pSkip ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterPlayersOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + IClientEntity* hit_entity = ( IClientEntity* )pEntityHandle; + int index = hit_entity->GetIndex( ); + return !( pEntityHandle == pSkip || index < 1 || index > 64 ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterWorldOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return false; + } + + TraceType_t GetTraceType( ) const override { + return TRACE_WORLD_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterSkipTwoEntities : public ITraceFilter { +public: + CTraceFilterSkipTwoEntities( ) { + + } + + CTraceFilterSkipTwoEntities( void* pPassEnt1, void* pPassEnt2 ) { + passentity1 = pPassEnt1; + passentity2 = pPassEnt2; + } + + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == passentity1 || pEntityHandle == passentity2 ); + } + + TraceType_t GetTraceType( ) const override { + return TRACE_EVERYTHING; + } + + void* passentity1; + void* passentity2; +}; + +class __declspec( align( 16 ) )VectorAligned : public vec3_t { +public: + VectorAligned( float _x, float _y, float _z ) { + x = _x; + y = _y; + z = _z; + w = 0; + } + + VectorAligned( ) { } + + void operator=( const vec3_t& vOther ) { + x = vOther.x; + y = vOther.y; + z = vOther.z; + } + + float w; +}; + +struct Ray_t +{ + VectorAligned m_Start; + VectorAligned m_Delta; + VectorAligned m_StartOffset; + VectorAligned m_Extents; + + bool m_IsRay; + bool m_IsSwept; + + Ray_t( ){ } + + void Init( const vec3_t& start, const vec3_t& end ) { + m_Delta = end - start; + + m_IsSwept = m_Delta.lengthsqr( ) != 0; + + m_Extents = vec3_t( 0.f, 0.f, 0.f ); + m_IsRay = true; + + m_StartOffset = vec3_t( 0.f, 0.f, 0.f ); + m_Start = start; + } + + void Init( const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs ) { + m_Delta = end - start; + + m_IsSwept = m_Delta.lengthsqr( ) != 0; + + m_Extents = maxs - mins; + m_Extents *= 0.5f; + m_IsRay = m_Extents.lengthsqr( ) < 1e-6; + + m_StartOffset = mins + maxs; + m_StartOffset *= 0.5f; + m_Start = start + m_StartOffset; + m_StartOffset *= -1.0f; + } +}; + +class CBaseTrace +{ +public: + bool IsDispSurface( ) const { return ( dispFlags & DISPSURF_FLAG_SURFACE ) != 0; } + bool IsDispSurfaceWalkable( ) const { return ( dispFlags & DISPSURF_FLAG_WALKABLE ) != 0; } + bool IsDispSurfaceBuildable( ) const { return ( dispFlags & DISPSURF_FLAG_BUILDABLE ) != 0; } + bool IsDispSurfaceProp1( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP1 ) != 0; } + bool IsDispSurfaceProp2( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP2 ) != 0; } + +public: + vec3_t startpos; + vec3_t endpos; + cplane_t plane; + + float fraction; + + int contents; + unsigned short dispFlags; + + bool allsolid; + bool startsolid; + + CBaseTrace( ) {} + +private: + CBaseTrace( const CBaseTrace& vOther ); +}; + +class CGameTrace : public CBaseTrace +{ +public: + bool DidHitWorld( ) const; + + bool DidHitNonWorldEntity( ) const; + + int GetEntityIndex( ) const; + + bool DidHit( ) const + { + return fraction < 1 || allsolid || startsolid; + } + +public: + float fractionleftsolid; + csurface_t surface; + + int hitgroup; + + short physicsbone; + unsigned short worldSurfaceIndex; + + IClientEntity* m_pEnt; + int hitbox; + + CGameTrace( ) {} + CGameTrace( const CGameTrace& vOther ); +}; + +class IEngineTrace { +public: + int GetPointContents( const vec3_t& vecAbsPosition, int contentsMask = 0xffffffff ) { + using fn = int( __thiscall* )( void*, const vec3_t&, int, void* ); + return util::get_vfunc< fn >( this, 0 )( this, vecAbsPosition, contentsMask, nullptr ); + } + + void TraceRay( const Ray_t& ray, unsigned int fMask, ITraceFilter* pTraceFilter, CBaseTrace* pTrace ) { + return util::get_vfunc< 4, void >( this, ray, fMask, pTraceFilter, pTrace ); + } + + void ClipRayToEntity( const Ray_t& ray, unsigned int fMask, IClientEntity* pEnt, CBaseTrace* pTrace ) { + return util::get_vfunc< 2, void >( this, ray, fMask, pEnt, pTrace ); + } +}; + +#define CONTENTS_EMPTY 0 + +#define CONTENTS_SOLID 0x1 +#define CONTENTS_WINDOW 0x2 +#define CONTENTS_SOLID_SURF 0x3 +#define CONTENTS_AUX 0x4 +#define CONTENTS_LIGHT_SURF 0x7 +#define CONTENTS_GRATE 0x8 +#define CONTENTS_SLIME 0x10 +#define CONTENTS_WATER 0x20 +#define CONTENTS_BLOCKLOS 0x40 +#define CONTENTS_OPAQUE 0x80 +#define LAST_VISIBLE_CONTENTS CONTENTS_OPAQUE + +#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1)) + +#define CONTENTS_TESTFOGVOLUME 0x100 +#define CONTENTS_UNUSED 0x200 +#define CONTENTS_BLOCKLIGHT 0x400 +#define CONTENTS_TEAM1 0x800 +#define CONTENTS_TEAM2 0x1000 +#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 +#define CONTENTS_MOVEABLE 0x4000 +#define CONTENTS_AREAPORTAL 0x8000 +#define CONTENTS_PLAYERCLIP 0x10000 +#define CONTENTS_MONSTERCLIP 0x20000 +#define CONTENTS_CURRENT_0 0x40000 +#define CONTENTS_CURRENT_90 0x80000 +#define CONTENTS_CURRENT_180 0x100000 +#define CONTENTS_CURRENT_270 0x200000 +#define CONTENTS_CURRENT_UP 0x400000 +#define CONTENTS_CURRENT_DOWN 0x800000 + +#define CONTENTS_ORIGIN 0x1000000 + +#define CONTENTS_MONSTER 0x2000000 +#define CONTENTS_DEBRIS 0x4000000 +#define CONTENTS_DETAIL 0x8000000 +#define CONTENTS_TRANSLUCENT 0x10000000 +#define CONTENTS_LADDER 0x20000000 +#define CONTENTS_HITBOX 0x40000000 + +#define SURF_LIGHT 0x0001 +#define SURF_SKY2D 0x0002 +#define SURF_SKY 0x0004 +#define SURF_WARP 0x0008 +#define SURF_TRANS 0x0010 +#define SURF_NOPORTAL 0x0020 +#define SURF_TRIGGER 0x0040 +#define SURF_NODRAW 0x0080 + +#define SURF_HINT 0x0100 + +#define SURF_SKIP 0x0200 +#define SURF_NOLIGHT 0x0400 +#define SURF_BUMPLIGHT 0x0800 +#define SURF_NOSHADOWS 0x1000 +#define SURF_NODECALS 0x2000 +#define SURF_NOPAINT SURF_NODECALS +#define SURF_NOCHOP 0x4000 +#define SURF_HITBOX 0x8000 + +// ----------------------------------------------------- +// spatial content masks - used for spatial queries (traceline,etc.) +// ----------------------------------------------------- +#define MASK_ALL (0xFFFFFFFF) +#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_NPCFLUID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER) +#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) +#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) +#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) +#define MASK_BLOCKLOS (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_BLOCKLOS) +#define MASK_BLOCKLOS_AND_NPCS (MASK_BLOCKLOS|CONTENTS_MONSTER) +#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) +#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) +#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) +#define MASK_SHOT_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_DEBRIS) +#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) +#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER) +#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) +#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) +#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) +#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) +#define MASK_NPCWORLDSTATIC_FLUID (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP) +#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) +#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN) +#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_GRATE) \ No newline at end of file diff --git a/cheat/gmod/IGameEventManager.hpp b/cheat/gmod/IGameEventManager.hpp new file mode 100644 index 0000000..f2e7c25 --- /dev/null +++ b/cheat/gmod/IGameEventManager.hpp @@ -0,0 +1,77 @@ +#pragma once +#include "util.hpp" + +class IGameEvent +{ +public: + const char* GetName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + int GetInt( const char* szKeyName, int nDefault = 0 ) { + return util::get_vfunc< 6, int >( this, szKeyName, nDefault ); + } + + float GetFloat( const char* name, float default_ = 0 ) { + return util::get_vfunc< 8, float >( this, name, default_ ); + } + + const char* GetString( const char* szKeyName ) { + return util::get_vfunc< 9, const char* >( this, szKeyName, 0 ); + } + + void SetString( const char* szKeyName, const char* szValue ) { + return util::get_vfunc< 16, void >( this, szKeyName, szValue ); + } +}; + +class IGameEventListener2 { +public: + virtual ~IGameEventListener2( void ) {}; + + // FireEvent is called by EventManager if event just occured + // KeyValue memory will be freed by manager if not needed anymore + virtual void FireGameEvent( IGameEvent* event ) = 0; + + virtual int GetEventDebugID( void ) = 0; +}; + +class IGameEventManager2 { +public: + virtual ~IGameEventManager2( void ) {}; + + // load game event descriptions from a file eg "resource\gameevents.res" + virtual int LoadEventsFromFile( const char* filename ) = 0; + + // removes all and anything + virtual void Reset( ) = 0; + + // adds a listener for a particular event + virtual bool AddListener( IGameEventListener2* listener, const char* name, bool bServerSide ) = 0; + + // returns true if this listener is listens to given event + virtual bool FindListener( IGameEventListener2* listener, const char* name ) = 0; + + // removes a listener + virtual void RemoveListener( IGameEventListener2* listener ) = 0; + + // create an event by name, but doesn't fire it. returns NULL is event is not + // known or no listener is registered for it. bForce forces the creation even if no listener is active + virtual IGameEvent* CreateEvent( const char* name, bool bForce = false, int* pCookie = nullptr ) = 0; + + // fires a server event created earlier, if bDontBroadcast is set, event is not send to clients + virtual bool FireEvent( IGameEvent* event, bool bDontBroadcast = false ) = 0; + + // fires an event for the local client only, should be used only by client code + virtual bool FireEventClientSide( IGameEvent* event ) = 0; + + // create a new copy of this event, must be free later + virtual IGameEvent* DuplicateEvent( IGameEvent* event ) = 0; + + // if an event was created but not fired for some reason, it has to bee freed, same UnserializeEvent + virtual void FreeEvent( IGameEvent* event ) = 0; + + // write/read event to/from bitbuffer + virtual bool SerializeEvent( IGameEvent* event, int* buf ) = 0; + virtual IGameEvent* UnserializeEvent( void* buf ) = 0; // create new KeyValues, must be deleted +}; \ No newline at end of file diff --git a/cheat/gmod/IMaterialSystem.hpp b/cheat/gmod/IMaterialSystem.hpp new file mode 100644 index 0000000..c9b9490 --- /dev/null +++ b/cheat/gmod/IMaterialSystem.hpp @@ -0,0 +1,163 @@ +#pragma once +#include "util.hpp" +#include "ISurface.hpp" + +using MaterialHandle_t = unsigned short; + +enum MaterialVarFlags_t { + MATERIAL_VAR_DEBUG = 1 << 0, + MATERIAL_VAR_NO_DEBUG_OVERRIDE = 1 << 1, + MATERIAL_VAR_NO_DRAW = 1 << 2, + MATERIAL_VAR_USE_IN_FILLRATE_MODE = 1 << 3, + + MATERIAL_VAR_VERTEXCOLOR = 1 << 4, + MATERIAL_VAR_VERTEXALPHA = 1 << 5, + MATERIAL_VAR_SELFILLUM = 1 << 6, + MATERIAL_VAR_ADDITIVE = 1 << 7, + MATERIAL_VAR_ALPHATEST = 1 << 8, + MATERIAL_VAR_MULTIPASS = 1 << 9, + MATERIAL_VAR_ZNEARER = 1 << 10, + MATERIAL_VAR_MODEL = 1 << 11, + MATERIAL_VAR_FLAT = 1 << 12, + MATERIAL_VAR_NOCULL = 1 << 13, + MATERIAL_VAR_NOFOG = 1 << 14, + MATERIAL_VAR_IGNOREZ = 1 << 15, + MATERIAL_VAR_DECAL = 1 << 16, + MATERIAL_VAR_ENVMAPSPHERE = 1 << 17, + MATERIAL_VAR_NOALPHAMOD = 1 << 18, + MATERIAL_VAR_ENVMAPCAMERASPACE = 1 << 19, + MATERIAL_VAR_BASEALPHAENVMAPMASK = 1 << 20, + MATERIAL_VAR_TRANSLUCENT = 1 << 21, + MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK = 1 << 22, + MATERIAL_VAR_NEEDS_SOFTWARE_SKINNING = 1 << 23, + MATERIAL_VAR_OPAQUETEXTURE = 1 << 24, + MATERIAL_VAR_ENVMAPMODE = 1 << 25, + MATERIAL_VAR_SUPPRESS_DECALS = 1 << 26, + MATERIAL_VAR_HALFLAMBERT = 1 << 27, + MATERIAL_VAR_WIREFRAME = 1 << 28, +}; + +class ITexture { +public: + int GetActualWidth( ) { + return util::get_vfunc< 3, int >( this ); + } + + int GetActualHeight( ) { + return util::get_vfunc< 4, int >( this ); + } +}; + +class IMaterial { +public: + auto GetName( ) { + return util::get_vfunc< 0, const char* >( this ); + } + + auto GetTextureGroupName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + void IncrementReferenceCount( ) { + return util::get_vfunc< 14, void >( this ); + } + + void AlphaModulate( float alpha ) { + return util::get_vfunc< 27, void >( this, alpha ); + } + + void ColorModulate( float r, float g, float b ) { + return util::get_vfunc< 28, void >( this, r, g, b ); + } + + void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ) { + return util::get_vfunc< 29, void >( this, flag, on ); + } + + bool GetMaterialVarFlag( MaterialVarFlags_t flag ) { + return util::get_vfunc< 30, bool >( this, flag ); + } + + auto GetAlphaModulation( ) { + return util::get_vfunc< 44, float >( this ); + } + + void GetColorModulate( float* r, float* g, float* b ) { + return util::get_vfunc< 45, void >( this, r, g, b ); + } + + void Refresh( ) { + return util::get_vfunc< 37, void >( this ); + } +}; + +class IMaterialSystem +{ +public: + enum RenderTargetSizeMode_t { + RT_SIZE_NO_CHANGE = 0, // Only allowed for render targets that don't want a depth buffer + // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer). + RT_SIZE_DEFAULT = 1, // Don't play with the specified width and height other than making sure it fits in the framebuffer. + RT_SIZE_PICMIP = 2, // Apply picmip to the render target's width and height. + RT_SIZE_HDR = 3, // frame_buffer_width / 4 + RT_SIZE_FULL_FRAME_BUFFER = 4, // Same size as frame buffer, or next lower power of 2 if we can't do that. + RT_SIZE_OFFSCREEN = 5, // Target of specified size, don't mess with dimensions + RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP = 6 // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. + }; + + enum MaterialRenderTargetDepth_t { + MATERIAL_RT_DEPTH_SHARED = 0x0, + MATERIAL_RT_DEPTH_SEPARATE = 0x1, + MATERIAL_RT_DEPTH_NONE = 0x2, + MATERIAL_RT_DEPTH_ONLY = 0x3, + }; + + ImageFormat GetBackBufferFormat( ) { + return util::get_vfunc< 36, ImageFormat >( this ); + } + + IMaterial* CreateMaterial( const char* pMaterialName, void* pVMTKeyValues ) { + return util::get_vfunc< 83, IMaterial* >( this, pMaterialName, pVMTKeyValues ); + } + + IMaterial* FindMaterial( const char* pMaterialName, const char* pTextureGroupName = "Model textures", bool complain = true, const char* pComplainPrefix = nullptr ) { + return util::get_vfunc< 84, IMaterial* >( this, pMaterialName, pTextureGroupName, complain, pComplainPrefix ); + } + + MaterialHandle_t FirstMaterial( ) { + return util::get_vfunc< 86, MaterialHandle_t >( this ); + } + + MaterialHandle_t NextMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 87, MaterialHandle_t >( this, h ); + } + + MaterialHandle_t InvalidMaterial( ) { + return util::get_vfunc< 88, MaterialHandle_t >( this ); + } + + IMaterial* GetMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 89, IMaterial* >( this, h ); + } + + void BeginRenderTargetAllocation( ) { + return util::get_vfunc< 94, void >( this ); + } + + void EndRenderTargetAllocation( ) { + return util::get_vfunc< 95, void >( this ); + } + + ITexture* CreateNamedRenderTargetTextureEx( const char* name, int w, int h, RenderTargetSizeMode_t sizeMode, + ImageFormat format, MaterialRenderTargetDepth_t depth ) + { + const int textureFlags = 0x4 | 0x8; //TEXTUREFLAGS_CLAMPS, TEXTUREFLAGS_CLAMPT + const int renderTargetFlags = 0x1; //CREATERENDERTARGETFLAGS_HDR + return util::get_vfunc< 97, ITexture* >( this, name, w, h, sizeMode, format, depth, textureFlags, renderTargetFlags ); + } + + /*void* GetRenderContext( ) { + typedef IMatRenderContext*( __thiscall* GetRenderContextFn )( void* ); + return CallVFunction( this, 115 )( this ); + }*/ +}; \ No newline at end of file diff --git a/cheat/gmod/IMemAlloc.hpp b/cheat/gmod/IMemAlloc.hpp new file mode 100644 index 0000000..2ad76be --- /dev/null +++ b/cheat/gmod/IMemAlloc.hpp @@ -0,0 +1,79 @@ +#pragma once + +typedef size_t( *MemAllocFailHandler_t )( size_t ); + +class IMemAlloc { +public: + // Release versions + virtual void *Alloc( size_t nSize ) = 0; + virtual void *Realloc( void *pMem, size_t nSize ) = 0; + virtual void Free( void *pMem ) = 0; + virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize ) = 0; + + // Debug versions + virtual void *Alloc( size_t nSize, const char *pFileName, int nLine ) = 0; + virtual void *Realloc( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; + virtual void Free( void *pMem, const char *pFileName, int nLine ) = 0; + virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; + + // Returns size of a particular allocation + virtual size_t GetSize( void *pMem ) = 0; + + // Force file + line information for an allocation + virtual void PushAllocDbgInfo( const char *pFileName, int nLine ) = 0; + virtual void PopAllocDbgInfo( ) = 0; + + // FIXME: Remove when we have our own allocator + // these methods of the Crt debug code is used in our codebase currently + virtual long CrtSetBreakAlloc( long lNewBreakAlloc ) = 0; + virtual int CrtSetReportMode( int nReportType, int nReportMode ) = 0; + virtual int CrtIsValidHeapPointer( const void *pMem ) = 0; + virtual int CrtIsValidPointer( const void *pMem, unsigned int size, int access ) = 0; + virtual int CrtCheckMemory( void ) = 0; + virtual int CrtSetDbgFlag( int nNewFlag ) = 0; + virtual void CrtMemCheckpoint( void *pState ) = 0; + + // FIXME: Make a better stats interface + virtual void DumpStats( ) = 0; + virtual void DumpStatsFileBase( char const *pchFileBase ) = 0; + + // FIXME: Remove when we have our own allocator + virtual void* CrtSetReportFile( int nRptType, void* hFile ) = 0; + virtual void* CrtSetReportHook( void* pfnNewHook ) = 0; + virtual int CrtDbgReport( int nRptType, const char * szFile, + int nLine, const char * szModule, const char * pMsg ) = 0; + + virtual int heapchk( ) = 0; + + virtual bool IsDebugHeap( ) = 0; + + virtual void GetActualDbgInfo( const char *&pFileName, int &nLine ) = 0; + virtual void RegisterAllocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; + virtual void RegisterDeallocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; + + virtual int GetVersion( ) = 0; + + virtual void CompactHeap( ) = 0; + + // Function called when malloc fails or memory limits hit to attempt to free up memory (can come in any thread) + virtual MemAllocFailHandler_t SetAllocFailHandler( MemAllocFailHandler_t pfnMemAllocFailHandler ) = 0; + + virtual void DumpBlockStats( void * ) = 0; + +#if defined( _MEMTEST ) + virtual void SetStatsExtraInfo( const char *pMapName, const char *pComment ) = 0; +#endif + + // Returns 0 if no failure, otherwise the size_t of the last requested chunk + // "I'm sure this is completely thread safe!" Brian Deen 7/19/2012. + virtual size_t MemoryAllocFailed( ) = 0; + + // handles storing allocation info for coroutines + virtual unsigned GetDebugInfoSize( ) = 0; + virtual void SaveDebugInfo( void *pvDebugInfo ) = 0; + virtual void RestoreDebugInfo( const void *pvDebugInfo ) = 0; + virtual void InitDebugInfo( void *pvDebugInfo, const char *pchRootFileName, int nLine ) = 0; + + // Replacement for ::GlobalMemoryStatus which accounts for unused memory in our system + virtual void GlobalMemoryStatus( size_t *pUsedMemory, size_t *pFreeMemory ) = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IPanel.hpp b/cheat/gmod/IPanel.hpp new file mode 100644 index 0000000..8b66fb1 --- /dev/null +++ b/cheat/gmod/IPanel.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "util.hpp" + +class IPanel { +public: + const char* GetName( int panel ) { + using fn = const char* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 36 )( this, panel ); + } + + void SetMouseInputEnabled( unsigned int panel, bool enable ) { + return util::get_vfunc< 32, void >( this, panel, enable ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IPhysicsSurfaceProps.hpp b/cheat/gmod/IPhysicsSurfaceProps.hpp new file mode 100644 index 0000000..d7003f2 --- /dev/null +++ b/cheat/gmod/IPhysicsSurfaceProps.hpp @@ -0,0 +1,79 @@ +#pragma once + +struct surfacephysicsparams_t { + // vphysics physical properties + float friction; + float elasticity; // collision elasticity - used to compute coefficient of restitution + float density; // physical density (in kg / m^3) + float thickness; // material thickness if not solid (sheet materials) in inches + float dampening; +}; + +struct surfaceaudioparams_t { + float reflectivity; // like elasticity, but how much sound should be reflected by this surface + float hardnessFactor; // like elasticity, but only affects impact sound choices + float roughnessFactor; // like friction, but only affects scrape sound choices + float roughThreshold; // surface roughness > this causes "rough" scrapes, < this causes "smooth" scrapes + float hardThreshold; // surface hardness > this causes "hard" impacts, < this causes "soft" impacts + float hardVelocityThreshold; // collision velocity > this causes "hard" impacts, < this causes "soft" impacts + float highPitchOcclusion; //a value betweeen 0 and 100 where 0 is not occluded at all and 100 is silent (except for any additional reflected sound) + float midPitchOcclusion; + float lowPitchOcclusion; +}; + +struct surfacesoundnames_t { + unsigned short walkStepLeft; + unsigned short walkStepRight; + unsigned short runStepLeft; + unsigned short runStepRight; + unsigned short impactSoft; + unsigned short impactHard; + unsigned short scrapeSmooth; + unsigned short scrapeRough; + unsigned short bulletImpact; + unsigned short rolling; + unsigned short breakSound; + unsigned short strainSound; +}; + +struct surfacegameprops_t { + float maxspeedfactor; + float jumpfactor; + float penetrationmodifier; + float damagemodifier; + uint16_t material; + uint8_t climbable; +}; + +struct surfacedata_t { + surfacephysicsparams_t physics; // physics parameters + surfaceaudioparams_t audio; // audio parameters + surfacesoundnames_t sounds; // names of linked sounds + surfacegameprops_t game; // Game data / properties +}; + +class IPhysicsSurfaceProps +{ +public: + virtual ~IPhysicsSurfaceProps( void ) {} + + // parses a text file containing surface prop keys + virtual int ParseSurfaceData( const char* pFilename, const char* pTextfile ) = 0; + // current number of entries in the database + virtual int SurfacePropCount( void ) const = 0; + + virtual int GetSurfaceIndex( const char* pSurfacePropName ) const = 0; + virtual void GetPhysicsProperties( int surfaceDataIndex, float* density, float* thickness, float* friction, float* elasticity ) const = 0; + + virtual surfacedata_t* GetSurfaceData( int surfaceDataIndex ) = 0; + virtual const char* GetString( unsigned short stringTableIndex ) const = 0; + + virtual const char* GetPropName( int surfaceDataIndex ) const = 0; + + // sets the global index table for world materials + // UNDONE: Make this per-CPhysCollide + virtual void SetWorldMaterialIndexTable( int* pMapArray, int mapSize ) = 0; + + // NOTE: Same as GetPhysicsProperties, but maybe more convenient + //virtual void GetPhysicsParameters(int surfaceDataIndex, surfacephysicsparams_t* pParamsOut) const = 0; +}; \ No newline at end of file diff --git a/cheat/gmod/IPrediction.hpp b/cheat/gmod/IPrediction.hpp new file mode 100644 index 0000000..575e270 --- /dev/null +++ b/cheat/gmod/IPrediction.hpp @@ -0,0 +1,129 @@ +#pragma once +#include "vector.hpp" + +//forward declarations +class user_cmd_t; +class IClientEntity; + +class IMoveHelper { +private: + virtual void UnknownVirtual( ) = 0; +public: + virtual void SetHost( IClientEntity* host ) = 0; +}; + +class CMoveData { +public: + bool m_bFirstRunOfFunctions : 1; + bool m_bGameCodeMovedPlayer : 1; + bool m_bNoAirControl : 1; + + unsigned long m_nPlayerHandle; + int m_nImpulseCommand; + vec3_t m_vecViewAngles; + vec3_t m_vecAbsViewAngles; + int m_nButtons; + int m_nOldButtons; + float m_flForwardMove; + float m_flSideMove; + float m_flUpMove; + + float m_flMaxSpeed; + float m_flClientMaxSpeed; + + vec3_t m_vecVelocity; + vec3_t m_vecOldVelocity; + float somefloat; + vec3_t m_vecAngles; + vec3_t m_vecOldAngles; + + float m_outStepHeight; + vec3_t m_outWishVel; + vec3_t m_outJumpVel; + + vec3_t m_vecConstraintCenter; + float m_flConstraintRadius; + float m_flConstraintWidth; + float m_flConstraintSpeedFactor; + bool m_bConstraintPastRadius; + + void SetAbsOrigin( const vec3_t& vec ); + const vec3_t& GetAbsOrigin( ) const; + +private: + vec3_t m_vecAbsOrigin; // edict::origin + uint8_t pad_ending_001[0x160]; +}; + +class ICSGameMovement { +public: + void ProcessMovement( IClientEntity* ent, void* data ) { + using fn = void( __thiscall* )( void*, IClientEntity*, void* ); + return util::get_vfunc< fn >( this, 1 )( this, ent, data ); + } + + void StartTrackPredictionErrors( IClientEntity* ent ) { + using fn = void( __thiscall* )( void*, IClientEntity* ); + return util::get_vfunc< fn >( this, 2 )( this, ent ); + } + + void FinishTrackPredictionErrors( IClientEntity* ent ) { + using fn = void( __thiscall* )( void*, IClientEntity* ); + return util::get_vfunc< fn >( this, 3 )( this, ent ); + } +}; + +class IPrediction { +public: + virtual ~IPrediction( ) { }; + + virtual void Init( ) = 0; + virtual void Shutdown( ) = 0; + + // Run prediction + virtual void Update + ( + int startframe, // World update ( un-modded ) most recently received + bool validframe, // Is frame data valid + int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) + int outgoing_command // Last command (most recent) sent to server (un-modded) + ) = 0; + + // We are about to get a network update from the server. We know the update #, so we can pull any + // data purely predicted on the client side and transfer it to the new from data state. + virtual void PreEntityPacketReceived( int commands_acknowledged, int current_world_update_packet ) = 0; + virtual void PostEntityPacketReceived( ) = 0; + virtual void PostNetworkDataReceived( int commands_acknowledged ) = 0; + + virtual void OnReceivedUncompressedPacket( ) = 0; + + // The engine needs to be able to access a few predicted values + virtual void GetViewOrigin( vec3_t& org ) = 0; + virtual void SetViewOrigin( vec3_t& org ) = 0; + virtual void GetViewAngles( vec3_t& ang ) = 0; + virtual void SetViewAngles( vec3_t& ang ) = 0; + virtual void GetLocalViewAngles( vec3_t& ang ) = 0; + virtual void SetLocalViewAngles( vec3_t& ang ) = 0; + + virtual bool InPrediction( ) const = 0; + virtual bool IsFirstTimePredicted( ) const = 0; + + virtual int GetIncomingPacketNumber( ) const = 0; + + virtual void RunCommand( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *moveHelper ) = 0; + + virtual void SetupMove( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *pHelper, CMoveData *move ) = 0; + virtual void FinishMove( IClientEntity *player, user_cmd_t *ucmd, CMoveData *move ) = 0; + virtual void SetIdealPitch( int nSlot, IClientEntity *player, const vec3_t& origin, const vec3_t& angles, const vec3_t& viewheight ) = 0; + + virtual void CheckError( int nSlot, IClientEntity *player, int commands_acknowledged ) = 0; + + virtual void _Update + ( + int nSlot, + bool received_new_world_update, + bool validframe, // Is frame data valid + int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) + int outgoing_command // Last command (most recent) sent to server (un-modded) + ) = 0; +}; diff --git a/cheat/gmod/ISurface.hpp b/cheat/gmod/ISurface.hpp new file mode 100644 index 0000000..5756191 --- /dev/null +++ b/cheat/gmod/ISurface.hpp @@ -0,0 +1,117 @@ +#pragma once +#include "IAppSystem.hpp" +#include "vector.hpp" +#include "color.hpp" + +enum FontDrawType_t { + FONT_DRAW_DEFAULT = 0, + FONT_DRAW_NONADDITIVE, + FONT_DRAW_ADDITIVE, + FONT_DRAW_TYPE_COUNT = 2, +}; + +enum FontFlags_t { + FONTFLAG_NONE, + FONTFLAG_ITALIC = 0x001, + FONTFLAG_UNDERLINE = 0x002, + FONTFLAG_STRIKEOUT = 0x004, + FONTFLAG_SYMBOL = 0x008, + FONTFLAG_ANTIALIAS = 0x010, + FONTFLAG_GAUSSIANBLUR = 0x020, + FONTFLAG_ROTARY = 0x040, + FONTFLAG_DROPSHADOW = 0x080, + FONTFLAG_ADDITIVE = 0x100, + FONTFLAG_OUTLINE = 0x200, + FONTFLAG_CUSTOM = 0x400, + FONTFLAG_BITMAP = 0x800, +}; + +enum ImageFormat { + IMAGE_FORMAT_UNKNOWN = -1, + IMAGE_FORMAT_RGBA8888 = 0, + IMAGE_FORMAT_ABGR8888, + IMAGE_FORMAT_RGB888, + IMAGE_FORMAT_BGR888, + IMAGE_FORMAT_RGB565, + IMAGE_FORMAT_I8, + IMAGE_FORMAT_IA88, + IMAGE_FORMAT_P8, + IMAGE_FORMAT_A8, + IMAGE_FORMAT_RGB888_BLUESCREEN, + IMAGE_FORMAT_BGR888_BLUESCREEN, + IMAGE_FORMAT_ARGB8888, + IMAGE_FORMAT_BGRA8888, + IMAGE_FORMAT_DXT1, + IMAGE_FORMAT_DXT3, + IMAGE_FORMAT_DXT5, + IMAGE_FORMAT_BGRX8888, + IMAGE_FORMAT_BGR565, + IMAGE_FORMAT_BGRX5551, + IMAGE_FORMAT_BGRA4444, + IMAGE_FORMAT_DXT1_ONEBITALPHA, + IMAGE_FORMAT_BGRA5551, + IMAGE_FORMAT_UV88, + IMAGE_FORMAT_UVWQ8888, + IMAGE_FORMAT_RGBA16161616F, + IMAGE_FORMAT_RGBA16161616, + IMAGE_FORMAT_UVLX8888, + IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point + IMAGE_FORMAT_RGB323232F, + IMAGE_FORMAT_RGBA32323232F, + + // Depth-stencil texture formats for shadow depth mapping + IMAGE_FORMAT_NV_DST16, // + IMAGE_FORMAT_NV_DST24, // + IMAGE_FORMAT_NV_INTZ, // Vendor-specific depth-stencil texture + IMAGE_FORMAT_NV_RAWZ, // formats for shadow depth mapping + IMAGE_FORMAT_ATI_DST16, // + IMAGE_FORMAT_ATI_DST24, // + IMAGE_FORMAT_NV_NULL, // Dummy format which takes no video memory + + // Compressed normal map formats + IMAGE_FORMAT_ATI2N, // One-surface ATI2N / DXN format + IMAGE_FORMAT_ATI1N, // Two-surface ATI1N format + + NUM_IMAGE_FORMATS +}; + +struct vertex_t { + vertex_t( ) {} + + vertex_t( const vec2_t& pos, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = pos; + m_tex_coord = coord; + } + + void init( float x, float y, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = vec2_t( x, y ); + m_tex_coord = coord; + } + + vec2_t m_position; + vec2_t m_tex_coord; +}; + +using HFont = unsigned long; +using VPANEL = unsigned long; +class IntRect; +class IHTMLEvents; +class IHTML; +using HCursor = unsigned long; +using HTexture = unsigned long; +class CharRenderInfo; +class IVguiMatInfo; +class IImage; +class DrawTexturedRectParms_t; +class IHTMLChromeController; + +class ISurface : public IAppSystem { +public: + void SetCursorAlwaysVisible( bool state ) { + return util::get_vfunc< 52, void >( this, state ); + } + + void UnlockCursor( ) { + return util::get_vfunc< 61, void >( this ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IVEngineClient.hpp b/cheat/gmod/IVEngineClient.hpp new file mode 100644 index 0000000..4357dc2 --- /dev/null +++ b/cheat/gmod/IVEngineClient.hpp @@ -0,0 +1,259 @@ +#pragma once +#include +#include + +#include "util.hpp" +#include "vector.hpp" + +//using matrix3x4 = float[ 3 ][ 4 ]; + +struct VMatrix +{ + float m_matrix[ 4 ][ 4 ]; + + float* operator[]( int i ) { + return m_matrix[ i ]; + } + + const float* operator[]( int i ) const { + return m_matrix[ i ]; + } +}; + +struct matrix3x4 +{ + float m_matrix[ 3 ][ 4 ]; + + matrix3x4( ) = default; + + matrix3x4( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23 ) { + m_matrix[ 0 ][ 0 ] = m00; m_matrix[ 0 ][ 1 ] = m01; m_matrix[ 0 ][ 2 ] = m02; m_matrix[ 0 ][ 3 ] = m03; + m_matrix[ 1 ][ 0 ] = m10; m_matrix[ 1 ][ 1 ] = m11; m_matrix[ 1 ][ 2 ] = m12; m_matrix[ 1 ][ 3 ] = m13; + m_matrix[ 2 ][ 0 ] = m20; m_matrix[ 2 ][ 1 ] = m21; m_matrix[ 2 ][ 2 ] = m22; m_matrix[ 2 ][ 3 ] = m23; + } + + float* operator[]( int i ) { + return m_matrix[ i ]; + } + + const float* operator[]( int i ) const { + return m_matrix[ i ]; + } +}; + + +typedef struct player_info_s { + char name[ 32 ];//32 + int m_userid; + char m_steamid[ 33 ];//32 + unsigned m_friendId; + char m_friendsname[ 32 ]; + bool m_isfakeplayer; + bool m_ishltv; + uint32_t m_customfiles[ 4 ]; + uint8_t m_filesdownloaded; +} player_info_t; + +class INetChannelInfo { +public: + enum + { + GENERIC = 0, // must be first and is default group + LOCALPLAYER, // bytes for local player entity update + OTHERPLAYERS, // bytes for other players update + ENTITIES, // all other entity bytes + SOUNDS, // game sounds + EVENTS, // event messages + TEMPENTS, // temp entities + USERMESSAGES, // user messages + ENTMESSAGES, // entity messages + VOICE, // voice data + STRINGTABLE, // a stringtable update + MOVE, // client move cmds + STRINGCMD, // string command + SIGNON, // various signondata + TOTAL, // must be last and is not a real group + }; + + virtual const char* GetName( ) const = 0; // get channel name + virtual const char* GetAddress( ) const = 0; // get channel IP address as string + virtual float GetTime( ) const = 0; // current net time + virtual float GetTimeConnected( ) const = 0; // get connection time in seconds + virtual int GetBufferSize( ) const = 0; // netchannel packet history size + virtual int GetDataRate( ) const = 0; // send data rate in byte/sec + + virtual bool IsLoopback( ) const = 0; // true if loopback channel + virtual bool IsTimingOut( ) const = 0; // true if timing out + virtual bool IsPlayback( ) const = 0; // true if demo playback + + virtual float GetLatency( int flow ) const = 0; // current latency (RTT), more accurate but jittering + virtual float GetAvgLatency( int flow ) const = 0; // average packet latency in seconds + virtual float GetAvgLoss( int flow ) const = 0; // avg packet loss[0..1] + virtual float GetAvgChoke( int flow ) const = 0; // avg packet choke[0..1] + virtual float GetAvgData( int flow ) const = 0; // data flow in bytes/sec + virtual float GetAvgPackets( int flow ) const = 0; // avg packets/sec + virtual int GetTotalData( int flow ) const = 0; // total flow in/out in bytes + virtual int GetTotalPackets( int flow ) const = 0; + virtual int GetSequenceNr( int flow ) const = 0; // last send seq number + virtual bool IsValidPacket( int flow, int frame_number ) const = 0; // true if packet was not lost/dropped/chocked/flushed + virtual float GetPacketTime( int flow, int frame_number ) const = 0; // time when packet was send + virtual int GetPacketBytes( int flow, int frame_number, int group ) const = 0; // group size of this packet + virtual bool GetStreamProgress( int flow, int* received, int* total ) const = 0; // TCP progress if transmitting + virtual float GetTimeSinceLastReceived( ) const = 0; // get time since last recieved packet in seconds + virtual float GetCommandInterpolationAmount( int flow, int frame_number ) const = 0; + virtual void GetPacketResponseLatency( int flow, int frame_number, int* pnLatencyMsecs, int* pnChoke ) const = 0; + virtual void GetRemoteFramerate( float* pflFrameTime, float* pflFrameTimeStdDeviation ) const = 0; + + virtual float GetTimeoutSeconds( ) const = 0; +}; + +class INetChannel { +public: + char pad_0000[ 20 ]; //0x0000 + bool m_bProcessingMessages; //0x0014 + bool m_bShouldDelete; //0x0015 + char pad_0016[ 2 ]; //0x0016 + int32_t m_nOutSequenceNr; //0x0018 last send outgoing sequence number + int32_t m_nInSequenceNr; //0x001C last received incoming sequnec number + int32_t m_nOutSequenceNrAck; //0x0020 last received acknowledge outgoing sequnce number + int32_t m_nOutReliableState; //0x0024 state of outgoing reliable data (0/1) flip flop used for loss detection + int32_t m_nInReliableState; //0x0028 state of incoming reliable data + int32_t m_nChokedPackets; //0x002C number of choked packets + char pad_0030[ 1044 ]; //0x0030 + + bool transmit( bool only_reliable ) { + return util::get_vfunc< 49, bool >( this, only_reliable ); + } +}; //Size: 0x0444 + +struct INetMessage { + virtual ~INetMessage( ); +}; + +template +class CNetMessagePB : public INetMessage, public T {}; + +class CCLCMsg_Move { +private: + char __PAD0[ 0x8 ]; +public: + int numBackupCommands; + int numNewCommands; +}; + +using CCLCMsg_Move_t = CNetMessagePB; + +class CClientState { +public: + char pad0[ 0x9C ]; + INetChannel* netchannel; + char pad1[ 0xD4 ]; + int32_t m_nDeltaTick; //0x174 + char pad2[ 0x4B34 ]; + float m_frameTime; + int32_t lastoutgoingcommand; + int32_t chokedcommands; + int32_t last_command_ack; +}; + +class CGlobalState { +public: + uintptr_t* m_manager; + CClientState *m_def_clientstate; + + __forceinline CClientState* get_client_state( ) { + return m_def_clientstate; + } +}; + +class IVEngineClient +{ +public: + void GetScreenSize( int& width, int& height ) { + using fn = void( __thiscall* )( void*, int&, int& ); + return util::get_vfunc< fn >( this, 5 )( this, width, height ); + } + + void ClientCmd( const char* szCommandString ) { + std::string command( szCommandString ); + std::replace( command.begin( ), command.end( ), ';', ':' ); + std::replace( command.begin( ), command.end( ), '"', '*' ); + using fn = void( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 7 )( this, command.c_str( ) ); + } + + void ClientCmd_Unrestricted( const char* szCommandString ) { + std::string command( szCommandString ); + std::replace( command.begin( ), command.end( ), ';', ':' ); + std::replace( command.begin( ), command.end( ), '"', '*' ); + using fn = void( __thiscall* )( void*, const char*, const char* ); + return util::get_vfunc< fn >( this, 114 )( this, command.c_str( ), nullptr ); + } + + bool GetPlayerInfo( int index, player_info_t* pInfo ) { + using fn = bool( __thiscall* )( void*, int, player_info_t* ); + return util::get_vfunc< fn >( this, 8 )( this, index, pInfo ); + } + + int GetPlayerForUserID( int UserID ) { + using fn = int( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 9 )( this, UserID ); + } + + int GetLocalPlayer( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 12 )( this ); + } + + float Time( ) { + using fn = float( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 14 )( this ); + } + + void GetViewAngles( vec3_t& ang ) { + using fn = void( __thiscall* )( void*, vec3_t& ); + return util::get_vfunc< fn >( this, 19 )( this, ang ); + } + + void SetViewAngles( vec3_t& ang ) { + using fn = void( __thiscall* )( void*, vec3_t& ); + return util::get_vfunc< fn >( this, 20 )( this, ang ); + } + + int GetMaxClients( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 21 )( this ); + } + + bool IsInGame( ) { + using fn = bool( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 26 )( this ); + } + + bool IsConnected( ) { + using fn = bool( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 27 )( this ); + } + + bool IsPaused( ) { + return util::get_vfunc< 91, bool >( this ); + } + + const VMatrix& WorldToScreenMatrix( ) { + using fn = const VMatrix& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 36 )( this ); + } + + const char* GetLevelName( ) { + using fn = const char* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 52 )( this ); + } + + INetChannelInfo* GetNetChannelInfo( ) { + using fn = INetChannelInfo* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 72 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IVModelInfoClient.hpp b/cheat/gmod/IVModelInfoClient.hpp new file mode 100644 index 0000000..957c6d9 --- /dev/null +++ b/cheat/gmod/IVModelInfoClient.hpp @@ -0,0 +1,134 @@ +#pragma once +#include "IVEngineClient.hpp" +#include "IClientEntityList.hpp" + +struct DrawModelState_t; + +struct mstudiobbox_t +{ + int bone; + int group; + vec3_t min; + vec3_t max; + int szhitboxnameindex; + + const char* get_name( ) { + if( szhitboxnameindex == 0 ) + return ""; + + return ( ( const char* )this ) + szhitboxnameindex; + } + + int unused[ 8 ]; +}; + +struct mstudiobone_t +{ + int sznameindex; + inline char * const get_name( void ) const { return ( ( char * )this ) + sznameindex; } + int parent; + char pad01[ 152 ]; + int flags; + char pad02[ 52 ]; +}; + +struct mstudiohitboxset_t +{ + int sznameindex; + inline char * const get_name( void ) const { return ( ( char * )this ) + sznameindex; } + int numhitboxes; + int hitboxindex; + inline mstudiobbox_t *get_hitbox( int i ) const { return ( mstudiobbox_t * )( ( ( unsigned char * )this ) + hitboxindex ) + i; }; +}; + +struct studiohdr_t +{ + char pad00[ 12 ]; + char name[ 64 ]; + char pad01[ 80 ]; + int numbones; + int boneIndex; + inline mstudiobone_t *get_bone( int i ) { return ( mstudiobone_t * )( ( ( unsigned char* )this ) + boneIndex ) + i; } + char pad02[ 8 ]; + int numhitboxsets; + int hitboxsetindex; + + mstudiohitboxset_t* get_hitbox_set( int i ) { + return ( mstudiohitboxset_t * )( ( ( char * )this ) + hitboxsetindex ) + i; + } + + char pad03[ 24 ]; + int numtextures; + inline mstudiobbox_t* get_hit_box( int index ) { return ( ( mstudiohitboxset_t* )( ( unsigned char* )this + hitboxsetindex ) )->get_hitbox( index ); } +}; + +struct ModelRenderInfo_t { + vec3_t m_origin; + vec3_t m_angles; + char pad[ 0x4 ]; + void* m_renderable; + const model_t* m_model; + const matrix3x4* m_model2world; + const matrix3x4* m_light_offset; + const vec3_t* m_light_origin; + int m_flags; + int m_entity_index; + int m_skin; + int m_body; + int m_hitboxset; + uint16_t* m_instance; + + ModelRenderInfo_t( ) { + m_model2world = nullptr; + m_light_offset = nullptr; + m_light_origin = nullptr; + } +}; + +class IVModelInfoClient { +public: + model_t* GetModel( int index ) { + using fn = model_t*( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 1 )( this, index ); + } + + int GetModelIndex( const char* name ) { + using fn = int( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 2 )( this, name ); + } + + const char* GetModelName( const model_t* model ) { + using fn = const char* ( __thiscall* )( void*, const model_t* ); + return util::get_vfunc< fn >( this, 3 )( this, model ); + } + + studiohdr_t* GetStudiomodel( const model_t* mod ) { + using fn = studiohdr_t* ( __thiscall* )( void*, const model_t* ); + return util::get_vfunc< fn >( this, 28 )( this, mod ); + } + + void GetModelMaterials( const model_t *model, int count, class IMaterial** ppMaterial ) { + using fn = const void( __thiscall* )( void*, const model_t*, int, IMaterial** ); + util::get_vfunc< fn >( this, 16 )( this, model, count, ppMaterial ); + } +}; + +enum OverrideType_t { + OVERRIDE_NORMAL = 0, + OVERRIDE_BUILD_SHADOWS, + OVERRIDE_DEPTH_WRITE, + OVERRIDE_SSAO_DEPTH_WRITE, +}; + +class IVModelRender { +public: + void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) { + using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int ); + return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk ); + } + + void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) { + using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + util::get_vfunc< fn >( this, 21 )( this, matctx, state, pInfo, pCustomBoneToWorld ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/IVRenderView.hpp b/cheat/gmod/IVRenderView.hpp new file mode 100644 index 0000000..fef45ae --- /dev/null +++ b/cheat/gmod/IVRenderView.hpp @@ -0,0 +1,21 @@ +#pragma once +#include "util.hpp" + +class IVRenderView { +public: + void SetBlend( float blend ) { + return util::get_vfunc< 4, void >( this, blend ); + } + + float GetBlend( ) { + return util::get_vfunc< 5, float >( this ); + } + + void SetColorModulation( float const* blend ) { + return util::get_vfunc< 6, void >( this, blend ); + } + + void GetColorModulation( float* blend ) { + return util::get_vfunc< 7, void >( this, blend ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/KeyValues.cpp b/cheat/gmod/KeyValues.cpp new file mode 100644 index 0000000..265cfd8 --- /dev/null +++ b/cheat/gmod/KeyValues.cpp @@ -0,0 +1,50 @@ +#include "KeyValues.hpp" +#include "pattern.hpp" +#include "interface.hpp" + +int IKeyValuesSystem::GetSymbolForString( const char* str, bool create ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 83 EC 0C 53 8B 5D 08 57" ) ); + using fn = int( __thiscall* )( void*, const char*, bool ); + + int symbol = ( ( fn )( offset ) )( this, str, create ); + printf( "%s: %d\n", str, symbol ); + return symbol; +} + +const char* IKeyValuesSystem::GetStringForSymbol( int symbol ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 8B 55 08 83 FA FF" ) ); + using fn = const char*( __thiscall* )( void*, int ); + + auto result = ( ( fn )( offset ) )( this, symbol ); + printf( "%d: %d\n", symbol, *( int* )( &result ) ); + + return result; +} + +KeyValues::KeyValues( const char* setName ) { + static bool inc{ }; + static auto key_values_fn = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "68 ? ? ? ? 8B C8 E8 ? ? ? ? 89 45 FC EB 07 C7 45 ? ? ? ? ? 8B 03 56" ) ) + 7; + if ( !inc ) { + key_values_fn += *reinterpret_cast< uintptr_t* >( key_values_fn + 1 ) + 5; + inc = true; + } + + reinterpret_cast< void( __thiscall* )( KeyValues*, const char* ) >( key_values_fn )( this, setName ); +} + +bool KeyValues::LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem, const char *pPathID, bool( *unknown )( const char* ) ) { + static auto load_from_buffer = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 34 53 8B 5D 0C 89 4C 24 04" ) ); + return reinterpret_cast< bool( __thiscall* )( KeyValues*, const char*, const char*, void*, const char*, bool( *)( const char* ) ) >( load_from_buffer ) + ( this, resourceName, pBuffer, pFileSystem, pPathID, unknown ); +} + +KeyValues* KeyValues::FindKey( const char* name ) { + auto key = g_gmod.m_keyvalues->GetSymbolForString( name, false ); + for( auto dat = m_pSub; !!dat; dat = dat->m_pPeer ) { + if( dat->m_iKeyName == key ) { + return dat; + } + } + + return nullptr; +} \ No newline at end of file diff --git a/cheat/gmod/KeyValues.hpp b/cheat/gmod/KeyValues.hpp new file mode 100644 index 0000000..0b11698 --- /dev/null +++ b/cheat/gmod/KeyValues.hpp @@ -0,0 +1,38 @@ +#pragma once +#include "util.hpp" + +class IKeyValuesSystem { +public: + int GetSymbolForString( const char* string, bool create ); + const char* GetStringForSymbol( int symbol ); +}; + +class KeyValues +{ +public: + KeyValues( const char *setName ); + bool LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem = nullptr, const char *pPathID = nullptr, bool( *unknown )( const char* ) = nullptr ); + + int m_iKeyName; + + char *m_sValue; + wchar_t *m_wsValue; + + // we don't delete these + union { + int m_iValue; + float m_flValue; + void *m_pValue; + unsigned char m_Color[ 4 ]; + }; + + char m_iDataType; + char m_bHasEscapeSequences; + char m_bEvaluateConditionals; + + KeyValues* FindKey( const char* key_name ); + + KeyValues *m_pPeer; // pointer to next key in list + KeyValues *m_pSub; // pointer to Start of a new sub key list + KeyValues *m_pChain;// Search here if it's not in our list +}; \ No newline at end of file diff --git a/cheat/gmod/Source.cpp b/cheat/gmod/Source.cpp new file mode 100644 index 0000000..6c8d000 --- /dev/null +++ b/cheat/gmod/Source.cpp @@ -0,0 +1,187 @@ +//this cheat was a mistake + +#include +#include + +#include "hooks.hpp" +#include "console.hpp" +#include "input_system.hpp" +#include "mem.hpp" + +HMODULE g_dll; + +void main_thread( HINSTANCE uh ) { +#ifdef IFACE_DLLMAIN + util::memset( ( uint8_t* )uh, 0x90, 0x1000 ); +#endif + g_gmod.initialize( ); + + while ( !g_gmod.m_panic ) { + std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) ); + } + + g_gmod.uninitialize( ); + ExitThread( 0 ); +} + +long __stdcall exception_handler( EXCEPTION_POINTERS* e ) { + const char* title = xors( "you crashed, retard" ); + std::string msg = xors( "unknown" ); + + ulong_t e_code = e->ExceptionRecord->ExceptionCode; + ulong_t e_info_0 = e->ExceptionRecord->ExceptionInformation[ 0 ]; + ulong_t e_info_1 = e->ExceptionRecord->ExceptionInformation[ 1 ]; + ulong_t e_info_2 = e->ExceptionRecord->ExceptionInformation[ 2 ]; + + switch( e_code ) { + case EXCEPTION_ACCESS_VIOLATION: + if( !e_info_0 ) + msg = xors( "read access violation at " ); + else if( e_info_0 == 1 ) + msg = xors( "write access violation at " ); + else + msg = xors( "access violation at " ); + + msg += util::to_hex_str( e_info_1 ); + break; + + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + msg = xors( "array bounds exceeded" ); + break; + + case EXCEPTION_BREAKPOINT: + msg = xors( "triggered breakpoint" ); + break; + + case EXCEPTION_FLT_DENORMAL_OPERAND: + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + case EXCEPTION_FLT_INEXACT_RESULT: + case EXCEPTION_FLT_INVALID_OPERATION: + case EXCEPTION_FLT_OVERFLOW: + case EXCEPTION_FLT_UNDERFLOW: + case EXCEPTION_FLT_STACK_CHECK: + msg = xors( "invalid floating point operation" ); + break; + + case EXCEPTION_IN_PAGE_ERROR: + if( !e_info_0 ) + msg = xors( "page error - read access violation at " ); + else if( e_info_0 == 1 ) + msg = xors( "page error - write access violation at " ); + else + msg = xors( "page error - access violation at " ); + + msg += util::to_hex_str( e_info_1 ); + msg += '\n'; + msg += xors( "NTSTATUS: " ); + msg += util::to_hex_str( e_info_2 ); + break; + + case EXCEPTION_INT_DIVIDE_BY_ZERO: + case EXCEPTION_INT_OVERFLOW: + msg = xors( "invalid integer operation" ); + break; + + case EXCEPTION_STACK_OVERFLOW: + msg = xors( "stack overflow" ); + break; + + default: + msg = xors( "exception code: " ); + msg += util::to_hex_str( e_code ); + msg += xors( "\nexception variables: \n" ); + msg += util::to_hex_str( e_info_0 ); msg += '\n'; + msg += util::to_hex_str( e_info_1 ); msg += '\n'; + msg += util::to_hex_str( e_info_2 ); msg += '\n'; + break; + } + + msg += xors( "\nregister dump: \n" ); + msg += xors( "eax: " ); msg += util::to_hex_str( e->ContextRecord->Eax ); msg += '\n'; + msg += xors( "esi: " ); msg += util::to_hex_str( e->ContextRecord->Esi ); msg += '\n'; + msg += xors( "ebx: " ); msg += util::to_hex_str( e->ContextRecord->Ebx ); msg += '\n'; + msg += xors( "edi: " ); msg += util::to_hex_str( e->ContextRecord->Edi ); msg += '\n'; + msg += xors( "ecx: " ); msg += util::to_hex_str( e->ContextRecord->Ecx ); msg += '\n'; + msg += xors( "ebp: " ); msg += util::to_hex_str( e->ContextRecord->Ebp ); msg += '\n'; + msg += xors( "edx: " ); msg += util::to_hex_str( e->ContextRecord->Edx ); msg += '\n'; + msg += xors( "esp: " ); msg += util::to_hex_str( e->ContextRecord->Esp ); msg += '\n'; + + if( e->ExceptionRecord->ExceptionAddress ) { + msg += xors( "\nin module: " ); + MEMORY_BASIC_INFORMATION info; + VirtualQuery( ( void* )e->ExceptionRecord->ExceptionAddress, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + char module_buf[ 32 ]; + K32GetModuleBaseNameA( GetCurrentProcess( ), ( HMODULE )info.AllocationBase, module_buf, 32 ); + msg += std::string( module_buf ); + msg += " ( "; + msg += util::to_hex_str( ( uintptr_t )info.AllocationBase ); + msg += " ) "; + + msg += xors( "at: " ); + msg += util::to_hex_str( ( uintptr_t )e->ExceptionRecord->ExceptionAddress ); + } + + auto file = CreateFileA( xors( "./moneybot_dump.dmp" ), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, + nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr ); + + if( file ) { + WriteFile( file, msg.data( ), msg.size( ), nullptr, nullptr ); + CloseHandle( file ); + } + + return EXCEPTION_CONTINUE_EXECUTION; +} + +int __stdcall DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { + HANDLE thread; + + uintptr_t wanted_reason; +#ifdef _DEBUG + wanted_reason = DLL_PROCESS_ATTACH; +#else + wanted_reason = DLL_PROCESS_ATTACH; +#endif + + if ( reason == wanted_reason +#ifdef IFACE_DLLMAIN + && !!reserved +#endif + ) { +#ifdef IFACE_DLLMAIN + g_factory.init( ( uintptr_t )( reserved ) ); +#endif + + g_dll = inst; + + //yayo + //SetUnhandledExceptionFilter( exception_handler ); + DisableThreadLibraryCalls( inst ); + + thread = CreateThread( nullptr, 0, + ( LPTHREAD_START_ROUTINE )( main_thread ), + inst, 0, nullptr ); + + if( !thread ) + return 0; + + CloseHandle( thread ); + + return 1; + } + +#ifdef IFACE_DLLMAIN + else if( !reserved ) { + MessageBoxA( nullptr, "interface data nullptr (loader error?)", "error", MB_OK ); + return 1; + } +#endif + + + if( reason == DLL_PROCESS_DETACH ) { + g_gmod.m_panic = true; + //SetUnhandledExceptionFilter( nullptr ); + } + + return 0; +} \ No newline at end of file diff --git a/cheat/gmod/Valve/dt_common.h b/cheat/gmod/Valve/dt_common.h new file mode 100644 index 0000000..44bc2a2 --- /dev/null +++ b/cheat/gmod/Valve/dt_common.h @@ -0,0 +1,180 @@ +//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#pragma once + +//#include +#include + +// Max number of properties in a datatable and its children. +#define MAX_DATATABLES 1024 // must be a power of 2. +#define MAX_DATATABLE_PROPS 4096 + +#define MAX_ARRAY_ELEMENTS 2048 // a network array should have more that 1024 elements + +#define HIGH_DEFAULT -121121.121121f + +#define BITS_FULLRES -1 // Use the full resolution of the type being encoded. +#define BITS_WORLDCOORD -2 // Encode as a world coordinate. + +#define DT_MAX_STRING_BITS 9 +#define DT_MAX_STRING_BUFFERSIZE (1<varName ) + +// Gets the size of a variable in a class. +#define PROPSIZEOF(className, varName) sizeof(((className*)0)->varName) + + +// SendProp::m_Flags. +#define SPROP_UNSIGNED (1<<0) // Unsigned integer data. + +#define SPROP_COORD (1<<1) // If this is set, the float/vector is treated like a world coordinate. +// Note that the bit count is ignored in this case. + +#define SPROP_NOSCALE (1<<2) // For floating point, don't scale into range, just take value as is. + +#define SPROP_ROUNDDOWN (1<<3) // For floating point, limit high value to range minus one bit unit + +#define SPROP_ROUNDUP (1<<4) // For floating point, limit low value to range minus one bit unit + +#define SPROP_NORMAL (1<<5) // If this is set, the vector is treated like a normal (only valid for vectors) + +#define SPROP_EXCLUDE (1<<6) // This is an exclude prop (not excludED, but it points at another prop to be excluded). + +#define SPROP_XYZE (1<<7) // Use XYZ/Exponent encoding for vectors. + +#define SPROP_INSIDEARRAY (1<<8) // This tells us that the property is inside an array, so it shouldn't be put into the +// flattened property list. Its array will point at it when it needs to. + +#define SPROP_PROXY_ALWAYS_YES (1<<9) // Set for datatable props using one of the default datatable proxies like +// SendProxy_DataTableToDataTable that always send the data to all clients. + +#define SPROP_CHANGES_OFTEN (1<<10) // this is an often changed field, moved to head of sendtable so it gets a small index + +#define SPROP_IS_A_VECTOR_ELEM (1<<11) // Set automatically if SPROP_VECTORELEM is used. + +#define SPROP_COLLAPSIBLE (1<<12) // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer +// (ie: for all automatically-chained base classes). +// In this case, it can get rid of this SendPropDataTable altogether and spare the +// trouble of walking the hierarchy more than necessary. + +#define SPROP_COORD_MP (1<<13) // Like SPROP_COORD, but special handling for multiplayer games +#define SPROP_COORD_MP_LOWPRECISION (1<<14) // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 +#define SPROP_COORD_MP_INTEGRAL (1<<15) // SPROP_COORD_MP, but coordinates are rounded to integral boundaries +#define SPROP_NUMFLAGBITS_NETWORKED 16 + +// This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are +// m_flAnimTime and m_flSimulationTime. MODs shouldn't need to mess with this probably +#define SPROP_ENCODED_AGAINST_TICKCOUNT (1<<16) + +// See SPROP_NUMFLAGBITS_NETWORKED for the ones which are networked +#define SPROP_NUMFLAGBITS 17 + +// Used by the SendProp and RecvProp functions to disable debug checks on type sizes. +#define SIZEOF_IGNORE -1 + + +// Use this to extern send and receive datatables, and reference them. +#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} +#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} + +#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable +#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable + + +class SendProp; + + +typedef enum +{ + DPT_Int = 0, + DPT_Float, + DPT_Vector, + DPT_VectorXY, + DPT_String, + DPT_Array, // An array of the base types (can't be of datatables). + DPT_DataTable, +#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + DPT_Quaternion, +#endif + DPT_NUMSendPropTypes +} SendPropType; + + +class DVariant +{ +public: + DVariant( ) { m_Type = DPT_Float; } + DVariant( float val ) { m_Type = DPT_Float; m_Float = val; } + + const char *ToString( ) { + static char text[ 128 ]; + + switch( m_Type ) { + case DPT_Int: + sprintf_s( text, sizeof( text ), "%i", m_Int ); + break; + case DPT_Float: + sprintf_s( text, sizeof( text ), "%.3f", m_Float ); + break; + case DPT_Vector: + sprintf_s( text, sizeof( text ), "(%.3f,%.3f,%.3f)", + m_Vector[ 0 ], m_Vector[ 1 ], m_Vector[ 2 ] ); + break; + #if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + case DPT_Quaternion: + sprintf_s( text, sizeof( text ), "(%.3f,%.3f,%.3f %.3f)", + m_Vector[ 0 ], m_Vector[ 1 ], m_Vector[ 2 ], m_Vector[ 3 ] ); + break; + #endif + case DPT_String: + if( m_pString ) + return m_pString; + else + return "NULL"; + break; + case DPT_Array: + sprintf_s( text, sizeof( text ), "Array" ); + break; + case DPT_DataTable: + sprintf_s( text, sizeof( text ), "DataTable" ); + break; + default: + sprintf_s( text, sizeof( text ), "DVariant type %i unknown", m_Type ); + break; + } + + return text; + } + + union + { + float m_Float; + long m_Int; + char *m_pString; + void *m_pData; // For DataTables. + #if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + float m_Vector[ 4 ]; + #else + float m_Vector[ 3 ]; + #endif + }; + SendPropType m_Type; +}; + + +// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1. +inline int NumBitsForCount( int nMaxElements ) { + int nBits = 0; + while( nMaxElements > 0 ) { + ++nBits; + nMaxElements >>= 1; + } + return nBits; +} \ No newline at end of file diff --git a/cheat/gmod/Valve/dt_recv.h b/cheat/gmod/Valve/dt_recv.h new file mode 100644 index 0000000..aaec6cc --- /dev/null +++ b/cheat/gmod/Valve/dt_recv.h @@ -0,0 +1,523 @@ +//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#ifndef DATATABLE_RECV_H +#define DATATABLE_RECV_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "dt_common.h" + +#define ADDRESSPROXY_NONE -1 + + +class RecvTable; +class RecvProp; + + +// This is passed into RecvProxy functions. +class CRecvProxyData +{ +public: + const RecvProp *m_pRecvProp; // The property it's receiving. + + DVariant m_Value; // The value given to you to store. + + int m_iElement; // Which array element you're getting. + + int m_ObjectID; // The object being referred to. +}; + + +//----------------------------------------------------------------------------- +// pStruct = the base structure of the datatable this variable is in (like C_BaseEntity) +// pOut = the variable that this this proxy represents (like C_BaseEntity::m_SomeValue). +// +// Convert the network-standard-type value in m_Value into your own format in pStruct/pOut. +//----------------------------------------------------------------------------- +typedef void( *RecvVarProxyFn )( const CRecvProxyData *pData, void *pStruct, void *pOut ); + +// ------------------------------------------------------------------------ // +// ArrayLengthRecvProxies are optionally used to get the length of the +// incoming array when it changes. +// ------------------------------------------------------------------------ // +typedef void( *ArrayLengthRecvProxyFn )( void *pStruct, int objectID, int currentArrayLength ); + + +// NOTE: DataTable receive proxies work differently than the other proxies. +// pData points at the object + the recv table's offset. +// pOut should be set to the location of the object to unpack the data table into. +// If the parent object just contains the child object, the default proxy just does *pOut = pData. +// If the parent object points at the child object, you need to dereference the pointer here. +// NOTE: don't ever return null from a DataTable receive proxy function. Bad things will happen. +typedef void( *DataTableRecvVarProxyFn )( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + + +// This is used to fork over the standard proxy functions to the engine so it can +// make some optimizations. +class CStandardRecvProxies +{ +public: + CStandardRecvProxies( ); + + RecvVarProxyFn m_Int32ToInt8; + RecvVarProxyFn m_Int32ToInt16; + RecvVarProxyFn m_Int32ToInt32; + RecvVarProxyFn m_FloatToFloat; + RecvVarProxyFn m_VectorToVector; +}; +extern CStandardRecvProxies g_StandardRecvProxies; + + +class CRecvDecoder; + + +class RecvProp +{ + // This info comes from the receive data table. +public: + RecvProp( ); + + void InitArray( int nElements, int elementStride ); + + int GetNumElements( ) const; + void SetNumElements( int nElements ); + + int GetElementStride( ) const; + void SetElementStride( int stride ); + + int GetFlags( ) const; + + const char* GetName( ) const; + SendPropType GetType( ) const; + + RecvTable* GetDataTable( ) const; + void SetDataTable( RecvTable *pTable ); + + RecvVarProxyFn GetProxyFn( ) const; + void SetProxyFn( RecvVarProxyFn fn ); + + DataTableRecvVarProxyFn GetDataTableProxyFn( ) const; + void SetDataTableProxyFn( DataTableRecvVarProxyFn fn ); + + int GetOffset( ) const; + void SetOffset( int o ); + + // Arrays only. + RecvProp* GetArrayProp( ) const; + void SetArrayProp( RecvProp *pProp ); + + // Arrays only. + void SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ); + ArrayLengthRecvProxyFn GetArrayLengthProxy( ) const; + + bool IsInsideArray( ) const; + void SetInsideArray( ); + + // Some property types bind more data to the prop in here. + const void* GetExtraData( ) const; + void SetExtraData( const void *pData ); + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char* GetParentArrayPropName( ); + void SetParentArrayPropName( const char *pArrayPropName ); + +public: + + const char *m_pVarName; + SendPropType m_RecvType; + int m_Flags; + int m_StringBufferSize; + + +public: + + bool m_bInsideArray; // Set to true by the engine if this property sits inside an array. + + // Extra data that certain special property types bind to the property here. + const void *m_pExtraData; + + // If this is an array (DPT_Array). + RecvProp *m_pArrayProp; + ArrayLengthRecvProxyFn m_ArrayLengthProxy; + + RecvVarProxyFn m_ProxyFn; + DataTableRecvVarProxyFn m_DataTableProxyFn; // For RDT_DataTable. + + RecvTable *m_pDataTable; // For RDT_DataTable. + int m_Offset; + + int m_ElementStride; + int m_nElements; + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char *m_pParentArrayPropName; +}; + + +class RecvTable +{ +public: + + typedef RecvProp PropType; + + RecvTable( ); + RecvTable( RecvProp *pProps, int nProps, const char *pNetTableName ); + ~RecvTable( ); + + void Construct( RecvProp *pProps, int nProps, const char *pNetTableName ); + + int GetNumProps( ); + RecvProp* GetProp( int i ); + + const char* GetName( ); + + // Used by the engine while initializing array props. + void SetInitialized( bool bInitialized ); + bool IsInitialized( ) const; + + // Used by the engine. + void SetInMainList( bool bInList ); + bool IsInMainList( ) const; + + +public: + + // Properties described in a table. + RecvProp *m_pProps; + int m_nProps; + + // The decoder. NOTE: this covers each RecvTable AND all its children (ie: its children + // will have their own decoders that include props for all their children). + CRecvDecoder *m_pDecoder; + + const char *m_pNetTableName; // The name matched between client and server. + + +public: + + bool m_bInitialized; + bool m_bInMainList; +}; + + +inline int RecvTable::GetNumProps( ) { + return m_nProps; +} + +inline RecvProp* RecvTable::GetProp( int i ) { + // Assert( i >= 0 && i < m_nProps ); + return &m_pProps[ i ]; +} + +inline const char* RecvTable::GetName( ) { + return m_pNetTableName; +} + +inline void RecvTable::SetInitialized( bool bInitialized ) { + m_bInitialized = bInitialized; +} + +inline bool RecvTable::IsInitialized( ) const { + return m_bInitialized; +} + +inline void RecvTable::SetInMainList( bool bInList ) { + m_bInMainList = bInList; +} + +inline bool RecvTable::IsInMainList( ) const { + return m_bInMainList; +} + + +// ------------------------------------------------------------------------------------------------------ // +// See notes on BEGIN_SEND_TABLE for a description. These macros work similarly. +// ------------------------------------------------------------------------------------------------------ // +#define BEGIN_RECV_TABLE(className, tableName) \ + BEGIN_RECV_TABLE_NOBASE(className, tableName) \ + RecvPropDataTable("baseclass", 0, 0, className::BaseClass::m_pClassRecvTable, DataTableRecvProxy_StaticDataTable), + +#define BEGIN_RECV_TABLE_NOBASE(className, tableName) \ + template int ClientClassInit(T *); \ + namespace tableName { \ + struct ignored; \ + } \ + template <> int ClientClassInit(tableName::ignored *); \ + namespace tableName { \ + RecvTable g_RecvTable; \ + int g_RecvTableInit = ClientClassInit((tableName::ignored *)NULL); \ + } \ + template <> int ClientClassInit(tableName::ignored *) \ + { \ + typedef className currentRecvDTClass; \ + const char *pRecvTableName = #tableName; \ + RecvTable &RecvTable = tableName::g_RecvTable; \ + static RecvProp RecvProps[] = { \ + RecvPropInt("should_never_see_this", 0, sizeof(int)), // It adds a dummy property at the start so you can define "empty" SendTables. + +#define END_RECV_TABLE() \ + }; \ + RecvTable.Construct(RecvProps+1, sizeof(RecvProps) / sizeof(RecvProp) - 1, pRecvTableName); \ + return 1; \ + } + + +#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName) +#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName)) +#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0]) + +// Just specify the name and offset. Used for strings and data tables. +#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName) +#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName) +#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName) + + +void RecvProxy_FloatToFloat( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_VectorToVector( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_QuaternionToQuaternion( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt8( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt16( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_StringToString( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt32( const CRecvProxyData *pData, void *pStruct, void *pOut ); + +// StaticDataTable does *pOut = pData. +void DataTableRecvProxy_StaticDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + +// PointerDataTable does *pOut = *((void**)pData) (ie: pData is a pointer to the object to decode into). +void DataTableRecvProxy_PointerDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + + +RecvProp RecvPropFloat( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_FloatToFloat +); + +RecvProp RecvPropVector( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_VectorToVector +); + +// This is here so the RecvTable can look more like the SendTable. +#define RecvPropQAngles RecvPropVector + +#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + +RecvProp RecvPropQuaternion( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_QuaternionToQuaternion +); +#endif + +RecvProp RecvPropInt( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = 0 +); + +RecvProp RecvPropString( + const char *pVarName, + int offset, + int bufferSize, + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_StringToString +); + +RecvProp RecvPropDataTable( + const char *pVarName, + int offset, + int flags, + RecvTable *pTable, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable +); + +RecvProp RecvPropArray3( + const char *pVarName, + int offset, + int sizeofVar, + int elements, + RecvProp pArrayProp, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable +); + +// Use the macro to let it automatically generate a table name. You shouldn't +// ever need to reference the table name. If you want to exclude this array, then +// reference the name of the variable in varTemplate. +RecvProp InternalRecvPropArray( + const int elementCount, + const int elementStride, + const char *pName, + ArrayLengthRecvProxyFn proxy +); + + +// +// Use this if you want to completely manage the way the array data is stored. +// You'll need to provide a proxy inside varTemplate that looks for 'iElement' +// to figure out where to store the specified element. +// +#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \ + varTemplate, \ + InternalRecvPropArray( \ + maxArrayLength, \ + 0, \ + #propertyName, \ + arrayLengthProxy \ + ) + + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( \ + sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + #arrayName, \ + arrayLengthProxy \ + ) + + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropArray( varTemplate, arrayName ) \ + RecvPropVariableLengthArray( 0, varTemplate, arrayName ) + + +// Use this one to specify the element count and stride manually. +#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy ) + + +// ---------------------------------------------------------------------------------------- // +// Inlines. +// ---------------------------------------------------------------------------------------- // + +inline void RecvProp::InitArray( int nElements, int elementStride ) { + m_RecvType = DPT_Array; + m_nElements = nElements; + m_ElementStride = elementStride; +} + +inline int RecvProp::GetNumElements( ) const { + return m_nElements; +} + +inline void RecvProp::SetNumElements( int nElements ) { + m_nElements = nElements; +} + +inline int RecvProp::GetElementStride( ) const { + return m_ElementStride; +} + +inline void RecvProp::SetElementStride( int stride ) { + m_ElementStride = stride; +} + +inline int RecvProp::GetFlags( ) const { + return m_Flags; +} + +inline const char* RecvProp::GetName( ) const { + return m_pVarName; +} + +inline SendPropType RecvProp::GetType( ) const { + return m_RecvType; +} + +inline RecvTable* RecvProp::GetDataTable( ) const { + return m_pDataTable; +} + +inline void RecvProp::SetDataTable( RecvTable *pTable ) { + m_pDataTable = pTable; +} + +inline RecvVarProxyFn RecvProp::GetProxyFn( ) const { + return m_ProxyFn; +} + +inline void RecvProp::SetProxyFn( RecvVarProxyFn fn ) { + m_ProxyFn = fn; +} + +inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn( ) const { + return m_DataTableProxyFn; +} + +inline void RecvProp::SetDataTableProxyFn( DataTableRecvVarProxyFn fn ) { + m_DataTableProxyFn = fn; +} + +inline int RecvProp::GetOffset( ) const { + return m_Offset; +} + +inline void RecvProp::SetOffset( int o ) { + m_Offset = o; +} + +inline RecvProp* RecvProp::GetArrayProp( ) const { + return m_pArrayProp; +} + +inline void RecvProp::SetArrayProp( RecvProp *pProp ) { + m_pArrayProp = pProp; +} + +inline void RecvProp::SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ) { + m_ArrayLengthProxy = proxy; +} + +inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy( ) const { + return m_ArrayLengthProxy; +} + +inline bool RecvProp::IsInsideArray( ) const { + return m_bInsideArray; +} + +inline void RecvProp::SetInsideArray( ) { + m_bInsideArray = true; +} + +inline const void* RecvProp::GetExtraData( ) const { + return m_pExtraData; +} + +inline void RecvProp::SetExtraData( const void *pData ) { + m_pExtraData = pData; +} + +inline const char* RecvProp::GetParentArrayPropName( ) { + return m_pParentArrayPropName; +} + +inline void RecvProp::SetParentArrayPropName( const char *pArrayPropName ) { + m_pParentArrayPropName = pArrayPropName; +} + +#endif // DATATABLE_RECV_H diff --git a/cheat/gmod/aimbot.cpp b/cheat/gmod/aimbot.cpp new file mode 100644 index 0000000..313b927 --- /dev/null +++ b/cheat/gmod/aimbot.cpp @@ -0,0 +1,404 @@ + +#include "aimbot.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "math.hpp" +#include "base_cheat.hpp" +#include "input_system.hpp" + +namespace features +{ + void c_aimbot::operator()( user_cmd_t* cmd ) { + m_cmd = cmd; + run( ); + } + + c_aimbot::aim_target_t c_aimbot::find_best_target( ) const { + aim_target_t ret{ -1, vec3_t{ } }; + vec3_t angle{ }; + + g_gmod.m_engine( )->GetViewAngles( angle ); + + vec3_t angle_dir = math::angle_vectors( angle ); + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + float closest_to = std::numeric_limits< float >::max( ); + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity( i ); + if( !ent || ent == g_ctx.m_local || !ent->is_valid( ) ) + continue; + + if( g_settings.rage.ignore_team && + g_ctx.m_local->m_iTeamNum( ) == ent->m_iTeamNum( ) ) + continue; + + if( g_settings.rage.ignore_teamcolor && + g_ctx.m_local->get_team_color( ) == ent->get_team_color( ) ) + continue; + + if( g_settings.rage.ignore_spawnprot && + ent->m_clrRender( ).a( ) < 250 ) + continue; + + player_info_t info; + if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) + continue; + + // whitelisted. + if( g_cheat.m_playerlist.is_friend( info.m_steamid ) ) + continue; + + const auto ent_pos = get_entity_position( ent ); + if( ent_pos.is_zero( ) ) + continue; + + auto dir = ( ent_pos - eye_pos ); + dir.normalize_vector( ); + + const float fov = angle_dir.fov_to( dir ) * M_RADPI; + if( fov > g_settings.rage.fov ) + continue; + + if( g_settings.rage.selection_type( ) == 0 ) { + if( fov < closest_to ) { + closest_to = fov; + ret.m_ent_index = i; + ret.m_position = ent_pos; + } + } + else if( g_settings.rage.selection_type( ) == 1 ) { + float dist = eye_pos.dist_to( ent_pos ); + if( dist < closest_to ) { + closest_to = dist; + ret.m_ent_index = i; + ret.m_position = ent_pos; + } + } + } + return ret; + } + + vec3_t c_aimbot::get_entity_position( c_base_player* ent ) const { + matrix3x4 matrix[ 256 ]{ }; + bool found_valid_hitbox{ }; + // the idea behind this is that some players can have really weird models and our aimbot will not work on them + // so if they don't have a valid hitbox, we then get the OOB center of their model and use that instead. + // fuck gmod. + // const const const const + bool hitscan = g_settings.rage.hitbox == -1; + const char* hitbox_selection[ ] = { + "Head", + "Neck", + "Pelvis", + "Chest" + }; + + + if( !ent->ce( )->SetupBones( matrix, 256, 0x100, g_gmod.m_globals->m_curtime ) ) + return vec3_t{ }; + + const auto model = ent->ce( )->GetModel( ); + if( !model ) + return vec3_t{ }; + + const auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); + if( !hdr ) + return vec3_t{ }; + + const auto set = hdr->get_hitbox_set( ent->m_nHitboxSet( ) ); + if( !set ) + return vec3_t{ }; + + for( int i{ }; i < set->numhitboxes; ++i ) { + const auto hitbox = set->get_hitbox( i ); + if( !hitbox ) + continue; + + const auto bone = hdr->get_bone( hitbox->bone ); + if( !bone ) + continue; + + const std::string name = bone->get_name( ); + if( name.empty( ) ) + continue; + + if( hitscan ) { + if( name.find( "Head" ) == std::string::npos ) + continue; + } + else { + if( name.find( hitbox_selection[ g_settings.rage.hitbox ] ) == std::string::npos ) + continue; + } + + const auto pos = math::vector_transform( ( hitbox->min + hitbox->max ) * 0.5f, matrix[ hitbox->bone ] ); + if( pos.is_zero( ) ) + continue; + + found_valid_hitbox = true; + if( ent->is_visible( pos ) ) + return pos; + } + + if( hitscan ) { // ghetto but it works fine. + for( int i{ }; i < set->numhitboxes; ++i ) { + const auto hitbox = set->get_hitbox( i ); + if( !hitbox ) + continue; + + const auto pos = math::vector_transform( ( hitbox->min + hitbox->max ) * 0.5f, matrix[ hitbox->bone ] ); + if( pos.is_zero( ) ) + continue; + + if( ent->is_visible( pos ) ) + return pos; + } + } + + if( !found_valid_hitbox ) { + auto pos = ent->ce( )->GetRenderOrigin( ); + pos += ( ent->m_vecMins( ) + ent->m_vecMaxs( ) ) * 0.5f; + if( ent->is_visible( pos ) ) + return pos; + } + + return vec3_t{ }; + } + + void c_aimbot::fix_accuracy( vec3_t& angle ) { + auto srand = []( double seed ) -> void { + if( !g_ctx.m_lua ) + return; + + const auto lua = g_ctx.m_lua; + + lua->GetField( LUA_GLOBALSINDEX, xors( "math" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 1 ); + return; + } + + lua->GetField( -1, xors( "randomseed" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return; + } + + lua->PushNumber( seed ); + lua->Call( 1, 0 ); + + lua->Pop( 1 ); + }; + + auto rand = []( const double low, const double high ) -> double { + if( !g_ctx.m_lua ) + return 0.0; + + const auto lua = g_ctx.m_lua; + + lua->GetField( LUA_GLOBALSINDEX, xors( "math" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 1 ); + return 0.0; + } + + lua->GetField( -1, xors( "Rand" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return 0.0; + } + + lua->PushNumber( low ); + lua->PushNumber( high ); + + lua->Call( 2, 1 ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 2 ); + return 0.0; + } + + double rand = lua->GetNumber( -1 ); + + lua->Pop( 2 ); + + return rand; + }; + + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) + return; + + bool is_cw20 = weapon->is_cw20( ); // own spread handling weapon packs (big). + bool is_fas2 = weapon->is_fas2( ); + bool is_custom = is_cw20 || is_fas2; + + auto weapon_name = weapon->get_class_name( ); + if( !is_custom && !weapon_name ) + return; + + auto cone = m_spread[ weapon_name ]; + if( !is_custom && cone.is_zero( ) ) + return; + + float cur_cone = weapon->get_custom_cone( ); + if( is_custom || cur_cone ) { // may be custom weapon similar to FAS2/CW20 + if ( g_settings.rage.norecoil ) + angle -= g_ctx.m_local->m_vecPunchAngle( ); + + if( !g_settings.rage.nospread ) + return; + + if( is_cw20 ) { + srand( m_cmd->m_cmd_nr ); + + if( g_ctx.m_local->m_fFlags( ) & FL_DUCKING ) + cur_cone *= 0.85f; + } + else if ( is_fas2 ) { + srand( g_ctx.m_local->m_nTickBase( ) * g_gmod.m_globals->m_interval_per_tick ); // FPS has to be over tickrate otherwise this fucks up, do not know how to fix. + } + else { + srand( g_ctx.m_local->m_nTickBase( ) * g_gmod.m_globals->m_interval_per_tick ); // some other custom ones based on FAS2 or CW20 use this. + } + + angle.x -= ( float )( rand( -cur_cone, cur_cone ) * 25.0 ); + angle.y -= ( float )( rand( -cur_cone, cur_cone ) * 25.0 ); + } + else { + // if hl2 + // no recoil... figure this out. + + if( !g_settings.rage.nospread ) + return; + + util::set_random_seed( m_cmd->m_random_seed & 0xff ); + + float rand_a = util::get_random_float( -0.5f, 0.5f ) + util::get_random_float( -0.5f, 0.5f ); + float rand_b = util::get_random_float( -0.5f, 0.5f ) + util::get_random_float( -0.5f, 0.5f ); + + float spread_x = cone.x * rand_a; + float spread_y = cone.y * rand_b; + + vec3_t forward, right, up; + math::angle_vectors( angle, &forward, &right, &up ); + + vec3_t spread_dir = forward + ( right * -spread_x ) + ( up * -spread_y ); + spread_dir.normalize_vector( ); + + angle = math::vector_angles( vec3_t{ }, spread_dir ); + } + } + + void c_aimbot::aim_at_target( const c_aimbot::aim_target_t& target ) { + // we're not gonna be checking for m_flNextPrimaryFire due to server side anticheats checking if IN_ATTACK is sent when you can fire, you will get banned. + // I'm gonna do some ghetto autopistol if we find that the weapon is not automatic (we can find this easily using a lua member of the weapon). + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + vec3_t angle_to_target = math::vector_angles( eye_pos, target.m_position ); + auto weapon = g_ctx.m_local->get_weapon( ); + float yaw = m_cmd->m_viewangles.y; + + fix_accuracy( angle_to_target ); + + if( g_settings.rage.silent != 2 || weapon->is_fas2( ) || weapon->is_cw20( ) || weapon->get_custom_cone( ) ) { // These custom weapons cannot do pSilent as they handle shot direction themselves... should probably warn users about this. + m_cmd->m_viewangles = angle_to_target.clamp( ); + + vec3_t delta = m_last_viewangles - ( m_cmd->m_viewangles - m_last_viewangles ); + m_cmd->m_mousedx = -( short )( delta.x / 0.022f ); // serverside anticheats detect this stuff. + m_cmd->m_mousedy = ( short )( delta.y / 0.022f ); + + if( g_settings.rage.silent == 1 ) { + vec3_t move = vec3_t( m_cmd->m_forwardmove, m_cmd->m_sidemove, m_cmd->m_upmove ); + float len = move.length( ); + + if( len ) { + move = math::angle_vectors( ( math::vector_angles( vec3_t{ }, move ) + vec3_t( 0, m_cmd->m_viewangles.y - yaw, 0 ) ) ) * len; + m_cmd->m_forwardmove = move.x; + m_cmd->m_sidemove = move.y; + } + } + } + else { + m_shot_dir = math::angle_vectors( angle_to_target.clamp( ) ); // save for later. this is really inaccurate and i do not know why. + m_shot_dir.normalize_vector( ); + } + + if( g_settings.rage.silent( ) == 0 ) + g_gmod.m_engine( )->SetViewAngles( m_cmd->m_viewangles ); + + if( g_settings.rage.auto_fire ) + m_cmd->m_buttons |= IN_ATTACK; + } + + void c_aimbot::log_shot( c_base_player* ent, fire_bullets_info* info ) { + // we log shot spread cones due to not having a proper function to give us weapon spread... + if( !ent || !info ) + return; + + if( info->spread.is_zero( ) ) + return; + + auto weapon = ent->get_weapon( ); + if( !weapon ) + return; + + auto weapon_name = weapon->get_class_name( ); + if( !weapon_name ) + return; + + m_spread[ weapon_name ] = info->spread; + } + + void c_aimbot::silent( ) { + // the idea behind this was using the context menu used in sandbox and darkrp ( C menu ) + // you can fire anywhere in the menu but it doesn't change your view angles + // worldclick stuff gets set in C_GMOD_Player::CreateMove so we must set it after the call to it. + // however this method has some problems, the weapon back has to be using the lua call player:GetAimVector() for src direction in FireBullets + // otherwise it will not work, 2 of the biggest weapon packs do not use this function so its kinda bork + // another problem is that if you do not aim within a 30 degree cone of your target or are close to them, lag compensation will not take effect ( thanks garry ) + // - kolo + + if( !m_cmd ) + return; + + m_last_viewangles = m_cmd->m_viewangles; // for mousedx garbage. + + if( !g_settings.rage.enabled ) + return; + + if( g_settings.rage.silent != 2 ) + return; + + if( m_shot_dir.is_zero( ) ) + return; + + m_cmd->m_world_clicking = true; + m_cmd->m_world_click_direction = m_shot_dir; + + m_shot_dir = vec3_t{ }; // useless now. + } + + void c_aimbot::run( ) { + if( !g_settings.rage.enabled ) + return; + + if( g_settings.rage.activation_type != 0 && + !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.rage.aimkey( ) ) ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) + return; + + //auto wpn_data = weapon->get_wpn_data( ); // only works for hl2 weapons.. + //if( !wpn_data ) // however you can get lua weapon data, cast to C_WeaponSWEP and call correct functions. + // return; + + auto target = find_best_target( ); + if( target.m_ent_index != -1 ) { + aim_at_target( target ); + } + } +} + diff --git a/cheat/gmod/aimbot.hpp b/cheat/gmod/aimbot.hpp new file mode 100644 index 0000000..5b6ad5f --- /dev/null +++ b/cheat/gmod/aimbot.hpp @@ -0,0 +1,38 @@ +#pragma once +#include +#include +#include + +#include "sdk.hpp" +#include "console.hpp" + +namespace features +{ + class c_aimbot + { + public: + c_aimbot( ) = default; + + private: + struct aim_target_t + { + int m_ent_index; + vec3_t m_position; + }; + + vec3_t m_shot_dir{ }, m_last_viewangles{ }; + user_cmd_t* m_cmd{ }; + std::map< const char*, vec3_t > m_spread{ }; // sorry not sorry + + void run( ); + + aim_target_t find_best_target( ) const; + vec3_t get_entity_position( c_base_player* ent ) const; + void aim_at_target( const aim_target_t& target ); + void fix_accuracy( vec3_t& angle ); + public: + void operator()( user_cmd_t* cmd ); + void silent( ); + void log_shot( c_base_player* local, fire_bullets_info* info ); + }; +} diff --git a/cheat/gmod/autowall.cpp b/cheat/gmod/autowall.cpp new file mode 100644 index 0000000..d94afbc --- /dev/null +++ b/cheat/gmod/autowall.cpp @@ -0,0 +1,305 @@ +#include + +#include "autowall.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "math.hpp" + +namespace features +{ + bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) { + if ( armor_value <= 0 ) return false; + + switch ( hitgroup ) { + case HITGROUP_GENERIC: + case HITGROUP_CHEST: + case HITGROUP_STOMACH: + case HITGROUP_LEFTARM: + case HITGROUP_RIGHTARM: + return true; + case HITGROUP_HEAD: + return ent->m_bHasHelmet( ); + } + + return false; + } + + void c_autowall::trace_line( const vec3_t& start, const vec3_t& end, unsigned mask, void* ignore, CGameTrace* tr ) { + CTraceFilter filter; + Ray_t ray; + + filter.pSkip = ignore; + ray.Init( start, end ); + + g_csgo.m_trace( )->TraceRay( ray, mask, &filter, tr ); + } + + void c_autowall::scale_damage( c_base_player* ent, int hitgroup, float weapon_armor_ratio, float& damage ) { + float multiplier; + float armor_ratio; + float new_damage; + int armor; + + auto get_hitgroup_mul = []( int hitgroup ) { + switch ( hitgroup ) { + case HITGROUP_HEAD: + return 4.f; + case HITGROUP_STOMACH: + return 1.25f; + case HITGROUP_LEFTLEG: + case HITGROUP_RIGHTLEG: + return 0.75f; + } + + return 1.0f; + }; + + multiplier = get_hitgroup_mul( hitgroup ); + damage *= multiplier; + armor = ent->m_ArmorValue( ); + + if ( is_armored( ent, armor, hitgroup ) ) { + armor_ratio = weapon_armor_ratio * 0.5f; + new_damage = damage * armor_ratio; + if ( hitgroup != HITGROUP_HEAD && damage - damage * armor_ratio * 0.5f > armor ) { + new_damage = damage - armor * 2.0f; + } + + damage = new_damage; + } + } + + bool c_autowall::is_breakable( IClientEntity* ent ) { + static auto is_breakable_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 85 F6 74 68 83 BE" ) ); + + auto& v2 = *reinterpret_cast< uint8_t* >( uintptr_t( ent ) + 0x27c ); + uint8_t backup_value = v2; + + auto clientclass = ent->GetClientClass( ); + if( clientclass->m_class_id != CFuncBrush && clientclass->m_class_id != CBaseDoor ) + v2 = 2; + + auto is_breakable_fn = reinterpret_cast< bool( __thiscall* )( void* ) >( is_breakable_ptr ); + + bool is_breakable = is_breakable_fn( ent ); + v2 = backup_value; + + return is_breakable; + } + + bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) { + float dist = 0.f; + CTraceFilter filter; + Ray_t ray, ray_2; + + while( dist <= 90.f ) { + dist += 4.f; + + out_end = start + dir * dist; + + int contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX ); + + if( contents & MASK_SHOT_HULL && !( contents & CONTENTS_HITBOX ) ) + continue; + + ray.Init( out_end, out_end - dir * 4.f ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, 0, exit_trace ); + + if( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) { + filter.pSkip = exit_trace->m_pEnt; + + ray_2.Init( out_end, start ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace ); + + if( exit_trace->DidHit( ) && !exit_trace->startsolid ) { + out_end = exit_trace->endpos; + return true; + } + } + else if( !exit_trace->DidHit( ) || exit_trace->startsolid ) { + if( tr.m_pEnt && tr.m_pEnt->GetIndex( ) ) { + if( is_breakable( tr.m_pEnt ) ) + return true; + + start = tr.endpos; + } + } + else if( ( ( exit_trace->surface.flags >> 7 ) & 1 ) && !( ( tr.surface.flags >> 7 ) & 1 ) ) + continue; + else if( exit_trace->plane.normal.dot( dir ) <= 1.0f ) { + auto fraction = exit_trace->fraction * 4.0f; + out_end = out_end - dir * fraction; + + return true; + } + } + + return false; + } + + bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) { + surfacedata_t* enter_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps ); + int enter_material = enter_surface_data->game.material; + float enter_surf_penetration_mod = enter_surface_data->game.penetrationmodifier; + + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= static_cast( pow( wpn_data->range_modifier, data.trace_length * 0.002 ) ); + + if( data.trace_length > 3000.f || enter_surf_penetration_mod < 0.1f ) + data.penetrate_count = 0; + + if( data.penetrate_count <= 0 ) + return false; + + vec3_t dummy; + CGameTrace trace_exit; + if( !trace_to_exit( data.enter_trace.endpos, data.direction, dummy, data.enter_trace, &trace_exit ) ) + return false; + + surfacedata_t* exit_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( trace_exit.surface.surfaceProps ); + + int exit_material = exit_surface_data->game.material; + float exit_surf_penetration_mod = exit_surface_data->game.penetrationmodifier; + + float final_damage_modifier = 0.16f; + float combined_penetration_modifier = 0.0f; + + if( ( data.enter_trace.contents & CONTENTS_GRATE ) != 0 || enter_material == 89 || enter_material == 71 ) { + combined_penetration_modifier = 3.0f; + final_damage_modifier = 0.05f; + } + else { + combined_penetration_modifier = ( enter_surf_penetration_mod + exit_surf_penetration_mod ) * 0.5f; + } + + if( enter_material == exit_material ) { + if( exit_material == 87 || exit_material == 85 ) + combined_penetration_modifier = 3.0f; + else if( exit_material == 76 ) + combined_penetration_modifier = 2.0f; + } + + float modifier = fmaxf( 0.f, 1.0f / combined_penetration_modifier ); + float taken_damage = ( data.current_damage * final_damage_modifier ) + modifier * 3.0f * fmaxf( 0.0f, + ( float )( 3.0 / ( wpn_data->penetration ) ) * 1.25f ); + float thickness = ( trace_exit.endpos - data.enter_trace.endpos ).lengthsqr( ); + + thickness *= modifier; + thickness *= 0.041666668f; + + float lost_damage = fmaxf( 0.0f, taken_damage + thickness ); + + if( lost_damage > data.current_damage ) + return false; + + if( lost_damage >= 0.0f ) + data.current_damage -= lost_damage; + + if( data.current_damage < 1.0f ) + return false; + + data.src = trace_exit.endpos; + data.penetrate_count--; + + return true; + } + + bool c_autowall::fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check, bool scale ) { + data.penetrate_count = 4; + data.trace_length = 0.f; + + if ( !wep_data ) + return false; + + data.current_damage = ( float )( wep_data->damage ); + + while ( data.penetrate_count > 0 && data.current_damage > 1.0f ) { + if ( !ent_check ) { + data.trace_length_remaining = data.length_to_end - data.trace_length; + } + else { + data.trace_length_remaining = wep_data->range - data.trace_length; + } + + vec3_t end = data.src + data.direction * data.trace_length_remaining; + trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace ); + + util::clip_trace_to_player( target->ce( ), data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace ); + + if ( data.enter_trace.fraction == 1.0f ) { + if ( !ent_check ) { + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); + + if( scale ) + scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage ); + return true; + } + + break; + } + + + if ( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD + && data.enter_trace.m_pEnt == target->ce( ) ) { + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); + + auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt ); + auto cl = enemy->ce( )->GetClientClass( ); + if ( cl->m_class_id != CCSPlayer ) { + return false; + } + + if ( shooter->m_iTeamNum( ) == enemy->m_iTeamNum( ) && !g_settings.rage.friendlies ) { + return false; + } + + if( scale ) + scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage ); + + return true; + } + + if ( !handle_bullet_penetration( wep_data, data ) ) + break; + } + + return false; + } + + float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) { + if ( !shooter || !target ) { + return 0.f; + } + + auto wep = shooter->get_weapon( ); + if ( !wep ) { + return 0.f; + } + + fire_bullet_data_t data; + data.src = shooter->m_vecOrigin( ); + data.filter.pSkip = shooter; + + if ( shooter == g_ctx.m_local ) { + data.src += shooter->m_vecViewOffset( ); + } + else { + data.src += 72.f; + } + + data.length_to_end = ( end - data.src ).length( ); + + vec3_t angles = math::vector_angles( data.src, end ); + data.direction = math::angle_vectors( angles ); + + data.direction.normalize_vector( ); + + if ( fire_bullet( shooter, target, wep->get_wpn_info( ), data, ent_check ) ) { + return data.current_damage; + } + + return 0.f; + } +} diff --git a/cheat/gmod/autowall.hpp b/cheat/gmod/autowall.hpp new file mode 100644 index 0000000..dfddbcc --- /dev/null +++ b/cheat/gmod/autowall.hpp @@ -0,0 +1,34 @@ +#pragma once +#include "sdk.hpp" +#include "pattern.hpp" +#include "interface.hpp" + +struct fire_bullet_data_t { + vec3_t src; + CGameTrace enter_trace; + vec3_t direction; + CTraceFilter filter; + float trace_length; + float trace_length_remaining; + float length_to_end; + float current_damage; + int penetrate_count; +}; + +namespace features +{ + class c_autowall { + private: + bool is_armored( c_base_player* entity, int armor_value, int hitgroup ); + void scale_damage( c_base_player* entity, int hitgroup, float weapon_armor_ratio, float& damage ); + void trace_line( const vec3_t& abs_start, const vec3_t& abs_end, unsigned mask, void* ignore, CGameTrace* trace ); + bool is_breakable( IClientEntity* ent ); + + bool trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ); + + public: + bool handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ); + bool fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check = true, bool scale_damage = true ); + float run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check = true ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/base_cheat.cpp b/cheat/gmod/base_cheat.cpp new file mode 100644 index 0000000..1a44474 --- /dev/null +++ b/cheat/gmod/base_cheat.cpp @@ -0,0 +1,3 @@ +#include "base_cheat.hpp" + +features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/cheat/gmod/base_cheat.hpp b/cheat/gmod/base_cheat.hpp new file mode 100644 index 0000000..b842f98 --- /dev/null +++ b/cheat/gmod/base_cheat.hpp @@ -0,0 +1,41 @@ +#pragma once +#include "util.hpp" +#include "movement.hpp" +#include "prediction.hpp" +#include "playerlist.hpp" +// #include "legitbot.hpp" +// #include "chams.hpp" +// #include "autowall.hpp" +#include "aimbot.hpp" +// #include "identity.hpp" +#include "lag_mgr.hpp" +#include "visual.hpp" +#include "extra.hpp" +// #include "movement_recorder.hpp" +// #include "player_manager.hpp" +// #include "skins.hpp" + +NAMESPACE_REGION( features ) + +class c_base_cheat { +public: + //have your cheat classes in here + c_movement m_movement; + c_prediction m_prediction; + c_player_list m_playerlist; + //c_legitbot m_legitbot; + //c_autowall m_autowall; + c_aimbot m_aimbot; + //c_identity m_identity; + //c_chams m_chams; + c_lagmgr m_lagmgr; + c_extra m_extra; + //c_skins m_skins; + c_visuals m_visuals; + //c_move_recorder m_move_rec; + //c_player_manager m_player_mgr; +}; + +END_REGION + +extern features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/cheat/gmod/bf_write.hpp b/cheat/gmod/bf_write.hpp new file mode 100644 index 0000000..80960e3 --- /dev/null +++ b/cheat/gmod/bf_write.hpp @@ -0,0 +1,34 @@ +#pragma once + +class bf_write { +public: + bf_write( void* data, int bytes, int max_bits = -1 ) { + m_data = ( unsigned char* )data; + m_bytes = bytes; + if( max_bits == -1 ) + m_bits = bytes * 8; + else + m_bits = max_bits; + } + + bf_write( const char* debug_name, void* data, int bytes, int max_bits = -1 ) { + m_debug_name = debug_name; + m_data = ( unsigned char* )data; + m_bytes = bytes; + if( max_bits == -1 ) + m_bits = bytes * 8; + else + m_bits = max_bits; + } + +public: + unsigned char* m_data{ }; + int m_bytes{ }; + int m_bits{ }; + int m_cur_bit{ }; + +private: + bool m_overflow{ }; + bool m_assert_on_overflow{ }; + const char* m_debug_name{ }; +}; \ No newline at end of file diff --git a/cheat/gmod/c_base_player.cpp b/cheat/gmod/c_base_player.cpp new file mode 100644 index 0000000..caf1ea0 --- /dev/null +++ b/cheat/gmod/c_base_player.cpp @@ -0,0 +1,433 @@ +#include "c_base_player.hpp" +#include "interface.hpp" +#include "math.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +#undef max + +//CCSGOPlayerAnimState* c_base_player::sm_player_animstate[ 65 ]; +// +//void CCSGOPlayerAnimState::update( float yaw, float pitch ) { +// static auto fn_ptr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24" ) ); +// uintptr_t alloc = ( uintptr_t )this; +// +// +// //vectorcall is GAY +// if( fn_ptr ) { +// __asm { +// push 0 +// mov ecx, alloc +// +// movss xmm1, dword ptr[ yaw ] +// movss xmm2, dword ptr[ pitch ] +// +// call fn_ptr +// } +// } +//} +// +//void CCSGOPlayerAnimState::reset( ) { +// static auto fn_ptr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "56 6A 01 68 ? ? ? ? 8B F1" ) ); +// if( fn_ptr ) { +// auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); +// fn( this ); +// } +//} +// +//uintptr_t c_base_player::get_player_resource( ) { +// for( int i{ 1 }; i < g_gmod.m_entlist( )->GetHighestEntityIndex( ); ++i ) { +// auto ent = g_gmod.m_entlist( )->GetClientEntity< IClientEntity >( i ); +// if( !ent ) continue; +// auto class_ = ent->GetClientClass( ); +// if( class_ ) { +// if( class_->m_class_id == CCSPlayerResource ) { +// return uintptr_t( ent ); +// } +// } +// } +// +// return 0; +//} +// +////use is_zero( ) on the vector to figure out if it returns a valid value +//vec3_t c_base_player::get_hitbox_pos( int hitbox ) { +// auto ce = this->ce( ); +// +// const auto model = ce->GetModel( ); +// if( !model ) return vec3_t{ }; +// +// auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); +// if( !hdr ) return vec3_t{ }; +// +// matrix3x4 bone_matrix[ 128 ]; +// if( !ce->SetupBones( bone_matrix, 128, 0x100, g_gmod.m_globals->m_curtime ) ) { +// return vec3_t{ }; +// } +// +// auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); +// if( !set ) return vec3_t{ }; +// +// auto box = set->pHitbox( hitbox ); +// if( !box ) return vec3_t{ }; +// +// vec3_t center = ( box->bbmin + box->bbmax ) * 0.5f; +// +// return math::vector_transform( center, bone_matrix[ box->bone ] ); +//} +// + +c_base_player* c_base_player::get_observer_target( ) { + return g_gmod.m_entlist( )->GetClientEntityFromHandle( m_hObserverTarget( ) ); +} + + +const char* c_base_player::get_rank( ) { + if( !g_ctx.m_lua ) + return ""; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 1 ); + return ""; + } + + lua->GetField( -1, "GetUserGroup" ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return ""; + } + + lua->Push( -2 ); // have to push the current entity. + + lua->Call( 1, 1 ); + if( !lua->IsType( -1, LUA_TYPE::_TYPE_STRING ) ) { + lua->Pop( 2 ); + return ""; + } + + const char* rank = lua->GetString( -1 ); + + lua->Pop( 2 ); + + return rank; +} + +clr_t c_base_player::get_team_color( ) { + if( !g_ctx.m_lua ) + return clr_t{ }; + + const auto lua = g_ctx.m_lua; + + clr_t ret{ }; + + lua->GetField( LUA_GLOBALSINDEX, xors( "team" ) ); // team + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 1 ); + return clr_t{ }; + } + + lua->GetField( -1, xors( "GetColor" ) ); // team, GetColor + if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { + lua->Pop( 2 ); + return clr_t{ }; + } + + lua->PushNumber( ( double )m_iTeamNum( ) ); // team, GetColor, team_number + lua->Call( 1, 1 ); // team, color_table + if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { + lua->Pop( 2 ); + return clr_t{ }; + } + + lua->PushString( xors( "r" ) ); // team, color_table, "r" + lua->GetTable( -2 ); // team, color_table, r_value + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 3 ); + return clr_t{ }; + } + + ret.r( ) = lua->GetNumber( -1 ); + lua->Pop( 1 ); + + lua->PushString( xors( "g" ) ); // team, color_table, "g" + lua->GetTable( -2 ); // team, color_table, g_value + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 3 ); + return clr_t{ }; + } + + ret.g( ) = lua->GetNumber( -1 ); + lua->Pop( 1 ); + + lua->PushString( xors( "b" ) ); // team, color_table, "b" + lua->GetTable( -2 ); // team, color_table, b_value + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 3 ); + return clr_t{ }; + } + + ret.b( ) = lua->GetNumber( -1 ); + lua->Pop( 3 ); // stack cleaned up. + + return ret; +} + +c_base_weapon* c_base_player::get_weapon( ) { + return g_gmod.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( m_hActiveWeapon( ) ); +} +bool c_base_player::is_visible( const vec3_t& pos ) { + vec3_t start = g_ctx.m_local->get_eye_pos( ); + return util::trace_ray( start, pos, g_ctx.m_local->ce( ), this->ce( ) ); +} + +// +//bool c_base_player::is_visible( int hitbox ) { +// vec3_t start = g_ctx.m_local->get_eye_pos( ); +// vec3_t end = get_hitbox_pos( hitbox ); +// +// if( !end ) return false; +// return util::trace_ray( start, end, g_ctx.m_local->ce( ), this->ce( ) ); +//} +// +//float c_base_player::get_hitbox_radius( int hitbox ) { +// auto model = ce( )->GetModel( ); +// auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); +// auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); +// +// if( !model || !hdr || !set ) +// return 0.f; +// +// auto box = set->pHitbox( hitbox ); +// +// if( box ) { +// auto dist = box->bbmin.dist_to( box->bbmax ); +// return dist + box->m_flRadius > 0 ? box->m_flRadius : 0.f; +// } +// +// return 0.f; +//} +// +//bool c_base_player::is_fakewalking( ) { +// auto walk_layer = m_AnimOverlay( ).GetElements( )[ 6 ]; +// auto velocity = m_vecVelocity( ).length2d( ); +// bool on_ground = m_fFlags( ) & FL_ONGROUND; +// if( walk_layer.m_flWeight < 0.03f && velocity > 0.1f && on_ground ) { +// return true; +// } +// +// return false; +//} +// +//int c_base_player::get_choked_ticks( ) { +// auto simtime = m_flSimulationTime( ); +// +// return TIME_TO_TICKS( g_gmod.m_globals->m_curtime - simtime ) + 1; +//} +// +//bool c_base_player::is_breaking_lc( ) { +// auto choked = get_choked_ticks( ); +// auto velocity = m_vecVelocity( ); +// auto ipt = g_gmod.m_globals->m_interval_per_tick; +// +// vec3_t travel_origin = m_vecOrigin( ) + velocity * ( ipt * choked ); +// return travel_origin.dist_to_sqr( m_vecOrigin( ) ) > 4096.f; +//} +// +//bool c_base_player::can_attack( bool ignore_rapid ) { +// if( g_ctx.m_has_fired_this_frame ) return false; +// if( !is_alive( ) ) return false; +// +// auto weapon = get_weapon( ); +// if( !weapon ) return false; +// +// float time = g_ctx.pred_time( ); +// +// float next_attack = m_flNextAttack( ); +// if( next_attack > time ) return false; +// +// float next_primary_attack = weapon->m_flNextPrimaryAttack( ); +// if( next_primary_attack > time ) return false; +// +// if( weapon->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER ) { +// float ready_time = weapon->m_flPostponeFireReadyTime( ); +// if( ready_time == FLT_MAX ) return false; +// +// float time_to_shoot = ready_time - time; +// return TIME_TO_TICKS( time_to_shoot ) < 1; +// } +// +// return true; +//} +// +//int c_base_player::get_seq_activity( int sequence ) { +// static uintptr_t fn_offset = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 7D 08 FF 56 8B F1 74 3D" ) ); +// auto fn = ( int( __thiscall* )( void*, int ) )( fn_offset ); +// +// return fn ? fn( this, sequence ) : -2; +//} +// +//void c_base_player::set_abs_angles( vec3_t angles ) { +// static uintptr_t fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 64 53 56 57 8B F1 E8" ) ); +// auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); +// +// return fn( this, angles ); +//} +// +//void c_base_player::set_abs_origin( vec3_t origin ) { +// static uintptr_t fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 51 53 56 57 8B F1" ) ); +// auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); +// +// return fn( this, origin ); +//} +// +//void c_base_player::create_animstate( CCSGOPlayerAnimState* state ) { +// static auto fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 56 8B F1 B9 ? ? ? ? C7 46" ) ); +// auto fn = ( void( __thiscall* )( CCSGOPlayerAnimState*, decltype( this ) ) )( fn_addr ); +// +// fn( state, this ); +//} +// +//void c_base_player::enforce_animations( ) { +// int idx = this->ce( )->GetIndex( ); +// auto animstate = sm_player_animstate[ idx ]; +// +// if( animstate && animstate->pBaseEntity == this ) { +// memcpy( get_animstate( ), animstate, sizeof( CCSGOPlayerAnimState ) ); +// } +// +// //get< bool >( 0x38CD ) = false; +// //get< bool >( 0x35F8 ) = false; +// //m_bClientSideAnimation( ) = false; +//} +// +//void c_base_player::fix_animations( CCSGOPlayerAnimState* saved_state ) { +// bool valid = false; +// int idx = this->ce( )->GetIndex( ); +// +// C_AnimationLayer anim_backup[ 13 ]{ }; +// float pose_param_backup[ 24 ]{ }; +// +// memcpy( anim_backup, +// m_AnimOverlay( ).GetElements( ), +// sizeof( anim_backup ) ); +// +// memcpy( pose_param_backup, +// m_flPoseParameter( ), +// sizeof( pose_param_backup ) ); +// +// auto sequence_backup = m_nSequence( ); +// auto flags_backup = m_fFlags( ); +// auto cycle_backup = m_flCycle( ); +// auto eye_angles = m_angEyeAngles( ); +// auto render_angles = ce( )->GetRenderAngles( ); +// auto origin = m_vecOrigin( ); +// +// //these change but idk what they are +// m_bClientSideAnimation( ) = true; +// this->invalidate_bone_cache( ); +// +// auto backup_curtime = g_gmod.m_globals->m_curtime; +// auto backup_frametime = g_gmod.m_globals->m_frametime; +// auto backup_interp = g_gmod.m_globals->m_interpolation_amount; +// +// g_gmod.m_globals->m_curtime = m_flSimulationTime( ) - util::get_lerptime( ); +// g_gmod.m_globals->m_frametime = TICK_INTERVAL( ); +// +// int framecount = g_gmod.m_globals->m_framecount; +// +// auto csgo_animstate = get_animstate( ); +// if( csgo_animstate ) { +// if( !saved_state ) { +// if( !sm_player_animstate[ idx ] ) { +// sm_player_animstate[ idx ] = ( CCSGOPlayerAnimState* )g_gmod.m_alloc->Alloc( sizeof( CCSGOPlayerAnimState ) ); +// this->create_animstate( sm_player_animstate[ idx ] ); +// } +// else if( sm_player_animstate[ idx ]->pBaseEntity != this ) { +// sm_player_animstate[ idx ]->reset( ); +// this->create_animstate( sm_player_animstate[ idx ] ); +// sm_player_animstate[ idx ]->pBaseEntity = this; +// } +// else { +// valid = true; +// sm_player_animstate[ idx ]->m_iLastClientSideAnimationUpdateFramecount = 0; +// sm_player_animstate[ idx ]->m_flLastClientSideAnimationUpdateTime = 0.f; +// sm_player_animstate[ idx ]->update( eye_angles.y, eye_angles.x ); +// } +// } +// } +// else { +// g_con->log( xors( "couldnt update animstate for player %d!" ), ce( )->GetIndex( ) ); +// return; +// } +// +// //call updateclientsideanimation +// util::get_vfunc< 218, void >( this ); +// +// if( saved_state ) +// memcpy( csgo_animstate, saved_state, sizeof( CCSGOPlayerAnimState ) ); +// else if( valid ) +// memcpy( csgo_animstate, sm_player_animstate[ idx ], sizeof( CCSGOPlayerAnimState ) ); +// +// this->ce( )->GetRenderAngles( ).y = std::remainderf( ce( )->GetRenderAngles( ).y, 360.f ); +// this->ce( )->GetRenderOrigin( ) = m_vecOrigin( ); +// set_abs_angles( this->ce( )->GetRenderAngles( ) ); +// set_abs_origin( m_vecOrigin( ) ); +// m_fFlags( ) = flags_backup; +// m_flCycle( ) = cycle_backup; +// m_nSequence( ) = sequence_backup; +// +// //*( int* )( uintptr_t( this ) + 0xa30 ) = 0; +// //m_nWriteableBones( ) = 0; +// +// memcpy( m_AnimOverlay( ).GetElements( ), +// anim_backup, +// sizeof( anim_backup ) ); +// +// memcpy( m_flPoseParameter( ), +// pose_param_backup, +// sizeof( pose_param_backup ) ); +// +// m_flLastBoneSetupTime( ) = 0.f; +// m_iMostRecentModelBoneCounter( ) = 0; +// +// ce( )->SetupBones( nullptr, -1, 0x100, m_flSimulationTime( ) ); +// +// m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); +// m_iMostRecentModelBoneCounter( ) = 0; +// +// g_gmod.m_globals->m_curtime = backup_curtime; +// g_gmod.m_globals->m_frametime = backup_frametime; +// +// m_bClientSideAnimation( ) = false; +//} +// +player_info_t c_base_player::get_info( ) { + player_info_t info; + g_gmod.m_engine( )->GetPlayerInfo( ce( )->GetIndex( ), &info ); + + return info; +} + +void c_base_player::get_name_safe( char* buf ) { + player_info_t info; + if( g_gmod.m_engine( )->GetPlayerInfo( this->ce( )->GetIndex( ), &info ) ) { + for( size_t i{ }; i < 32; ++i ) { + switch( info.name[ i ] ) { + case '"': + case '\\': + case ';': + case '\n': + buf[ i ] = ' '; + break; + default: + buf[ i ] = info.name[ i ]; + break; + } + } + + buf[ 31 ] = 0; + } +} \ No newline at end of file diff --git a/cheat/gmod/c_base_player.hpp b/cheat/gmod/c_base_player.hpp new file mode 100644 index 0000000..085f4a2 --- /dev/null +++ b/cheat/gmod/c_base_player.hpp @@ -0,0 +1,258 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "netvars.hpp" +#include "pattern.hpp" +#include "c_base_weapon.hpp" +#include "CUtlVector.hpp" +#include "settings.hpp" + +enum PlayerState_t { + FL_ONGROUND = 1 << 0, + FL_DUCKING = 1 << 1, + FL_WATERJUMP = 1 << 2, + FL_ONTRAIN = 1 << 3, + FL_INRAIN = 1 << 4, + FL_FROZEN = 1 << 5, + FL_ATCONTROLS = 1 << 6, + FL_CLIENT = 1 << 7, + FL_FAKECLIENT = 1 << 8, + FL_INWATER = 1 << 9, +}; + +enum MoveType_t { + MOVETYPE_NONE = 0, // never moves + MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc. + MOVETYPE_WALK, // Player only - moving on the ground + MOVETYPE_STEP, // gravity, special edge handling -- monsters use this + MOVETYPE_FLY, // No gravity, but still collides with stuff + MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity + MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation + MOVETYPE_PUSH, // no clip to world, push and crush + MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity + MOVETYPE_LADDER, // Used by players only when going onto a ladder + MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode + MOVETYPE_CUSTOM, // Allows the entity to describe its own physics + MOVETYPE_LAST = MOVETYPE_CUSTOM, // should always be defined as the last item in the list + MOVETYPE_MAX_BITS = 4, +}; + +enum LifeState_t { + LIFE_ALIVE = 0, // alive + LIFE_DYING, // playing death animation or still falling off of a ledge waiting to hit ground + LIFE_DEAD, // dead. lying still. + LIFE_RESPAWNABLE, + LIFE_DISCARDBODY, +}; + +class fire_bullets_info +{ +public: + int32_t shots; //0x0000 + vec3_t src; //0x0004 + vec3_t dir; //0x0010 + vec3_t spread; //0x001C + float distance; //0x0028 + int32_t ammo_type; //0x002C + int32_t tracer_freq; //0x0030 + float damage; //0x0034 + int32_t player_damager; //0x0038 + int32_t flags; //0x003C + char pad_0040[ 18 ]; //0x0040 +}; //Size: 0x0054 + + + +struct clientanimating_t { + void* m_pAnimating; + unsigned int m_fFlags; + clientanimating_t( void* _pAnim, unsigned int _flags ) : m_pAnimating( _pAnim ), m_fFlags( _flags ) {} +}; + + + +class VarMapEntry_t { +public: + unsigned short type; + unsigned short m_bNeedsToInterpolate; // Set to false when this var doesn't + // need Interpolate() called on it anymore. + void* data; + void* watcher; +}; + +struct VarMapping_t { + CUtlVector< VarMapEntry_t > m_Entries; + int m_nInterpolatedEntries; // +0x14 + float m_lastInterpolationTime; // +0x18 +}; + +class c_base_player { +private: + +public: + //NETVAR( m_YourFunctionName, "Name", "Table", extra, type ) + + NETVAR( m_nMoveType, "m_Collision", "DT_BaseEntity", -0x24, MoveType_t ); + NETVAR( m_iHealth, "m_iHealth", "DT_BaseEntity", 0, int ); + NETVAR( m_lifeState, "m_lifeState", "DT_BasePlayer", 0, uint8_t ); + NETVAR( m_nTickBase, "m_nTickBase", "DT_BasePlayer", 0, int ); + NETVAR( m_fFlags, "m_fFlags", "DT_BasePlayer", 0, int ); + //NETVAR( m_vecVelocity, "m_vecVelocity[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_nHitboxSet, "m_nHitboxSet", "DT_BaseAnimating", 0, int ); + NETVAR( m_vecOrigin, "m_vecOrigin", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_vecViewOffset, "m_vecViewOffset[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_hActiveWeapon, "m_hActiveWeapon", "DT_BaseCombatCharacter", 0, ulong_t ); + NETVAR( m_iTeamNum, "m_iTeamNum", "DT_BaseEntity", 0, int ); + NETVAR( m_dwBoneMatrix, "m_nForceBone", "DT_BaseAnimating", 28, uintptr_t ); + NETVAR( m_bHasHelmet, "m_bHasHelmet", "DT_CSPlayer", 0, bool ); + NETVAR( m_ArmorValue, "m_ArmorValue", "DT_CSPlayer", 0, int ); + NETVAR( m_flNextAttack, "m_flNextAttack", "DT_BaseCombatCharacter", 0, float ); + NETVAR( m_angEyeAngles, "m_angEyeAngles[0]", "DT_CSPlayer", 0, vec3_t ); + NETVAR( m_AnimOverlay, "m_hLightingOrigin", "DT_BaseAnimating", 0x3c, int ); + NETVAR( m_flSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0, float ); + NETVAR( m_flCycle, "m_flCycle", "DT_BaseAnimating", 0, float ); + NETVAR( m_nSequence, "m_nSequence", "DT_BaseAnimating", 0, int ); + PNETVAR( m_flPoseParameter, "m_flPoseParameter", "DT_BaseAnimating", 0, float ); + NETVAR( m_bClientSideAnimation, "m_bClientSideAnimation", "DT_BaseAnimating", 0, bool ); + NETVAR( m_flLastBoneSetupTime, "m_hLightingOrigin", "DT_BaseAnimating", -0x20, float ); + NETVAR( m_iMostRecentModelBoneCounter, "m_nForceBone", "DT_BaseAnimating", 0x4, int ); + NETVAR( m_nWriteableBones, "m_nForceBone", "DT_BaseAnimating", 0x20, int ); + NETVAR( m_vecThirdpersonAngles, "deadflag", "DT_BasePlayer", 0x4, vec3_t ); + NETVAR( m_hObserverTarget, "m_hObserverTarget", "DT_BasePlayer", 0, uint32_t ); + NETVAR( m_iObserverMode, "m_iObserverMode", "DT_BasePlayer", 0, int ); + NETVAR( m_csgoAnimState, "m_bIsScoped", "DT_CSPlayer", -0xe, void* ); + NETVAR( m_flOldSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0x4, float ); + NETVAR( m_CoordinateFrame, "m_CollisionGroup", "DT_BaseEntity", -0x4C, matrix3x4 ); + NETVAR( m_vecMins, "m_vecMins", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_vecMaxs, "m_vecMaxs", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_bIsScoped, "m_bIsScoped", "DT_CSPlayer", 0, bool ); + NETVAR( m_viewPunchAngle, "m_viewPunchAngle", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_flMaxFlashAlpha, "m_flFlashMaxAlpha", "DT_CSPlayer", 0, float ); + NETVAR( m_flFlashDuration, "m_flFlashDuration", "DT_CSPlayer", 0, float ); + NETVAR( m_flFlashTime, "m_flFlashMaxAlpha", "DT_CSPlayer", -0x10, float ); + NETVAR( m_bGunGameImmunity, "m_bGunGameImmunity", "DT_CSPlayer", 0, bool ); + NETVAR( m_hViewModel, "m_hViewModel[0]", "DT_BasePlayer", 0, uint32_t ); + NETVAR( m_bSpotted, "m_bSpotted", "DT_CSPlayer", 0, bool ); + NETVAR( m_clrRender, "m_clrRender", "DT_BaseEntity", 0, clr_t ); + NETVAR( m_vecPunchAngle, "m_vecPunchAngle", "DT_BasePlayer", 0, vec3_t ); + + OFFSET( m_CachedBoneData, 0x28FC + sizeof( void* ), CUtlVector< matrix3x4 > ); + OFFSET( m_flSpawnTime, 0xa290, float ); + OFFSET( m_vecVelocity, 0xf4, vec3_t ); + +public: + static uintptr_t get_player_resource( ); + + /*makes it much more organized: functions from IClientEntity + dont interfere with our defined functions*/ + __forceinline IClientEntity* ce( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + __forceinline operator IClientEntity*( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + template < typename t > + __forceinline t& get( std::ptrdiff_t offset ) { + return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); + } + + __forceinline bool is_alive( ) { + return m_iHealth( ) > 0; + } + + bool is_flashed( ); + bool is_reloading( ); + + __forceinline auto& m_aimPunchAngle( bool real = false ) { + static vec3_t backup_var{ }; + static auto offset = g_netvars.get_netvar( fnv( "DT_BasePlayer" ), fnv( "m_aimPunchAngle" ) ); + if( g_settings.misc.no_recoil( ) && !real ) { + backup_var = { 0.f, 0.f, 0.f }; + return backup_var; + } + + return get< vec3_t >( offset ); + } + + __forceinline void* get_animstate( ) { + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( "DT_CSPlayer" ), + fnv( "m_bIsScoped" ) ); + + if( !offset ) { + return nullptr; + } + + return *reinterpret_cast< void** >( uintptr_t( this ) + offset - 0xa ); + } + + __forceinline void disable_interpolaton( ) { + VarMapping_t* varmapping = ( VarMapping_t* )( uintptr_t( this ) + 0x24 ); + + for( int i{ }; i < varmapping->m_nInterpolatedEntries; ++i ) { + if( !varmapping->m_Entries.GetElements( ) ) { + continue; + } + + auto e = &varmapping->m_Entries.GetElements( )[ i ]; + + if( e ) + e->m_bNeedsToInterpolate = false; + } + + //this is the only thing that actually disables interpolation + //to re-enable it, u want to backup and restore m_nInterpolatedEntries + //theres no need to re-enable it because the game will do it for you + //as soon as you stop forcing it off + varmapping->m_nInterpolatedEntries = 0; + varmapping->m_lastInterpolationTime = 0.f; + } + + __forceinline void update_clientside_animation( ) { + bool backup = m_bClientSideAnimation( ); + m_bClientSideAnimation( ) = true; + util::get_vfunc< 218, void >( this ); + m_bClientSideAnimation( ) = backup; + } + + __forceinline void invalidate_bone_cache( ) { + m_flLastBoneSetupTime( ) = -FLT_MAX; + m_iMostRecentModelBoneCounter( ) -= 1; + m_nWriteableBones( ) = 0; + } + + __forceinline vec3_t get_eye_pos( ) { + vec3_t yes; + util::get_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 286 )( this, yes ); + return yes; + } + + __forceinline bool is_valid( ) { + return !ce( )->IsDormant( ) && is_alive( ); + } + + c_base_player* get_observer_target( ); + const char* get_rank( ); + clr_t get_team_color( ); + bool is_fakewalking( ); + player_info_t get_info( ); + void get_name_safe( char* buf ); + c_base_weapon* get_weapon( ); + vec3_t get_hitbox_pos( int hitbox ); + bool is_visible( int hitbox ); + bool is_visible( const vec3_t& pos ); + bool can_attack( bool ignore_rapid = false ); + int get_choked_ticks( ); + float get_hitbox_radius( int hitbox ); + + void set_abs_origin( vec3_t origin ); + void set_abs_angles( vec3_t angles ); + void enforce_animations( ); + + void create_animstate( void* state ); + int get_seq_activity( int sequence ); + + void fix_animations( void* saved_state = nullptr ); + bool is_breaking_lc( ); +}; \ No newline at end of file diff --git a/cheat/gmod/c_base_weapon.cpp b/cheat/gmod/c_base_weapon.cpp new file mode 100644 index 0000000..94c5ec6 --- /dev/null +++ b/cheat/gmod/c_base_weapon.cpp @@ -0,0 +1,87 @@ +#include "c_base_weapon.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +void* c_base_weapon::get_wpn_data( ) { + static auto func = pattern::first_code_match< void*( __thiscall* )( void* ) >( g_gmod.m_chl.dll( ), "0F B7 81 ? ? ? ? 50 E8 ? ? ? ? 83 C4 04 C3" ); + + if ( func ) + return func( this ); + + return nullptr; +} + +bool c_base_weapon::is_cw20( ) { + if( !g_ctx.m_lua ) + return false; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 2 ); + return false; + } + + lua->GetField( -1, xors( "CW20Weapon" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_BOOL ) ) { + lua->Pop( 2 ); + return false; + } + + bool is_cw20 = lua->GetBool( -1 ); + + lua->Pop( 2 ); + + return is_cw20; +} + +bool c_base_weapon::is_fas2( ) { + if( !g_ctx.m_lua ) + return false; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 2 ); + return false; + } + + lua->GetField( -1, xors( "IsFAS2Weapon" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_BOOL ) ) { + lua->Pop( 2 ); + return false; + } + + bool is_fas2 = lua->GetBool( -1 ); + + lua->Pop( 2 ); + + return is_fas2; +} + +float c_base_weapon::get_custom_cone( ) { + if( !g_ctx.m_lua ) + return 0.f; + + const auto lua = g_ctx.m_lua; + + this->ce( )->PushEntity( ); // thank god for this function. + if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { + lua->Pop( 2 ); + return false; + } + + lua->GetField( -1, xors( "CurCone" ) ); + if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { + lua->Pop( 2 ); + return false; + } + + float cone = lua->GetNumber( -1 ); + + lua->Pop( 2 ); + + return cone; +} \ No newline at end of file diff --git a/cheat/gmod/c_base_weapon.hpp b/cheat/gmod/c_base_weapon.hpp new file mode 100644 index 0000000..76884c8 --- /dev/null +++ b/cheat/gmod/c_base_weapon.hpp @@ -0,0 +1,48 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "netvars.hpp" +#include "pattern.hpp" + + + +class c_base_weapon { +public: + NETVAR( m_iClip1, "m_iClip1", "DT_BaseCombatWeapon", 0, int ); + NETVAR( m_flNextPrimaryAttack, "m_flNextPrimaryAttack", "DT_BaseCombatWeapon", 0, float ); + NETVAR( m_hOwner, "m_hOwner", "DT_BaseCombatWeapon", 0, uint32_t ); + NETVAR( m_nModelIndex, "m_nModelIndex", "DT_BaseEntity", 0, int ); + + __forceinline IClientEntity* ce( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + __forceinline operator IClientEntity*( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + template < typename t > + __forceinline t& get( std::ptrdiff_t offset ) { + return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); + } + + int get_max_clip1( ) { + return util::get_vfunc< 355, int >( this ); + } + + const char* get_class_name( ) { + return util::get_vfunc< 366, const char* >( this ); + } + + const char* get_print_name( ) { + return util::get_vfunc< 367, const char* >( this ); + } + + void* get_wpn_data( ); + + char get_hud_icon( ); + + bool is_cw20( ); + bool is_fas2( ); + float get_custom_cone( ); +}; \ No newline at end of file diff --git a/cheat/gmod/chams.cpp b/cheat/gmod/chams.cpp new file mode 100644 index 0000000..09abe58 --- /dev/null +++ b/cheat/gmod/chams.cpp @@ -0,0 +1,157 @@ +#include "chams.hpp" +#include "interface.hpp" + +static auto chams_mat = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white" + "$model" "1" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$envmapcontrast" ".4" + "$envmapsaturation" "1.0" + "$flat" "0" + "$nocull" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" + "$phong" "1" + "$phongexponent" "255.0" + "$normalmapalphaenvmask" "1" + "$phongboost" "6.0" + "$phongfresnelranges" "[0 0.5 1]" + "$BasemapAlphaPhongMask" "1" +})" +) ); + +static auto chams_mat_shine = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$reflectivity" "[1.0 1.0 1.0]" + "$envmapcontrast" ".4" + "$envmapsaturation" "1.0" + "$model" "1" + "$flat" "0" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +static auto chams_mat_flat = xors_raw( ( + R"("UnlitGeneric" +{ + "$basetexture" "vgui/white" + "$model" "1" + "$flat" "1" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +namespace features +{ + void c_materials::make_cham_buffer( char* buf, int len, int type ) { + switch ( type ) { + case 1: + sprintf_s( buf, len - 1, chams_mat_flat.decrypt( ) ); + break; + case 2: + sprintf_s( buf, len - 1, chams_mat_shine.decrypt( ) ); + break; + default: + sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); + } + } + + void c_material::init( const char* name, const char* buf ) { + m_keyvalues = new KeyValues( name ); + m_keyvalues->LoadFromBuffer( name, buf ); + + m_mat = g_csgo.m_mat_system( )->CreateMaterial( name, m_keyvalues ); + m_mat->IncrementReferenceCount( ); + } + + void c_materials::force_material( IMaterial* mat, fclr_t clr ) { + if( !mat ) return; + + float col[ ] = { clr.r( ), clr.g( ), clr.b( ) }; + g_csgo.m_render_view( )->SetBlend( clr.a( ) ); + g_csgo.m_render_view( )->SetColorModulation( col ); + + g_csgo.m_model_render( )->ForcedMaterialOverride( mat ); + } + + void c_materials::initialize_materials( ) { + char buffer[ 1024 ]; + + make_cham_buffer( buffer, sizeof( buffer ), 0 ); + m_chams.init( xors( "chamsmat" ), buffer ); + memset( buffer, 0, 1024 ); + + make_cham_buffer( buffer, sizeof( buffer ), 1 ); + m_chams_flat.init( xors( "chamsmat_flat" ), buffer ); + memset( buffer, 0, 1024 ); + m_initialized = true; + } + + void c_materials::update_materials( ) { + if( !m_initialized ) return; + static float last_reflectivity{ }; + static float last_shine{ }; + static KeyValues* reflectivity; + static KeyValues* shine; + + if( !reflectivity ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_iDataType != 1 ) continue; + if( strstr( it->m_sValue, xors( "[.3 .3 .3]" ) ) ) { + reflectivity = it; + } + } + } + + if( !shine ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_flValue == 6.0f ) + shine = it; + } + } + + if( reflectivity ) { + if( last_reflectivity != g_settings.visuals.chams.reflectivity( ) ) { + char buf[ 32 ]; + sprintf_s< 32 >( buf, xors( "[%1.1f %1.1f %1.1f]" ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ) ); + + strcpy( reflectivity->m_sValue, buf ); + m_chams.m_mat->Refresh( ); + } + last_reflectivity = g_settings.visuals.chams.reflectivity( ); + } + + if( shine ) { + if( last_shine != g_settings.visuals.chams.shine( ) ) { + shine->m_flValue = g_settings.visuals.chams.shine( ) * 100.f; + m_chams.m_mat->Refresh( ); + } + last_shine = g_settings.visuals.chams.shine( ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/chams.hpp b/cheat/gmod/chams.hpp new file mode 100644 index 0000000..2c3e317 --- /dev/null +++ b/cheat/gmod/chams.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "sdk.hpp" + +namespace features +{ + enum ChamBufferType_t { + TYPE_NORMAL, + TYPE_FLAT, + TYPE_SHINE + }; + + class c_material { + public: + c_material( ) = default; + + void init( const char* mat, const char* buf ); + + operator IMaterial*( ) { + return m_mat; + } + + public: + IMaterial* m_mat; + KeyValues* m_keyvalues; + }; + + class c_materials { + public: + c_material m_chams{ }; + c_material m_chams_flat{ }; + + void make_cham_buffer( char* buf, int len, int type ); //type, 0 = normal, 1 = flat, 2 = shine + public: + void initialize_materials( ); + void force_material( IMaterial* material, fclr_t color ); + void update_materials( ); + bool m_initialized{ }; + }; + + class c_chams { + public: + c_materials m_materials; + }; +} \ No newline at end of file diff --git a/cheat/gmod/color.hpp b/cheat/gmod/color.hpp new file mode 100644 index 0000000..38bb442 --- /dev/null +++ b/cheat/gmod/color.hpp @@ -0,0 +1,278 @@ +#pragma once +#include +#include + +//this is a fucking mess + +class fclr_t { + float R, G, B, A; +public: + fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } + + fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + float& r( ) { return R; } + float& g( ) { return G; } + float& b( ) { return B; } + float& a( ) { return A; } + + fclr_t& operator =( fclr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + fclr_t operator+( const fclr_t& v ) const { + return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + bool operator==( fclr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; + +class clr_t { + uint8_t R, G, B, A; +public: + clr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + uint8_t& r( ) { return R; } + uint8_t& g( ) { return G; } + uint8_t& b( ) { return B; } + uint8_t& a( ) { return A; } + + clr_t& operator =( const clr_t& c ) { + R = c.R; + G = c.G; + B = c.B; + A = c.A; + return *this; + } + + clr_t operator+( const clr_t& v ) const { + return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + clr_t operator*( float f ) { + return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + float brightness( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast( G - B ) / delta; + else if ( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.v; + } + + float saturation( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast( G - B ) / delta; + else if ( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.s; + } + + static clr_t from_hsb( float hue, float saturation, float brightness ) { + float h = hue == 1.0f ? 0 : hue * 6.0f; + float f = h - ( int )h; + float p = brightness * ( 1.0f - saturation ); + float q = brightness * ( 1.0f - saturation * f ); + float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); + + if ( h < 1 ) { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if ( h < 2 ) { + return clr_t( + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if ( h < 3 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ) + ); + } + else if ( h < 4 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else if ( h < 5 ) { + return clr_t( + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ) + ); + } + } + + static clr_t blend( clr_t first, clr_t second, float t ) { + return clr_t( + first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), + first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), + first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), + first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) + ); + } + + float hue( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + float min, max, delta; + + min = static_cast< float >( R < G ? R : G ); + min = static_cast< float >( min < B ? min : B ); + + max = static_cast< float >( R > G ? R : G ); + max = static_cast< float >( max > B ? max : B ); + + out.v = max; + delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = ( delta / max ); + } + else { + out.s = 0.0f; + out.h = ( float )NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast< float >( G - B ) / delta; + else + if ( G >= max ) + out.h = 2.0f + static_cast< float >( B - R ) / delta; + else + out.h = 4.0f + static_cast< float >( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.h; + } + + fclr_t to_fclr( ) { + return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; + } + + operator fclr_t( ) { + return this->to_fclr( ); + } + + bool operator==( const clr_t& c ) const { + return ( R == c.R && G == c.G && B == c.B ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/con_alias.hpp b/cheat/gmod/con_alias.hpp new file mode 100644 index 0000000..f00e7df --- /dev/null +++ b/cheat/gmod/con_alias.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include +#include "simple_settings.hpp" + +template< typename var_type = bool > +class con_alias : public ISetting { +public: + con_alias( hash_t hash, con_var< var_type >* var ) : + m_var( var ), + m_value( var_type{ } ), + m_name( hash ), + m_is_var( true ) { }; + + con_alias( hash_t hash ) : + m_name( hash ), + m_value( 0 ), + m_var( nullptr ), + m_is_var( false ) { }; + + con_alias( hash_t hash, var_type&& rhs ) : + m_name( hash ), + m_value( rhs ), + m_var( nullptr ), + m_is_var( false ) { }; + + virtual std::string get_string( ) override { + if( m_is_var ) + return m_var->get_string( ); + else + return std::to_string( m_value ); + } + + virtual void set_value( int value ) override { + set_value_internal( value ); + } + + virtual void set_value( float value ) override { + set_value_internal( value ); + } + + virtual void set_value( ulong_t value ) override { + set_value_internal( value ); + } + +private: + template < typename t > + void set_value_internal( t&& val ) { + if( m_is_var ) + m_var->set( val ); + else + m_value = ( var_type )( val ); + } + +private: + bool m_is_var; + hash_t m_name; + var_type m_value; + con_var< var_type >* m_var; +}; \ No newline at end of file diff --git a/cheat/gmod/con_fn.hpp b/cheat/gmod/con_fn.hpp new file mode 100644 index 0000000..59fb0a3 --- /dev/null +++ b/cheat/gmod/con_fn.hpp @@ -0,0 +1,172 @@ +#pragma once +#include + +#include "simple_settings.hpp" + +//KEEP THIS UP TO DATE!! +enum ConFnVarType_t { + TYPE_NULL = 0, + TYPE_FLOAT = 'F', + TYPE_STRING = 'S', + TYPE_INTEGER = 'D', + TYPE_HEX = 'X' +}; + +class con_fn_base { +public: + virtual bool execute( const char* str ) = 0; + virtual const char* get_syntax( ) = 0; + virtual hash_t get_hash( ) = 0; +}; + +class con_fn : public con_fn_base { +public: + con_fn( hash_t hash, std::function< void __cdecl( const char*, const char* ) > function, const char* syntax ) { + m_hash = hash; + m_function = function; + strcpy_s< 64 >( m_syntax, syntax ); + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + m_args++; + } + } + } + + static ConFnVarType_t get_var_type( size_t arg, const char* syntax ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( syntax ); ++i ) { + if( syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + template < typename t > + static t get_arg( const char* str, size_t arg_index, const char* syntax ) { + auto arg_type = get_var_type( arg_index, syntax ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + if( cur_arg++ == arg_index ) { + size_t start = i + 1; + size_t end = strlen( str ); + for( size_t i2 = start; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + break; + } + } + + std::string str( str + start, end - start ); + + char* end_ptr = ( char* )str.c_str( ) + end; + if constexpr( std::is_integral_v< t > ) { + auto radix = get_var_type( arg_index, syntax ) == TYPE_HEX ? 16 : 10; + return std::strtol( str.c_str( ), &end_ptr, radix ); + } + + if constexpr( std::is_floating_point_v< t > ) { + return std::strtof( str.c_str( ), &end_ptr ); + } + + return ( t )str.c_str( ); + } + } + } + + return t{ }; + } + + virtual const char* get_syntax( ) override { + return m_syntax; + } + + virtual hash_t get_hash( ) override { + return m_hash; + } + + ConFnVarType_t get_var_type( size_t arg ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( m_syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + //returns false on failed execution + virtual bool execute( const char* str ) override { + size_t arg_count{ }; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + arg_count++; + } + } + + if( arg_count != m_args ) { + return false; + } + + std::string pass_str( " " ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + size_t end = strlen( str ); + for( size_t i2 = i + 2; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + } + } + + char* end_ptr = ( char* )( str + i + end ); + switch( get_var_type( cur_arg ) ) { + case TYPE_FLOAT: { + pass_str += std::to_string( strtof( str + i, &end_ptr ) ); + break; + } + case TYPE_INTEGER: { + pass_str += std::to_string( strtol( str + i, &end_ptr, 10 ) ); + break; + } + case TYPE_HEX: { + char buf[ 10 ]; + sprintf_s< 10 >( buf, "%08x", strtol( str + i, &end_ptr, 16 ) ); + pass_str += buf; + break; + } + case TYPE_STRING: { + std::string add_str( str + i, end - i ); + pass_str += add_str; + break; + } + default: + return false; + } + + if( end != strlen( str ) ) { + pass_str += ' '; + } + ++cur_arg; + } + } + + m_function( pass_str.c_str( ), m_syntax ); + return true; + } + +private: + hash_t m_hash{ }; + size_t m_args{ }; + char m_syntax[ 64 ]{ }; + std::function< void( __cdecl )( const char*, const char* ) > m_function{ }; +}; \ No newline at end of file diff --git a/cheat/gmod/console.cpp b/cheat/gmod/console.cpp new file mode 100644 index 0000000..174fc25 --- /dev/null +++ b/cheat/gmod/console.cpp @@ -0,0 +1,324 @@ +#include "console.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "d3d.hpp" +#include "ui_draw.h" + +std::shared_ptr< console > g_con = std::make_shared< console >( ); + + +void console::draw_text( int x, int y, bool greyed, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, "%s", buf ); + //g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_text( int x, int y, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_rect( int x, int y, int w, int h, clr_t col ) { + g_d3d.draw_filled_rect( col, x, y, w, h ); +} + +void console::register_alias( std::shared_ptr< ISetting >& alias ) { + m_aliases.push_back( alias ); +} + +void console::capture_command( ) { + float current_time = GetTickCount( ) * 0.001f; + size_t length = strlen( m_cur_cmd ); + + for( size_t i{ }; i < 0xfe; ++i ) { + if( m_input->is_key_pressed( i ) ) { + float delta_time = current_time - m_last_key_input[ i ]; + if( fabs( delta_time ) > 0.2f ) { + if( i == KEYS_BACK ) { + m_cur_cmd[ length - 1 ] = 0; + m_last_key_input[ i ] = current_time; + continue; + } + + m_key_states[ i ] = 0xf0; + wchar_t pressed_char; + const auto scan = MapVirtualKeyA( i, 2 ); + auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); + + if( ret == 1 ) { + if( length < 200 ) { + m_cur_cmd[ length ] = ( char )( pressed_char ); + m_cur_cmd[ length + 1 ] = 0; + } + } + m_last_key_input[ i ] = current_time; + } + } + else { + m_last_key_input[ i ] = 0.f; + m_key_states[ i ] = 0; + } + } +} + +ISetting* console::find_var( hash_t var ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + if( var == setting->get_hash( ) ) { + return setting; + } + } + + return nullptr; +} + +ISetting* console::find_alias( hash_t alias ) { + for( auto& it : m_aliases ) { + if( it->get_hash( ) == alias ) + return it.get( ); + } + + return nullptr; +} + +con_fn_base* console::find_fn( hash_t name ) { + for( auto& it : m_functions ) { + if( it->get_hash( ) == name ) { + return it; + } + } + + return nullptr; +} + +std::string console::impl_alias_str( std::string str ) { + for( size_t i{ }; i < str.length( ); ++i ) { + if( str[ i ] == ' ' && str[ i + 1 ] != ' ' ) { + size_t end = 0; + for( size_t i2{ i + 1 }; i2 < str.length( ); ++i ) { + if( str[ i2 ] == ' ' ) + end = i2; + } + + if( end ) { + std::string alias_str( str.c_str( ) + i, end - i ); + auto alias = find_alias( hash::fnv1a( alias_str ) ); + if( alias ) { + str.replace( alias_str.begin( ), alias_str.end( ), alias->get_string( ) ); + } + else { + g_con->log( xors( "couldnt find alias %s" ), alias_str.c_str( ) ); + } + } + } + } + + return str; +} + +void console::execute_command( const char* cmd ) { + if( !cmd[ 0 ] ) return; + std::string first_param( cmd, strlen( cmd ) ); + + size_t end{ }; + bool one_arg = true; + for( size_t i{ }; i < strlen( cmd ); ++i ) { + if( cmd[ i ] == ' ' ) { + first_param.resize( i ); + end = i; + one_arg = false; + break; + } + } + + if( one_arg ) { + first_param.resize( first_param.length( ) - 1 ); + } + + //find a command to execute + auto fn = find_fn( hash::fnv1a( first_param ) ); + if( fn ) { + //std::string alias_cmd = impl_alias_str( cmd ); + + if( !fn->execute( cmd ) ) { + log( xors( "invalid syntax" ) ); + } + return; + } + + //command not found, we're managing vars + if( !one_arg ) { + std::string second_param = ( cmd + end + 1 ); + bool is_floating_point = second_param.find( '.' ) != std::string::npos; + auto var = find_var( hash::fnv1a( first_param ) ); + + if( var ) { + auto setting_cast = static_cast< con_var< void* >* >( var ); + if( !setting_cast->is_integral( ) && !setting_cast->is_floating_point( ) ) { + auto value = std::strtol( second_param.c_str( ), 0, 16 ); + printf( xors( "value: %08x\n" ), value ); + var->set( value ); + } + + if( is_floating_point ) { + float value = std::strtof( second_param.c_str( ), 0 ); + var->set( value ); + } + else { + int value = std::strtol( second_param.c_str( ), 0, 10 ); + var->set( value ); + } + log( xors( "%s %s\n" ), first_param.c_str( ), second_param.c_str( ) ); + return; + } + } + + + log( xors( "unknown command: %s" ), first_param.c_str( ) ); +} + +void console::input( ) { + static int drag_x, drag_y; + int cursor_x, cursor_y; + int x = m_x, y = m_y; + bool clicked = m_input->is_key_pressed( KEYS_MOUSE1 ); + static bool is_hovered{ }; + m_input->get_cursor_pos( cursor_x, cursor_y ); + + auto is_top_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + TOP_HEIGHT; + }; + + auto is_window_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + HEIGHT; + }; + + auto is_bottom_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y + HEIGHT - TOP_HEIGHT + && cursor_y < y + HEIGHT; + }; + + if( clicked ) { + //m_consuming_input = is_window_hovered( ); + } + + if( !clicked && is_top_hovered( ) ) { + drag_x = cursor_x - m_x; + drag_y = cursor_y - m_y; + } + + if( clicked && is_hovered ) { + is_hovered = true; + m_x = cursor_x - drag_x; + m_y = cursor_y - drag_y; + } + else { + is_hovered = is_top_hovered( ); + } + + if( clicked ) { + m_active = is_bottom_hovered( ); + } + + if( m_active ) { + capture_command( ); + + static bool was_held{ }; + if( m_input->is_key_pressed( KEYS_RETURN ) ) { + if( !was_held ) { + execute_command( m_cur_cmd ); + m_cur_cmd[ 0 ] = 0; + } + was_held = true; + } + else was_held = false; + } +} + +void console::draw( ) { + if( !m_open ) { + m_consuming_input = false; + m_active = false; + return; + } + + static clr_t col = clr_t( 31, 31, 31, 255 ); + + input( ); + + RECT prev_rect{ }; + RECT new_rect{ m_x - 1, m_y - 1, + m_x + WIDTH + 1, m_y + HEIGHT + 1 }; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_rect( m_x - 1, m_y - 1, WIDTH + 2, HEIGHT + 2, ui::ui_get_accent_col( ) ); + draw_rect( m_x, m_y, WIDTH, HEIGHT, col ); + draw_rect( m_x + 1, m_y, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + + draw_rect( m_x + 1, m_y + HEIGHT - TOP_HEIGHT, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + if( m_active ) { + draw_rect( m_x + 2, m_y + HEIGHT - TOP_HEIGHT + 1, WIDTH - 4, TOP_HEIGHT - 2, clr_t( 31, 31, 31 ) ); + auto fn = find_fn( hash::fnv1a( m_cur_cmd ) ); + if( fn ) { + std::string fn_str = m_cur_cmd; + fn_str += ' '; + fn_str += fn->get_syntax( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, "%s", fn_str.c_str( ) ); + } + + else { + auto var = find_var( hash::fnv1a( m_cur_cmd ) ); + if( var ) { + std::string var_str = m_cur_cmd; + var_str += ' '; + + var_str += var->get_string( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, var_str.c_str( ) ); + } + } + } + + std::string cur_cmd_str = m_cur_cmd; + if( m_active ) { + cur_cmd_str += '_'; + } + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, cur_cmd_str.c_str( ) ); + draw_text( m_x + 3, m_y + TOP_HEIGHT / 2 - 3, xors( "console" ) ); + + int cur_y = m_y + HEIGHT - TOP_HEIGHT; + for( int i = m_logs.size( ) - 1; i >= 0; --i ) { + constexpr int LINE_HEIGHT = 14; + auto& log = m_logs.at( i ); + + if( cur_y - LINE_HEIGHT < m_y + TOP_HEIGHT ) { + m_logs.erase( m_logs.begin( ) + i ); + continue; + } + + draw_text( m_x + 2, cur_y -= LINE_HEIGHT, log.m_msg ); + } + + g_d3d.get_device( )->SetScissorRect( &prev_rect ); +} \ No newline at end of file diff --git a/cheat/gmod/console.hpp b/cheat/gmod/console.hpp new file mode 100644 index 0000000..cfeb255 --- /dev/null +++ b/cheat/gmod/console.hpp @@ -0,0 +1,123 @@ +#pragma once +#include +#include +#include +#include + +#include "con_fn.hpp" +#include "con_alias.hpp" +#include "input_system.hpp" +#include "math.hpp" + +#pragma warning(disable: 4996) + +class console { +public: + console( ) { + m_input = std::make_shared< util::c_input_manager >( ); + } + + static constexpr size_t TOP_HEIGHT = 22; + static constexpr size_t WIDTH = 400; + static constexpr size_t HEIGHT = 450; + + bool m_consuming_input{ }; + bool m_active{ }; + bool m_open{ }; + + struct con_log { + float m_time; + char m_msg[ 128 ]; + }; + + void draw_text( int x, int y, bool greyed, const char* msg, ... ); + void draw_text( int x, int y, const char* msg, ... ); + void draw_rect( int x, int y, int w, int h, clr_t col ); + void register_fn( con_fn_base* fn ) { m_functions.push_back( fn ); } + + void input( ); + void draw( ); + + auto& get_input( ) { + return m_input; + } + + void log( const char* fmt, ... ) { + va_list args; + char buf[ 128 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 128 >( buf, fmt, args ); + __crt_va_end( args ); + + con_log log; + log.m_time = ( float )GetTickCount( ) * 0.001f; + memcpy( log.m_msg, buf, 128 ); + + print( "%s\n", buf ); + + m_logs.push_back( log ); + } + + void print( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); + } + + void create( ) { + #ifdef _DEBUG + AllocConsole( ); + freopen( xors( "CONOUT$" ), "w", stdout ); + const char* hack_names[ ] = { + xors( "dunk hack" ), + xors( "dweeb dumpster" ), + xors( "nova killER" ), + xors( "moms credit card" ), + xors( "dad hook" ), + xors( "retard remover" ), + xors( "slam hook" ), + xors( "swoosh" ), + xors( "retard remover" ), + xors( "shotgun hack" ), + }; + + SetConsoleTitleA( hack_names[ math::random_number( 0, 9 ) ] ); + #endif + game_console_print = reinterpret_cast< msg_t >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); + } + + void destroy( ) { + //FreeConsole( ); + //fclose( stdout ); + } + + std::vector< con_log > m_logs; + std::vector< con_fn_base* > m_functions; + std::vector< std::shared_ptr< ISetting > > m_aliases; + + void register_alias( std::shared_ptr< ISetting >& alias ); + + using msg_t = void( __cdecl* )( const char*, ... ); + msg_t game_console_print; + +private: + ISetting* find_var( hash_t name ); + ISetting* find_alias( hash_t name ); + + std::string impl_alias_str( std::string str ); + + con_fn_base* find_fn( hash_t name ); + void capture_command( ); + void execute_command( const char* cmd ); + + int m_x{ 100 }, m_y{ 100 }; + + char m_cur_cmd[ 200 ]{ }; + uint8_t m_key_states[ 256 ]{ }; + float m_last_key_input[ 256 ]{ }; + std::shared_ptr< util::c_input_manager > m_input; +}; + +extern std::shared_ptr< console > g_con; \ No newline at end of file diff --git a/cheat/gmod/context.cpp b/cheat/gmod/context.cpp new file mode 100644 index 0000000..752585e --- /dev/null +++ b/cheat/gmod/context.cpp @@ -0,0 +1,104 @@ +#include "context.hpp" +#include "console.hpp" +#include "hooks.hpp" +#include "base_cheat.hpp" + +context::c_context g_ctx; + +NAMESPACE_REGION( context ) + +bool c_context::run_frame( ) { + m_local = g_gmod.m_entlist( )->GetClientEntity< >( + g_gmod.m_engine( )->GetLocalPlayer( ) ); + + return !!m_local; +} +// +void c_context::on_cmove_end( user_cmd_t* cmd ) { + auto send = g_cheat.m_lagmgr.get_state( ); + + if( send ) { + m_thirdperson_angle = m_last_realangle; + m_last_fakeangle = cmd->m_viewangles; + m_last_origin = m_local->m_vecOrigin( ); + } + else { + m_last_realangle = cmd->m_viewangles; + m_last_realangle.x = m_last_fakeangle.x; + } + + m_thirdperson_angle.x = cmd->m_viewangles.x; + if( g_cheat.m_lagmgr.get_sent( ) > 1 ) { + m_thirdperson_angle.y = m_last_fakeangle.y; + } + *get_last_cmd( ) = *cmd; +} +// +//void c_context::reset_shot_queue( ) { +// m_last_shot = m_last_shot_ack = 0; +// m_shot_data = { }; +//} +// +////predicted servertime of player, use this for breaking lby etc +//float c_context::pred_time( ) { +// calculate_tickbase( ); +// +// return m_tickbase * g_gmod.m_globals->m_interval_per_tick; +//} +// +////calculate tickbase depending on whether last ucmd was predicted +//bool c_context::calculate_tickbase( ) { +// if ( !m_local ) { +// return false; +// } +// +// //get current tickbase +// auto player_tickbase = m_local->m_nTickBase( ); +// +// //disabled due to our engine pred being shit +// m_tickbase = player_tickbase; +// return true; +// +// if ( m_snapshot.empty( ) ) { +// m_tickbase = player_tickbase; +// return false; +// } +// +// //if cmd wasnt predicted increment tickbase +// auto snap_cmd = &m_snapshot.front( ); +// if ( !snap_cmd->m_predicted ) { +// if ( !m_tickbase ) { +// m_tickbase = player_tickbase; +// } +// +// m_tickbase++; +// snap_cmd->m_predicted = true; +// } +// else { +// m_tickbase = player_tickbase; +// } +// +// return true; +//} +// +//save snapshots of usercommands +bool c_context::create_snapshot( user_cmd_t* ucmd ) { + user_cmd_t ucmd_copy; + + while ( m_snapshot.size( ) >= 64 ) { + m_snapshot.pop_back( ); + } + + if ( !ucmd ) { + return false; + } + + memcpy( &ucmd_copy, + ucmd, + sizeof( ucmd_copy ) ); + + m_snapshot.push_front( ucmd_copy ); + return true; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/context.hpp b/cheat/gmod/context.hpp new file mode 100644 index 0000000..a478776 --- /dev/null +++ b/cheat/gmod/context.hpp @@ -0,0 +1,71 @@ +#pragma once +#include + +#include "util.hpp" +#include "sdk.hpp" + +NAMESPACE_REGION( context ) + +struct shot_data_t { + vec3_t m_local_pos; + vec3_t m_angle; + vec3_t m_enemy_pos; + int m_enemy_index; + int m_resolver_shots; + bool m_resolver_state; + bool m_missed{ true }; + float m_hitbox_radius; + int m_hitgroup; +}; + +//replacement to the old global:: namespace +class c_context { +public: + //run localplayer check, pointer, is valid etc + bool run_frame( ); + float pred_time( ); + + void on_cmove_end( user_cmd_t* cmd ); + bool create_snapshot( user_cmd_t* ); + //calculate accurate tickbase + bool calculate_tickbase( ); + + user_cmd_t* get_last_cmd( ) { + return m_snapshot.empty( ) ? nullptr : &m_snapshot.front( ); + } + +public: + c_base_player* m_local{ }; + int m_stage{ }; + //accurate tickbase + int m_tickbase{ }; + + bool m_drawing_postscreenspace{ }; + bool m_has_incremented_shots{ }; + bool m_drawing_screneend{ }; + + bool m_has_fired_this_frame{ }; + + vec3_t m_last_realangle{ }; + vec3_t m_last_fakeangle{ }; + vec3_t m_thirdperson_angle{ }; + vec3_t m_last_origin{ }; + + float m_fov{ 90.f }; + + CLuaInterface* m_lua{ }; + +public: + void reset_shot_queue( ); + + int m_last_shot_ack; + int m_last_shot; + + std::array< shot_data_t, 128 > m_shot_data; +private: + std::deque< user_cmd_t > m_snapshot; +}; + +END_REGION + +extern context::c_context g_ctx; \ No newline at end of file diff --git a/cheat/gmod/create_move.cpp b/cheat/gmod/create_move.cpp new file mode 100644 index 0000000..c25d0c5 --- /dev/null +++ b/cheat/gmod/create_move.cpp @@ -0,0 +1,87 @@ +#include + +#include "hooks.hpp" +#include "mem.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "input_system.hpp" +#include "math.hpp" + +#include "base_cheat.hpp" + + +bool __fastcall hooks::create_move( void* ecx_, void* edx_, float input_sample_frametime, user_cmd_t* ucmd ) { + static auto create_move_o = g_gmod.m_clientmode->get_old_function< decltype( &hooks::create_move ) >( 21 ); + + // call from CInput::ExtraMouseSample with dummy cmd. + if( !ucmd->m_cmd_nr || !ucmd->m_tick_count || g_gmod.m_panic ) + return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + // for interfacing with lua related stuff. + g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); + if( !g_ctx.m_lua ) + return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + // random_seed isn't generated in ClientMode::CreateMove yet (since CInput::CreateMove handles that), we must generate it ourselves. + ucmd->m_random_seed = math::md5_pseudorandom( ucmd->m_cmd_nr ) & 0x7fffffff; + + //get sendpacket off the stack + stack_t stack( get_baseptr( ) ); + byte *send_packet = stack.next( ).next( ).next( ).local< byte* >( 0x1 ); + + g_ctx.create_snapshot( ucmd ); + + //return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + /* + g_cheat.m_extra.update_netchannel( ); + g_cheat.m_identity( ); + */ + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + static int last_frame = g_gmod.m_globals->m_framecount; + if( last_frame != g_gmod.m_globals->m_framecount ) + g_ctx.m_has_fired_this_frame = false; + + last_frame = g_gmod.m_globals->m_framecount; + + // hook fire bullets for spread compensation. + if( !fire_bullets_o ) { + fire_bullets_o = decltype( &hooks::fire_bullets )( c_vmt::hook_method( g_ctx.m_local, 16, hooks::fire_bullets ) ); + } + + g_cheat.m_prediction( ucmd ); + g_cheat.m_movement( ucmd ); + + g_cheat.m_lagmgr( ucmd, send_packet ); + + g_cheat.m_aimbot( ucmd ); + + //if( auto weapon = g_ctx.m_local->get_weapon( ) ) { + // if( auto c_class = weapon->ce( )->GetClientClass( ) ) { + // g_con->print( "%s\n", c_class->m_name ); + // } + //} + + g_cheat.m_extra.use_spammer( ucmd ); + + if( g_cheat.m_lagmgr.get_choked( ) > 15 ) { + g_cheat.m_lagmgr.set_state( true ); + } + + g_cheat.m_lagmgr.on_cmove_end( ); + + g_ctx.on_cmove_end( ucmd ); + + ucmd->clamp( ); + // call original *after* any changes due to anticheats detecting changes between this and any changes after. + create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + + g_cheat.m_aimbot.silent( ); + } + else { + create_move_o( ecx_, 0, input_sample_frametime, ucmd ); + } + + return false; +} diff --git a/cheat/gmod/d3d.cpp b/cheat/gmod/d3d.cpp new file mode 100644 index 0000000..6802239 --- /dev/null +++ b/cheat/gmod/d3d.cpp @@ -0,0 +1,344 @@ +#include "d3d.hpp" +#include "interface.hpp" +#include "math.hpp" +#include "d3d_sprite.hpp" + +d3d::c_renderer g_d3d; +d3d::d3d_fonts_t d3d::fonts; + + +//theres shit still left to add like drawrect etc but thats really simple +//this is the base and it works so thats ok +//love +// - nave + +// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) +// DrawPrimitiveUP for each object will slow stuff down eventually +// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else + +namespace d3d +{ + void d3d_fonts_t::release( ) { + if( f_12 ) f_12->Release( ); + if( f_14 ) f_14->Release( ); + if( f_16 ) f_16->Release( ); + if( f_18 ) f_18->Release( ); + if( f_menu ) f_menu->Release( ); + if( f_con ) f_con->Release( ); + } + + void d3d_fonts_t::create( IDirect3DDevice9* device ) { + auto create_font = [ & ]( ID3DXFont** font, const char* font_name, int width, int size, int weight ) { + //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); + + auto code = D3DXCreateFontA( device, size, width, weight, 0, false, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); + + if( code < 0 ) throw xors( "fuck d3d" ); + }; + + create_font( &f_12, xors( "Verdana" ), 0, 12, 0 ); //change this idc + create_font( &f_esp_small, xors( "Tahoma" ), 0, 11, 500 ); + create_font( &f_14, xors( "Verdana" ), 0, 14, 0 ); + create_font( &f_16, xors( "Verdana" ), 0, 16, 0 ); + create_font( &f_18, xors( "Verdana" ), 0, 18, 0 ); + create_font( &f_menu, xors( "Tahoma" ), 0, 12, 300 ); + create_font( &f_con, xors( "Consolas" ), 6, 12, 300 ); + } + + + c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { + create_objects( ); + } + + bool c_renderer::run_frame( IDirect3DDevice9* device ) { + if( g_gmod.m_panic ) { + return false; + } + + if( !m_device ) { + m_device = device; + create_objects( ); + return false; + } + + return true; + } + + c_renderer::~c_renderer( ) { + invalidate_objects( ); + } + + void c_renderer::on_device_lost( ) { + invalidate_objects( ); + } + + void c_renderer::on_device_reset( ) { + create_objects( ); + } + + void c_renderer::invalidate_objects( ) { + if( m_block ) m_block->Release( ); + fonts.release( ); + } + + void c_renderer::create_objects( ) { + D3DVIEWPORT9 viewport; + + if( !m_device ) return; + + if( m_device->GetViewport( &viewport ) < 0 ) { + return; + } + + if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { + return; + } + + if( !m_block ) { + return; + } + + // get display size. + m_width = viewport.Width; + m_height = viewport.Height; + + fonts.create( m_device ); + } + + void c_renderer::begin( ) { + if( !m_device ) return; + + D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; + + m_device->SetViewport( &vp ); + + //m_sil_txt->GetSurfaceLevel( 0, &m_surface ); + + // set vertex stream declaration. + m_device->SetVertexShader( nullptr ); + m_device->SetPixelShader( nullptr ); + m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); + m_block->Capture( ); + + m_device->SetRenderState( D3DRS_LIGHTING, false ); + m_device->SetRenderState( D3DRS_FOGENABLE, false ); + m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + + m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); + m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); + m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_STENCILENABLE, false ); + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); + + m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); + m_device->SetRenderState( D3DRS_ALPHATESTENABLE, false ); + m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); + + m_device->SetTexture( 0, nullptr ); + m_device->SetTexture( 1, nullptr ); + m_device->SetTexture( 2, nullptr ); + m_device->SetTexture( 3, nullptr ); + + m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); + m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); + m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); + m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); + + m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); + /* commented out until further notice */ + //m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + //m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + // todo - dex; if we use textures, need to set those rendering states too + } + + void c_renderer::end( ) { + + //m_device->SetTexture( 0, nullptr ); + //m_device->SetTexture( 1, nullptr ); + //m_device->SetTexture( 2, nullptr ); + //m_device->SetTexture( 3, nullptr ); + m_block->Apply( ); + //m_block->Release( ); + } + + void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { + d3d_vertex_t v[ 2 ] = { + d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why + d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) + }; //edit: do we wanna use z for shit? i mean we could for like menu stuff + //so it renders above other stuff + + m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); + } + + void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 5 ] = { + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); + } + + void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 6 ] = { + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) + }; + + + m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); + } + + void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { + d3d_vertex_t v[ 4 ]; + + switch( type ) { + case GRADIENT_VERTICAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + case GRADIENT_HORIZONTAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + } + + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { + constexpr float PI = 3.1415926f; + const float step = PI * 2.0f / float( res ); + + int point_x = x + r, + point_y = y - r, + point_x_o{ }, + point_y_o{ }; + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + for( int i{ }; i <= res; i++ ) { + float theta = float( i ) * step; + + point_x = x + ( int )( r * cos( theta ) ); + point_y = y - ( int )( r * sin( theta ) ); + if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); + point_x_o = point_x; + point_y_o = point_y; + } + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { + d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + + v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; + } + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_text( ID3DXFont* font, clr_t color, + int x, int y, FontAlign_t align, long font_flags, const char* msg ) { + if( !msg ) return; + if( !font ) return; + + auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); + auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); + auto buf = msg; + + if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; + if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); + RECT rect{ x, y, 1000, 100 }; + + ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; + + if( font_flags & D3DFONTFLAG_DROPSHADOW ) { + RECT r{ rect }; + r.left++; + r.top++; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + + if( font_flags & D3DFONTFLAG_OUTLINE ) { + for( int i = -1; i < 2; i++ ) { + RECT r{ rect }; + r.left += i; + r.top += i; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + } + + font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); + } + + int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.right - temp.left ); + } + + int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.bottom - temp.top ); + } +} diff --git a/cheat/gmod/d3d.hpp b/cheat/gmod/d3d.hpp new file mode 100644 index 0000000..c4088a3 --- /dev/null +++ b/cheat/gmod/d3d.hpp @@ -0,0 +1,122 @@ +#ifndef D3D_HEADER //stackoverflow my niggas +#define D3D_HEADER + +#include +#include + +#pragma comment(lib, "d3d9.lib") +#pragma comment(lib, "d3dx9.lib") +#pragma warning(disable : 4838) + +#include +#include + +#include +#pragma comment(lib, "dwmapi.lib") + +#include "util.hpp" +#include "color.hpp" +#include "renderer.hpp" + +enum D3DFontFlags_t { + D3DFONTFLAG_OUTLINE = 0x10, + D3DFONTFLAG_DROPSHADOW = 0x100, +}; + +enum GradientType_t { + GRADIENT_HORIZONTAL, + GRADIENT_VERTICAL +}; + +//suck my dick +namespace d3d +{ + struct d3d_vertex_t { + d3d_vertex_t( float x, float y, float z, clr_t color ) : + m_x( x ), m_y( y ), m_z( z ), + m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; + + d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), + m_clr( 0 ) { }; + + float m_x; + float m_y; + float m_z; + float m_rhw = 1.f; + D3DCOLOR m_clr; + }; + + constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); + + struct d3d_fonts_t { + void release( ); + void create( IDirect3DDevice9* device ); + + ID3DXFont* f_12; + ID3DXFont* f_esp_small; + ID3DXFont* f_14; + ID3DXFont* f_16; + ID3DXFont* f_18; + ID3DXFont* f_menu; + ID3DXFont* f_con; + }; + + class c_renderer { + private: + IDirect3DDevice9* m_device; + IDirect3DStateBlock9* m_block; + public: + ulong_t m_width; + ulong_t m_height; + + c_renderer( ) { }; + c_renderer( IDirect3DDevice9* device ); + ~c_renderer( ); + + void on_device_lost( ); + void on_device_reset( ); + auto get_device( ) { + return m_device; + } + + bool run_frame( IDirect3DDevice9* device ); + void begin( ); + void end( ); + + void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); + void draw_rect( clr_t color, int x, int y, int w, int h ); + void draw_filled_rect( clr_t color, int x, int y, int w, int h ); + void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); + + void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); + + template < FontAlign_t align = ALIGN_CENTER > + void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + draw_text( font, color, x, y, align, font_flags, buffer ); + } + + int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); + int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); + + private: + void invalidate_objects( ); + void create_objects( ); + }; + + extern d3d::d3d_fonts_t fonts; +} + +extern d3d::c_renderer g_d3d; + +#endif \ No newline at end of file diff --git a/cheat/gmod/d3d_sprite.cpp b/cheat/gmod/d3d_sprite.cpp new file mode 100644 index 0000000..8dd6705 --- /dev/null +++ b/cheat/gmod/d3d_sprite.cpp @@ -0,0 +1,13 @@ +#include "d3d_sprite.hpp" + +std::vector< d3d::c_sprite* > d3d::sprites; + +namespace icons +{ + d3d::c_sprite sprite_legit; + d3d::c_sprite sprite_visuals_; + d3d::c_sprite sprite_rage; + d3d::c_sprite sprite_visuals; + d3d::c_sprite sprite_misc; + d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/gmod/d3d_sprite.hpp b/cheat/gmod/d3d_sprite.hpp new file mode 100644 index 0000000..42c09c1 --- /dev/null +++ b/cheat/gmod/d3d_sprite.hpp @@ -0,0 +1,169 @@ +#pragma once +#include "d3d.hpp" +#include "console.hpp" + + +namespace d3d +{ + class c_sprite; + + extern std::vector< c_sprite* > sprites; + + class c_sprite { + public: + size_t m_width{ }; + size_t m_height{ }; + + IDirect3DDevice9* m_device{ }; + ID3DXSprite* m_sprite{ }; + IDirect3DTexture9* m_texture{ }; + const byte* m_image{ }; + size_t m_image_size{ }; + + + public: + c_sprite( ) { + sprites.push_back( this ); + } + + ~c_sprite( ) { + on_reset( ); + } + + void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { + m_width = width; + m_height = height; + + m_device = device; + m_image = file; + m_image_size = img_size; + } + + void begin( IDirect3DDevice9* device ) { + m_device = device; + + if( !m_device ) { + return; + } + + if( !m_sprite ) + D3DXCreateSprite( m_device, &m_sprite ); + + if( m_sprite ) + m_sprite->Begin( D3DXSPRITE_DONOTMODIFY_RENDERSTATE ); + + if( !m_texture ) { + auto hr = D3DXCreateTextureFromFileInMemoryEx( m_device, + m_image, + m_image_size, + m_width, + m_height, + -1, + 0, + D3DFORMAT( 0 ), + D3DPOOL_DEFAULT, + -1, + -1, + 0, + 0, + 0, + &m_texture ); + } + } + + void end( ) { + if( !m_device || !m_sprite || !m_texture ) return; + if( m_sprite ) m_sprite->End( ); + } + + void on_reset( ) { + if( m_sprite && m_device && m_texture ) { + m_sprite->OnLostDevice( ); + m_texture->Release( ); + m_texture = nullptr; + } + } + + void on_reset_end( ) { + if( m_sprite && m_device ) + m_sprite->OnResetDevice( ); + } + + void draw( int x, int y, clr_t color ) { + if( !m_device || !m_texture || !m_sprite ) { + return; + } + + const float scale = 0.8f; + + ulong_t + fill_mode, + adaptive_tess, + dest_blend, + cull, + stencil, + vertex_blend, + alpha_test; + + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, &fill_mode ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, &adaptive_tess ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, &dest_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, &cull ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, &stencil ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, &vertex_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, &alpha_test ); + + ulong_t mag_filter; + ulong_t min_filter; + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, &mag_filter ); + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, &min_filter ); + + m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC ); + m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, D3DFILL_SOLID ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, D3DLINECAPS_ALPHACMP ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, D3DMULTISAMPLE_4_SAMPLES ); + + + ulong_t hr; + D3DXVECTOR2 center = D3DXVECTOR2( ( m_width * scale ) * 0.5f, ( m_height * scale ) * 0.5f ); + D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); + D3DXMATRIX matrix; + D3DXVECTOR2 scale_vec( scale, scale ); + D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale_vec, ¢er, 0.f, &trans ); + + hr = m_sprite->SetTransform( &matrix ); + + auto d3dcolor = D3DCOLOR_RGBA( color.r( ), + color.g( ), color.b( ), color.a( ) ); + hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, fill_mode ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, adaptive_tess ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, dest_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, cull ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, stencil ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, vertex_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, alpha_test ); + + m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, mag_filter ); + } + }; +} + +namespace icons +{ + extern d3d::c_sprite sprite_legit; + extern d3d::c_sprite sprite_visuals_; + extern d3d::c_sprite sprite_rage; + extern d3d::c_sprite sprite_visuals; + extern d3d::c_sprite sprite_misc; + extern d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/gmod/debug_show_spread.cpp b/cheat/gmod/debug_show_spread.cpp new file mode 100644 index 0000000..68931b2 --- /dev/null +++ b/cheat/gmod/debug_show_spread.cpp @@ -0,0 +1,16 @@ +#include "hooks.hpp" +#include "context.hpp" + +int __fastcall hooks::debug_show_spread_get_int( void* ecx_, void* edx_ ) { + static auto original_fn = g_csgo.m_debug_show_spread->get_old_function< decltype( &debug_show_spread_get_int ) >( 13 ); + if( !g_settings.visuals.snipers_crosshair || !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) || g_ctx.m_local->m_bIsScoped( ) ) { + return original_fn( ecx_, 0 ); + } + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon || !weapon->is_sniper( ) ) { + return original_fn( ecx_, 0 ); + } + + return 3; +} \ No newline at end of file diff --git a/cheat/gmod/directx.cpp b/cheat/gmod/directx.cpp new file mode 100644 index 0000000..dd42588 --- /dev/null +++ b/cheat/gmod/directx.cpp @@ -0,0 +1,195 @@ +#include + +#include "settings.hpp" +#include "hooks.hpp" +#include "ui.h" +#include "base_cheat.hpp" +#include "context.hpp" +#include "mem.hpp" + + +using namespace d3d; + +void on_d3d( IDirect3DDevice9* device ) { + constexpr float step = 1.0f / 2.f; + constexpr float fade_step = 1.0f / 7.f; + static float anim_time{ }; + static bool flip{ }; + static int anim_progress{ }; + + static bool sprites_init{ }; + if( !sprites_init ) { + ui::setup_sprites( device ); + sprites_init = true; + } + + if( g_settings.menu.open ) { + if( anim_time >= 0.95f ) { + flip = true; + } + if( anim_time <= 0.05f ) { + flip = false; + } + + if( flip ) + anim_time -= fade_step * ui::ui_get_frametime( ); + else + anim_time += fade_step * ui::ui_get_frametime( ); + + anim_time = std::clamp( anim_time, 0.f, 1.0f ); + + ui::set_animtime( anim_time ); + + anim_progress += ui::ui_get_frametime( ) * step * 255; + anim_progress = std::clamp( anim_progress, 0, 50 ); + g_d3d.draw_filled_rect( clr_t( 0, 0, 0, anim_progress ), + 0, 0, g_d3d.m_width, g_d3d.m_height ); + + ui::render( ); + } + else { + anim_progress = 0; + } +} + +long __stdcall hooks::d3d::end_scene( IDirect3DDevice9* device ) { + static auto end_scene_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::end_scene ) >( 42 ); + if ( g_gmod.m_panic ) return end_scene_o( device ); + auto ret = end_scene_o( device ); + + static uintptr_t return_address = 0; + static uintptr_t gameoverlay_return_address = 0; + + + if( !gameoverlay_return_address ) { + MEMORY_BASIC_INFORMATION info; + VirtualQuery( _ReturnAddress( ), &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + char mod[ MAX_PATH ]; + GetModuleFileNameA( ( HMODULE )info.AllocationBase, mod, MAX_PATH ); + + if( strstr( mod, xors( "gameoverlay" ) ) ) + gameoverlay_return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + // only using gameoverlay stuff as you can't be screenshotted. any other method requires more effort and frankly i cannot be bothered. + if( gameoverlay_return_address && gameoverlay_return_address != ( uintptr_t )( _ReturnAddress( ) ) ) + return ret; + + if( !g_gmod.m_panic && g_d3d.run_frame( device ) ) { + for( auto& it : ::d3d::sprites ) + it->begin( device ); + g_d3d.begin( ); + + on_d3d( device ); + + g_cheat.m_visuals( ); + + if( g_settings.menu.open || g_con->m_open ) { + ui::ui_draw_cursor( ); + } + + std::chrono::high_resolution_clock timer; + static auto last = timer.now( ); + auto now = timer.now( ); + + std::chrono::duration< double > delta = now - last; + last = timer.now( ); + + g_gmod.m_frametime = delta.count( ); + + if( !g_con->m_logs.empty( ) && g_settings.menu.logs_enable ) { + auto& logs = g_con->m_logs; + float time = ( float )GetTickCount( ) * 0.001f; + + auto data = logs.data( ); + + int cur_pos = 2; + for( int i = logs.size( ) - 1; i >= 0; --i ) { + if( cur_pos > g_d3d.m_height - 200 ) { + cur_pos -= 8; + break; + } + + float delta = time - data[ i ].m_time; + if( delta >= 5.0f ) { + break; + } + + clr_t col( 255, 255, 255 ); + if( delta > 4.f ) col.a( ) *= ( 6.f - delta ); + + g_d3d.draw_text< ALIGN_RIGHT >( fonts.f_con, col, g_d3d.m_width - 5, cur_pos, D3DFONTFLAG_DROPSHADOW, data[ i ].m_msg ); + cur_pos += 10; + } + } + + for( auto& it : ::d3d::sprites ) + it->end( ); + + g_d3d.end( ); + } + + return ret; +} + +long __stdcall hooks::d3d::present( IDirect3DDevice9* device, RECT* source, RECT* dest, HWND wnd_override, RGNDATA* reg ) { + static auto present_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::present ) >( 17 ); + + static uintptr_t return_address = 0; + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( return_address && return_address != ( uintptr_t )( _ReturnAddress( ) ) ) + return present_o( device, source, dest, wnd_override, reg ); + + if( g_d3d.run_frame( device ) ) { + g_d3d.begin( ); + if( g_settings.misc.watermark ) { + static std::string str( xors( "moneybot | " ) ); + static bool transform = false; + if( !transform ) { + str += __DATE__; + str += ", "; + str += __TIME__; + + std::transform( str.begin( ), str.end( ), str.begin( ), + [ ]( char c ) { return ::tolower( c ); } ); + transform = true; + } + + g_d3d.draw_text< ALIGN_RIGHT >( ::d3d::fonts.f_menu, + ui::ui_get_text_col( ), g_d3d.m_width - 10, 8, + D3DFONTFLAG_DROPSHADOW, str.c_str( ) ); + } + + g_con->draw( ); + g_d3d.end( ); + } + + return present_o( device, source, dest, wnd_override, reg ); +} + +long __stdcall hooks::d3d::reset( IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params ) { + static auto reset_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::reset ) >( 16 ); + if ( g_gmod.m_panic ) { + return reset_o( device, params ); + } + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset( ); + + g_d3d.on_device_lost( ); + long result = reset_o( device, params ); + g_d3d.on_device_reset( ); + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset_end( ); + + return result; +} \ No newline at end of file diff --git a/cheat/gmod/do_post_screen_space_effects.cpp b/cheat/gmod/do_post_screen_space_effects.cpp new file mode 100644 index 0000000..0766233 --- /dev/null +++ b/cheat/gmod/do_post_screen_space_effects.cpp @@ -0,0 +1,17 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +bool __fastcall hooks::do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ) { + static auto old_fn = g_csgo.m_clientmode->get_old_function< decltype( &do_post_screen_space_effects ) >( 44 ); + + g_ctx.m_drawing_postscreenspace = true; + if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.m_local ) { + g_cheat.m_visuals.update_glow( ); + } + + bool ret = old_fn( ecx_, 0, setup ); + g_ctx.m_drawing_postscreenspace = false; + + return ret; +} \ No newline at end of file diff --git a/cheat/gmod/draw_model_execute.cpp b/cheat/gmod/draw_model_execute.cpp new file mode 100644 index 0000000..354a3d4 --- /dev/null +++ b/cheat/gmod/draw_model_execute.cpp @@ -0,0 +1,167 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" +#include "util.hpp" +#include "settings.hpp" +//this is so ugly dont even look at it + +//gets called once per frame for every entity +void __fastcall hooks::draw_model_execute( IVModelRender* ecx_, void* edx_, + void* render_ctx, const DrawModelState_t& state, + const ModelRenderInfo_t& info, matrix3x4* bone_to_world ) { + static auto dme_o = g_csgo.m_model_render->get_old_function< decltype( &hooks::draw_model_execute ) >( 21 ); + + if( g_csgo.m_panic || g_ctx.m_drawing_postscreenspace ) + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + + bool draw = true; + IMaterial* mat = g_settings.visuals.chams.flat( ) ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; + auto model_name = g_csgo.m_model_info( )->GetModelName( info.m_model ); + auto local_index = g_csgo.m_engine( )->GetLocalPlayer( ); + int local_team = 0; + if( g_ctx.m_local ) + local_team = g_ctx.m_local->m_iTeamNum( ); + int team = 0; + bool is_player = false; + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index == local_index ) { + if( g_settings.misc.thirdperson( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) + && g_ctx.m_local->m_bIsScoped( ) ) { + float clr[ ] = { 1.0f, 1.0f, 1.0f }; + g_csgo.m_render_view( )->SetColorModulation( clr ); + g_csgo.m_render_view( )->SetBlend( 0.5f ); + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + } + } + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index ) { + auto player = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); + + if( player && player->is_valid( ) && !player->m_bGunGameImmunity( ) ) { + is_player = true; + team = player->m_iTeamNum( ); + + if( g_settings.visuals.chams.enabled ) { + if( g_settings.visuals.chams.ignore_z && !g_ctx.m_drawing_screneend && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) + draw = false; + else if( !g_settings.visuals.chams.ignore_z && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) { + fclr_t clr = team != local_team ? g_settings.visuals.chams.color_visible_enemy( ) : g_settings.visuals.chams.color_visible_friendly( ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + g_cheat.m_chams.m_materials.force_material( mat, clr ); + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); + g_csgo.m_render_view( )->SetBlend( 1.0f ); + draw = false; + } + } + + } + } + + if( g_settings.misc.transparent_vm && strstr( model_name, xors( "weapon" ) ) ) { + if( strstr( model_name, xors( "arms" ) ) ) { + g_csgo.m_render_view( )->SetBlend( 0.6f ); + } + } + + if( is_player ) { + if( g_settings.rage.resolver( ) && g_settings.rage.bt_visualize( ) && ( team != local_team || g_settings.rage.friendlies( ) ) ) { + RecordType_t record_type = g_cheat.m_ragebot.m_lagcomp->can_backtrack_entity( info.m_entity_index ); + auto record = g_cheat.m_ragebot.m_lagcomp->get_render_record( info.m_entity_index ); + + if( record && record_type ) { + fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + float backup_modulation[ 3 ]{ }; + bool backup_ignorez = false; + float backup_blend = 1.0f; + + backup_blend = g_csgo.m_render_view( )->GetBlend( ); + g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); + + //BIG ROFL + if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) + && backup_blend == clr_hid.a( ) ) { + backup_ignorez = true; + } + + if( !backup_ignorez ) { + auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); + g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, g_settings.rage.bt_col( ) ); + dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + } + + g_csgo.m_render_view( )->SetBlend( backup_blend ); + g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); + g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && + ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); + + if( draw ) { + dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + draw = false; + } + } + } + + + if( g_settings.legit.backtracking_visualize( ) && ( team != local_team || g_settings.legit.friendlies( ) ) ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); + auto record = g_cheat.m_legitbot.m_lagcomp.find_best_record( info.m_entity_index ); + { //idk + auto records = g_cheat.m_legitbot.m_lagcomp.get_records( info.m_entity_index ); + if( records.size( ) ) { + for( auto& it : util::reverse_iterator( records ) ) { + if( it.is_valid( ) ) { + record = ⁢ + break; + } + } + } + } + + if( record && record->is_valid( ) && record->m_position.dist_to( ent->get_hitbox_pos( 0 ) ) > 5.f ) { + fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + float backup_modulation[ 3 ]{ }; + bool backup_ignorez = false; + float backup_blend = 1.0f; + + backup_blend = g_csgo.m_render_view( )->GetBlend( ); + g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); + + //BIG ROFL + if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) + && backup_blend == clr_hid.a( ) ) { + backup_ignorez = true; + } + + if( !backup_ignorez ) { + auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); + g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, g_settings.legit.backtracking_col( ) ); + dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + } + + g_csgo.m_render_view( )->SetBlend( backup_blend ); + g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); + g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && + ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); + + if( draw ) { + dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + draw = false; + } + } + } + } + + if( draw ) { + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + } + + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); +} \ No newline at end of file diff --git a/cheat/gmod/emit_sound.cpp b/cheat/gmod/emit_sound.cpp new file mode 100644 index 0000000..547828c --- /dev/null +++ b/cheat/gmod/emit_sound.cpp @@ -0,0 +1,19 @@ +#include "base_cheat.hpp" +#include "hooks.hpp" + +void __fastcall hooks::emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ) { + static auto emit_sound_o = g_csgo.m_engine_sound->get_old_function< decltype( &hooks::emit_sound ) >( 5 ); + + if( !g_csgo.m_panic && origin ) { + auto entity = g_csgo.m_entlist( )->GetClientEntity< >( ent ); + if( entity && entity->is_player( ) && entity->ce( )->IsDormant( ) && + ent >= 0 && ent <= 64 ) + g_cheat.m_visuals.update_position( ent, *origin ); + } + + emit_sound_o( ecx_, 0, filter, ent, channel, sound, hash, sample, + volume, attenuation, seed, flags, pitch, origin, direction, + origins, update_pos, sound_time, speaker_entry ); +} \ No newline at end of file diff --git a/cheat/gmod/extra.cpp b/cheat/gmod/extra.cpp new file mode 100644 index 0000000..454971e --- /dev/null +++ b/cheat/gmod/extra.cpp @@ -0,0 +1,86 @@ +#include "base_cheat.hpp" +#include "context.hpp" +#include "input_system.hpp" +#include "math.hpp" +#include "hooks.hpp" +#include "interface.hpp" +#undef min + +namespace features +{ + void c_extra::use_spammer( user_cmd_t* cmd ) { + if( !g_settings.misc.use_spam( ) ) + return; + + if( !g_input.is_key_pressed( g_settings.misc.use_spam_key( ) ) ) + return; + + static bool toggle{ }; + + if( toggle ) + cmd->m_buttons |= IN_USE; + else + cmd->m_buttons &= ~IN_USE; + + toggle ^= 1; + } + + void c_extra::third_person( ) { + if( !g_ctx.m_local ) + return; + + static bool enabled = false; + static bool toggle = true; + static bool key_held = false; + + + if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.thirdperson_key( ) ) ) { + if( !key_held ) { + toggle ^= 1; + } + key_held = true; + } + else { + key_held = false; + } + + if( !g_settings.misc.thirdperson || !toggle ) { + if( enabled ) { + g_gmod.m_input->m_fCameraInThirdPerson = false; + enabled = false; + } + + return; + } + + vec3_t viewangles{ }; + if( g_ctx.m_local->is_alive( ) ) { + g_gmod.m_engine( )->GetViewAngles( viewangles ); + g_gmod.m_input->m_fCameraInThirdPerson = true; + g_gmod.m_input->m_vecCameraOffset = vec3_t( viewangles.x, viewangles.y, 150.0f ); + + constexpr float cam_hull_offset{ 16.f }; + + const vec3_t cam_hull_min( -cam_hull_offset, -cam_hull_offset, -cam_hull_offset ); + const vec3_t cam_hull_max( cam_hull_offset, cam_hull_offset, cam_hull_offset ); + vec3_t cam_forward, origin = g_ctx.m_local->get_eye_pos( ); + + cam_forward = math::angle_vectors( vec3_t( viewangles.x, viewangles.y, 0.f ) ); + + CTraceFilterWorldAndPropsOnly filter; + Ray_t ray; + CGameTrace tr; + + ray.Init( origin, origin - ( cam_forward * 150.f ), cam_hull_min, cam_hull_max ); + + g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, &tr ); + g_gmod.m_input->m_vecCameraOffset.z = 150.f * tr.fraction; + + enabled = true; + } + else if( g_gmod.m_entlist( )->GetClientEntityFromHandle< >( g_ctx.m_local->m_hObserverTarget( ) ) ) { + g_gmod.m_input->m_fCameraInThirdPerson = false; + g_ctx.m_local->m_iObserverMode( ) = 5; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/extra.hpp b/cheat/gmod/extra.hpp new file mode 100644 index 0000000..8d01603 --- /dev/null +++ b/cheat/gmod/extra.hpp @@ -0,0 +1,12 @@ +#pragma once +#include +#include + +namespace features +{ + class c_extra { + public: + void use_spammer( user_cmd_t* cmd ); + void third_person( ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/factory.cpp b/cheat/gmod/factory.cpp new file mode 100644 index 0000000..4133e39 --- /dev/null +++ b/cheat/gmod/factory.cpp @@ -0,0 +1,110 @@ +#include "factory.hpp" +#ifndef IFACE_DLLMAIN +#include "fnv.hpp" + +#include + +NAMESPACE_REGION( factory ) +NAMESPACE_REGION( interfaces ) + +//iterate all exports inside of a module and find createinterface +uintptr_t c_interface_manager::find_createinterface( void* module_ ) { + IMAGE_DOS_HEADER* dos_header; + IMAGE_NT_HEADERS* nt_headers; + uintptr_t export_address; + IMAGE_EXPORT_DIRECTORY* export_dir; + const char* export_name; + uintptr_t* names; + uintptr_t* funcs; + uint16_t* ords; + uint32_t export_hash; + + dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); + nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); + + //find addresses of functions from nt headers + export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; + export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); + + if ( !export_dir->NumberOfFunctions ) + return uintptr_t{ }; + + names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); + funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); + + ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); + + if ( names && funcs && ords ) { + //iterate the exports + for ( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { + export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); + export_hash = hash::fnv1a( export_name ); + + if ( export_hash == fnv( "CreateInterface" ) ) { + return uintptr_t( module_ ) + funcs[ ords[ i ] ]; + } + } + } + + return uintptr_t{ }; +} + +c_interface_manager::c_interface_manager( ) { + auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); + auto peb = teb->ProcessEnvironmentBlock; + + auto root = &peb->Ldr->InMemoryOrderModuleList; + //iterate module list + for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { + PLDR_DATA_TABLE_ENTRY data_table; + HMODULE module_base; + uintptr_t create_interface_export; + uintptr_t create_interface_; + uintptr_t* list_iterator_ptr; + interface_iterator_t* list_iterator; + + data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); + module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); + create_interface_export = find_createinterface( module_base ); + + if ( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { + continue; + } + + //find the createinterface function + create_interface_ = follow_createinterface_export( create_interface_export ); + if ( !is_createinterface_fn( create_interface_ ) ) { + continue; + } + + //find the list iterator + list_iterator_ptr = find_list_ptr( create_interface_ ); + + //iterate the interface list + for ( list_iterator = reinterpret_cast< interface_iterator_t* >( + list_iterator_ptr ); + !!list_iterator; + list_iterator = list_iterator->m_next + ) { + std::string name( list_iterator->m_name ); + std::string module_name( util::unicode_to_ascii( + std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); + + uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); + + size_t version = [ & ]( ) { + std::string ret( name ); + ret.erase( std::remove_if( ret.begin( ), ret.end( ), + [ & ]( int i ) { return !::isdigit( i ); } + ), ret.end( ) ); + return atoi( ret.c_str( ) ); + }( ); + + m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); + } + } +} + +END_REGION +END_REGION +#endif \ No newline at end of file diff --git a/cheat/gmod/factory.hpp b/cheat/gmod/factory.hpp new file mode 100644 index 0000000..a3565e0 --- /dev/null +++ b/cheat/gmod/factory.hpp @@ -0,0 +1,155 @@ +#pragma once +#include +#include +#include +#include +#include "vmt.hpp" +#include "util.hpp" +#include "x86.hpp" +#include "console.hpp" + +//IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran +#ifndef _DEBUG +//#define IFACE_DLLMAIN +#endif + +#ifdef IFACE_DLLMAIN +#include "iface_dllmain_impl.hpp" +#else + +NAMESPACE_REGION( factory ) + +namespace interfaces +{ + struct interface_iterator_t { + void* m_create_fn; + char* m_name; + + interface_iterator_t* m_next; + }; + + inline auto follow_createinterface_export( uintptr_t export_ ) { + /* + .text:006F5F00 CreateInterface proc near + .text:006F5F00 push ebp + .text:006F5F01 mov ebp, esp + .text:006F5F03 pop ebp + .text:006F5F04 jmp sub_6F5E90 + */ + uintptr_t jmp = export_ + 0x4; + uintptr_t jmp_target = jmp + *( uintptr_t* )( jmp + 0x1 ) + 0x5; + + return jmp_target; + } + + inline auto find_list_ptr( uintptr_t createinterface ) { + /* + .text:006F5E90 push ebp + .text:006F5E91 mov ebp, esp + .text:006F5E93 push esi + .text:006F5E94 mov esi, dword_2EEFDE4 + .text:006F5E9A push edi + */ + auto iterator_ptr = **( uintptr_t*** )( createinterface + 0x6 ); + + return iterator_ptr; + } + + inline bool is_createinterface_export( uintptr_t export_ ) { + return ( *( uint8_t* )( export_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( export_ + 4 ) == 0xe9 + && *( uint8_t* )( export_ + 9 ) == 0xcc + && *( uint8_t* )( export_ + 10 ) == 0xcc ); + } + + inline bool is_createinterface_fn( uintptr_t fn_ ) { + return ( *( uint8_t* )( fn_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( fn_ + 4 ) == 0x8b + && *( uint8_t* )( fn_ + 10 ) == x86::encode_push_reg( x86::reg::edi ) ); + } + + class c_interface_manager { + public: + struct interface_data_t { + std::string m_name; + std::string m_module; + size_t m_version; + uintptr_t m_ptr; + + template < typename t > __forceinline t get( ) { + return reinterpret_cast< t >( m_ptr ); + } + }; + + c_interface_manager( ); + + //iterate the interface list to find our desired version + template < typename t = void* > + t find_interface( const std::string& module_, std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += "0"; + + for( auto& it : m_interfaces ) { + if( !it.m_module.compare( module_ ) + && !it.m_name.compare( name ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + template < typename t = void* > + t find_interface( std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + for( auto& it : m_interfaces ) { + if( strstr( it.m_name.c_str( ), name.c_str( ) ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + void dump_interface_list( ) { + for( auto& it : m_interfaces ) { + g_con->print( xors( "%s version %u in %s at 0x%08x\n" ), + it.m_name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + } + } + + private: + uintptr_t find_createinterface( void* module_ ); + + std::vector< interface_data_t > m_interfaces; + }; +} + +END_REGION +#endif + +extern HMODULE g_dll; +extern factory::interfaces::c_interface_manager g_factory; \ No newline at end of file diff --git a/cheat/gmod/fire_bullets.cpp b/cheat/gmod/fire_bullets.cpp new file mode 100644 index 0000000..6bc4297 --- /dev/null +++ b/cheat/gmod/fire_bullets.cpp @@ -0,0 +1,15 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +decltype( &hooks::fire_bullets ) hooks::fire_bullets_o{ }; +void __fastcall hooks::fire_bullets( void* ecx, void* edx, fire_bullets_info* info ) { + if( g_gmod.m_panic ) return fire_bullets_o( ecx, edx, info ); + + if( g_ctx.run_frame( ) && + g_ctx.m_local == ecx ) { // only our shots. + g_cheat.m_aimbot.log_shot( ( c_base_player* )ecx, info ); // dynamically logging spread vectors for nospread. + } + + return fire_bullets_o( ecx, edx, info ); +} \ No newline at end of file diff --git a/cheat/gmod/fnv.hpp b/cheat/gmod/fnv.hpp new file mode 100644 index 0000000..a3f2dc9 --- /dev/null +++ b/cheat/gmod/fnv.hpp @@ -0,0 +1,64 @@ +#pragma once + +#pragma warning( disable : 4307 ) // '*': integral constant overflow +#pragma warning( disable : 4244 ) // possible loss of data + +#include +#include + +using hash_t = unsigned int; + +// used for compile-time FNV-1a 32bit hashes. +#define fnv( str ) \ + [&]() { \ + constexpr hash_t out = hash::fnv1a( str ); \ + \ + return out; \ + }() + +// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. +#define fnv_const( str ) Hash::fnv1a_32( str ) + +namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). +{ + // FNV-1a constants. + enum : hash_t { + FNV1A_PRIME = 0x1000193, + FNV1A_BASIS = 0x811C9DC5 + }; + + // compile-time strlen. + __forceinline constexpr size_t ct_strlen( const char *str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; + } + + // hash data. + __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { + hash_t out = FNV1A_BASIS; + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ data[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash c-style string. + __forceinline constexpr hash_t fnv1a( const char *str ) { + hash_t out = FNV1A_BASIS; + size_t len = ct_strlen( str ); + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ str[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash C++-style string ( runtime only ). + __forceinline hash_t fnv1a( const std::string &str ) { + return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); + } +} \ No newline at end of file diff --git a/cheat/gmod/frame_stage_notify.cpp b/cheat/gmod/frame_stage_notify.cpp new file mode 100644 index 0000000..c371eb0 --- /dev/null +++ b/cheat/gmod/frame_stage_notify.cpp @@ -0,0 +1,25 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" + + +void __fastcall hooks::frame_stage_notify( void* ecx_, void* edx_, ClientFrameStage_t stage ) { + static auto frame_stage_notify_o = g_gmod.m_chl->get_old_function< decltype( &hooks::frame_stage_notify ) >( 35 ); + if ( g_gmod.m_panic ) return frame_stage_notify_o( ecx_, edx_, stage ); + + g_ctx.m_stage = stage; + + switch( stage ) { + case FRAME_NET_UPDATE_START: + break; + case FRAME_NET_UPDATE_POSTDATAUPDATE_START: + break; + case FRAME_RENDER_START: + break; + case FRAME_RENDER_END: + break; + } + + frame_stage_notify_o( ecx_, edx_, stage ); +} \ No newline at end of file diff --git a/cheat/gmod/get_screen_size.cpp b/cheat/gmod/get_screen_size.cpp new file mode 100644 index 0000000..19d9908 --- /dev/null +++ b/cheat/gmod/get_screen_size.cpp @@ -0,0 +1,37 @@ +#include "hooks.hpp" +#include "settings.hpp" + +#include +#include "context.hpp" +#include "mem.hpp" + +void __fastcall hooks::get_screen_size( void* ecx, void* edx, int& w, int& h ) { + static auto get_screen_size_o = g_csgo.m_surface->get_old_function< decltype( &hooks::get_screen_size ) >( 44 ); + static auto draw_crosshair_h = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "8B 0D ? ? ? ? 99 2B C2 D1 F8 89" ) ); + + stack_t stack( get_baseptr( ) ); + auto ret = stack.next( ).return_address( ); + //call original + get_screen_size_o( ecx, edx, w, h ); + + //alter screen width and height to adjust the crosshair position on screen + if( g_settings.visuals.recoil_crosshair && g_ctx.m_local ) { + if( ret == draw_crosshair_h || ret == draw_crosshair_h - 14 /* width call is 14 bytes above height call*/ ) { + w /= 2; + h /= 2; + + vec3_t punch_angles = g_ctx.m_local->m_aimPunchAngle( ) * 2.f; + + if( punch_angles.x < -0.1f ) { + float fov = g_ctx.m_fov; + float angle_step = h / fov; + + w -= int( punch_angles.y * angle_step ); + h += int( punch_angles.x * angle_step ); + } + + w *= 2; + h *= 2; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/get_viewmodel_fov.cpp b/cheat/gmod/get_viewmodel_fov.cpp new file mode 100644 index 0000000..e4722e2 --- /dev/null +++ b/cheat/gmod/get_viewmodel_fov.cpp @@ -0,0 +1,8 @@ +#include "hooks.hpp" +#include "settings.hpp" + +float __fastcall hooks::get_viewmodel_fov( void* ecx, void* edx ) { + static auto get_viewmodel_fov_o = g_csgo.m_clientmode->get_old_function< decltype( &hooks::get_viewmodel_fov ) >( 35 ); + + return get_viewmodel_fov_o( ecx, nullptr ) + float( g_settings.misc.viewmodel_fov ); +} diff --git a/cheat/gmod/gmod.vcxproj b/cheat/gmod/gmod.vcxproj new file mode 100644 index 0000000..e20139f --- /dev/null +++ b/cheat/gmod/gmod.vcxproj @@ -0,0 +1,369 @@ + + + + + Debug + Win32 + + + pHit + Win32 + + + pHit + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + optimize_test + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.0 + {82E7C50B-01E3-4D65-AECC-196E9494DFF4} + gmod + 10.0.17763.0 + + + DynamicLibrary + true + v141 + MultiByte + + + + DynamicLibrary + true + v141 + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)\bin + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)bin + + + $(SolutionDir)bin + false + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + $(SolutionDir)bin + false + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + + Level2 + Full + true + /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG;_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS + true + false + Default + AnySuitable + true + StreamingSIMDExtensions2 + Fast + true + MultiThreadedDLL + _DEBUG + NotUsing + precompiled.hpp + + + false + /FAs %(AdditionalOptions) + DebugFastLink + false + false + + + + + Level3 + MaxSpeed + true + true + true + true + stdcpplatest + _CRT_SECURE_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions) + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + stdcpplatest + _CRT_SECURE_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions) + + + true + true + + + + + Level3 + Disabled + true + false + stdcpplatest + _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) + EditAndContinue + true + + + DebugFastLink + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + \ No newline at end of file diff --git a/cheat/gmod/gmod.vcxproj.filters b/cheat/gmod/gmod.vcxproj.filters new file mode 100644 index 0000000..c0bbeec --- /dev/null +++ b/cheat/gmod/gmod.vcxproj.filters @@ -0,0 +1,385 @@ + + + + + {35d8e768-6ac4-4c43-818b-c2bcc4c3d527} + + + {1c1f773e-855b-43aa-afc8-5b8ee2cdbbc0} + + + {d47a6098-6f48-477c-8e9d-2e9ad3c0427d} + + + {f0e1c4a3-598f-4287-b0a6-63c19c84ad72} + + + {120ffcba-bfc7-4d07-97f1-ff5da4f08801} + + + {87974e05-d739-4f24-9c3b-2d96f0148b15} + + + {1df4716c-8aa1-49bd-bc47-e879bc145159} + + + {2b412e0a-8891-49f0-a4e2-752d774d9715} + + + {7306897e-ecec-49ec-b65d-d0e24ae31128} + + + {95cd308d-e344-423e-9068-935c019ffdff} + + + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + icons + + + icons + + + icons + + + icons + + + icons + + + sdk\valve + + + sdk\valve + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + hooks + + + util + + + util + + + util + + + util + + + util + + + util + + + util + + + util + + + hooks\hookers + + + hooks\hookers + + + factory + + + factory + + + factory + + + factory + + + context + + + context + + + context + + + util + + + util + + + util + + + sdk + + + sdk + + + features + + + features + + + features + + + features + + + sdk + + + sdk + + + features + + + features + + + features + + + features + + + + + sdk + + + sdk + + + sdk + + + hooks + + + hooks + + + hooks + + + util + + + util + + + util + + + util + + + util + + + factory + + + factory + + + factory + + + context + + + context + + + util + + + util + + + + features + + + features + + + features + + + hooks + + + features + + + features + + + hooks + + + features + + + features + + + hooks + + + hooks + + + features + + + hooks + + + hooks + + + features + + + hooks + + + \ No newline at end of file diff --git a/cheat/gmod/hooks.cpp b/cheat/gmod/hooks.cpp new file mode 100644 index 0000000..a5cb91e --- /dev/null +++ b/cheat/gmod/hooks.cpp @@ -0,0 +1,48 @@ +#include "hooks.hpp" +#include "interface.hpp" + +hooks::c_netvar_proxy hooks::lby_proxy; +hooks::c_netvar_proxy hooks::last_shot_proxy; + + + + + +bool hooks::commit( factory::c_gmod* instance ) { + while ( !( instance->m_hwnd = FindWindowA( xors( "Valve001" ), 0 ) ) ) + Sleep( 100 ); + + window_procedure_o = reinterpret_cast< decltype( window_procedure_o ) >( + SetWindowLongA( instance->m_hwnd, GWLP_WNDPROC, + ( long )window_procedure ) + ); + + instance->m_d3d->hook( 42, &hooks::d3d::end_scene ); + instance->m_d3d->hook( 16, &hooks::d3d::reset ); + instance->m_d3d->hook( 17, &hooks::d3d::present ); + instance->m_surface->hook( 62, &hooks::lock_cursor ); + //instance->m_view_render->hook( 6, &hooks::render_view ); + instance->m_engine_vgui->hook( 13, &hooks::paint ); + //instance->m_engine->hook( 93, &hooks::is_hltv_proxy ); + //instance->m_engine->hook( 91, &hooks::is_paused ); + //instance->m_engine->hook( 27, &hooks::is_connected ); + //instance->m_panel->hook( 41, &hooks::paint_traverse ); + instance->m_clientmode->hook( 21, &hooks::create_move ); + //instance->m_clientmode->hook( 23, &hooks::override_mouse_input ); + //instance->m_clientmode->hook( 35, &hooks::get_viewmodel_fov ); + //instance->m_clientmode->hook( 44, &hooks::do_post_screen_space_effects ); + instance->m_clientmode->hook( 16, &hooks::override_view ); + //instance->m_chl->hook( 35, &hooks::frame_stage_notify ); + //instance->m_chl->hook( 10, &hooks::hud_process_input ); + instance->m_prediction->hook( 17, &hooks::run_command ); + //instance->m_prediction->hook( 14, &hooks::in_prediction ); + //instance->m_model_render->hook( 21, &hooks::draw_model_execute ); + //instance->m_render_view->hook( 9, &hooks::scene_end ); + //instance->m_surface->hook( 44, &hooks::get_screen_size ); + //instance->m_surface->hook( 116, &hooks::on_screen_size_changed ); + //instance->m_surface->hook( 82, &hooks::play_sound ); + //instance->m_engine_sound->hook( 5, &hooks::emit_sound ); + //instance->m_debug_show_spread->hook( 13, &hooks::debug_show_spread_get_int ); + + return true; +} diff --git a/cheat/gmod/hooks.hpp b/cheat/gmod/hooks.hpp new file mode 100644 index 0000000..e4a6239 --- /dev/null +++ b/cheat/gmod/hooks.hpp @@ -0,0 +1,64 @@ +#pragma once +#include + +#include "util.hpp" +#include "d3d.hpp" +#include "interface.hpp" +#include "netvar_proxy.hpp" + +namespace hooks +{ + //hook like the hooker that u are + + long __stdcall window_procedure( HWND, uint32_t, uint32_t, long ); + extern decltype( &window_procedure ) window_procedure_o; + + void __fastcall fire_bullets( void*, void*, fire_bullets_info* ); + extern decltype( &fire_bullets ) fire_bullets_o; + + void __fastcall lock_cursor( void*, void* ); + void __fastcall paint( void*, void*, int ); + void __fastcall render_view( void*, void*, CViewSetup&, int, int ); + void __fastcall paint_traverse( void*, void*, unsigned int, bool, bool ); + bool __fastcall create_move( void*, void*, float, user_cmd_t* ); + void __fastcall frame_stage_notify( void*, void*, ClientFrameStage_t ); + void __fastcall run_command( void*, void*, IClientEntity*, user_cmd_t*, IMoveHelper* ); + void __fastcall override_mouse_input( void*, void*, float*, float* ); + void __fastcall draw_model_execute( IVModelRender*, void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + void __fastcall scene_end( void*, void* ); + bool __fastcall is_hltv_proxy( void*, void* ); + bool __fastcall is_hltv( void* thisptr, uintptr_t pvs_entity ); + float __fastcall get_viewmodel_fov( void*, void* ); + void __fastcall get_screen_size( void*, void*, int&, int& ); + void __fastcall override_view( void* ecx_, void* edx_, CViewSetup* setup ); + void __fastcall emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ); + + bool __fastcall is_connected( void* ecx_, void* edx_ ); + + bool __fastcall in_prediction( void* ecx_, void* edx_ ); + + void __cdecl lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); + void __cdecl last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); + int __fastcall send_datagram( INetChannel* channel, void* edx, void* datagram ); + bool __fastcall is_paused( void* ecx_, void* edx_ ); + bool __fastcall do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ); + void __fastcall on_screen_size_changed( void* ecx_, void* edx_, int old_h, int old_w ); + void __fastcall play_sound( void* ecx_, void* edx_, const char* name ); + void __fastcall hud_process_input( void* ecx_, void* edx_, bool repaint ); + + int __fastcall debug_show_spread_get_int( void* ecx_, void* edx_ ); + + extern c_netvar_proxy lby_proxy; + extern c_netvar_proxy last_shot_proxy; + + //do we wanna only run menu in d3d or visuals too? + namespace d3d { + long __stdcall end_scene( IDirect3DDevice9* ); + long __stdcall reset( IDirect3DDevice9*, D3DPRESENT_PARAMETERS* ); + long __stdcall present( IDirect3DDevice9*, RECT*, RECT*, HWND, RGNDATA* ); + } + + extern bool commit( factory::c_gmod* ); +} \ No newline at end of file diff --git a/cheat/gmod/hud_process_input.cpp b/cheat/gmod/hud_process_input.cpp new file mode 100644 index 0000000..b68c9c1 --- /dev/null +++ b/cheat/gmod/hud_process_input.cpp @@ -0,0 +1,19 @@ +#include "context.hpp" +#include "hooks.hpp" + +void __fastcall hooks::hud_process_input( void* ecx_, void* edx_, bool active ) { + static auto hud_update_o = g_csgo.m_chl->get_old_function< decltype( &hooks::hud_process_input ) >( 10 ); + + static auto g_vecRenderAngle = *pattern::first_code_match< vec3_t** >( g_csgo.m_chl.dll( ), + xors( "F3 0F 10 05 ? ? ? ? F3 0F 5C 05 ? ? ? ? F3 0F 11 86" ), 0x4 ); + + if( g_ctx.run_frame( ) ) { + float backup = g_vecRenderAngle->y; + g_vecRenderAngle->y = g_ctx.m_last_fakeangle.y; + hud_update_o( ecx_, 0, active ); + g_vecRenderAngle->y = backup; + return; + } + + return hud_update_o( ecx_, 0, active ); +} \ No newline at end of file diff --git a/cheat/gmod/icons.hpp b/cheat/gmod/icons.hpp new file mode 100644 index 0000000..bffd94e --- /dev/null +++ b/cheat/gmod/icons.hpp @@ -0,0 +1,5 @@ +#include "icons/legit.hpp" +#include "icons/rage.hpp" +#include "icons/visuals.hpp" +#include "icons/misc.hpp" +#include "icons/config.hpp" \ No newline at end of file diff --git a/cheat/gmod/icons/config.hpp b/cheat/gmod/icons/config.hpp new file mode 100644 index 0000000..be45039 --- /dev/null +++ b/cheat/gmod/icons/config.hpp @@ -0,0 +1,1752 @@ +/* E:\Users\admin\Desktop\stuff\icons\config.png (4/1/2018 10:00:36 PM) + StartOffset: 00000000, EndOffset: 0000519A, Length: 0000519B */ + +namespace icons { +constexpr static size_t config_size = 20891; +namespace raw { +static unsigned char config[20891] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, + 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, + 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x66, + 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, 0x65, 0x34, + 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, 0x2D, 0x32, + 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x30, 0x36, 0x32, 0x33, + 0x62, 0x65, 0x64, 0x36, 0x2D, 0x33, 0x35, 0x62, 0x35, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x37, + 0x61, 0x32, 0x34, 0x30, 0x39, 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, + 0x2D, 0x64, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, + 0x66, 0x66, 0x39, 0x62, 0x39, 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x37, 0x61, 0x32, 0x34, 0x30, 0x39, + 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, 0x2D, 0x64, 0x39, 0x34, 0x38, + 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, 0x66, 0x66, 0x39, 0x62, 0x39, + 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, + 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x66, 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, + 0x65, 0x34, 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, + 0x2D, 0x32, 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x55, 0x32, 0xFE, 0xAE, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0B, 0xBD, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x7B, 0x90, 0x95, 0x65, 0x1D, 0xC7, + 0x3F, 0xE7, 0xEC, 0xC2, 0xDE, 0x61, 0x59, 0x59, 0x02, 0x44, 0x28, 0x58, + 0xC0, 0x58, 0x09, 0x2C, 0x15, 0x44, 0x25, 0x35, 0x75, 0x6C, 0x14, 0xBB, + 0x20, 0x3A, 0x89, 0x63, 0xD9, 0xFD, 0xDE, 0x4C, 0xC3, 0x54, 0x96, 0x8D, + 0x91, 0x35, 0x43, 0x6A, 0x37, 0x2D, 0x29, 0x13, 0xB5, 0x2C, 0x2A, 0x8B, + 0xA9, 0x94, 0xA9, 0x2C, 0xBB, 0xDF, 0x30, 0x1C, 0xE4, 0xB2, 0x54, 0xC8, + 0x2D, 0x10, 0x01, 0xB9, 0x2E, 0xEC, 0xB2, 0xF7, 0x73, 0x9E, 0xFE, 0xF8, + 0xFD, 0x8E, 0x6E, 0xDC, 0xDE, 0xE7, 0x3D, 0x97, 0xF7, 0x76, 0x9E, 0xEF, + 0xCC, 0x99, 0xDD, 0x85, 0xF7, 0x3D, 0xE7, 0x3D, 0xEF, 0xF7, 0x7D, 0x9E, + 0xE7, 0x77, 0xF9, 0xFE, 0x7E, 0x4F, 0xCA, 0x18, 0x83, 0x43, 0x72, 0x91, + 0x76, 0xB7, 0xC0, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, + 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0x19, 0xA1, + 0x32, 0x61, 0xDF, 0xA7, 0x0A, 0x38, 0x13, 0xA8, 0x05, 0x1A, 0x80, 0x61, + 0xFA, 0xB3, 0x6E, 0xD0, 0xC3, 0x9C, 0x01, 0x8E, 0x01, 0x47, 0xF5, 0xD5, + 0x01, 0x74, 0x01, 0xCF, 0xEB, 0xFF, 0x39, 0x82, 0x23, 0x86, 0x51, 0xC0, + 0x6B, 0xF4, 0xE7, 0xAB, 0x81, 0x69, 0x40, 0x35, 0x50, 0xAF, 0xC4, 0xD6, + 0xEA, 0xDF, 0x29, 0x3D, 0x3E, 0x0B, 0xF4, 0x00, 0xDD, 0x40, 0xA7, 0xBE, + 0xBA, 0x80, 0xF5, 0xC0, 0x73, 0xC0, 0x3E, 0xE0, 0x59, 0xE0, 0x48, 0x12, + 0x08, 0x4E, 0xC5, 0x34, 0x54, 0x59, 0x0D, 0xCC, 0x00, 0xCE, 0x03, 0x66, + 0x02, 0xD3, 0x81, 0x26, 0x7D, 0x35, 0x28, 0x99, 0x69, 0x7D, 0xA5, 0x4E, + 0xF1, 0x1E, 0x46, 0xC9, 0xCE, 0xEA, 0xEF, 0xED, 0xC0, 0x21, 0xE0, 0x30, + 0xF0, 0x0C, 0xB0, 0x01, 0x78, 0x1A, 0x68, 0xD3, 0x63, 0x1C, 0xC1, 0x01, + 0xA0, 0x1E, 0xB8, 0x18, 0x98, 0x0B, 0xCC, 0x02, 0xA6, 0x02, 0x8D, 0x40, + 0x4D, 0x11, 0xED, 0x89, 0xAC, 0x4E, 0xE1, 0x87, 0x80, 0x8D, 0xC0, 0xDF, + 0x81, 0xBF, 0xEA, 0xCF, 0x7E, 0x47, 0x70, 0x69, 0x30, 0x14, 0xB8, 0x0C, + 0xB8, 0x0A, 0x78, 0x3D, 0x30, 0x51, 0x47, 0x6A, 0xA9, 0x97, 0x98, 0x01, + 0x1D, 0xD1, 0x9B, 0x81, 0xA7, 0x80, 0x27, 0x81, 0x7F, 0xE8, 0x88, 0x77, + 0x04, 0x17, 0x09, 0xD3, 0x80, 0xEB, 0x81, 0x6B, 0x74, 0xC4, 0x36, 0x84, + 0x60, 0xFD, 0x67, 0x95, 0xE8, 0x36, 0xE0, 0x71, 0x60, 0x05, 0xB0, 0xC3, + 0x11, 0x5C, 0xB8, 0x01, 0x78, 0x25, 0xF0, 0x7E, 0x60, 0x36, 0x30, 0x32, + 0x02, 0x6E, 0x5D, 0x06, 0xD8, 0x03, 0xFC, 0x11, 0x78, 0x10, 0xF8, 0x93, + 0x23, 0x38, 0x3F, 0x8C, 0x04, 0xDE, 0x09, 0xDC, 0xA0, 0x16, 0xF2, 0x90, + 0x88, 0x5D, 0x5F, 0x17, 0xB0, 0x16, 0x58, 0x06, 0xFC, 0x48, 0xFF, 0x76, + 0x6E, 0x92, 0x25, 0x26, 0x01, 0x1F, 0x07, 0xAE, 0x03, 0xC6, 0x46, 0x34, + 0x18, 0x53, 0xAB, 0x46, 0xDE, 0x19, 0xC0, 0x78, 0xE0, 0x9B, 0xC0, 0x7E, + 0x37, 0x82, 0xBD, 0x71, 0x0E, 0x70, 0x3B, 0xF0, 0x46, 0x0D, 0x52, 0x14, + 0x82, 0x0E, 0xF5, 0x65, 0xBB, 0x4E, 0x12, 0xC0, 0x18, 0xA2, 0x24, 0x35, + 0xEA, 0xCF, 0x7C, 0x61, 0xD4, 0x6F, 0x5E, 0x01, 0xDC, 0x09, 0xEC, 0x75, + 0x04, 0x9F, 0xDE, 0x98, 0x5A, 0x02, 0x5C, 0xA1, 0x6E, 0x4F, 0x3E, 0xD8, + 0xA1, 0x16, 0xEF, 0x0B, 0x1A, 0xB8, 0xD8, 0xA7, 0x24, 0x67, 0x4E, 0x32, + 0x73, 0x8D, 0x00, 0x5E, 0xA1, 0xFE, 0xF4, 0x68, 0x0D, 0x92, 0x8C, 0xC9, + 0xF3, 0x73, 0x8F, 0x02, 0x8F, 0x01, 0x77, 0x00, 0xBB, 0x1D, 0xC1, 0x27, + 0x62, 0x22, 0x70, 0x8F, 0x5A, 0xCA, 0x43, 0x7D, 0x9E, 0xDB, 0xA7, 0xAE, + 0xCB, 0x7A, 0x60, 0x95, 0x12, 0xDC, 0xAE, 0x53, 0x66, 0xAF, 0xBA, 0x3A, + 0xC7, 0x7F, 0xC9, 0x94, 0x7E, 0x4E, 0xB5, 0xAE, 0xF7, 0x8D, 0xFA, 0x80, + 0x9D, 0x0F, 0x9C, 0xAB, 0x46, 0x5D, 0x3E, 0x33, 0xC6, 0x72, 0xE0, 0xB3, + 0x51, 0x9A, 0xAE, 0xA3, 0x40, 0xF0, 0x08, 0xE0, 0x6E, 0x60, 0xA1, 0xDE, + 0x70, 0x3F, 0xF8, 0x3D, 0xF0, 0x3B, 0xB5, 0x6A, 0x77, 0x68, 0x70, 0xA2, + 0x17, 0x7F, 0x91, 0xA7, 0x94, 0xBE, 0x6A, 0x74, 0x4D, 0x7D, 0x25, 0x70, + 0xB5, 0xCE, 0x24, 0xE7, 0xFB, 0xBC, 0x9E, 0x76, 0xE0, 0x3E, 0x9D, 0xAE, + 0xFB, 0x1D, 0xC1, 0x50, 0x01, 0xDC, 0x06, 0x2C, 0x02, 0x86, 0xFB, 0x38, + 0xEF, 0x3F, 0xC0, 0x4F, 0x81, 0x95, 0x3A, 0x62, 0x4F, 0x36, 0x0D, 0x17, + 0x72, 0x4D, 0x67, 0x00, 0xAD, 0xC0, 0x5B, 0x80, 0xF9, 0x6A, 0xEC, 0xD9, + 0x62, 0x17, 0xB0, 0x58, 0xDD, 0xA8, 0xB2, 0x27, 0x78, 0x3E, 0xF0, 0x15, + 0xB5, 0x44, 0x6D, 0xF1, 0x2B, 0x60, 0xA9, 0x4E, 0xC7, 0x07, 0x29, 0x5D, + 0x9C, 0xB8, 0x02, 0xC9, 0x4C, 0xCD, 0x05, 0xDE, 0x87, 0x84, 0x48, 0x6D, + 0xF1, 0x6F, 0x75, 0xF3, 0x56, 0x95, 0x33, 0xC1, 0x13, 0x75, 0xCD, 0xBA, + 0x80, 0x53, 0x27, 0x04, 0x8E, 0xB7, 0x58, 0x97, 0x02, 0x0F, 0xEB, 0x7A, + 0xDB, 0x17, 0xD0, 0x75, 0xD6, 0x00, 0xAF, 0x03, 0x3E, 0x0A, 0x2C, 0xB0, + 0x3C, 0x27, 0xAB, 0xB3, 0xCB, 0x2D, 0x84, 0x9C, 0x95, 0xAA, 0x0C, 0xF1, + 0x73, 0x3F, 0xAC, 0x37, 0xCE, 0x86, 0xDC, 0x8C, 0x8E, 0xF4, 0xA5, 0xBA, + 0xD6, 0x06, 0x99, 0xDD, 0xE9, 0x56, 0x23, 0xAE, 0x5D, 0xAD, 0xE5, 0x77, + 0x59, 0x9C, 0x93, 0x46, 0xA2, 0x70, 0x6F, 0x07, 0xEE, 0x0D, 0x93, 0xE0, + 0xB0, 0x82, 0x08, 0x17, 0x02, 0x6F, 0xF3, 0xF1, 0x80, 0xDD, 0x03, 0x7C, + 0x1D, 0xD8, 0x4E, 0x38, 0xA9, 0xBB, 0x0C, 0x92, 0x59, 0x5A, 0xE2, 0x63, + 0x6D, 0xAD, 0xD1, 0xA9, 0x7D, 0x7A, 0xB9, 0x11, 0x5C, 0x0B, 0x7C, 0x40, + 0x7D, 0x4F, 0x1B, 0x3C, 0xA8, 0x96, 0xE9, 0x0B, 0x21, 0x2F, 0x67, 0x06, + 0xD8, 0x0A, 0x7C, 0x49, 0xA7, 0x5F, 0x1B, 0x4C, 0x05, 0x6E, 0x2E, 0x30, + 0x98, 0x12, 0x2B, 0x82, 0x2B, 0x90, 0x10, 0xDF, 0xD5, 0x96, 0xC7, 0xFF, + 0x41, 0xA7, 0xE6, 0xB0, 0xC9, 0x3D, 0x19, 0xC9, 0x1B, 0x2C, 0xBF, 0xEF, + 0x0D, 0xC0, 0xAB, 0xCA, 0x85, 0xE0, 0x34, 0xF0, 0x0E, 0xF5, 0x7D, 0xBD, + 0xF0, 0xBC, 0xFA, 0xC7, 0x9B, 0x88, 0x16, 0x0C, 0xA2, 0xF4, 0xB8, 0x0B, + 0x91, 0xFB, 0x78, 0x61, 0x82, 0x0F, 0xE3, 0x2C, 0xF6, 0x04, 0x4F, 0xF1, + 0x31, 0x7A, 0x1F, 0x45, 0xD2, 0x71, 0x51, 0x94, 0xCB, 0xF4, 0xEB, 0x34, + 0xFD, 0x43, 0xCB, 0x40, 0xCA, 0x8D, 0x48, 0xC4, 0xAC, 0x22, 0xE9, 0x04, + 0xCF, 0x07, 0x9A, 0x2D, 0x8E, 0x5B, 0x45, 0xC4, 0xD3, 0x70, 0x6A, 0x55, + 0x7F, 0x57, 0x0D, 0x3F, 0x2F, 0xB4, 0x00, 0xD7, 0x86, 0xF1, 0xB0, 0x06, + 0x49, 0x70, 0x35, 0x22, 0xB9, 0xB1, 0x71, 0x8B, 0x1E, 0x8E, 0xE0, 0xD4, + 0x7C, 0x32, 0x3C, 0x6B, 0x39, 0x8A, 0x2B, 0x91, 0xF4, 0xA7, 0x49, 0x32, + 0xC1, 0xB3, 0x81, 0xC9, 0x16, 0xC7, 0xAD, 0x47, 0x62, 0xCB, 0x7D, 0x31, + 0x20, 0xB8, 0x0B, 0x91, 0xF0, 0xD8, 0x64, 0x90, 0x5A, 0x81, 0x71, 0x49, + 0x26, 0x78, 0x0E, 0x92, 0xB5, 0xF1, 0xC2, 0x13, 0xC0, 0x4E, 0xE2, 0x83, + 0x8D, 0x48, 0xF8, 0xD4, 0x0B, 0x63, 0x10, 0xC1, 0x60, 0x62, 0x09, 0x9E, + 0x84, 0xB7, 0xF4, 0xE6, 0x00, 0x92, 0x21, 0xEA, 0x89, 0x11, 0xC1, 0x9D, + 0xD8, 0x69, 0xB3, 0xEA, 0x10, 0xF9, 0x51, 0x22, 0x09, 0x1E, 0xAE, 0x4E, + 0xBF, 0xD7, 0xFA, 0xBB, 0x5A, 0x47, 0x44, 0xDC, 0xB0, 0x0E, 0x51, 0x5C, + 0x7A, 0x59, 0xD3, 0x89, 0x9D, 0xA2, 0xA7, 0x5A, 0x3A, 0xFB, 0x5B, 0x90, + 0x0C, 0x51, 0xDC, 0xB0, 0x1D, 0x11, 0xE1, 0x79, 0x11, 0x3C, 0xC9, 0xD2, + 0x8B, 0x88, 0x1D, 0xC1, 0x63, 0x90, 0xAA, 0x04, 0xAF, 0x00, 0xC2, 0x26, + 0x44, 0x81, 0x11, 0x37, 0x74, 0x5A, 0x1A, 0x5A, 0x13, 0x80, 0xB3, 0x93, + 0x48, 0x70, 0xBD, 0x85, 0x93, 0xFF, 0x22, 0x92, 0x47, 0x8D, 0x23, 0x8C, + 0xCE, 0x3E, 0x5E, 0x0F, 0x67, 0xAD, 0xA5, 0xA1, 0x19, 0x3B, 0x82, 0xEB, + 0x2C, 0x3E, 0x6B, 0x3F, 0x22, 0x92, 0x8B, 0x2B, 0xB6, 0xE3, 0x9D, 0xFB, + 0xCD, 0x69, 0xC1, 0x12, 0x47, 0xF0, 0x30, 0x8B, 0xCF, 0xEA, 0x8C, 0x99, + 0xF5, 0x7C, 0x3C, 0x8E, 0x20, 0xD1, 0x2D, 0x2F, 0x82, 0xAB, 0x92, 0x48, + 0xB0, 0xCD, 0x97, 0xEA, 0x25, 0x86, 0xD5, 0x7B, 0x83, 0xD0, 0x87, 0x88, + 0x03, 0xBC, 0x30, 0x24, 0x89, 0x04, 0x1B, 0xBC, 0xC3, 0x74, 0x71, 0x6F, + 0x27, 0x91, 0xB6, 0xFC, 0x0E, 0xA9, 0x24, 0x12, 0xDC, 0x6B, 0x41, 0x70, + 0x25, 0xF1, 0xEE, 0x38, 0x90, 0xB2, 0xB8, 0xFE, 0x6C, 0xD0, 0xCB, 0x50, + 0x50, 0x04, 0x77, 0xE0, 0x2D, 0x6B, 0xAD, 0x0F, 0xDA, 0x00, 0x29, 0x32, + 0x9A, 0x2D, 0x7D, 0xDC, 0x81, 0x24, 0x12, 0xDC, 0x65, 0x31, 0x82, 0xC7, + 0x22, 0xA2, 0xF3, 0xB8, 0x62, 0x32, 0xDE, 0xDA, 0xEE, 0x34, 0x01, 0xA7, + 0x0C, 0x83, 0x24, 0xD8, 0xCB, 0x0F, 0x6E, 0x44, 0x04, 0x01, 0x71, 0x85, + 0x4D, 0xFD, 0x72, 0x07, 0x01, 0x27, 0x52, 0x82, 0x22, 0x78, 0x0B, 0x52, + 0x21, 0xEF, 0xB5, 0x06, 0x9F, 0x19, 0x53, 0x63, 0x6B, 0x04, 0x12, 0x86, + 0xF4, 0x32, 0x34, 0xB7, 0x03, 0xDB, 0x92, 0x48, 0xF0, 0x36, 0xA4, 0xC4, + 0xC4, 0x0B, 0xE7, 0x91, 0x7F, 0x85, 0x5F, 0x98, 0x18, 0x0F, 0x5C, 0x64, + 0x71, 0xDC, 0x2E, 0x02, 0x16, 0xC2, 0x07, 0x45, 0xF0, 0x31, 0xFD, 0x72, + 0x5E, 0x78, 0xAD, 0xC5, 0x48, 0x88, 0x22, 0x5A, 0xF1, 0x2E, 0xBF, 0x31, + 0x48, 0xBC, 0x3A, 0x93, 0x44, 0x82, 0x0D, 0x12, 0x67, 0xEE, 0xF5, 0x38, + 0x6E, 0x38, 0xF0, 0x86, 0x98, 0x91, 0x5B, 0x83, 0x94, 0xBD, 0x7A, 0xD9, + 0x18, 0x9D, 0xC0, 0x9F, 0xC3, 0x70, 0xCE, 0x83, 0xC2, 0x53, 0xD8, 0x89, + 0xE8, 0xAE, 0x27, 0x44, 0x1D, 0x71, 0x1E, 0x98, 0x01, 0x5C, 0x6E, 0x71, + 0xDC, 0x51, 0x44, 0x6E, 0x9B, 0x58, 0x82, 0xDB, 0xB0, 0x53, 0x20, 0x4E, + 0x41, 0x5A, 0x38, 0xC4, 0xC1, 0xD8, 0xAA, 0x42, 0x94, 0xA2, 0xA3, 0x2C, + 0x8E, 0x5D, 0x45, 0x08, 0x85, 0xE1, 0x41, 0xDE, 0xC4, 0x2E, 0xEC, 0x15, + 0x88, 0xEF, 0x45, 0x44, 0x02, 0x51, 0xC7, 0x4C, 0x44, 0xD4, 0x6E, 0x73, + 0x1F, 0x1F, 0x23, 0x84, 0x58, 0x7B, 0xD0, 0xA3, 0xE4, 0xB7, 0xD8, 0xA5, + 0x04, 0x5B, 0x91, 0xFA, 0x5A, 0x08, 0x41, 0x2C, 0x6E, 0x89, 0x6A, 0xA4, + 0x1B, 0xD0, 0x59, 0x16, 0xC7, 0x6E, 0xC4, 0x5B, 0xF1, 0x91, 0x08, 0x82, + 0xB7, 0x22, 0xAA, 0x49, 0x9B, 0x51, 0x7C, 0x93, 0x4E, 0x7F, 0x51, 0x6B, + 0xF1, 0x9B, 0xCB, 0x06, 0xDD, 0xEA, 0x63, 0x29, 0xF9, 0x09, 0x21, 0x35, + 0x67, 0x09, 0x9A, 0xE0, 0x63, 0xC0, 0xF7, 0x2C, 0x47, 0xF1, 0x18, 0xE0, + 0x33, 0x48, 0x53, 0x94, 0x28, 0xA1, 0x1F, 0x98, 0x07, 0x7C, 0x0C, 0x69, + 0xAB, 0x68, 0x33, 0x7A, 0x7F, 0x4E, 0x48, 0x55, 0x1A, 0x41, 0x13, 0x6C, + 0x80, 0x35, 0x96, 0xA3, 0x38, 0x85, 0xC8, 0x4C, 0x17, 0x23, 0x5A, 0xA6, + 0x28, 0xAD, 0xBB, 0xB7, 0x23, 0xE5, 0x28, 0x36, 0x58, 0x81, 0xF4, 0xA1, + 0x36, 0xE5, 0x40, 0x70, 0xCE, 0x1F, 0x5C, 0x66, 0x19, 0xF8, 0xA8, 0x50, + 0xBF, 0xF8, 0x73, 0x48, 0x18, 0x33, 0x6C, 0x4C, 0x47, 0x2A, 0x1E, 0x67, + 0x5A, 0xDA, 0x06, 0x1B, 0x91, 0x66, 0x31, 0xDD, 0x61, 0x5D, 0x70, 0x58, + 0xAE, 0xC8, 0x1A, 0xE0, 0x01, 0xCB, 0x63, 0x6B, 0x75, 0x2D, 0xFE, 0x2A, + 0xD2, 0xAC, 0x2C, 0x2C, 0x5C, 0x08, 0x7C, 0x03, 0xB8, 0x04, 0xBB, 0xB4, + 0x66, 0x2F, 0xD2, 0xBE, 0xE1, 0xB9, 0x30, 0x9F, 0xC8, 0xB0, 0x08, 0xEE, + 0x45, 0x2A, 0xF3, 0x7E, 0x69, 0x79, 0x7C, 0x03, 0x12, 0x2D, 0xBA, 0xCF, + 0x32, 0xA8, 0x50, 0x6C, 0x2C, 0x00, 0xBE, 0xA6, 0x24, 0xDB, 0x6A, 0xAA, + 0x96, 0xEB, 0xF4, 0xDC, 0x1B, 0x26, 0xC1, 0x61, 0x76, 0xD9, 0x49, 0xEB, + 0xF4, 0xFB, 0x00, 0xF6, 0x79, 0xE0, 0x7E, 0xA4, 0x47, 0xD6, 0x32, 0xBD, + 0x81, 0xA5, 0x0E, 0x1C, 0x8C, 0x47, 0x9A, 0xAE, 0xDC, 0xAC, 0x76, 0x80, + 0xAD, 0xCB, 0xB6, 0x1A, 0xF8, 0x08, 0x21, 0x44, 0xAE, 0xA2, 0x44, 0x30, + 0x48, 0x1C, 0x77, 0xA1, 0x8E, 0x4C, 0xDB, 0x2E, 0x77, 0x59, 0xB5, 0xC2, + 0x9F, 0x06, 0x1E, 0x02, 0xFE, 0x82, 0x77, 0x2A, 0xD2, 0x2F, 0xC6, 0xE8, + 0x4C, 0x71, 0xAB, 0xAE, 0xB7, 0x4D, 0xD8, 0x6B, 0xA9, 0xF6, 0x22, 0x81, + 0x9A, 0x27, 0x89, 0x40, 0x85, 0x64, 0x14, 0x5A, 0x19, 0x0E, 0x57, 0x97, + 0x63, 0xB1, 0xCF, 0xF3, 0x7A, 0x90, 0x36, 0x0F, 0xFF, 0x04, 0x7E, 0xA6, + 0x81, 0x84, 0xAD, 0x05, 0x5E, 0x4B, 0x2B, 0x92, 0xB2, 0x7C, 0x13, 0x92, + 0xD9, 0x1A, 0x8B, 0x3F, 0x15, 0x64, 0xBF, 0x8E, 0xDC, 0x47, 0x89, 0x48, + 0xF1, 0x7A, 0x54, 0x9A, 0x91, 0x8E, 0x46, 0x9A, 0x78, 0x7E, 0x30, 0x0F, + 0xB7, 0xAB, 0x4B, 0x47, 0xF4, 0x66, 0xA4, 0x32, 0x71, 0x27, 0x52, 0x98, + 0xBD, 0xC3, 0xC2, 0x7A, 0xAD, 0x53, 0x52, 0xA7, 0x20, 0x69, 0xCA, 0xAB, + 0x90, 0x02, 0xB1, 0x51, 0xBA, 0xD6, 0xFA, 0x55, 0x40, 0xDE, 0x86, 0xF4, + 0xF2, 0x8A, 0xCC, 0x96, 0x3C, 0x51, 0x21, 0x38, 0xA5, 0x6B, 0xDC, 0x22, + 0xE0, 0x43, 0x79, 0xFA, 0xD7, 0xFD, 0x7A, 0x63, 0xBB, 0x95, 0xEC, 0x5C, + 0xD7, 0xD9, 0xBE, 0x53, 0x1C, 0x9F, 0x6B, 0x3E, 0x3A, 0x4D, 0x5D, 0xB0, + 0x3A, 0x44, 0x36, 0x94, 0xCE, 0x83, 0xD8, 0x2C, 0xF0, 0x45, 0xB5, 0x9A, + 0x0F, 0x44, 0x29, 0x2A, 0x13, 0xA5, 0x7E, 0xD1, 0x29, 0x44, 0x95, 0x78, + 0xAD, 0x92, 0x3C, 0x33, 0x4F, 0x2B, 0x3F, 0x47, 0x76, 0x0F, 0x12, 0xE6, + 0xCC, 0x9E, 0xC6, 0xC8, 0xAB, 0x54, 0xA2, 0x2B, 0xC8, 0x4F, 0xAF, 0x3C, + 0x00, 0xFC, 0x0D, 0xB8, 0x1F, 0x49, 0x87, 0x1E, 0x22, 0x62, 0x88, 0x92, + 0x0E, 0x39, 0xD7, 0x3D, 0xFD, 0x80, 0x92, 0x93, 0x2A, 0xE0, 0x41, 0x19, + 0x4A, 0x30, 0x12, 0xDC, 0x14, 0x12, 0x7E, 0x7D, 0x31, 0x8A, 0xE4, 0x46, + 0x69, 0x04, 0xB7, 0x20, 0xF1, 0xDD, 0x59, 0xBA, 0x16, 0xB6, 0x10, 0x70, + 0x15, 0x5E, 0x01, 0xD8, 0xAF, 0xCB, 0xC1, 0x36, 0x64, 0xF3, 0xAC, 0x5F, + 0x10, 0xA1, 0xAE, 0xEF, 0x61, 0x13, 0x3C, 0x47, 0xA7, 0xE4, 0xCB, 0x91, + 0xB4, 0x5B, 0x93, 0x5A, 0xAD, 0x69, 0x02, 0x2E, 0xF1, 0x28, 0x00, 0xB9, + 0xED, 0xF1, 0xFA, 0x91, 0xE2, 0xF5, 0x2D, 0x48, 0x5A, 0x74, 0x25, 0xD2, + 0x50, 0xA6, 0x2C, 0x09, 0x9E, 0xA6, 0x01, 0x84, 0x2B, 0xD5, 0x15, 0x69, + 0x8C, 0x19, 0xA9, 0x5E, 0xEB, 0x7F, 0xBB, 0x12, 0xFD, 0x1B, 0x0D, 0xE4, + 0xEC, 0x29, 0x17, 0x82, 0x1B, 0x94, 0xD8, 0x85, 0x48, 0x25, 0x40, 0x18, + 0xBB, 0x98, 0x05, 0x85, 0x01, 0x44, 0x87, 0xB5, 0x01, 0x78, 0x04, 0x69, + 0xEC, 0xD6, 0x93, 0x64, 0x82, 0x2F, 0x02, 0x3E, 0x89, 0xF4, 0xCB, 0x6A, + 0x22, 0xBA, 0x4A, 0x8D, 0x62, 0x23, 0xA3, 0xEB, 0xF4, 0xAF, 0x91, 0x78, + 0xF6, 0xBA, 0xA4, 0x11, 0x3C, 0x04, 0x78, 0x37, 0xD2, 0x00, 0xBC, 0x85, + 0x78, 0x17, 0x98, 0x15, 0x82, 0x4E, 0x44, 0x78, 0xF8, 0x65, 0x24, 0x85, + 0x98, 0xB3, 0xC2, 0x4D, 0x9C, 0x09, 0x6E, 0x46, 0x54, 0x19, 0x37, 0x22, + 0xD1, 0xA1, 0x62, 0x4D, 0xC7, 0xFD, 0x1A, 0xD0, 0x18, 0x1C, 0xC4, 0xC8, + 0x6D, 0x80, 0x55, 0x45, 0x7E, 0x5B, 0xF3, 0xF4, 0xEA, 0xAC, 0x52, 0x7B, + 0x9C, 0xBB, 0x55, 0x4D, 0xF1, 0x8A, 0xB6, 0x07, 0x74, 0x3D, 0xBE, 0x1F, + 0x69, 0x70, 0xDE, 0x1D, 0xE7, 0x11, 0x3C, 0x01, 0xF8, 0x3C, 0xB2, 0x73, + 0x49, 0x43, 0x81, 0xEF, 0xB5, 0x67, 0x90, 0xAF, 0xB9, 0x1A, 0x91, 0xDF, + 0x1E, 0xD6, 0x51, 0x91, 0x1D, 0xE4, 0xAE, 0xF4, 0xAB, 0xC1, 0x56, 0x8F, + 0x7D, 0x15, 0x5F, 0x5A, 0xDF, 0xA7, 0x5D, 0x89, 0x6C, 0x1E, 0xF4, 0xEF, + 0x0D, 0xBA, 0x9C, 0x4C, 0x46, 0x62, 0xD3, 0x4D, 0x48, 0x22, 0x62, 0x64, + 0x81, 0x86, 0xD8, 0x61, 0x44, 0x61, 0x7A, 0x07, 0x25, 0x6E, 0x1B, 0x55, + 0x2A, 0x82, 0x27, 0x20, 0xED, 0xEF, 0xE7, 0x21, 0x21, 0xC0, 0x7C, 0x70, + 0x48, 0xFD, 0xCA, 0xAD, 0x48, 0x63, 0xF0, 0x2D, 0x3A, 0x4A, 0x8F, 0xE8, + 0x88, 0xCB, 0x45, 0xA9, 0xCC, 0xA0, 0xB5, 0xCE, 0xE8, 0x28, 0x4C, 0xFB, + 0x98, 0xFA, 0x52, 0xFA, 0x3E, 0x19, 0xFD, 0xBD, 0x62, 0xD0, 0xBF, 0xA7, + 0xF5, 0xEF, 0x6A, 0x25, 0x7B, 0x18, 0x22, 0xE7, 0x9D, 0xAB, 0xCB, 0xCD, + 0x9C, 0x02, 0x1E, 0xDE, 0x0E, 0xE0, 0x07, 0xC0, 0xA7, 0x29, 0x7E, 0x36, + 0xAC, 0xA4, 0x04, 0x8F, 0x43, 0x3A, 0xA2, 0xBF, 0x99, 0xFC, 0x5A, 0xD9, + 0xB7, 0x21, 0x42, 0x80, 0x35, 0x48, 0xA6, 0xA8, 0x53, 0x6F, 0x46, 0x1F, + 0x76, 0xAD, 0x20, 0x4A, 0x76, 0xAF, 0x78, 0xB9, 0x89, 0x4A, 0xBD, 0xCE, + 0x14, 0xB3, 0x91, 0x8D, 0x45, 0xAE, 0xC1, 0x5E, 0xA3, 0x75, 0x3C, 0xC9, + 0xDF, 0xD7, 0x65, 0xEC, 0x70, 0x1C, 0x08, 0x1E, 0x81, 0x04, 0xDC, 0xDF, + 0x9A, 0x07, 0xB9, 0xEB, 0x80, 0x1F, 0xEB, 0x68, 0xDD, 0xA4, 0x2E, 0x45, + 0x0F, 0xD1, 0xDD, 0x6D, 0x3B, 0xB7, 0x5B, 0x5A, 0x35, 0x22, 0x0E, 0xBC, + 0x42, 0x6D, 0x0D, 0xBF, 0x44, 0x77, 0x02, 0xDF, 0xD6, 0x91, 0xDC, 0x17, + 0x65, 0x82, 0xAB, 0xF4, 0x22, 0x17, 0xF9, 0x24, 0xF7, 0x20, 0x2F, 0xCB, + 0x5B, 0xD6, 0x22, 0xB1, 0xDD, 0xB8, 0x75, 0xBB, 0x1B, 0xA2, 0x4B, 0xD1, + 0x2C, 0x25, 0xF9, 0x26, 0xFC, 0xB5, 0x4B, 0x3A, 0xAC, 0x2E, 0xE4, 0x77, + 0xA2, 0x4C, 0xF0, 0x3C, 0x44, 0x4A, 0xD3, 0xEC, 0x73, 0xD4, 0xDE, 0x85, + 0xE4, 0x71, 0x0F, 0x12, 0xEF, 0x36, 0x4A, 0xB9, 0x87, 0x7C, 0xA4, 0x4E, + 0xD9, 0x9F, 0xC0, 0x5F, 0x29, 0xEC, 0x26, 0xE0, 0x3D, 0x88, 0x42, 0xA5, + 0x78, 0x30, 0xC6, 0x14, 0xE3, 0xD5, 0x62, 0x8C, 0x59, 0x6B, 0xFC, 0xE1, + 0x21, 0x63, 0xCC, 0x0C, 0x63, 0x4C, 0x8D, 0x31, 0x26, 0x55, 0xA4, 0xEB, + 0x88, 0xC2, 0x2B, 0x65, 0x8C, 0xA9, 0x33, 0xC6, 0x5C, 0x60, 0x8C, 0x59, + 0xE9, 0xE3, 0x7E, 0x0C, 0x18, 0x63, 0x1E, 0x37, 0xC6, 0x8C, 0x2B, 0xE6, + 0xF5, 0x14, 0xC3, 0x2F, 0x1D, 0xA6, 0x4F, 0x5E, 0xAB, 0x0F, 0x5F, 0x70, + 0x89, 0xBA, 0x08, 0x6D, 0xEA, 0x0B, 0x1A, 0x92, 0x03, 0xA3, 0xCB, 0xCC, + 0x1A, 0x44, 0x8A, 0xF4, 0x88, 0xE5, 0x79, 0x15, 0x48, 0x6C, 0x7E, 0x5E, + 0xD4, 0xA6, 0xE8, 0x8B, 0x91, 0x14, 0x59, 0x93, 0x65, 0xD8, 0xEE, 0x0B, + 0xBA, 0xD6, 0xEC, 0x4E, 0x18, 0xB1, 0xA7, 0xF2, 0xB1, 0xC7, 0x23, 0x7A, + 0xB3, 0x5B, 0x2C, 0xCF, 0xF9, 0xAF, 0x1A, 0x6C, 0x5B, 0x8B, 0x75, 0x01, + 0x85, 0xA0, 0x1A, 0x51, 0x5F, 0x34, 0x59, 0x1E, 0x7F, 0x2F, 0xA2, 0x59, + 0x2A, 0x07, 0x72, 0x51, 0xFF, 0x7A, 0x27, 0x52, 0xEA, 0xB2, 0xC2, 0xF2, + 0x9C, 0xF1, 0xC8, 0x96, 0x78, 0xA9, 0x28, 0x10, 0x7C, 0x09, 0x70, 0x99, + 0xE5, 0xB1, 0x4F, 0x20, 0xBB, 0x98, 0xED, 0x2B, 0x13, 0x72, 0x07, 0x93, + 0xBC, 0x0B, 0xF8, 0x14, 0xF0, 0x8C, 0x25, 0x27, 0x0B, 0x28, 0x52, 0x97, + 0x83, 0x42, 0x09, 0xBE, 0xCE, 0xD2, 0x6A, 0xDE, 0xA9, 0xD3, 0xD4, 0xEE, + 0x32, 0x23, 0x77, 0xF0, 0xBA, 0xBC, 0x4D, 0x6D, 0x0F, 0x1B, 0xC5, 0xE5, + 0x59, 0x1A, 0x4B, 0x08, 0x95, 0xE0, 0x16, 0x1D, 0xC1, 0x36, 0xEF, 0xF1, + 0x2D, 0xA4, 0x10, 0x2B, 0x4B, 0xF9, 0x22, 0x8B, 0xA4, 0x0C, 0x97, 0x5B, + 0x1A, 0x5C, 0x97, 0x6A, 0x20, 0x25, 0x34, 0x82, 0xCF, 0xC5, 0xAE, 0x18, + 0x6C, 0x15, 0x22, 0x4C, 0xEF, 0xC1, 0xE1, 0x18, 0xB2, 0x9B, 0xAA, 0x8D, + 0x01, 0x35, 0x07, 0xD9, 0x3C, 0x3B, 0x34, 0x82, 0x5B, 0xF1, 0x56, 0x65, + 0x66, 0x90, 0xDC, 0xE7, 0x16, 0xC7, 0xED, 0x4B, 0xC8, 0x15, 0x84, 0xDB, + 0xB8, 0x9F, 0x67, 0x87, 0x45, 0x70, 0xA3, 0x9A, 0xF2, 0x5E, 0xE7, 0xB7, + 0x21, 0xB1, 0xE5, 0x01, 0xC7, 0xEB, 0x4B, 0xE8, 0x45, 0x36, 0xD2, 0xDA, + 0x6B, 0xC1, 0xCD, 0x39, 0x61, 0x11, 0x3C, 0x12, 0xBB, 0xC6, 0xA1, 0x9B, + 0x91, 0x12, 0x12, 0x87, 0xFF, 0xC7, 0xBF, 0xB0, 0xDB, 0x67, 0xE9, 0x52, + 0xEC, 0x37, 0xD2, 0x2E, 0x2A, 0xC1, 0xCD, 0x78, 0xAB, 0x26, 0x06, 0x90, + 0x0A, 0xC0, 0x76, 0xC7, 0xE7, 0x09, 0x68, 0xC7, 0x6E, 0x83, 0xE9, 0xD1, + 0x14, 0x28, 0x96, 0xC8, 0x97, 0xE0, 0xD1, 0x78, 0x8B, 0xE6, 0x0E, 0x21, + 0xBA, 0xE0, 0x8C, 0xE3, 0xF3, 0x04, 0x74, 0x23, 0x89, 0x16, 0xAF, 0xF4, + 0x60, 0xA5, 0xAE, 0xC5, 0x81, 0x13, 0x3C, 0xDC, 0xE2, 0xDC, 0xA3, 0xC4, + 0x73, 0x17, 0xB3, 0xA0, 0xB0, 0xCF, 0xC2, 0x27, 0x4E, 0x87, 0x45, 0x70, + 0x2D, 0xDE, 0xA1, 0xB4, 0x7E, 0xE2, 0xB1, 0x45, 0x6C, 0x98, 0x2E, 0x93, + 0xD7, 0xFD, 0x49, 0x91, 0x9F, 0x2A, 0xA6, 0x60, 0x82, 0xAB, 0x2D, 0x09, + 0x76, 0xD6, 0xF3, 0xE9, 0xEF, 0x8F, 0x4D, 0xE0, 0xC7, 0x84, 0x41, 0xB0, + 0x0D, 0x32, 0x94, 0x77, 0xE4, 0xCA, 0x0B, 0x7D, 0x04, 0x10, 0xB6, 0x2D, + 0x65, 0xF9, 0x68, 0x13, 0x92, 0xDB, 0x9C, 0x41, 0xC0, 0xBB, 0x7D, 0xC5, + 0x84, 0xDC, 0xE9, 0xE4, 0xAF, 0x38, 0x8D, 0x04, 0xC1, 0xE3, 0x80, 0x3B, + 0x29, 0xCF, 0xE4, 0x82, 0x0D, 0x2A, 0x08, 0xA0, 0xCA, 0xA3, 0xB2, 0xC4, + 0x5F, 0xA0, 0xC2, 0xF1, 0x18, 0x2E, 0xD2, 0xEE, 0x16, 0x38, 0x82, 0x1D, + 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0xB0, 0x43, 0x74, 0x08, 0xCE, + 0x15, 0x62, 0x39, 0x94, 0x16, 0x05, 0xDF, 0xE7, 0x7C, 0xDD, 0xA4, 0x23, + 0x48, 0x3D, 0x4D, 0x35, 0x2E, 0x5A, 0x55, 0xCA, 0xC1, 0xD7, 0x41, 0x81, + 0x45, 0xE2, 0x51, 0xEA, 0x74, 0xE7, 0xE0, 0xD6, 0x60, 0x07, 0x47, 0xB0, + 0x83, 0x23, 0xD8, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, + 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0xD9, 0xE2, + 0x7F, 0x03, 0x00, 0xFF, 0x90, 0x57, 0xA9, 0xA4, 0xD4, 0xE2, 0xD9, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* config_icon = raw::config; +} \ No newline at end of file diff --git a/cheat/gmod/icons/legit.hpp b/cheat/gmod/icons/legit.hpp new file mode 100644 index 0000000..c5db680 --- /dev/null +++ b/cheat/gmod/icons/legit.hpp @@ -0,0 +1,1798 @@ +/* E:\Users\admin\Desktop\stuff\icons\legit.png (4/1/2018 9:59:16 PM) + StartOffset: 00000000, EndOffset: 000053B8, Length: 000053B9 */ + +namespace icons { +constexpr static size_t legit_size = 21433; +namespace raw { +static unsigned char legit[21433] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x32, + 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, 0x39, 0x32, + 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, 0x2D, 0x35, + 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, 0x33, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x64, 0x63, 0x38, 0x34, + 0x38, 0x37, 0x30, 0x30, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x61, + 0x32, 0x66, 0x61, 0x64, 0x37, 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, + 0x2D, 0x39, 0x66, 0x34, 0x30, 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, + 0x37, 0x35, 0x61, 0x36, 0x31, 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, 0x32, 0x66, 0x61, 0x64, 0x37, + 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, 0x2D, 0x39, 0x66, 0x34, 0x30, + 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, 0x37, 0x35, 0x61, 0x36, 0x31, + 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x32, 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, + 0x39, 0x32, 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, + 0x2D, 0x35, 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, + 0x33, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x78, 0xE1, 0xB7, 0x9F, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0D, 0xDB, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x70, 0xD5, 0xD5, 0x15, 0xC7, + 0xBF, 0x2F, 0x21, 0x46, 0x88, 0x24, 0x84, 0x04, 0x15, 0xC4, 0x32, 0xE0, + 0x82, 0x88, 0x8A, 0x80, 0x48, 0x47, 0xAA, 0x8E, 0xD6, 0x05, 0x5C, 0xAA, + 0xA2, 0xD6, 0xB1, 0x08, 0x6A, 0xD5, 0x56, 0xB4, 0x75, 0x5F, 0x6A, 0xDD, + 0x82, 0x6B, 0xC5, 0xE2, 0x86, 0xB4, 0xD6, 0xDA, 0xD6, 0x8D, 0x8A, 0x75, + 0x5C, 0xC6, 0x1D, 0xB4, 0x3A, 0x50, 0xB7, 0xBA, 0x55, 0x45, 0x44, 0x91, + 0x28, 0x22, 0xAB, 0x52, 0x76, 0x49, 0x42, 0x96, 0x6F, 0xFF, 0xB8, 0xDF, + 0x37, 0xF3, 0x4C, 0x21, 0xF9, 0x9D, 0x9B, 0xDF, 0x7B, 0xEF, 0x17, 0x72, + 0xCF, 0xCC, 0x6F, 0x70, 0xCC, 0xFB, 0xBD, 0x7B, 0xDF, 0xFD, 0xFC, 0xCE, + 0xB9, 0xE7, 0xDE, 0x7B, 0xCE, 0xF9, 0xA5, 0x48, 0x22, 0xC8, 0x96, 0x2B, + 0x05, 0x61, 0x08, 0x02, 0xE0, 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, + 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, + 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, + 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, 0x20, 0x01, 0x70, 0x90, 0xF6, + 0x27, 0x9D, 0x12, 0xD2, 0x8F, 0x42, 0x00, 0x83, 0x00, 0x1C, 0x09, 0x60, + 0x00, 0x80, 0x62, 0x00, 0x5F, 0x01, 0x78, 0x0B, 0xC0, 0x8B, 0x00, 0xBE, + 0x03, 0xD0, 0x98, 0x60, 0x25, 0xD9, 0x19, 0xC0, 0xF1, 0x00, 0x06, 0x02, + 0xD8, 0x06, 0xC0, 0x22, 0x00, 0xEF, 0x02, 0x78, 0x0A, 0xC0, 0xEA, 0x8E, + 0x0E, 0xB8, 0x04, 0xC0, 0xD1, 0x00, 0x2E, 0x05, 0x30, 0xA4, 0xD9, 0xDF, + 0x96, 0x01, 0x98, 0x0A, 0xE0, 0x3E, 0x00, 0x9F, 0x01, 0x48, 0x5A, 0x7C, + 0x51, 0x31, 0x80, 0x91, 0xEA, 0xFB, 0x88, 0x66, 0x7F, 0x5B, 0x07, 0xA0, + 0x3F, 0x80, 0x5B, 0x01, 0xAC, 0xCC, 0x5B, 0x0F, 0x49, 0xE6, 0xFB, 0xDA, + 0x9D, 0xE4, 0x7B, 0xDC, 0xBC, 0x6C, 0x20, 0x79, 0x3B, 0xC9, 0x01, 0x24, + 0x53, 0x09, 0xE8, 0x6F, 0xFA, 0xEA, 0x42, 0xF2, 0xF8, 0x56, 0xFA, 0x5E, + 0x4F, 0xF2, 0x12, 0x92, 0x9D, 0xF2, 0xD5, 0xCF, 0x24, 0xCC, 0xC1, 0x7B, + 0x00, 0xD8, 0xBD, 0x85, 0xBF, 0x77, 0x06, 0x70, 0x2E, 0x80, 0x73, 0xA4, + 0x11, 0xA9, 0x04, 0xF4, 0xB9, 0x0B, 0x80, 0x23, 0x00, 0x5C, 0xB1, 0x09, + 0xAB, 0xD3, 0xDC, 0x42, 0x8E, 0x94, 0x95, 0xEA, 0xB0, 0x4E, 0x56, 0x5F, + 0x00, 0x5B, 0xB7, 0xF2, 0x99, 0x22, 0x00, 0xE3, 0x75, 0xED, 0x92, 0x10, + 0xB3, 0x7C, 0x25, 0x80, 0xA1, 0x11, 0x3E, 0xBF, 0x03, 0x80, 0xD2, 0x8E, + 0x0C, 0x38, 0xAA, 0xF3, 0x54, 0x28, 0xC0, 0xE7, 0x49, 0x93, 0xF3, 0x21, + 0x5B, 0x4B, 0x73, 0xAF, 0x06, 0xB0, 0x77, 0xC4, 0x7B, 0x9A, 0xF2, 0xE9, + 0x3B, 0x24, 0x01, 0xF0, 0xE7, 0x00, 0xD6, 0x47, 0xFC, 0x6C, 0x11, 0x80, + 0x33, 0x01, 0x5C, 0x98, 0x07, 0xC8, 0xC5, 0x00, 0x46, 0x01, 0xA8, 0x32, + 0xC0, 0x05, 0x80, 0x2F, 0x01, 0xAC, 0xED, 0xC8, 0x80, 0x3F, 0x00, 0xF0, + 0x86, 0xE1, 0x29, 0x2F, 0x06, 0x70, 0x1A, 0x80, 0x8B, 0x00, 0xEC, 0x96, + 0xA3, 0x39, 0x39, 0x6D, 0x96, 0x27, 0x00, 0xD8, 0xCB, 0x70, 0xDF, 0x72, + 0x00, 0x33, 0x00, 0xD4, 0x75, 0x64, 0xC0, 0x5F, 0x03, 0xB8, 0x01, 0xC0, + 0x6C, 0x83, 0xB9, 0x2E, 0x06, 0x70, 0x86, 0x96, 0x27, 0x03, 0x65, 0xBE, + 0xB3, 0x25, 0x5B, 0x01, 0xF8, 0x89, 0xFA, 0xB8, 0xA7, 0xE1, 0xBE, 0xD5, + 0x00, 0xEE, 0x01, 0x30, 0x0D, 0x40, 0x7D, 0x47, 0x5E, 0x26, 0xA5, 0xAF, + 0xFD, 0x49, 0xBE, 0x4F, 0xB2, 0x81, 0xD1, 0xA5, 0x9E, 0xE4, 0xBD, 0x24, + 0x07, 0x91, 0x2C, 0xCC, 0x42, 0x9F, 0x8A, 0x49, 0x9E, 0x48, 0xF2, 0x23, + 0xDA, 0x64, 0x25, 0xC9, 0xEB, 0x49, 0x6E, 0x9B, 0xEF, 0x71, 0x4D, 0x12, + 0xE0, 0x34, 0xE4, 0xF7, 0x3C, 0x20, 0xFF, 0x99, 0xE4, 0xE0, 0x98, 0x21, + 0x77, 0x26, 0x79, 0x12, 0xC9, 0x8F, 0x8D, 0x70, 0x57, 0x90, 0x9C, 0x40, + 0xB2, 0x22, 0x09, 0x63, 0x9A, 0x34, 0xC0, 0x20, 0xB9, 0x1F, 0xC9, 0x77, + 0x8D, 0x90, 0x1B, 0x05, 0x79, 0x08, 0xC9, 0xA2, 0x18, 0xFA, 0x50, 0x42, + 0x72, 0x0C, 0xC9, 0xB9, 0x46, 0xB8, 0xDF, 0x08, 0x6E, 0x59, 0x52, 0xC6, + 0x33, 0x5B, 0x5F, 0x9C, 0x22, 0x59, 0xA0, 0x2B, 0x57, 0x90, 0x99, 0x01, + 0xB9, 0x2D, 0x3B, 0x47, 0xDB, 0x90, 0x1C, 0x47, 0xF2, 0x13, 0x63, 0xDB, + 0xCB, 0x48, 0x5E, 0x4B, 0xB2, 0x7B, 0x92, 0x14, 0x26, 0x15, 0x73, 0xFA, + 0x68, 0xA1, 0x36, 0xDB, 0xCB, 0xB5, 0xDB, 0x03, 0x2D, 0x81, 0x56, 0xE9, + 0xC0, 0xA0, 0xC9, 0xF0, 0x5D, 0x23, 0x00, 0x4C, 0x02, 0xB0, 0x8F, 0xC1, + 0x89, 0x6A, 0x02, 0xF0, 0x17, 0x00, 0xF7, 0xCA, 0x3B, 0x6F, 0x30, 0xF6, + 0xBF, 0x14, 0xC0, 0x71, 0x19, 0xCE, 0x5B, 0x54, 0x59, 0x06, 0x60, 0x0A, + 0x80, 0xC9, 0x00, 0xD6, 0x18, 0xC7, 0xAB, 0x44, 0xFF, 0x52, 0xFD, 0x8F, + 0xF5, 0x60, 0x25, 0x4E, 0xC0, 0x85, 0xDA, 0x65, 0x1A, 0x07, 0xE0, 0x30, + 0x00, 0x83, 0x35, 0xC0, 0x6F, 0x03, 0x78, 0x16, 0xC0, 0x63, 0x00, 0x16, + 0x1A, 0x07, 0x7D, 0x18, 0x80, 0x3B, 0x00, 0x0C, 0x37, 0x7A, 0xCA, 0x0F, + 0x00, 0xF8, 0x03, 0x80, 0xF7, 0x0D, 0xED, 0x75, 0xD3, 0x89, 0xD0, 0x25, + 0x5A, 0x7E, 0x45, 0xF2, 0x51, 0x01, 0x2C, 0x01, 0x70, 0xB7, 0xAE, 0xF5, + 0x86, 0x3E, 0x96, 0xC8, 0x2B, 0x3F, 0x04, 0xC0, 0xF6, 0xEA, 0xE7, 0x5A, + 0x00, 0xCF, 0x68, 0x6F, 0x60, 0x4D, 0x2C, 0x1B, 0x24, 0x31, 0x9A, 0x83, + 0x3E, 0x24, 0xA7, 0xB6, 0x60, 0xC2, 0x1E, 0x22, 0x39, 0xCC, 0x63, 0x8E, + 0xDC, 0x97, 0xE4, 0xDB, 0x1E, 0xE6, 0xFA, 0xAF, 0x24, 0x87, 0x46, 0x34, + 0xD7, 0x65, 0x24, 0x7F, 0x4E, 0xF2, 0x53, 0xC3, 0xF7, 0x37, 0x91, 0x5C, + 0x4C, 0xF2, 0xB7, 0x24, 0xBB, 0x1A, 0x7F, 0x53, 0x19, 0xC9, 0xD3, 0xF5, + 0xBB, 0x9A, 0xCB, 0xDB, 0x24, 0xCF, 0x8E, 0x6B, 0x1E, 0x8F, 0xD3, 0xE3, + 0xBC, 0x3A, 0xC2, 0xA0, 0x4C, 0xF5, 0x84, 0x3C, 0x9C, 0xE4, 0x9B, 0x1E, + 0x90, 0xFF, 0x26, 0xEF, 0xBA, 0x25, 0xC8, 0xDD, 0x34, 0xD8, 0x56, 0xB8, + 0x8B, 0x04, 0x77, 0x1B, 0xE3, 0x6F, 0x29, 0x27, 0x79, 0x16, 0xC9, 0xEA, + 0x16, 0xBE, 0x7F, 0xAE, 0x56, 0x14, 0xA9, 0xA4, 0x00, 0xEE, 0x4E, 0xF2, + 0xB9, 0x88, 0x83, 0xF3, 0xA8, 0x80, 0x59, 0x1D, 0xA1, 0xA1, 0x24, 0x5F, + 0xD7, 0xB2, 0xC8, 0x22, 0x7F, 0x27, 0xB9, 0xCF, 0x66, 0xDA, 0x2B, 0xD3, + 0x60, 0xCF, 0x37, 0xC2, 0xFD, 0x5A, 0xC7, 0x80, 0x25, 0x1E, 0x70, 0xCF, + 0xD5, 0xC3, 0xD1, 0x9A, 0xDC, 0x11, 0xC7, 0x8A, 0x20, 0x2E, 0xC0, 0x95, + 0x24, 0x9F, 0x37, 0x0C, 0xD2, 0x23, 0xF2, 0x76, 0xAD, 0xEB, 0xD6, 0x7D, + 0x48, 0xBE, 0xE1, 0x01, 0x79, 0xDA, 0x26, 0xDA, 0x2B, 0x25, 0x79, 0x06, + 0xC9, 0xCF, 0x8D, 0x70, 0x97, 0x90, 0xBC, 0x4C, 0xE7, 0xC1, 0x96, 0xBE, + 0x97, 0xCA, 0xF4, 0x2E, 0x8C, 0xD8, 0xD6, 0x73, 0x24, 0xB7, 0x4A, 0x0A, + 0xE0, 0x72, 0x92, 0x4F, 0x19, 0x07, 0xFD, 0x61, 0x92, 0x7B, 0x7B, 0x40, + 0x1E, 0xE6, 0x09, 0x79, 0x6A, 0x06, 0xE4, 0x2E, 0x24, 0x4F, 0x25, 0x39, + 0xCF, 0x08, 0x77, 0x29, 0xC9, 0x2B, 0x3C, 0xE6, 0xDC, 0xF4, 0xC3, 0x54, + 0x6D, 0x68, 0xEF, 0x49, 0x92, 0x5B, 0x27, 0x05, 0x70, 0x21, 0xC9, 0x5F, + 0x91, 0xAC, 0x35, 0x0E, 0xD8, 0x63, 0x32, 0xBD, 0xD6, 0x27, 0x75, 0x08, + 0xC9, 0x59, 0x24, 0x37, 0x7A, 0x40, 0xDE, 0x83, 0xE4, 0xC9, 0x46, 0xCD, + 0x6D, 0x94, 0xE6, 0x5E, 0xE2, 0xA1, 0xB9, 0xE5, 0x46, 0xCD, 0x4D, 0xB7, + 0x77, 0x77, 0x92, 0x34, 0x18, 0x24, 0x7B, 0x92, 0x7C, 0x96, 0x64, 0x9D, + 0x71, 0xD0, 0x1F, 0x6F, 0x61, 0x8E, 0x6C, 0xE9, 0xDA, 0x9B, 0xE4, 0x4C, + 0x23, 0xE4, 0x26, 0x92, 0xCF, 0x78, 0x3A, 0x54, 0x17, 0xCB, 0x99, 0xB4, + 0x6A, 0xEE, 0x99, 0x11, 0xE7, 0xDC, 0x4C, 0xB8, 0xD5, 0x24, 0x47, 0x24, + 0xC9, 0xC9, 0xCA, 0x1C, 0xF4, 0x7F, 0x7A, 0x40, 0x9E, 0x26, 0x4D, 0xB6, + 0x3A, 0x15, 0x83, 0x3D, 0x35, 0xD9, 0x3A, 0xE7, 0xFA, 0x38, 0x54, 0x5D, + 0x49, 0x9E, 0x66, 0x34, 0xCB, 0x8D, 0xD2, 0xF4, 0x5F, 0x7B, 0x58, 0x8A, + 0x9C, 0x6D, 0x55, 0x0E, 0x22, 0x39, 0xC3, 0x13, 0xF2, 0x0F, 0x3D, 0xE6, + 0x9D, 0xC1, 0x24, 0x5F, 0xC9, 0x02, 0xE4, 0xC6, 0x0C, 0x6F, 0xD9, 0xBA, + 0x14, 0x4A, 0xAF, 0x73, 0x2D, 0xD3, 0x40, 0x03, 0xC9, 0x05, 0x9A, 0xEA, + 0x4A, 0x93, 0xBE, 0x17, 0xBD, 0x9B, 0xBC, 0xC0, 0x5A, 0xE3, 0xA0, 0x3E, + 0x4D, 0xF2, 0x40, 0x0F, 0x53, 0xB8, 0x17, 0xC9, 0x97, 0x3C, 0x1E, 0xAA, + 0x96, 0x06, 0xFB, 0x4B, 0x92, 0xE7, 0x79, 0x3C, 0x70, 0x15, 0x9E, 0x73, + 0xEE, 0x7C, 0x92, 0xBF, 0xD4, 0x11, 0x65, 0xBB, 0x38, 0x4D, 0x1A, 0xE0, + 0x09, 0xF9, 0x09, 0x4F, 0xC8, 0x83, 0x48, 0xBE, 0x1C, 0x03, 0xE4, 0x06, + 0x92, 0x5F, 0xC8, 0x4C, 0x5A, 0x07, 0xBB, 0xBB, 0x20, 0x2D, 0xF4, 0x98, + 0x73, 0xCF, 0x8D, 0x1B, 0x6E, 0x2E, 0x8E, 0x0B, 0x07, 0xC8, 0xF1, 0xAA, + 0xF1, 0x70, 0xBC, 0xF6, 0xF7, 0x98, 0x87, 0x06, 0xC9, 0x07, 0xA8, 0xCD, + 0x31, 0xDC, 0x54, 0x86, 0xE6, 0x7E, 0x65, 0x6C, 0x6F, 0xBE, 0xEE, 0xEB, + 0xC2, 0x76, 0x7A, 0x1E, 0xDC, 0x5F, 0xC0, 0x6A, 0x3C, 0xCC, 0xF5, 0xC1, + 0x1E, 0xF3, 0xDF, 0x40, 0x92, 0x2F, 0x78, 0x40, 0x6E, 0xD0, 0xBA, 0x78, + 0xBC, 0xD1, 0xD9, 0x4B, 0x29, 0x72, 0xE3, 0x02, 0xCD, 0xD9, 0x96, 0xF6, + 0xE6, 0x6A, 0xAE, 0xDE, 0x8A, 0xED, 0xFC, 0xC0, 0x7F, 0x67, 0x6D, 0x84, + 0x58, 0x21, 0x3F, 0x4B, 0xF2, 0x10, 0x0F, 0x73, 0x3D, 0x90, 0xE4, 0x74, + 0x03, 0xE4, 0x46, 0x92, 0x9F, 0x49, 0x93, 0xAC, 0x70, 0x7B, 0x90, 0xBC, + 0x50, 0xDE, 0xB6, 0xF5, 0x61, 0x3A, 0xBD, 0x0D, 0x67, 0xE6, 0x89, 0x8B, + 0xE8, 0xE8, 0xAF, 0x35, 0xA8, 0x15, 0xF2, 0x93, 0x9A, 0x93, 0xAD, 0xCE, + 0xCE, 0x1E, 0xF2, 0xE6, 0x5B, 0xF3, 0xAE, 0x9B, 0x32, 0xCC, 0xA4, 0x15, + 0x6E, 0x25, 0xC9, 0xF3, 0x75, 0xAA, 0x64, 0x85, 0x7B, 0x56, 0xB6, 0xE1, + 0xE6, 0x23, 0x64, 0x67, 0x27, 0x99, 0xEB, 0x0D, 0x1E, 0xE6, 0xFA, 0x20, + 0x0F, 0xC8, 0xBB, 0x93, 0xFC, 0x57, 0x2B, 0xDB, 0x9A, 0x8B, 0x65, 0x96, + 0x3B, 0x79, 0x98, 0xE5, 0x8B, 0x8C, 0x70, 0xEB, 0x15, 0xE3, 0x75, 0x3A, + 0x73, 0x94, 0x67, 0x95, 0x8F, 0x30, 0x92, 0x7E, 0x9E, 0xE6, 0x7A, 0x3A, + 0xC9, 0x03, 0x3C, 0xCC, 0xF5, 0x01, 0xDA, 0xBB, 0x5E, 0x2F, 0x6D, 0x6D, + 0xD2, 0xF7, 0xD5, 0xC9, 0xAC, 0x5E, 0xEE, 0xA1, 0xB9, 0xDB, 0x69, 0x67, + 0x6B, 0xB9, 0x51, 0x73, 0x3F, 0x21, 0x39, 0x76, 0x4B, 0x88, 0xC9, 0x8A, + 0x32, 0x27, 0x3F, 0xED, 0x01, 0xF9, 0x05, 0x01, 0xB3, 0x2E, 0x27, 0x06, + 0x91, 0x7C, 0x40, 0xA6, 0x78, 0x81, 0x3C, 0xDD, 0xE9, 0x3A, 0xE4, 0xB7, + 0x3A, 0x38, 0x95, 0x9A, 0x73, 0x2D, 0x70, 0x1B, 0xB5, 0x3D, 0x7A, 0x5A, + 0x7B, 0x8F, 0xC9, 0xB2, 0xC8, 0x4E, 0x8A, 0xB9, 0x3A, 0x4C, 0x19, 0x84, + 0x51, 0xE5, 0x45, 0x00, 0x37, 0x29, 0x14, 0xC8, 0x92, 0x31, 0x50, 0xA1, + 0x50, 0x9C, 0x46, 0xA5, 0xC0, 0x2C, 0x50, 0xD0, 0x3D, 0x8C, 0xDF, 0x31, + 0x16, 0xC0, 0x65, 0x00, 0x7A, 0x1A, 0x72, 0xAF, 0xAA, 0x01, 0xDC, 0x0C, + 0xE0, 0x21, 0xE4, 0x3A, 0x91, 0x3D, 0xCF, 0x51, 0x7F, 0xFD, 0xE4, 0x44, + 0x59, 0xE7, 0xE4, 0xE7, 0x3D, 0x1D, 0xAF, 0xB6, 0x44, 0x89, 0x56, 0x68, + 0x29, 0x64, 0xF5, 0x96, 0xE7, 0x4A, 0x73, 0xF3, 0x92, 0x23, 0x9C, 0x84, + 0xD0, 0xCE, 0x3E, 0xDA, 0xBD, 0xB2, 0x42, 0x9E, 0xA1, 0x25, 0x54, 0x97, + 0x1C, 0xC0, 0xDD, 0x56, 0x66, 0xF9, 0x1B, 0xA3, 0x59, 0x4E, 0xC3, 0xCD, + 0x5B, 0xE2, 0x7A, 0x52, 0xE2, 0x77, 0xFB, 0xEA, 0x6C, 0x78, 0x9D, 0x11, + 0xF2, 0xCB, 0x24, 0x0F, 0xCD, 0x22, 0xE4, 0x34, 0x5C, 0x1F, 0x87, 0x6A, + 0x2E, 0x5D, 0x7C, 0x75, 0x51, 0x3E, 0xC7, 0x36, 0x49, 0x19, 0x0D, 0xFD, + 0x14, 0xCA, 0x63, 0x85, 0xFC, 0x12, 0xC9, 0x51, 0x1E, 0x51, 0x16, 0x51, + 0xE0, 0xF6, 0xD4, 0x69, 0x92, 0xC5, 0x2C, 0xA7, 0x97, 0x42, 0x63, 0xB3, + 0xB9, 0x43, 0xD5, 0x1E, 0x01, 0x67, 0x86, 0xDE, 0x5A, 0x21, 0xCF, 0x22, + 0x39, 0x32, 0xC6, 0x79, 0xAE, 0x80, 0xE4, 0x8E, 0x74, 0x09, 0x64, 0x2B, + 0x8C, 0x70, 0x67, 0x2B, 0x62, 0xA4, 0x30, 0x09, 0x63, 0x9A, 0xC4, 0xDC, + 0xA4, 0xDE, 0x24, 0x1F, 0xF4, 0x80, 0xFC, 0x38, 0xC9, 0xED, 0x63, 0xEA, + 0x43, 0x0F, 0x92, 0x37, 0x69, 0x1E, 0xB5, 0xC0, 0xFD, 0x90, 0x2E, 0x61, + 0x2D, 0x31, 0xE3, 0x99, 0xC4, 0x42, 0x68, 0x8B, 0x54, 0xFF, 0xE2, 0x29, + 0xD8, 0x6A, 0x4C, 0x1D, 0x0B, 0x57, 0x63, 0x2B, 0x0E, 0xD9, 0x53, 0x49, + 0xE6, 0x51, 0xC7, 0x67, 0xA3, 0xF2, 0x9B, 0x6F, 0x06, 0xF0, 0x68, 0x92, + 0x06, 0x33, 0xA9, 0x95, 0xEE, 0xBE, 0x06, 0x70, 0x1D, 0x80, 0xD7, 0x0C, + 0xE9, 0x1B, 0x4D, 0xCA, 0x89, 0x8A, 0x43, 0xB6, 0x37, 0xAC, 0x73, 0x1B, + 0x00, 0x7C, 0xA4, 0x04, 0xF1, 0x69, 0x49, 0x1B, 0xC8, 0xA4, 0x02, 0x2E, + 0x03, 0xD0, 0x4B, 0x1B, 0x19, 0x51, 0x01, 0xA7, 0x94, 0xBF, 0x14, 0x47, + 0x49, 0x87, 0x72, 0x43, 0xBB, 0x0D, 0x00, 0x66, 0x01, 0x78, 0x39, 0x89, + 0x03, 0x99, 0x44, 0xC0, 0x25, 0x4A, 0xC8, 0xBA, 0x45, 0xC9, 0x60, 0x51, + 0xFB, 0xB8, 0x0C, 0xC0, 0x17, 0x31, 0x55, 0xB4, 0x59, 0x21, 0xB3, 0x1B, + 0x35, 0xE9, 0xEE, 0x47, 0x00, 0xC6, 0x00, 0xD8, 0x36, 0x69, 0x83, 0xD9, + 0x29, 0x81, 0x70, 0x0F, 0x56, 0x81, 0x95, 0xE1, 0x86, 0xFB, 0x6A, 0x00, + 0x3C, 0x01, 0x60, 0x71, 0x4C, 0xFD, 0xF8, 0x1C, 0xC0, 0x5C, 0x44, 0xAB, + 0xA6, 0x53, 0x04, 0x60, 0x5F, 0x00, 0xBD, 0x95, 0x32, 0xFB, 0x20, 0x80, + 0x6F, 0x83, 0x06, 0xFF, 0xBF, 0x74, 0x05, 0x70, 0x28, 0x5C, 0xF5, 0xB8, + 0xFD, 0x0C, 0xF7, 0xAD, 0x07, 0x30, 0x1D, 0xC0, 0x44, 0x55, 0xB5, 0x89, + 0x43, 0xE6, 0x2B, 0xCF, 0x78, 0xA9, 0xC1, 0x22, 0xF4, 0xD2, 0x83, 0x39, + 0x0E, 0x40, 0x0F, 0x24, 0xA3, 0x22, 0x5F, 0x62, 0x96, 0x49, 0x5D, 0x49, + 0x8E, 0x66, 0xCB, 0x75, 0x1F, 0x37, 0x25, 0x6B, 0x48, 0xDE, 0x4F, 0xB2, + 0x57, 0x16, 0xFA, 0x54, 0xA4, 0xBD, 0xE7, 0x6A, 0xDA, 0xB2, 0x1A, 0x97, + 0x90, 0xBC, 0x54, 0x3B, 0x60, 0xA9, 0xB0, 0x0E, 0x76, 0x31, 0x57, 0xC7, + 0x91, 0x7C, 0xC7, 0x08, 0x77, 0x35, 0xC9, 0xFB, 0xB4, 0x66, 0xCD, 0xE6, + 0x3E, 0xF4, 0x38, 0x92, 0x73, 0x8C, 0x90, 0x17, 0xD3, 0x25, 0xA8, 0xF5, + 0xCC, 0x37, 0xE4, 0x7C, 0x82, 0x4D, 0x29, 0x40, 0x7C, 0x34, 0xC9, 0x7F, + 0x1B, 0xE1, 0xAE, 0x24, 0x79, 0x8F, 0xCE, 0x66, 0x73, 0xD1, 0xD7, 0xB1, + 0xDA, 0x7E, 0xB4, 0x42, 0xBE, 0x5C, 0x1B, 0x37, 0x1D, 0xEE, 0xB0, 0x21, + 0xA5, 0x18, 0xE2, 0x31, 0x74, 0xC5, 0x56, 0x2C, 0xF2, 0x5F, 0xBA, 0xDC, + 0xD9, 0x6E, 0x6D, 0x68, 0xDB, 0xE7, 0xBE, 0x93, 0x49, 0x7E, 0xE0, 0x61, + 0xAE, 0xAF, 0xD4, 0xB6, 0x67, 0x5E, 0x20, 0xE7, 0xCB, 0x8B, 0x2E, 0x87, + 0xAB, 0xFB, 0x78, 0x11, 0x5A, 0x2E, 0xC7, 0xDB, 0x5C, 0x56, 0xC2, 0x15, + 0x08, 0x9F, 0x60, 0xD8, 0xE5, 0x4A, 0xC1, 0x55, 0xAB, 0xEB, 0xAC, 0x02, + 0x31, 0x05, 0x00, 0x36, 0xE8, 0xAA, 0x31, 0x38, 0x51, 0x8F, 0xE8, 0xDF, + 0xCB, 0xB4, 0xD3, 0x15, 0xA5, 0x66, 0x48, 0x4F, 0xB8, 0x52, 0xC8, 0x94, + 0x77, 0xBD, 0xC4, 0x58, 0x88, 0xA6, 0xDD, 0x2D, 0x93, 0x52, 0x2A, 0x76, + 0x32, 0x12, 0xC0, 0xF9, 0x9E, 0x70, 0xAB, 0xE0, 0xAA, 0xF6, 0x44, 0x6D, + 0xAF, 0x52, 0xCB, 0x9D, 0xBD, 0x00, 0xF4, 0x13, 0xEC, 0xC5, 0x00, 0x3E, + 0x01, 0xF0, 0x8E, 0x0A, 0xC3, 0x44, 0x8D, 0xB2, 0x78, 0x54, 0xB0, 0x2E, + 0x37, 0x42, 0x1E, 0xAF, 0xFF, 0x7E, 0x58, 0xBB, 0x74, 0xDC, 0x12, 0xBD, + 0xE8, 0x74, 0x98, 0xE9, 0x29, 0x74, 0x25, 0x0B, 0x2D, 0xB2, 0x9C, 0xE4, + 0xEF, 0x3D, 0xCC, 0x72, 0x05, 0xC9, 0x5F, 0xC8, 0xB4, 0x6E, 0xEA, 0x3B, + 0x27, 0x29, 0x3E, 0xCC, 0x7A, 0xF2, 0x73, 0x92, 0x7E, 0x83, 0x25, 0x09, + 0x7D, 0x29, 0xC9, 0x6B, 0x72, 0x6D, 0xAE, 0x73, 0x09, 0xB8, 0x92, 0x2E, + 0xAB, 0xFE, 0x03, 0x8F, 0x39, 0xF7, 0x56, 0xDA, 0xAB, 0xCE, 0x74, 0x57, + 0x34, 0x45, 0x4B, 0xB9, 0xC0, 0x75, 0x24, 0x27, 0xEA, 0x2C, 0xBA, 0xC0, + 0x13, 0x72, 0x83, 0x11, 0xF2, 0x95, 0x24, 0x77, 0xD8, 0xD2, 0xC2, 0x66, + 0xCB, 0xE4, 0x89, 0xBE, 0xE7, 0x01, 0x77, 0x92, 0x51, 0x73, 0x53, 0xFA, + 0x7C, 0x54, 0x4B, 0xB1, 0x5A, 0xE7, 0xBE, 0x7D, 0x3C, 0x06, 0xFD, 0x44, + 0x0F, 0xC7, 0x6B, 0x19, 0x5D, 0x45, 0xA2, 0x9C, 0x40, 0xCE, 0x15, 0xDC, + 0x9F, 0x91, 0xFC, 0x8F, 0x11, 0xEE, 0x0A, 0x92, 0xB7, 0x19, 0x23, 0x35, + 0xD2, 0xC1, 0x71, 0x63, 0x75, 0x36, 0x6B, 0x79, 0x90, 0x6E, 0xF0, 0x84, + 0x7C, 0xBC, 0x7E, 0x9B, 0x05, 0xF2, 0xB7, 0x24, 0xAB, 0x72, 0xB1, 0x84, + 0xCA, 0x36, 0xDC, 0x6E, 0xDA, 0x28, 0xF8, 0xD0, 0x03, 0xEE, 0x24, 0xDA, + 0x13, 0xA1, 0x2B, 0x34, 0x0D, 0xCC, 0xF6, 0xC8, 0x2C, 0x5C, 0x25, 0x4D, + 0xF6, 0x99, 0x23, 0x4F, 0xF0, 0x84, 0x7C, 0xAD, 0x76, 0xE1, 0x52, 0xED, + 0x11, 0x70, 0x99, 0xD6, 0xB9, 0x1F, 0xE7, 0x40, 0x73, 0xD3, 0xED, 0x9D, + 0xE2, 0x61, 0x29, 0x36, 0x65, 0xAE, 0x7D, 0x21, 0x5B, 0xE7, 0xE4, 0x15, + 0x72, 0xBC, 0xB2, 0x66, 0xAE, 0xB3, 0x6D, 0x96, 0x3F, 0xF6, 0xD4, 0xDC, + 0x7C, 0xC0, 0x4D, 0xCB, 0x3A, 0x99, 0x6B, 0x1F, 0xC8, 0xC7, 0xCA, 0xCF, + 0xA8, 0x37, 0x4E, 0x0F, 0xD7, 0x65, 0xCB, 0xBB, 0xCE, 0x96, 0x59, 0x1E, + 0x43, 0x7B, 0x95, 0xF4, 0x6F, 0x3D, 0xE1, 0xA6, 0xDB, 0x9B, 0xCD, 0xF8, + 0x64, 0x4D, 0x1B, 0x20, 0x8F, 0xF6, 0x80, 0xBC, 0x8A, 0xAE, 0xCE, 0xF4, + 0x0F, 0xE2, 0x86, 0x1C, 0x37, 0xDC, 0x72, 0x2D, 0x4D, 0xE6, 0x78, 0xC0, + 0x9D, 0x48, 0x7B, 0xB2, 0x77, 0xDA, 0x5B, 0x9E, 0xC3, 0xF8, 0x65, 0x9D, + 0x02, 0xEF, 0xFA, 0x78, 0x42, 0x7E, 0xC7, 0x53, 0x93, 0x63, 0x85, 0x1C, + 0xF7, 0xF1, 0xDA, 0x4F, 0x69, 0xAB, 0x41, 0x45, 0x65, 0x0B, 0xFC, 0x8E, + 0xF6, 0x32, 0x45, 0x69, 0xB8, 0x16, 0xCD, 0x6D, 0x32, 0x46, 0x4A, 0xAE, + 0x25, 0x79, 0x8B, 0xD6, 0xC9, 0xD6, 0x41, 0x3F, 0x86, 0xE4, 0x5B, 0xB4, + 0x55, 0xFF, 0x59, 0x21, 0xCB, 0xD1, 0x97, 0x31, 0xE5, 0x0E, 0xC7, 0x05, + 0xB7, 0x80, 0xAE, 0x98, 0xD9, 0xEB, 0x46, 0xB8, 0x4B, 0x49, 0xDE, 0x6C, + 0xCC, 0x4C, 0x48, 0x65, 0x6C, 0x62, 0x58, 0xCD, 0xF2, 0x42, 0xF9, 0x05, + 0x35, 0x46, 0x4D, 0x4E, 0x6F, 0x86, 0x58, 0x77, 0xBC, 0x8E, 0xA6, 0x4B, + 0x5D, 0xDD, 0x68, 0xD4, 0xE4, 0x1B, 0xE9, 0x52, 0x54, 0x13, 0x03, 0xB8, + 0x84, 0xE4, 0x9D, 0x1E, 0x70, 0x6F, 0xF0, 0x30, 0xCB, 0x95, 0x74, 0xD5, + 0xE3, 0xE6, 0x7A, 0xB4, 0xF7, 0x1B, 0x79, 0xBB, 0xAF, 0xD2, 0x56, 0x8D, + 0x67, 0xAD, 0x20, 0xEF, 0xEA, 0x01, 0xF9, 0x18, 0x41, 0xAE, 0x33, 0x5A, + 0xB5, 0xD1, 0x4C, 0x50, 0xA5, 0xBB, 0x4A, 0xBA, 0xEA, 0x36, 0x96, 0xC1, + 0xAE, 0xA2, 0x3D, 0x99, 0xBB, 0x52, 0x7B, 0xCB, 0x9F, 0x7A, 0xC0, 0xBD, + 0x2E, 0x23, 0xF3, 0x61, 0x24, 0x5D, 0xE6, 0x7F, 0x9D, 0x51, 0x93, 0x6F, + 0xA7, 0xAB, 0x1C, 0x64, 0x85, 0x7C, 0x14, 0xC9, 0xD7, 0x8C, 0xED, 0xDD, + 0xCF, 0x04, 0x95, 0x13, 0xAE, 0xA0, 0x4B, 0xCE, 0xB6, 0xC0, 0xB5, 0x9A, + 0xE5, 0x4A, 0xBA, 0x1A, 0x54, 0x56, 0xCD, 0x5D, 0xA2, 0xF6, 0x9A, 0xA7, + 0x9A, 0x1E, 0xE1, 0x31, 0xE8, 0x6B, 0x75, 0x16, 0xDD, 0xDF, 0x63, 0x8E, + 0x4C, 0xB7, 0x17, 0xD5, 0xF1, 0x9A, 0xCE, 0x18, 0xEA, 0x66, 0xC5, 0x05, + 0xB8, 0x94, 0xAE, 0xBA, 0x7A, 0x94, 0xC1, 0x9E, 0x60, 0xD4, 0xDC, 0x14, + 0x5D, 0x4A, 0xCA, 0xD9, 0x74, 0x95, 0x70, 0x2C, 0xB2, 0x58, 0x1B, 0x09, + 0x9B, 0x7B, 0x98, 0x8E, 0xF4, 0x84, 0xEC, 0x7B, 0x0A, 0x75, 0x94, 0x1C, + 0xAF, 0x28, 0x90, 0xFF, 0xC1, 0x84, 0x95, 0x13, 0x3E, 0x91, 0x9B, 0x4F, + 0xB1, 0x4C, 0x17, 0xF5, 0xBC, 0xC6, 0xC3, 0x2C, 0x6F, 0x47, 0x57, 0x24, + 0x65, 0x9E, 0x87, 0xE6, 0x5E, 0x15, 0xA1, 0xBD, 0x51, 0x74, 0xC9, 0x6B, + 0x56, 0x73, 0x7D, 0x9B, 0xA7, 0x26, 0x1F, 0xC9, 0xD6, 0x2B, 0xD7, 0xD7, + 0x6A, 0xAC, 0x0A, 0x99, 0xA0, 0x65, 0x52, 0x67, 0x2D, 0x77, 0x16, 0xA9, + 0x83, 0x0D, 0xFA, 0x11, 0x35, 0x74, 0xD5, 0xE3, 0xAE, 0xA2, 0x5F, 0xDD, + 0xC7, 0x73, 0x3C, 0x34, 0x37, 0x0D, 0x37, 0x6A, 0xFA, 0xE6, 0xE1, 0x6C, + 0xBD, 0x1A, 0x4F, 0x73, 0xF9, 0x4E, 0x8E, 0xE5, 0x2E, 0x1E, 0xCE, 0x50, + 0xBA, 0xBD, 0xDA, 0xCD, 0xC0, 0x7D, 0x95, 0xAE, 0x42, 0x50, 0x9B, 0x9D, + 0xAC, 0xC2, 0xAA, 0xAA, 0xAA, 0xB8, 0x62, 0x07, 0x1A, 0x00, 0x7C, 0xA8, + 0x8C, 0x80, 0x0D, 0xCA, 0x0E, 0x58, 0x00, 0xF7, 0xFE, 0xA2, 0xA9, 0x70, + 0xAF, 0xB9, 0xA9, 0x35, 0xD6, 0xC3, 0x38, 0x01, 0xC0, 0x05, 0xB0, 0xBD, + 0x4A, 0x76, 0x29, 0xDC, 0x4B, 0x21, 0x27, 0x1A, 0xB2, 0x13, 0xAA, 0x15, + 0x53, 0xBD, 0x8B, 0xF2, 0x92, 0xA2, 0xC4, 0x8B, 0x17, 0x29, 0xAA, 0xA3, + 0x40, 0x81, 0xF2, 0x96, 0x44, 0xB9, 0x6A, 0x25, 0xD9, 0x55, 0x2A, 0x94, + 0x68, 0x23, 0xDC, 0xFB, 0x92, 0x56, 0x01, 0x78, 0x1D, 0xEE, 0x55, 0x42, + 0x6F, 0xC6, 0x12, 0x42, 0xC3, 0xEC, 0x14, 0x61, 0xE9, 0xAD, 0xCE, 0x37, + 0x29, 0xCA, 0x7F, 0xA9, 0xF1, 0xFE, 0x4A, 0xA5, 0xAD, 0x5C, 0x0C, 0xDB, + 0x1B, 0xBF, 0x33, 0xE1, 0xD6, 0x7A, 0xF4, 0x7B, 0x14, 0xDC, 0xCB, 0x9F, + 0x87, 0x2A, 0xB4, 0x27, 0x8A, 0x6C, 0x80, 0x7B, 0x11, 0xD7, 0x64, 0xB8, + 0x77, 0x05, 0x5B, 0x06, 0x74, 0x37, 0x7C, 0xFF, 0xBD, 0x49, 0x6B, 0x00, + 0x3C, 0x07, 0x60, 0x9E, 0x1E, 0x9C, 0xA6, 0xF6, 0x14, 0xB2, 0x63, 0x89, + 0xC4, 0x18, 0x4F, 0x5B, 0x21, 0xED, 0xB4, 0x59, 0xBE, 0x9A, 0x6D, 0xCF, + 0xAA, 0x3F, 0x54, 0x73, 0xB2, 0xC5, 0x5C, 0xD7, 0x91, 0xBC, 0xCB, 0xD3, + 0x5C, 0x77, 0xA8, 0x04, 0xF0, 0xEE, 0x5A, 0xE7, 0x5A, 0x1D, 0xAA, 0x74, + 0xBC, 0x53, 0x5C, 0xE5, 0x78, 0x0F, 0xA7, 0xFD, 0x15, 0x3E, 0x75, 0x24, + 0x27, 0x27, 0x0D, 0x72, 0x92, 0xE0, 0xF6, 0xD0, 0x3A, 0xD7, 0xEA, 0x50, + 0x2D, 0x92, 0xE6, 0xC6, 0x5D, 0x6B, 0x79, 0xA4, 0x20, 0x5B, 0xB6, 0x19, + 0x6B, 0x32, 0x1C, 0xAF, 0x82, 0x00, 0xF8, 0xFB, 0x4B, 0xA1, 0xF3, 0xE4, + 0x6D, 0x5B, 0xE1, 0x5E, 0xC1, 0xEC, 0xD5, 0xA0, 0xFA, 0xB1, 0x3C, 0x5A, + 0x4B, 0x69, 0xE2, 0x5A, 0x92, 0x53, 0xE4, 0x05, 0x77, 0x0A, 0x80, 0xDD, + 0xA9, 0x90, 0x15, 0x6E, 0xE6, 0xAB, 0xE5, 0xB2, 0x5D, 0xC9, 0xE6, 0x20, + 0xDA, 0x8B, 0x8C, 0xD7, 0x92, 0xFC, 0x23, 0x5D, 0x59, 0xE3, 0xBC, 0x42, + 0xCE, 0x77, 0xFA, 0x68, 0x01, 0x80, 0xFD, 0x15, 0x04, 0xDF, 0x37, 0xAA, + 0x5F, 0xA8, 0x60, 0xF5, 0x29, 0x70, 0xA5, 0x10, 0x37, 0x66, 0xB9, 0x8F, + 0xAF, 0x02, 0xB8, 0x51, 0xE5, 0x24, 0xA2, 0x96, 0x4E, 0x2C, 0x06, 0x70, + 0x2A, 0x80, 0x33, 0xB5, 0xDC, 0xEB, 0xB0, 0xF9, 0xC1, 0x65, 0x70, 0xB5, + 0x1F, 0xFB, 0x19, 0xEE, 0x59, 0x08, 0xE0, 0x4E, 0x00, 0xB7, 0xC2, 0x56, + 0xAB, 0xB2, 0x2D, 0xF2, 0x0A, 0x80, 0xEB, 0x55, 0xAA, 0x61, 0x43, 0xC4, + 0x7B, 0x3A, 0xEB, 0xB7, 0xF5, 0xED, 0xC8, 0x80, 0x7B, 0xC1, 0xBD, 0x00, + 0x3A, 0xAA, 0xE6, 0x7E, 0x05, 0xE0, 0x2E, 0x5D, 0x0D, 0x39, 0xEE, 0xEB, + 0x4C, 0x69, 0xF2, 0x2C, 0xC3, 0x83, 0x55, 0x01, 0x57, 0x74, 0xB5, 0xC3, + 0x96, 0x70, 0xE8, 0xA4, 0x1D, 0xA1, 0xA8, 0x70, 0x27, 0x0B, 0x6E, 0x63, + 0x9E, 0xFA, 0x3B, 0x33, 0x43, 0x31, 0x0E, 0x94, 0x29, 0x8E, 0x02, 0x39, + 0x9E, 0x4D, 0x8B, 0x76, 0x08, 0xF8, 0x3B, 0xED, 0x74, 0xF5, 0x6E, 0xE5, + 0x73, 0x0B, 0xB4, 0x7D, 0x37, 0x25, 0x8F, 0x70, 0x33, 0x21, 0x33, 0xC3, + 0x7F, 0x28, 0x6E, 0x65, 0xFB, 0x76, 0x49, 0x47, 0x36, 0xD1, 0xCB, 0x35, + 0xBF, 0xD5, 0xB7, 0xA2, 0xB9, 0xB7, 0x27, 0x04, 0x6E, 0x5A, 0x66, 0x69, + 0x4E, 0x9E, 0xD9, 0x82, 0xB9, 0x26, 0x80, 0x4F, 0x01, 0xCC, 0xC9, 0x69, + 0x36, 0x61, 0xC2, 0x34, 0x78, 0x1D, 0x5C, 0x91, 0xEC, 0x61, 0x00, 0x06, + 0xC3, 0x55, 0xD9, 0x49, 0x9B, 0xB3, 0x7A, 0x69, 0xEE, 0xBD, 0x3A, 0xA8, + 0x48, 0x0A, 0xDC, 0x4C, 0xC8, 0x54, 0x5F, 0x47, 0xC0, 0x55, 0xD8, 0x29, + 0xD4, 0xFF, 0xAB, 0x57, 0x8A, 0xEA, 0x9F, 0xE4, 0x14, 0xE6, 0x0D, 0x70, + 0x3E, 0x2B, 0xBE, 0x67, 0xCA, 0x21, 0x3A, 0x5C, 0x18, 0xA2, 0x8D, 0xF7, + 0x95, 0x70, 0x65, 0x8C, 0x66, 0x28, 0xA7, 0xB6, 0x01, 0xC9, 0x95, 0xE1, + 0x00, 0x4E, 0x51, 0xDF, 0x77, 0xD4, 0x81, 0xC1, 0x3C, 0xB8, 0xC2, 0x68, + 0x0F, 0xEB, 0x21, 0x46, 0x47, 0x07, 0x0C, 0xB8, 0xC4, 0xF0, 0xA1, 0x00, + 0x76, 0xD5, 0x51, 0xDA, 0xFB, 0x88, 0xAF, 0xEE, 0x55, 0xB6, 0xA5, 0x14, + 0x2E, 0xC9, 0x7C, 0x4F, 0x4D, 0x3B, 0xEF, 0xCA, 0xFA, 0xE4, 0x5D, 0x92, + 0x04, 0x38, 0xC8, 0x16, 0xE8, 0x64, 0x05, 0x09, 0x80, 0x83, 0x04, 0xC0, + 0x41, 0x02, 0xE0, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, + 0x00, 0x07, 0x09, 0x80, 0x83, 0x04, 0xC0, 0x41, 0x02, 0xE0, 0x20, 0x01, + 0x70, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x83, + 0x64, 0x47, 0xFE, 0x37, 0x00, 0x03, 0xCE, 0x9A, 0x67, 0x1F, 0xCC, 0x4A, + 0xE6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, + 0x82 +}; +} +static unsigned char* legit_icon = raw::legit; +} \ No newline at end of file diff --git a/cheat/gmod/icons/misc.hpp b/cheat/gmod/icons/misc.hpp new file mode 100644 index 0000000..9e78249 --- /dev/null +++ b/cheat/gmod/icons/misc.hpp @@ -0,0 +1,1721 @@ +/* E:\Users\admin\Desktop\stuff\icons\misc.png (4/1/2018 10:00:14 PM) + StartOffset: 00000000, EndOffset: 00005025, Length: 00005026 */ + +namespace icons { +constexpr static size_t misc_size = 20518; +namespace raw { +static unsigned char misc[20518] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, + 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, + 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, + 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, 0x35, 0x37, + 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, 0x2D, 0x63, + 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x66, 0x37, 0x34, + 0x35, 0x33, 0x62, 0x38, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, + 0x34, 0x35, 0x36, 0x39, 0x37, 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, + 0x2D, 0x37, 0x37, 0x34, 0x33, 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, + 0x65, 0x38, 0x65, 0x34, 0x36, 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x34, 0x35, 0x36, 0x39, 0x37, + 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, 0x2D, 0x37, 0x37, 0x34, 0x33, + 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, 0x65, 0x38, 0x65, 0x34, 0x36, + 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, + 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x61, 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, + 0x35, 0x37, 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, + 0x2D, 0x63, 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xCB, 0xA4, 0xEC, 0x39, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0A, 0x48, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x8C, 0x5D, 0x55, 0x15, 0xC7, + 0x7F, 0xF7, 0xDE, 0x79, 0xF7, 0xE1, 0xB4, 0xB4, 0xA5, 0x6F, 0x3A, 0xA5, + 0x28, 0x32, 0xA5, 0x9D, 0x92, 0x52, 0x04, 0x15, 0x94, 0x8A, 0x90, 0x5A, + 0x2D, 0x11, 0xA2, 0x35, 0x4A, 0x04, 0xF1, 0x91, 0xF8, 0xC2, 0x10, 0xEB, + 0x2B, 0xD1, 0xF8, 0x41, 0xE1, 0x83, 0xD1, 0x84, 0x48, 0x22, 0x31, 0x8A, + 0x04, 0x11, 0xD4, 0x08, 0x0D, 0x6D, 0xAC, 0x96, 0x48, 0x85, 0xAA, 0xA1, + 0x45, 0x91, 0x42, 0x5B, 0xEB, 0x4C, 0x87, 0x16, 0x28, 0xED, 0x40, 0xA7, + 0xD3, 0x4E, 0x3B, 0x73, 0x67, 0xDA, 0x79, 0xDC, 0xED, 0x87, 0xB5, 0x4E, + 0xE8, 0x87, 0xCA, 0xD9, 0x67, 0xEE, 0xB9, 0xF7, 0xEC, 0x73, 0xCF, 0xFE, + 0x27, 0x27, 0x43, 0xE1, 0xD0, 0x39, 0xF7, 0xFE, 0xCE, 0xDE, 0x7B, 0xAD, + 0xFF, 0x5E, 0x7B, 0xEF, 0x9C, 0x31, 0x06, 0xAF, 0xDA, 0x55, 0xDE, 0x7F, + 0x05, 0x1E, 0xB0, 0x97, 0x07, 0xEC, 0xE5, 0x01, 0x7B, 0x79, 0xC0, 0x5E, + 0xF1, 0xAB, 0xCE, 0xC1, 0x67, 0xCA, 0x01, 0x05, 0x7D, 0xF9, 0xEA, 0x80, + 0x7A, 0xFD, 0x73, 0xCE, 0x91, 0xE7, 0x2B, 0x01, 0x63, 0x7A, 0x8D, 0x9F, + 0x75, 0x79, 0xC0, 0x21, 0x6A, 0x01, 0x26, 0x01, 0x8B, 0x81, 0x99, 0xFA, + 0xCF, 0xD3, 0x80, 0xA9, 0xFA, 0xDF, 0x1A, 0x1C, 0xE8, 0x71, 0x4A, 0xC0, + 0x19, 0xA0, 0x08, 0x9C, 0x04, 0x4E, 0xE9, 0xCF, 0xFD, 0xC0, 0x09, 0xE0, + 0x34, 0x30, 0xE4, 0x01, 0xBF, 0xA9, 0x06, 0x60, 0x06, 0xB0, 0x10, 0xB8, + 0x4C, 0x7F, 0xAE, 0x02, 0xCE, 0x07, 0x9A, 0x80, 0x29, 0x0A, 0xBA, 0xC1, + 0xA1, 0x97, 0x71, 0x54, 0x41, 0x16, 0x15, 0x66, 0x11, 0xF8, 0x2F, 0xD0, + 0x09, 0xBC, 0x06, 0xFC, 0x13, 0x38, 0x02, 0xF4, 0xE9, 0xBD, 0xC9, 0x76, + 0x87, 0x09, 0x19, 0x1D, 0x8D, 0xC0, 0x3C, 0xE0, 0x72, 0xE0, 0x6A, 0xA0, + 0x1D, 0xB8, 0x44, 0x5B, 0x6E, 0x5A, 0x35, 0x0E, 0x1C, 0x05, 0xF6, 0x02, + 0xBB, 0x81, 0xED, 0xC0, 0xBF, 0x81, 0xD7, 0x81, 0x91, 0xAC, 0x00, 0xAE, + 0xD7, 0xD6, 0x79, 0x35, 0x70, 0x3D, 0x70, 0x15, 0xB0, 0xA4, 0x46, 0xE3, + 0x9B, 0x7D, 0xC0, 0x53, 0xC0, 0x36, 0xE0, 0xEF, 0xC0, 0x31, 0x1D, 0xB7, + 0x6B, 0x16, 0x70, 0x8B, 0x82, 0x5D, 0x03, 0xAC, 0x05, 0xDA, 0x32, 0x12, + 0xC8, 0x76, 0x02, 0x9B, 0x80, 0xAD, 0xC0, 0x3F, 0xB4, 0x7B, 0xAF, 0x39, + 0xC0, 0x0B, 0x80, 0x1B, 0x80, 0xDB, 0x75, 0x8C, 0xCD, 0x91, 0x2D, 0x8D, + 0x6A, 0x97, 0xFD, 0x00, 0xB0, 0x59, 0x03, 0xB3, 0x9A, 0x08, 0xB2, 0x72, + 0xC0, 0x3B, 0x81, 0xCF, 0x00, 0xEB, 0x75, 0xDC, 0xCD, 0xA2, 0xEA, 0x81, + 0xD5, 0xC0, 0x05, 0xC0, 0x6C, 0xE0, 0x31, 0xE0, 0x40, 0xDA, 0x5B, 0x70, + 0x0E, 0xE8, 0x00, 0xEE, 0x04, 0x6E, 0x02, 0x9A, 0xBD, 0xED, 0x00, 0x9A, + 0x4E, 0xFD, 0x06, 0xF8, 0x29, 0xD0, 0x95, 0x66, 0xC0, 0xCB, 0x81, 0xEF, + 0x2A, 0xDC, 0x38, 0x64, 0x34, 0x0F, 0x4D, 0xCA, 0x54, 0x28, 0xE8, 0x65, + 0x62, 0x18, 0x62, 0x86, 0x81, 0x07, 0x81, 0x9F, 0x54, 0x1A, 0x72, 0x5D, + 0x85, 0x5A, 0xEE, 0xDB, 0x81, 0x0D, 0x65, 0xC0, 0x1D, 0x51, 0x13, 0xE1, + 0x18, 0x30, 0x70, 0x56, 0x9A, 0x31, 0x08, 0xF4, 0x27, 0x60, 0x78, 0x94, + 0x80, 0x56, 0x60, 0xB2, 0xFE, 0xB9, 0x59, 0x73, 0xF4, 0xF3, 0xF4, 0xDF, + 0x35, 0x44, 0xFC, 0xFB, 0x9A, 0x81, 0x4F, 0xEB, 0xD8, 0xFC, 0x63, 0xE0, + 0xE5, 0x34, 0x01, 0x6E, 0x03, 0xEE, 0xD0, 0x31, 0x37, 0x6A, 0x0B, 0xED, + 0x07, 0x5E, 0xD2, 0xB7, 0xFA, 0x45, 0xFD, 0xD9, 0x8F, 0xB8, 0x47, 0x39, + 0x35, 0x15, 0x8A, 0x09, 0xB5, 0xE0, 0x49, 0x9A, 0x09, 0xE4, 0xD4, 0x84, + 0x99, 0x0E, 0xBC, 0x03, 0x58, 0x06, 0x2C, 0xD5, 0xF8, 0x62, 0x6A, 0x84, + 0xBF, 0xAF, 0x09, 0xB8, 0x4D, 0x3F, 0xCF, 0x5D, 0xFA, 0x42, 0x3B, 0x0F, + 0xB8, 0x19, 0xB8, 0x05, 0xB8, 0x55, 0xBB, 0x33, 0x5B, 0x0D, 0x02, 0xCF, + 0x01, 0x4F, 0x03, 0x7F, 0x05, 0x5E, 0x01, 0x5E, 0xC5, 0x61, 0x8F, 0x57, + 0xD5, 0x00, 0x2C, 0xD2, 0x58, 0x63, 0x25, 0xF0, 0x7E, 0x35, 0x6C, 0x5A, + 0x22, 0xBC, 0x34, 0x9F, 0x47, 0x9C, 0xB0, 0x87, 0x2A, 0x91, 0x27, 0xC7, + 0x39, 0x06, 0xE7, 0x81, 0x0F, 0x03, 0xF7, 0x02, 0xF3, 0x2D, 0xFF, 0x9F, + 0x31, 0x85, 0xF9, 0x47, 0xE0, 0x11, 0xC4, 0x01, 0x2A, 0x92, 0x4E, 0xB5, + 0x2A, 0xE8, 0xF5, 0x9A, 0xEB, 0xCF, 0x8F, 0x30, 0x56, 0xEF, 0x56, 0xD0, + 0x3B, 0x5C, 0x6E, 0xC1, 0x41, 0xD7, 0x6C, 0x0B, 0x77, 0x58, 0x73, 0xC3, + 0x5F, 0x03, 0x4F, 0x00, 0xBD, 0x29, 0x8F, 0x8E, 0xFB, 0x11, 0xE7, 0xAA, + 0x0B, 0x78, 0x5E, 0xC7, 0xD8, 0x95, 0x9A, 0x22, 0x85, 0xE9, 0x52, 0xE0, + 0x73, 0x3A, 0x3C, 0xC5, 0xFB, 0x3D, 0x18, 0x63, 0xE2, 0xB8, 0xEA, 0x8C, + 0x31, 0x5F, 0x37, 0xC6, 0x8C, 0x19, 0x3B, 0x0D, 0x18, 0x63, 0x1E, 0x36, + 0xC6, 0xAC, 0x8A, 0xE9, 0xF7, 0xBB, 0x78, 0xAD, 0x36, 0xC6, 0x6C, 0x31, + 0xC6, 0x8C, 0x58, 0x7E, 0x27, 0xC7, 0x8D, 0x31, 0xB7, 0x1A, 0x63, 0x0A, + 0x71, 0x3E, 0x47, 0x5C, 0x2D, 0xF8, 0x22, 0xE0, 0x13, 0x96, 0xE3, 0xEE, + 0x88, 0x5A, 0x77, 0x77, 0x03, 0x7B, 0x6A, 0x38, 0xDF, 0x7D, 0x52, 0x87, + 0x9B, 0x3C, 0x70, 0x9D, 0x45, 0xE4, 0x3F, 0x0D, 0xF8, 0x24, 0xF0, 0x37, + 0x6D, 0xC9, 0xB1, 0x8D, 0x9B, 0x71, 0x04, 0x56, 0x6B, 0x35, 0xEF, 0xB5, + 0xD1, 0x36, 0xE0, 0x47, 0x35, 0x0E, 0x37, 0xD0, 0x0E, 0x8D, 0x90, 0x9F, + 0xB7, 0xBC, 0xFF, 0x5D, 0xC0, 0x35, 0xC4, 0x68, 0xE5, 0xC6, 0x01, 0xF8, + 0x02, 0xE0, 0x66, 0xCB, 0xD6, 0xDB, 0xA5, 0x2D, 0x77, 0x57, 0x86, 0x9C, + 0xAB, 0xED, 0xC0, 0x3D, 0xC0, 0x1B, 0x16, 0xF7, 0x4E, 0x46, 0x3C, 0xFB, + 0x69, 0xAE, 0x00, 0xCE, 0x6B, 0x80, 0xD0, 0x61, 0x71, 0xEF, 0x10, 0xF0, + 0x0B, 0xFD, 0xC0, 0x59, 0xD3, 0x63, 0x9A, 0x06, 0xD9, 0xA4, 0x7D, 0xD7, + 0x68, 0x7E, 0xED, 0x04, 0xE0, 0xC9, 0x9A, 0xFB, 0xD9, 0x38, 0x39, 0x3B, + 0xF5, 0x43, 0x66, 0x51, 0x45, 0xE0, 0x3E, 0x64, 0x8E, 0x38, 0x4C, 0xB3, + 0x90, 0x79, 0xF2, 0x7A, 0x17, 0x00, 0xB7, 0x02, 0xD7, 0x5A, 0x06, 0x56, + 0xBF, 0x05, 0x7A, 0xC8, 0xAE, 0xBA, 0x35, 0xD7, 0xB7, 0xD1, 0x07, 0x22, + 0xBA, 0x62, 0x15, 0x03, 0x3C, 0x0B, 0xBB, 0x29, 0xC0, 0xBD, 0xC8, 0x84, + 0x77, 0xD6, 0xB5, 0x11, 0xA9, 0xD7, 0x0A, 0xD3, 0xF2, 0xB8, 0xC6, 0xE1, + 0x72, 0x01, 0x2F, 0x43, 0xEA, 0xAB, 0xC2, 0xF4, 0x27, 0xA4, 0x20, 0x2D, + 0x97, 0x61, 0xB8, 0x39, 0xA4, 0xFA, 0xF2, 0x2F, 0x16, 0xF7, 0x4E, 0x05, + 0xE6, 0xBA, 0x00, 0xF8, 0x0A, 0x8B, 0xB1, 0x62, 0x14, 0x78, 0x46, 0x03, + 0x8C, 0x2C, 0x2F, 0x65, 0x34, 0x88, 0x35, 0xFB, 0xB4, 0xC5, 0xBD, 0x4D, + 0xC0, 0x8A, 0xA4, 0x01, 0xD7, 0x21, 0xD5, 0x09, 0x61, 0x3A, 0x40, 0x05, + 0xA7, 0xC3, 0x52, 0xA8, 0x43, 0x84, 0xFB, 0xED, 0x05, 0xED, 0x1D, 0x13, + 0x05, 0xDC, 0x64, 0x19, 0xE9, 0xED, 0xB5, 0x1C, 0x77, 0xDE, 0xAA, 0x6B, + 0x73, 0xB1, 0xBB, 0x2D, 0x07, 0xB0, 0x4D, 0xB9, 0xCE, 0x14, 0xA2, 0xCD, + 0xC8, 0xFD, 0xDF, 0x56, 0x38, 0x51, 0xD5, 0x63, 0x57, 0x86, 0xD3, 0x8B, + 0xCC, 0xE7, 0x46, 0x4D, 0xBF, 0xDA, 0x78, 0xB3, 0x00, 0xBE, 0xE4, 0x18, + 0xE0, 0xBC, 0xE6, 0xF5, 0x3D, 0xC0, 0x41, 0xA2, 0x55, 0x4A, 0x1E, 0x45, + 0xA6, 0x42, 0x2F, 0xB5, 0xB8, 0xB7, 0x40, 0x99, 0x53, 0xA6, 0xE5, 0x00, + 0x2E, 0x58, 0xE6, 0xBF, 0x51, 0xAB, 0xFB, 0xE7, 0x00, 0x1F, 0xD3, 0x54, + 0x61, 0x81, 0x02, 0x36, 0x0E, 0xB6, 0xE0, 0x21, 0x6D, 0x89, 0x9B, 0x80, + 0x47, 0xB1, 0x9F, 0xE6, 0x34, 0xC8, 0x4C, 0x9A, 0x0D, 0x9B, 0x7C, 0x92, + 0x2D, 0x38, 0x6F, 0xF9, 0x00, 0x51, 0x82, 0xAB, 0xA0, 0x94, 0xE5, 0x6B, + 0xDA, 0x7A, 0x5D, 0xD7, 0x0A, 0xC4, 0xC5, 0x1B, 0x57, 0xC8, 0xA7, 0x2D, + 0x5F, 0x8E, 0xAA, 0x0D, 0x4D, 0xF9, 0x18, 0xDE, 0xE4, 0x38, 0x75, 0x31, + 0x32, 0xF1, 0x9D, 0x06, 0xB8, 0x81, 0x2E, 0x04, 0xBE, 0x8A, 0x78, 0xF2, + 0x71, 0x47, 0xDD, 0x89, 0x03, 0x8E, 0x5B, 0x1D, 0x48, 0x09, 0x4C, 0xDA, + 0xB4, 0x14, 0xFB, 0x25, 0x38, 0xB9, 0x6A, 0x06, 0x8E, 0xAE, 0x01, 0x6E, + 0x75, 0x30, 0xA0, 0xB2, 0xD1, 0x98, 0x46, 0xBD, 0xCE, 0xC9, 0x35, 0xC0, + 0xBD, 0xB8, 0x5F, 0x68, 0x77, 0x2E, 0x8D, 0x00, 0xC7, 0x3D, 0xE0, 0x70, + 0xED, 0x43, 0x4C, 0xF9, 0xB4, 0x69, 0x0F, 0x55, 0x58, 0xA5, 0x50, 0x0B, + 0x80, 0x5F, 0x42, 0x16, 0x68, 0x1D, 0x4A, 0x49, 0x4B, 0x1E, 0xD3, 0x3C, + 0xF8, 0x7E, 0xC4, 0x6B, 0x77, 0x4E, 0xAE, 0xED, 0xD1, 0xD1, 0x0F, 0xFC, + 0x0A, 0x31, 0x46, 0xDE, 0x8B, 0xAC, 0xFA, 0xAF, 0x77, 0xF0, 0x7B, 0xCB, + 0x21, 0xAB, 0x2E, 0xFE, 0x83, 0xD4, 0x50, 0x6D, 0x24, 0x81, 0xB5, 0xBF, + 0x69, 0x04, 0x8C, 0x7E, 0x71, 0x3F, 0x07, 0xB6, 0x00, 0x57, 0x22, 0xC5, + 0xE1, 0x2E, 0x02, 0xEE, 0xD2, 0x1E, 0xA7, 0x87, 0xE8, 0x4E, 0x5D, 0xA6, + 0x01, 0xA3, 0x86, 0x41, 0xB7, 0x5E, 0x05, 0x47, 0x9F, 0x31, 0x15, 0xC1, + 0x60, 0x5D, 0x0A, 0x9E, 0x31, 0x8D, 0x51, 0xB5, 0x0F, 0xB2, 0xBC, 0x3C, + 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x80, 0xBD, 0x3C, 0x60, 0x2F, + 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x4A, 0x40, 0x69, 0x30, 0x3A, 0x5C, 0xAD, + 0xAA, 0x2C, 0x79, 0xC0, 0x13, 0xD7, 0x64, 0x64, 0x51, 0xF9, 0x6C, 0xC4, + 0x8B, 0xCE, 0xE1, 0x4E, 0xE1, 0x5D, 0x00, 0xF7, 0x14, 0xB2, 0x93, 0xEC, + 0x7E, 0xAA, 0xBC, 0xFF, 0x64, 0xDA, 0x01, 0xCF, 0x45, 0xAA, 0x2A, 0x3F, + 0x88, 0x54, 0x55, 0x36, 0x3B, 0x0A, 0x78, 0x10, 0x29, 0x7F, 0xDD, 0x08, + 0xFC, 0x1E, 0xC7, 0x36, 0x02, 0x77, 0x15, 0x70, 0x13, 0x52, 0x55, 0x79, + 0x07, 0xE9, 0x28, 0xBC, 0xEB, 0x40, 0xEA, 0x9B, 0x47, 0x81, 0x3F, 0xE0, + 0xE0, 0xAC, 0x92, 0x6B, 0x41, 0x56, 0xB0, 0x71, 0x69, 0x9A, 0xAA, 0x2A, + 0xDB, 0x80, 0x2F, 0xE1, 0x68, 0xB1, 0xA0, 0x8B, 0x55, 0x95, 0x69, 0xDC, + 0x47, 0xBA, 0x1D, 0x29, 0x9F, 0xF5, 0x80, 0x43, 0xD4, 0x9A, 0xE2, 0x8C, + 0xC4, 0x57, 0x55, 0x5A, 0xA8, 0x17, 0x47, 0x4B, 0x5F, 0x42, 0x34, 0x82, + 0x6C, 0x13, 0xEC, 0x01, 0x87, 0x68, 0x2F, 0xB2, 0x6F, 0x63, 0xDA, 0xB4, + 0x0B, 0xBB, 0xFD, 0x37, 0x32, 0x0F, 0xB8, 0x1B, 0x29, 0xBA, 0x7B, 0x85, + 0x74, 0x54, 0x72, 0x8C, 0x6A, 0x1E, 0x7C, 0x3F, 0x70, 0xD8, 0xA7, 0x49, + 0xE1, 0x1A, 0x40, 0xF6, 0xAE, 0x3C, 0x83, 0xEC, 0xDE, 0x73, 0x19, 0xD1, + 0xF7, 0x62, 0xAE, 0x96, 0x86, 0x91, 0x9D, 0x83, 0x9E, 0x42, 0x56, 0x18, + 0x96, 0x3C, 0x60, 0x3B, 0x1D, 0x47, 0x6A, 0xA3, 0x9F, 0x44, 0x36, 0xF3, + 0x6C, 0x71, 0x14, 0xF0, 0x00, 0x72, 0x08, 0xD6, 0x61, 0x12, 0x3C, 0x17, + 0x29, 0x8D, 0x80, 0x41, 0xAC, 0xBF, 0xFD, 0x7A, 0xF9, 0xAA, 0xCA, 0x1A, + 0x04, 0x9C, 0xBA, 0x2F, 0xD2, 0x55, 0xF9, 0xE9, 0x42, 0x0F, 0xD8, 0xCB, + 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x3C, 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, + 0xF6, 0xF2, 0x80, 0xB3, 0xA4, 0x34, 0x18, 0x1D, 0x2E, 0x3A, 0x59, 0xC1, + 0x41, 0x99, 0x1E, 0xF0, 0x04, 0x35, 0x05, 0x39, 0xB7, 0x60, 0x0E, 0x6E, + 0xAE, 0xF0, 0x37, 0x88, 0x17, 0xDD, 0x83, 0x4C, 0x6F, 0x0E, 0x7B, 0xC0, + 0xF6, 0x9A, 0x07, 0x7C, 0x1C, 0xB8, 0x5E, 0x01, 0x37, 0x39, 0xFA, 0xDD, + 0x0D, 0x22, 0xBB, 0xE8, 0x3E, 0x8E, 0x9C, 0x07, 0xEC, 0xAB, 0x2A, 0x2D, + 0xD4, 0x88, 0x1C, 0x6C, 0xF9, 0x65, 0xEC, 0xF6, 0xA2, 0x4E, 0x5A, 0x2B, + 0x90, 0x7A, 0xAC, 0x21, 0xEC, 0xF7, 0xAA, 0xCC, 0x74, 0x90, 0x75, 0x09, + 0x52, 0x36, 0x9B, 0x06, 0xB8, 0x81, 0x16, 0xE1, 0xAB, 0x2A, 0xAD, 0xD5, + 0x81, 0xA3, 0xD5, 0x89, 0x21, 0x6A, 0x07, 0x16, 0x7B, 0xC0, 0xE1, 0x6A, + 0x25, 0x9D, 0x07, 0x77, 0xE4, 0x88, 0xE9, 0x18, 0x9C, 0x5A, 0x07, 0xDC, + 0x8B, 0xC3, 0xD5, 0x11, 0x6F, 0xA1, 0x33, 0xF8, 0xBD, 0x2A, 0xAD, 0xB4, + 0x0F, 0xE8, 0x4C, 0x21, 0xE0, 0x5D, 0xD4, 0x68, 0x55, 0x65, 0xDC, 0x0B, + 0xC2, 0xBA, 0x90, 0x0A, 0xC5, 0x83, 0x29, 0x31, 0x12, 0xC6, 0x34, 0x0F, + 0x8E, 0x5A, 0x55, 0x59, 0xB5, 0x85, 0x74, 0xE5, 0xA4, 0x49, 0x25, 0xEC, + 0x8A, 0xD4, 0xA3, 0xBC, 0x44, 0x41, 0x55, 0xE5, 0x10, 0xB0, 0x1A, 0x29, + 0xBA, 0x73, 0xB9, 0x6E, 0xEC, 0x59, 0xE4, 0xA0, 0xAB, 0xCD, 0x11, 0x5E, + 0x48, 0xDB, 0x23, 0x0E, 0x4C, 0xD2, 0x80, 0xC7, 0xB1, 0x3B, 0x70, 0x23, + 0xAA, 0x51, 0x71, 0x5C, 0x21, 0x6F, 0xD7, 0xA8, 0xBA, 0x11, 0x37, 0x0F, + 0xE5, 0x28, 0x22, 0xE7, 0x02, 0x1F, 0x26, 0xDA, 0xAA, 0xC2, 0x46, 0xEC, + 0xDC, 0xB9, 0x52, 0x1C, 0x9F, 0xBB, 0x1C, 0xC0, 0xA3, 0xD8, 0xB9, 0x37, + 0xE7, 0x23, 0xD6, 0xE3, 0x50, 0xC4, 0xD6, 0xD1, 0xA9, 0x5D, 0x76, 0xDE, + 0x51, 0xC0, 0x13, 0x2D, 0x06, 0x9C, 0x83, 0xDD, 0x02, 0x3B, 0x43, 0x0C, + 0xCB, 0x78, 0xCA, 0x01, 0x7C, 0xDA, 0xF2, 0xCD, 0x6D, 0x07, 0x16, 0x62, + 0x77, 0x40, 0xF2, 0xB9, 0x3E, 0x64, 0xAD, 0x55, 0x55, 0xCE, 0xB3, 0xCC, + 0x99, 0x8F, 0xC5, 0xF1, 0xD9, 0xCB, 0x09, 0xB2, 0xC6, 0xB1, 0x5B, 0x70, + 0xB5, 0x48, 0x01, 0x7B, 0x89, 0x16, 0x10, 0x7E, 0xA0, 0x67, 0x89, 0x98, + 0x4E, 0x49, 0x2F, 0x07, 0xB0, 0x01, 0x9E, 0xB3, 0xE8, 0x46, 0x0A, 0xD8, + 0x9D, 0x10, 0x9E, 0x05, 0x35, 0x03, 0xEF, 0xB1, 0xB8, 0x6F, 0x18, 0x39, + 0x26, 0x20, 0xF1, 0x34, 0x69, 0x27, 0x32, 0xAB, 0x12, 0xA6, 0xB5, 0xA4, + 0x6B, 0xD5, 0x7E, 0xA5, 0xB4, 0x54, 0xB3, 0x83, 0x30, 0xF5, 0x11, 0xD3, + 0x61, 0xDA, 0xE5, 0x02, 0x3E, 0x8C, 0xAC, 0x04, 0x0C, 0xD3, 0x32, 0xE0, + 0x43, 0x19, 0x87, 0x9B, 0x07, 0x6E, 0xC2, 0x6E, 0x22, 0xE5, 0x05, 0x85, + 0x9C, 0x38, 0xE0, 0x53, 0xC8, 0xEA, 0x3A, 0x9B, 0xDF, 0x73, 0x1B, 0x30, + 0x3D, 0xC3, 0x80, 0x57, 0x00, 0xEB, 0x2C, 0xEF, 0x7D, 0xC2, 0xB2, 0x67, + 0xAC, 0x38, 0xE0, 0xD3, 0xFA, 0x30, 0x36, 0x15, 0x0D, 0x57, 0x20, 0x73, + 0xBD, 0x0D, 0x19, 0x84, 0xDB, 0x02, 0xDC, 0x8E, 0xEC, 0xFD, 0x15, 0xA6, + 0x5E, 0xE4, 0xA0, 0x8F, 0x92, 0x0B, 0x80, 0x8D, 0x76, 0x27, 0xCF, 0x58, + 0xDC, 0x5B, 0x8F, 0x4C, 0xE4, 0xAF, 0xC9, 0x18, 0xDC, 0x7A, 0x64, 0xDF, + 0xAF, 0x9B, 0xB1, 0xAB, 0x2F, 0xDB, 0x42, 0x8C, 0x67, 0x47, 0xC5, 0x31, + 0xD9, 0xF0, 0x3A, 0xF0, 0x3B, 0x4B, 0x33, 0xA2, 0x0D, 0xF8, 0x06, 0x70, + 0x79, 0x46, 0xE0, 0x16, 0x90, 0xD2, 0xA3, 0x3B, 0x81, 0x99, 0x96, 0x43, + 0xDE, 0xE3, 0xD8, 0x1F, 0x55, 0x5B, 0x15, 0xC0, 0xE3, 0xC0, 0x9F, 0x91, + 0xC5, 0xD0, 0x36, 0xBA, 0x12, 0xF8, 0x26, 0xB2, 0x27, 0x56, 0xAD, 0xC3, + 0xBD, 0x0E, 0xD8, 0x80, 0xDD, 0x61, 0xD0, 0x00, 0xDB, 0x80, 0x1D, 0x71, + 0x47, 0x76, 0x71, 0xE8, 0x55, 0xE4, 0xAC, 0x23, 0x5B, 0x4F, 0x76, 0x1D, + 0xF0, 0x43, 0xE0, 0x06, 0xDC, 0x3C, 0xF8, 0x2A, 0x8E, 0x31, 0xF7, 0x46, + 0xE0, 0xDB, 0xC8, 0x01, 0x5F, 0x36, 0x3A, 0x01, 0x3C, 0x18, 0x57, 0x7A, + 0x14, 0x28, 0xCE, 0x99, 0x9A, 0x4D, 0xFA, 0xA1, 0xD6, 0x5A, 0xFE, 0xDE, + 0x1B, 0x35, 0x37, 0x9E, 0x05, 0x6C, 0x65, 0x62, 0x56, 0xA6, 0x8B, 0x9A, + 0xAF, 0x2F, 0xF0, 0x67, 0x89, 0x66, 0xF0, 0x3C, 0xAA, 0x2D, 0x18, 0x57, + 0x01, 0xF7, 0x02, 0xF7, 0x21, 0x1B, 0xA7, 0xCC, 0xB5, 0xB8, 0x3F, 0x07, + 0x5C, 0x05, 0xCC, 0xD0, 0x3C, 0x79, 0x0B, 0xF0, 0x22, 0xE2, 0xC1, 0xA6, + 0x51, 0xB3, 0x81, 0xE5, 0xFA, 0xE2, 0xAE, 0x21, 0x9A, 0x3D, 0xBB, 0x0B, + 0xF8, 0x19, 0x70, 0x32, 0xEE, 0x87, 0xCA, 0x19, 0x13, 0xEB, 0x44, 0xCD, + 0x24, 0xE0, 0x2B, 0xC0, 0x77, 0x88, 0xB6, 0xF3, 0xDB, 0x00, 0xB0, 0x1B, + 0x99, 0x22, 0xDC, 0x89, 0xD8, 0x74, 0x47, 0x90, 0xF2, 0x1D, 0x57, 0x37, + 0x46, 0xAB, 0x43, 0xAC, 0xC7, 0x79, 0x3A, 0xC6, 0xBE, 0x1B, 0xB1, 0x21, + 0xDB, 0x89, 0x36, 0x45, 0xFA, 0x06, 0xF0, 0x2D, 0x64, 0xE3, 0x19, 0x5C, + 0x07, 0x0C, 0x70, 0x1E, 0xF0, 0x3D, 0xE0, 0x8B, 0x13, 0xE8, 0x21, 0x4E, + 0xEA, 0x78, 0xBE, 0x07, 0xF1, 0xB9, 0x4F, 0x00, 0x47, 0x75, 0x5C, 0x72, + 0xA1, 0x56, 0x2B, 0xAF, 0x31, 0xC3, 0x5C, 0x1D, 0x5A, 0x66, 0x6A, 0x8F, + 0xB5, 0x14, 0x99, 0x44, 0x88, 0xBA, 0x0A, 0x63, 0x10, 0xB8, 0x1B, 0xB8, + 0x57, 0x23, 0xE8, 0x54, 0x00, 0x06, 0x39, 0xCF, 0xFE, 0x2E, 0x60, 0xFD, + 0x04, 0x03, 0xB9, 0x31, 0x85, 0x3B, 0x84, 0x9C, 0x48, 0x1A, 0x00, 0x36, + 0x0E, 0x01, 0x6E, 0xD5, 0x60, 0x6A, 0xFA, 0x04, 0x3F, 0xE3, 0x19, 0x1D, + 0xD2, 0x7E, 0x50, 0xC9, 0x61, 0xA9, 0x52, 0x80, 0x01, 0x2E, 0x06, 0xBE, + 0x0F, 0x7C, 0x34, 0xA6, 0x48, 0xD9, 0xA5, 0x0D, 0xC1, 0xCB, 0x55, 0x11, + 0x78, 0x48, 0x33, 0x89, 0x43, 0x15, 0x7D, 0xD8, 0x0A, 0x02, 0x06, 0x59, + 0xA9, 0xB0, 0x01, 0x31, 0xD9, 0x9D, 0xDC, 0x8D, 0x35, 0x01, 0x1D, 0x05, + 0x1E, 0x06, 0xEE, 0x01, 0x5E, 0xAE, 0xF8, 0xDB, 0x58, 0x61, 0xC0, 0x00, + 0x4B, 0x80, 0x2F, 0x20, 0x0B, 0xCA, 0x16, 0x64, 0x1C, 0x6E, 0x37, 0xF0, + 0x4B, 0xCD, 0x77, 0x8F, 0x54, 0xA5, 0xBB, 0xA9, 0x02, 0xE0, 0x20, 0x85, + 0x58, 0x07, 0xDC, 0x82, 0xD8, 0x94, 0x59, 0x9B, 0x70, 0x28, 0x22, 0x13, + 0x08, 0x8F, 0xA8, 0x5F, 0xD0, 0x5F, 0xB5, 0xF1, 0xA4, 0x4A, 0x80, 0x03, + 0x77, 0x67, 0x25, 0xF0, 0x29, 0xE0, 0x7D, 0xC8, 0x1A, 0xA4, 0x5A, 0xDF, + 0x61, 0x60, 0x54, 0x5B, 0xED, 0x56, 0x85, 0xFB, 0x02, 0x55, 0x3E, 0xD7, + 0xA1, 0x9A, 0x80, 0x03, 0x2D, 0x56, 0xD0, 0x1F, 0xD1, 0xD6, 0x1C, 0x9C, + 0xAC, 0x52, 0x6B, 0x2D, 0xF6, 0x00, 0xE2, 0xCF, 0x6F, 0x06, 0xFE, 0x05, + 0xBC, 0x96, 0x48, 0x44, 0x98, 0x00, 0x60, 0x10, 0x23, 0xFE, 0x42, 0xCD, + 0x21, 0x57, 0x29, 0xE8, 0x85, 0x88, 0x75, 0xD9, 0x98, 0x52, 0xA8, 0x43, + 0x1A, 0x40, 0x05, 0x60, 0x9F, 0x45, 0x1C, 0xAA, 0x83, 0x49, 0x66, 0x00, + 0x49, 0x01, 0x0E, 0x54, 0xA7, 0x79, 0xE4, 0x45, 0x7A, 0xAD, 0x54, 0xF0, + 0x6F, 0x53, 0xC3, 0x64, 0x0A, 0x30, 0xCD, 0x51, 0xA0, 0x7D, 0x88, 0x03, + 0xD7, 0xA7, 0x39, 0x7B, 0x27, 0x52, 0x08, 0xDF, 0xAD, 0xD7, 0x49, 0x1C, + 0x70, 0xE1, 0x92, 0x06, 0x7C, 0xB6, 0x1A, 0x10, 0x77, 0x68, 0x86, 0x9A, + 0x08, 0x33, 0x35, 0x38, 0x5B, 0x82, 0x7B, 0x4B, 0x4A, 0x8D, 0x02, 0xED, + 0x51, 0x93, 0x22, 0x38, 0x05, 0xAD, 0x0F, 0xC7, 0xAC, 0x55, 0x97, 0x00, + 0x9F, 0xAB, 0x1B, 0x6F, 0xD2, 0xD6, 0xEC, 0xE2, 0xCA, 0x86, 0x7E, 0xA4, + 0x64, 0xC9, 0xE9, 0x45, 0x72, 0x2E, 0x03, 0xF6, 0x8A, 0x41, 0x7E, 0x23, + 0x34, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x92, 0xD1, 0xFF, + 0x06, 0x00, 0x3D, 0x67, 0xD1, 0x66, 0xCA, 0xCF, 0x19, 0x9B, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* misc_icon = raw::misc; +} \ No newline at end of file diff --git a/cheat/gmod/icons/rage.hpp b/cheat/gmod/icons/rage.hpp new file mode 100644 index 0000000..00e0764 --- /dev/null +++ b/cheat/gmod/icons/rage.hpp @@ -0,0 +1,1630 @@ +/* E:\Users\admin\Desktop\stuff\icons\rage.png (4/1/2018 9:59:32 PM) + StartOffset: 00000000, EndOffset: 00004BD9, Length: 00004BDA */ + +namespace icons { +constexpr static size_t rage_size = 19418; +namespace raw { +static unsigned char rage[19418] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x65, + 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, 0x61, 0x36, + 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, 0x2D, 0x63, + 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, 0x39, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x65, 0x31, 0x37, 0x35, + 0x35, 0x65, 0x39, 0x63, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, + 0x31, 0x36, 0x37, 0x34, 0x65, 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, + 0x2D, 0x63, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, + 0x66, 0x31, 0x35, 0x61, 0x38, 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x31, 0x36, 0x37, 0x34, 0x65, + 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, 0x2D, 0x63, 0x39, 0x34, 0x38, + 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, 0x66, 0x31, 0x35, 0x61, 0x38, + 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x65, 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, + 0x61, 0x36, 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, + 0x2D, 0x63, 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, + 0x39, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xB3, 0x93, 0x52, 0x50, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x05, 0xFC, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x88, 0x94, 0x55, 0x18, 0xC7, + 0x7F, 0xB3, 0xAB, 0x6B, 0xA9, 0xD9, 0x62, 0xBA, 0x56, 0xBB, 0x62, 0x94, + 0x90, 0xD9, 0x05, 0xB5, 0x48, 0x4B, 0x14, 0xBB, 0x80, 0x5D, 0xB4, 0xD8, + 0xAF, 0xF5, 0xA1, 0x02, 0x23, 0xB0, 0x08, 0xA2, 0x0F, 0x51, 0x51, 0x1F, + 0xBA, 0x10, 0xA5, 0x11, 0x14, 0x51, 0x54, 0xC2, 0x16, 0x11, 0x44, 0xD1, + 0xE5, 0x43, 0x45, 0x37, 0x37, 0x8C, 0xCC, 0xB2, 0x02, 0xD3, 0xC8, 0x56, + 0xB0, 0xA2, 0xD6, 0x75, 0x6D, 0xD5, 0x35, 0x37, 0xDB, 0xD5, 0xD9, 0x99, + 0x3E, 0x3C, 0xCF, 0xA0, 0x81, 0xF3, 0x9E, 0x33, 0x7B, 0x19, 0xDF, 0x77, + 0xF6, 0xFF, 0x83, 0x61, 0x84, 0x79, 0x77, 0xDE, 0x71, 0x7E, 0xEF, 0x39, + 0xE7, 0x39, 0xCF, 0x7B, 0xCE, 0x33, 0xB9, 0x62, 0xB1, 0x88, 0xA8, 0x5D, + 0xEA, 0xF4, 0x15, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, + 0x04, 0x0B, 0x09, 0x16, 0x12, 0x2C, 0xC1, 0x42, 0x82, 0x85, 0x04, 0x0B, + 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, 0x16, + 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, + 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, + 0x0B, 0x09, 0x96, 0x60, 0x51, 0x4B, 0x8C, 0xAB, 0xF0, 0xF8, 0x1C, 0x30, + 0x03, 0xC8, 0x03, 0x3D, 0xC3, 0x38, 0xEF, 0x49, 0xC0, 0xE9, 0xC0, 0x78, + 0xA0, 0x50, 0xE3, 0xDF, 0xF1, 0x61, 0xE0, 0x90, 0x3F, 0xFA, 0x81, 0x62, + 0x5A, 0x05, 0xCF, 0x05, 0x2E, 0x02, 0x16, 0xFA, 0x07, 0xDD, 0x08, 0x7C, + 0x07, 0x74, 0x55, 0x78, 0xCE, 0x8B, 0x81, 0x45, 0xC0, 0x7C, 0xA0, 0xA1, + 0x86, 0x05, 0xE7, 0x5C, 0xE6, 0xBF, 0xC0, 0x3E, 0xA0, 0x13, 0xD8, 0x0D, + 0xF4, 0xF9, 0xF3, 0x4E, 0x97, 0x3E, 0xAA, 0xFF, 0xFF, 0x5C, 0xE4, 0x0E, + 0xFF, 0xF9, 0xC0, 0x83, 0xC0, 0x02, 0x6F, 0x79, 0x83, 0xC0, 0x1F, 0xC0, + 0x27, 0xC0, 0x5A, 0xE0, 0xCF, 0xC8, 0xF3, 0x2D, 0x01, 0x1E, 0x00, 0xE6, + 0x01, 0xD3, 0xFC, 0x4B, 0xA8, 0x75, 0x06, 0x81, 0x01, 0xE0, 0x1F, 0xE0, + 0x6F, 0x17, 0xFE, 0x3B, 0xB0, 0xC9, 0x25, 0xFF, 0xEC, 0xCF, 0x7D, 0x27, + 0x4A, 0x70, 0x33, 0xF0, 0x1C, 0xD0, 0x7A, 0x9C, 0xD7, 0xFA, 0x81, 0x67, + 0x81, 0xFB, 0x22, 0xCE, 0x35, 0x0B, 0x68, 0x03, 0x96, 0x69, 0x64, 0x04, + 0x97, 0xBD, 0x17, 0xF8, 0xD1, 0x65, 0x6F, 0x06, 0xBE, 0x07, 0x7A, 0xAB, + 0x2D, 0xB8, 0x15, 0x78, 0x0B, 0xA8, 0x2F, 0xF3, 0xFA, 0x5E, 0xE0, 0x72, + 0xA0, 0x23, 0xF0, 0x3E, 0xB7, 0x03, 0x2F, 0xC9, 0xEB, 0x71, 0xE9, 0x05, + 0xB6, 0x03, 0x1F, 0x03, 0x9F, 0xBB, 0xE8, 0x43, 0xD5, 0x8A, 0xA2, 0xCF, + 0x4D, 0x90, 0x0B, 0x70, 0x1A, 0xB0, 0x32, 0xE2, 0x3C, 0x0B, 0xE5, 0xB1, + 0x2C, 0x8D, 0x1E, 0x97, 0xDC, 0x03, 0x3C, 0x06, 0xAC, 0x02, 0x66, 0x56, + 0x2B, 0xC8, 0x9A, 0x18, 0x78, 0xBD, 0xE8, 0x01, 0x58, 0x48, 0xF0, 0x14, + 0x3F, 0x36, 0x27, 0x9F, 0x65, 0x99, 0x02, 0x2C, 0x05, 0xE6, 0xF8, 0x77, + 0xBA, 0xCE, 0x5B, 0x73, 0x61, 0x34, 0x5B, 0xF0, 0x60, 0xE0, 0xF5, 0x82, + 0x4F, 0x05, 0x42, 0x1C, 0x91, 0xBF, 0x68, 0x9A, 0x80, 0xDB, 0x80, 0x47, + 0x81, 0x1B, 0x80, 0x09, 0xA3, 0xD5, 0x82, 0x73, 0x91, 0x57, 0xCF, 0x40, + 0xC4, 0x31, 0x05, 0x79, 0xAB, 0x88, 0x06, 0x60, 0xB9, 0x07, 0xB9, 0x53, + 0x81, 0x37, 0x3C, 0xA8, 0x1D, 0xD5, 0x44, 0x47, 0xD2, 0x85, 0x10, 0xEA, + 0xC6, 0x89, 0xE8, 0xA2, 0x4B, 0x53, 0x89, 0x5A, 0xE8, 0xC6, 0x8B, 0x1E, + 0xBB, 0x34, 0x78, 0x4F, 0x39, 0x61, 0x88, 0x2D, 0xF1, 0x02, 0xE0, 0x61, + 0x6F, 0x20, 0xAF, 0x63, 0x49, 0xA6, 0xAA, 0x0B, 0x1E, 0x29, 0x36, 0x00, + 0x1F, 0xF8, 0xE7, 0xCA, 0xD5, 0x80, 0xE0, 0x06, 0xE0, 0x14, 0x7F, 0x6E, + 0x04, 0xCE, 0x07, 0xCE, 0xF4, 0x5C, 0xC2, 0xC4, 0x0A, 0xDE, 0x6B, 0x96, + 0xE7, 0x21, 0x7A, 0x81, 0xF7, 0xB2, 0x2C, 0x78, 0x23, 0xF0, 0x8A, 0x5F, + 0xF9, 0xB5, 0x20, 0xB8, 0x0E, 0x4B, 0xC7, 0xD6, 0x7B, 0xEB, 0x3D, 0x07, + 0x38, 0x1B, 0x4B, 0xF4, 0x2C, 0x72, 0xE1, 0x93, 0x23, 0xDF, 0x6F, 0x36, + 0xF0, 0x10, 0x96, 0x11, 0xDB, 0x9C, 0x55, 0xC1, 0xF9, 0xC8, 0xF1, 0x3C, + 0xAB, 0x74, 0xFA, 0x45, 0xFC, 0xA1, 0xCB, 0xBD, 0x16, 0xB8, 0xCE, 0x23, + 0xE6, 0x98, 0x0B, 0x7A, 0x01, 0x96, 0x09, 0x5C, 0x4D, 0x64, 0x8A, 0x38, + 0x6D, 0x82, 0x27, 0x8D, 0x81, 0xE0, 0x29, 0x0F, 0xEC, 0xF1, 0xC7, 0x56, + 0x2C, 0x8B, 0x75, 0x93, 0x8B, 0x3E, 0x39, 0xE2, 0xEF, 0x57, 0x60, 0xF7, + 0x00, 0x9E, 0x8C, 0x19, 0x8F, 0x75, 0xBB, 0xF0, 0xC4, 0xD2, 0x03, 0xBC, + 0xE3, 0xE3, 0x6B, 0x1B, 0x71, 0xF9, 0xE8, 0x71, 0xC0, 0x1D, 0xC0, 0xA5, + 0x23, 0x35, 0x0F, 0xAE, 0xF6, 0xB8, 0x35, 0x16, 0xF9, 0x05, 0xCB, 0x60, + 0xBD, 0x10, 0x29, 0x79, 0x26, 0x70, 0x67, 0x4C, 0xA0, 0xA6, 0x16, 0x9C, + 0x1E, 0x76, 0x01, 0x6B, 0x3C, 0xC8, 0x8C, 0x49, 0x0A, 0xDD, 0x88, 0xDD, + 0x03, 0x90, 0xE0, 0x0C, 0xF1, 0x17, 0xF0, 0x94, 0x4F, 0x15, 0x63, 0xE2, + 0x95, 0x5B, 0x7D, 0x0A, 0x26, 0xC1, 0x19, 0xA2, 0x0B, 0x78, 0x02, 0xF8, + 0x2D, 0xE2, 0xD8, 0x95, 0xC0, 0x79, 0x12, 0x9C, 0x3D, 0xBE, 0xF5, 0xAE, + 0x3A, 0x14, 0x93, 0x4C, 0x01, 0xAE, 0x4F, 0x9A, 0x0D, 0x49, 0x70, 0x7A, + 0x69, 0x03, 0x76, 0x44, 0x1C, 0xB7, 0x3C, 0x69, 0x7A, 0x25, 0xC1, 0xE9, + 0xA5, 0x13, 0x78, 0x33, 0x62, 0xAE, 0x3B, 0x17, 0x4B, 0x65, 0x4A, 0x70, + 0x06, 0x79, 0x9B, 0xF0, 0x12, 0x9E, 0xA9, 0x58, 0x86, 0x2B, 0x27, 0xC1, + 0xD9, 0x63, 0x07, 0xB6, 0x94, 0x27, 0x14, 0x47, 0xCD, 0xA6, 0xCC, 0xAA, + 0x1B, 0x09, 0x4E, 0x37, 0x87, 0xB1, 0x3B, 0x6C, 0x21, 0x9A, 0xCA, 0xB9, + 0x94, 0xE0, 0x74, 0x53, 0x00, 0xBE, 0x21, 0xBC, 0x58, 0xA2, 0x89, 0x32, + 0xF7, 0x9A, 0x25, 0x38, 0xDD, 0x14, 0x81, 0x6E, 0xC2, 0x99, 0xAD, 0xE9, + 0x94, 0x49, 0x5B, 0x4A, 0x70, 0x36, 0x5A, 0x71, 0x28, 0x92, 0x9E, 0x84, + 0xDD, 0x77, 0x96, 0xE0, 0x0C, 0x52, 0xDA, 0x02, 0x93, 0x44, 0xBD, 0xC6, + 0xE0, 0xEC, 0x92, 0x27, 0x79, 0x5D, 0x3A, 0xDE, 0x85, 0x17, 0x24, 0x38, + 0x9B, 0x4C, 0x20, 0xBC, 0x30, 0x63, 0x3F, 0x65, 0x76, 0x42, 0x48, 0x70, + 0xBA, 0xA9, 0xC3, 0x32, 0x55, 0x21, 0xC1, 0xDD, 0xD8, 0xA6, 0x36, 0x09, + 0xCE, 0x20, 0x57, 0x11, 0x5E, 0xAF, 0xB5, 0xAF, 0x5C, 0x20, 0x26, 0xC1, + 0xE9, 0xA6, 0x11, 0xB8, 0x24, 0xE2, 0xB8, 0x4E, 0x8D, 0xC1, 0xD9, 0x64, + 0x29, 0xB6, 0xB3, 0x21, 0x89, 0x7E, 0x60, 0x8B, 0x04, 0x67, 0x8F, 0x71, + 0xD8, 0x6A, 0xCB, 0xD0, 0xBA, 0xAB, 0x2E, 0x60, 0x5B, 0xB9, 0xA9, 0x94, + 0x04, 0xA7, 0x97, 0x25, 0xC0, 0x95, 0x11, 0xC7, 0x7D, 0x4D, 0x42, 0xBD, + 0x14, 0x09, 0x4E, 0xEF, 0xD8, 0x7B, 0x37, 0xB6, 0xF7, 0x3A, 0xC4, 0xBB, + 0x24, 0x6C, 0x16, 0x90, 0xE0, 0x74, 0x72, 0x0B, 0x70, 0x4D, 0xC4, 0x71, + 0x5B, 0x81, 0xAF, 0x48, 0xC8, 0x74, 0x49, 0x70, 0xFA, 0xB8, 0x1A, 0xB8, + 0x0B, 0x2B, 0x35, 0x15, 0xE2, 0x35, 0x9F, 0x03, 0x23, 0xC1, 0xD9, 0x60, + 0x19, 0xF0, 0x08, 0x76, 0x03, 0x3F, 0xC4, 0x4F, 0xDE, 0x3D, 0x17, 0x42, + 0x91, 0x9A, 0x38, 0xF1, 0x34, 0x78, 0xCB, 0xBD, 0x1F, 0xB8, 0x2C, 0xE2, + 0xF8, 0x22, 0xF0, 0x22, 0xF0, 0x6B, 0x4C, 0x28, 0x9E, 0x26, 0xEA, 0xC7, + 0xA0, 0xDC, 0x66, 0x6C, 0x43, 0xD9, 0x2A, 0xE2, 0x92, 0x1A, 0x00, 0xEB, + 0xB1, 0xCA, 0x47, 0x85, 0xAC, 0x09, 0x1E, 0x4B, 0x75, 0x3C, 0xA6, 0xBB, + 0xD0, 0x56, 0x6C, 0x1B, 0x69, 0x4B, 0xE4, 0xDF, 0x75, 0x62, 0xBB, 0x1F, + 0xBA, 0x63, 0x27, 0xD3, 0x69, 0x62, 0x7F, 0x8D, 0x4B, 0x9D, 0xEA, 0x53, + 0xA0, 0x79, 0xC0, 0x62, 0xE0, 0x0A, 0xEC, 0x66, 0x42, 0x6C, 0x69, 0x87, + 0x3E, 0xE0, 0x69, 0xA0, 0x3D, 0xF6, 0x84, 0x69, 0x13, 0xDC, 0x02, 0x5C, + 0xE8, 0xFF, 0xAE, 0x95, 0x72, 0x4B, 0x75, 0x1E, 0x11, 0xB7, 0xB8, 0xD8, + 0xB3, 0xFC, 0x79, 0x16, 0xF1, 0xBB, 0xFB, 0xC1, 0xAA, 0x1D, 0xAD, 0xF3, + 0xC7, 0x91, 0xAC, 0x0A, 0x5E, 0x41, 0x60, 0xAF, 0x4D, 0x06, 0xA9, 0x77, + 0xC1, 0x33, 0xB0, 0xFA, 0x1C, 0x13, 0x29, 0xB3, 0xBC, 0x26, 0x81, 0x02, + 0xB6, 0x08, 0x7E, 0x2D, 0x56, 0xA4, 0x86, 0xAC, 0x0A, 0x9E, 0xE3, 0x0F, + 0x71, 0x94, 0x7E, 0x6C, 0x01, 0xFC, 0xE3, 0xC4, 0x17, 0x7D, 0x8D, 0x16, + 0x3C, 0x52, 0xDD, 0x64, 0xEE, 0x98, 0x87, 0x88, 0xA7, 0x07, 0xAB, 0x8F, + 0xF5, 0x3C, 0xE1, 0x5A, 0xA0, 0x43, 0x6E, 0xC1, 0xA1, 0xEE, 0xA4, 0x9E, + 0xB8, 0xDA, 0x1A, 0xE3, 0xE5, 0xAB, 0x22, 0x3A, 0x80, 0x97, 0x5D, 0xF0, + 0xAE, 0xA1, 0xBE, 0x49, 0x48, 0x70, 0x91, 0xF0, 0x92, 0xCD, 0x41, 0xC2, + 0x65, 0x07, 0x0A, 0x84, 0x4B, 0x22, 0x8A, 0xA3, 0x33, 0x89, 0x0D, 0xC0, + 0xAB, 0xC0, 0xA7, 0x0C, 0xB3, 0x8E, 0x74, 0x8C, 0xE0, 0xDD, 0x11, 0x82, + 0x3F, 0x8B, 0x10, 0xBC, 0x53, 0x5D, 0x74, 0x70, 0x0A, 0xB4, 0x15, 0x78, + 0x1F, 0xF8, 0x08, 0xBB, 0xC7, 0x3B, 0xEC, 0xF2, 0x8F, 0x31, 0x5D, 0xF4, + 0x36, 0xEC, 0xA6, 0xF2, 0x19, 0x09, 0xAF, 0x7F, 0x11, 0xF1, 0x3E, 0xED, + 0x58, 0x12, 0xFD, 0x54, 0xB9, 0xFC, 0xDF, 0x85, 0xBF, 0x07, 0xDB, 0x60, + 0xB6, 0xDE, 0x5B, 0xEE, 0x0F, 0xC0, 0xC1, 0x91, 0x3A, 0x41, 0xAC, 0xE0, + 0x67, 0x80, 0x7B, 0xB1, 0x32, 0xFC, 0xA5, 0x74, 0xE2, 0x11, 0xAC, 0x34, + 0xFD, 0x9A, 0xC8, 0x6E, 0x64, 0x13, 0x56, 0x39, 0x7E, 0xB5, 0x4F, 0xF8, + 0xC7, 0x22, 0xA5, 0xF2, 0xFE, 0x3D, 0x3E, 0xAE, 0x6E, 0x07, 0xBE, 0xC4, + 0xAA, 0xBE, 0x77, 0x54, 0x3A, 0x05, 0x8A, 0x8A, 0x6E, 0x23, 0x7F, 0xB3, + 0xA1, 0x11, 0xB8, 0x19, 0xFB, 0xED, 0x86, 0x19, 0xC7, 0x7C, 0xC8, 0x76, + 0xAC, 0x76, 0x62, 0x6C, 0x75, 0xBA, 0x69, 0x58, 0xE1, 0x90, 0xC5, 0x3E, + 0xE1, 0xAF, 0xE5, 0x1F, 0xE5, 0x28, 0x71, 0x18, 0x38, 0x80, 0x55, 0xC6, + 0x3F, 0xE0, 0x63, 0xEC, 0x16, 0x1F, 0xB2, 0xBA, 0xB0, 0xDF, 0xBE, 0xC8, + 0x8F, 0xD6, 0xC9, 0x63, 0x05, 0x83, 0x95, 0x09, 0x68, 0xC2, 0xEA, 0x42, + 0x94, 0x02, 0xAB, 0xCE, 0x21, 0x04, 0x4F, 0x93, 0xB1, 0x2C, 0x4E, 0xF3, + 0x18, 0x11, 0x3C, 0xE0, 0x5D, 0xEE, 0x41, 0x6C, 0x71, 0x7A, 0xE9, 0x57, + 0x58, 0xF2, 0xD5, 0x38, 0x79, 0x25, 0x82, 0x45, 0x06, 0xD1, 0x0D, 0x7F, + 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, + 0x42, 0x82, 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, + 0x85, 0x04, 0x0B, 0x09, 0x96, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, + 0x0B, 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, + 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x12, + 0x2C, 0x6A, 0x8A, 0xFF, 0x06, 0x00, 0x0E, 0x16, 0x36, 0x06, 0x65, 0x03, + 0x35, 0x24, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, + 0x60, 0x82 +}; +} +static unsigned char* rage_icon = raw::rage; +} \ No newline at end of file diff --git a/cheat/gmod/icons/visuals.hpp b/cheat/gmod/icons/visuals.hpp new file mode 100644 index 0000000..8ee4589 --- /dev/null +++ b/cheat/gmod/icons/visuals.hpp @@ -0,0 +1,1837 @@ +/* E:\Users\admin\Desktop\stuff\icons\visuals.png (4/1/2018 10:00:00 PM) + StartOffset: 00000000, EndOffset: 00005593, Length: 00005594 */ + +namespace icons { +constexpr static size_t visuals_size = 21908; +namespace raw { +static unsigned char visuals[21908] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, + 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, 0x31, 0x61, + 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, 0x2D, 0x39, + 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, 0x34, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x36, 0x38, 0x37, + 0x35, 0x30, 0x30, 0x66, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x30, + 0x33, 0x31, 0x65, 0x39, 0x31, 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, + 0x2D, 0x30, 0x65, 0x34, 0x61, 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, + 0x32, 0x31, 0x36, 0x34, 0x33, 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, 0x33, 0x31, 0x65, 0x39, 0x31, + 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, 0x2D, 0x30, 0x65, 0x34, 0x61, + 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, 0x32, 0x31, 0x36, 0x34, 0x33, + 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x30, 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, + 0x31, 0x61, 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, + 0x2D, 0x39, 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, + 0x34, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x52, 0x1E, 0x40, 0x1C, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0F, 0xB6, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x94, 0x1C, 0x55, 0x15, 0xC6, + 0x7F, 0x3D, 0x7B, 0xB6, 0x21, 0x99, 0x6C, 0x10, 0x82, 0xC3, 0x12, 0x96, + 0x84, 0x18, 0x59, 0x13, 0x20, 0x91, 0x7D, 0x09, 0x04, 0x10, 0x34, 0x78, + 0x3C, 0x08, 0x02, 0xC1, 0x13, 0x8E, 0xE2, 0x71, 0x41, 0x51, 0x96, 0x28, + 0x22, 0xCA, 0x2E, 0x02, 0x46, 0x59, 0xC4, 0x05, 0x3D, 0x0A, 0x82, 0xEC, + 0x08, 0x42, 0x02, 0xB2, 0xC8, 0x2E, 0xA0, 0x01, 0x02, 0x21, 0x81, 0x24, + 0x98, 0x90, 0x90, 0x6D, 0x92, 0xC9, 0x4C, 0x66, 0xA6, 0x33, 0x33, 0xD7, + 0x3F, 0xEE, 0xED, 0x33, 0xCD, 0xD0, 0x5D, 0xFD, 0xAA, 0xA7, 0xAA, 0xBA, + 0x66, 0xA6, 0xEE, 0x39, 0x75, 0xD2, 0x67, 0x52, 0x5D, 0xFD, 0xDE, 0xFB, + 0xEA, 0xDD, 0x77, 0xEF, 0x7D, 0xDF, 0xBD, 0x2F, 0x25, 0x22, 0x24, 0xD2, + 0x77, 0xA5, 0x2C, 0x19, 0x82, 0x04, 0xE0, 0x44, 0x12, 0x80, 0x13, 0x89, + 0xAB, 0x54, 0xF4, 0x93, 0x7E, 0x6E, 0x03, 0x0C, 0x06, 0x52, 0x40, 0x03, + 0xD0, 0x9C, 0x00, 0xDC, 0x37, 0x64, 0x30, 0x30, 0x1D, 0x38, 0x1A, 0xA8, + 0x05, 0x04, 0xD8, 0x08, 0x3C, 0x08, 0x3C, 0xD3, 0x1F, 0x80, 0x4E, 0xF5, + 0x61, 0x2B, 0xBA, 0x12, 0xF8, 0x16, 0x70, 0x26, 0x50, 0x0F, 0x94, 0xDB, + 0xDF, 0xDB, 0x81, 0x45, 0xC0, 0x6D, 0x76, 0x75, 0x24, 0x00, 0xF7, 0x4E, + 0xDB, 0xE2, 0x18, 0x60, 0x2E, 0xB0, 0x93, 0xA9, 0xE6, 0x6C, 0xE9, 0x04, + 0xDE, 0x04, 0xCE, 0x05, 0x9E, 0xB3, 0x99, 0x9D, 0x18, 0x59, 0xBD, 0x48, + 0xAA, 0x80, 0x19, 0x79, 0xC0, 0xCD, 0xF4, 0x7B, 0x82, 0xA9, 0xEF, 0x3E, + 0xBD, 0x4C, 0xF5, 0x55, 0x80, 0x2B, 0x81, 0x1D, 0xF3, 0x80, 0x9B, 0x6D, + 0x7F, 0x8C, 0x49, 0x00, 0xEE, 0xBD, 0xFD, 0x72, 0x01, 0xAE, 0x3C, 0xF1, + 0x83, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x91, 0x04, 0xE0, 0x44, + 0x12, 0x80, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x01, 0xB8, 0x8F, + 0x48, 0x2A, 0x81, 0x37, 0xBC, 0x28, 0xCE, 0xA7, 0xD0, 0x30, 0x21, 0xC0, + 0x1B, 0xC0, 0x86, 0x64, 0xA8, 0x3F, 0x26, 0x93, 0x80, 0xA1, 0xF6, 0x79, + 0x31, 0xB0, 0xAA, 0xB7, 0x00, 0x3C, 0x08, 0xDD, 0xBD, 0x39, 0x06, 0xD8, + 0xD6, 0xFE, 0xB6, 0x04, 0x78, 0x1A, 0x78, 0x18, 0x58, 0x19, 0xD1, 0x00, + 0x0A, 0xBA, 0x6B, 0x54, 0x48, 0xCA, 0x89, 0x76, 0xA3, 0xA1, 0x1E, 0x98, + 0x89, 0x6E, 0x5F, 0x0E, 0xB3, 0xBF, 0x7D, 0x60, 0x63, 0x73, 0x27, 0xD0, + 0x1A, 0x67, 0x80, 0x6B, 0x81, 0x0B, 0x81, 0xD3, 0x81, 0x91, 0x59, 0xCF, + 0x9E, 0x08, 0x4C, 0xB5, 0xCE, 0xDD, 0x6C, 0x1D, 0x0A, 0x5B, 0xD2, 0xC0, + 0x6A, 0x87, 0xFB, 0x3E, 0x8C, 0x10, 0xE0, 0x5D, 0xD1, 0xED, 0xCB, 0x93, + 0x81, 0x11, 0x59, 0xE3, 0x33, 0x09, 0xD8, 0x1B, 0xD8, 0x0E, 0xB8, 0x0E, + 0x68, 0x0B, 0xF6, 0x55, 0x17, 0x09, 0xE2, 0xAA, 0x12, 0x91, 0xD9, 0x22, + 0xB2, 0x46, 0x72, 0x4B, 0xA7, 0x88, 0xAC, 0x12, 0x91, 0xAB, 0x45, 0xA4, + 0x3E, 0xA0, 0xDF, 0xF4, 0xBA, 0xCA, 0x45, 0x64, 0xBA, 0xFD, 0x66, 0x3E, + 0x59, 0x24, 0x22, 0x53, 0x45, 0xA4, 0x2C, 0x82, 0xF6, 0xEC, 0x26, 0x22, + 0xB7, 0x88, 0xC8, 0x3A, 0x8F, 0xF1, 0x59, 0x6A, 0xED, 0x09, 0xF4, 0xB7, + 0x83, 0x32, 0xB2, 0x06, 0x02, 0x87, 0xD8, 0xCC, 0xCD, 0x67, 0xF0, 0x8C, + 0xB6, 0xD9, 0x7D, 0x2E, 0xB0, 0x43, 0xC8, 0xB3, 0xA5, 0x03, 0x78, 0x01, + 0xB8, 0x01, 0x58, 0x9E, 0xE3, 0xFF, 0x17, 0x01, 0xBF, 0x32, 0xFB, 0xA0, + 0x33, 0xE4, 0xB6, 0xEC, 0x02, 0x7C, 0xD7, 0x54, 0xF3, 0x70, 0x8F, 0xF1, + 0xA9, 0xB7, 0xD9, 0x3D, 0x20, 0x8E, 0x2A, 0xBA, 0x3C, 0x6B, 0x4D, 0xA1, + 0x00, 0xC8, 0x67, 0xDA, 0xE7, 0x1B, 0x80, 0x15, 0x21, 0x0E, 0x6C, 0x23, + 0xF0, 0x5B, 0x60, 0x21, 0x70, 0x7C, 0xD6, 0xE0, 0x7E, 0x68, 0x6B, 0xDE, + 0xAB, 0xC0, 0xE6, 0x90, 0xC1, 0xDD, 0x19, 0xF8, 0x01, 0xF0, 0x05, 0xA0, + 0xCE, 0x61, 0x7C, 0x76, 0x01, 0x6A, 0x80, 0x96, 0xB8, 0x01, 0xDC, 0xE9, + 0x38, 0x13, 0x52, 0x36, 0xCB, 0xBF, 0x62, 0x9F, 0xAF, 0x0F, 0x11, 0x64, + 0x01, 0xD6, 0x02, 0xF3, 0x80, 0xFF, 0x02, 0xD5, 0xF6, 0xF7, 0x16, 0xE0, + 0x23, 0x5B, 0xA7, 0xC3, 0x06, 0xF7, 0x42, 0x03, 0x77, 0x98, 0xE3, 0x77, + 0x36, 0x38, 0x1A, 0x87, 0x91, 0x03, 0xBC, 0x05, 0x78, 0x05, 0x65, 0x51, + 0xB8, 0xC8, 0xA8, 0x2C, 0x90, 0xAF, 0x0B, 0xD9, 0xBA, 0x6E, 0xC9, 0x61, + 0xD8, 0x49, 0x44, 0xE0, 0xCE, 0xCC, 0x72, 0x87, 0x5C, 0xE4, 0x31, 0x1B, + 0xCB, 0xD8, 0x05, 0x3A, 0xDA, 0x80, 0xBF, 0x02, 0x2F, 0xFA, 0xF8, 0x4E, + 0x66, 0x26, 0x9F, 0x1F, 0xC1, 0x9A, 0x2C, 0xDD, 0xAE, 0xB0, 0xD7, 0xDC, + 0x39, 0xC0, 0x29, 0x3E, 0xC1, 0x7D, 0xC8, 0xEC, 0x86, 0x8E, 0x38, 0x02, + 0x9C, 0xF1, 0x77, 0x7F, 0x02, 0xBC, 0xEE, 0xE3, 0x3B, 0x23, 0x80, 0x2F, + 0x03, 0xDF, 0xF6, 0x30, 0xD0, 0x7A, 0x93, 0x8C, 0x06, 0x2E, 0x02, 0x3E, + 0x8F, 0x72, 0xB1, 0x5D, 0x65, 0x3E, 0x70, 0xB5, 0xA3, 0x6B, 0x57, 0x32, + 0x80, 0xDB, 0x81, 0xA7, 0xEC, 0xED, 0x7D, 0xCD, 0x27, 0xC8, 0xA7, 0x03, + 0x27, 0xA1, 0x64, 0xB9, 0xDE, 0x2A, 0xD5, 0xC0, 0x19, 0x45, 0x80, 0x3B, + 0x0F, 0xB8, 0xCC, 0x96, 0xB8, 0xAD, 0x71, 0x8F, 0x64, 0xB5, 0x00, 0x4F, + 0x9A, 0x9A, 0xF9, 0x29, 0xB0, 0x9F, 0x0F, 0x75, 0x7D, 0x22, 0xF0, 0x68, + 0xC0, 0x46, 0xD7, 0x00, 0xB3, 0x4A, 0xB7, 0xCD, 0x8A, 0xAC, 0xAD, 0xB6, + 0xD0, 0xE0, 0x96, 0x80, 0x0D, 0xAD, 0xED, 0x81, 0x13, 0x8A, 0x58, 0x73, + 0x33, 0xE0, 0x86, 0x62, 0xF4, 0x85, 0x11, 0x8B, 0x6E, 0x45, 0x43, 0x93, + 0x73, 0x80, 0x9F, 0x01, 0xFB, 0xFA, 0x50, 0x6F, 0x83, 0x7A, 0xF0, 0xBB, + 0xDB, 0x00, 0x7B, 0x02, 0x7B, 0xD9, 0x20, 0x6F, 0x6B, 0xCF, 0xAC, 0xB2, + 0xFF, 0xAB, 0xCD, 0x72, 0x9F, 0x36, 0xA1, 0x59, 0x0D, 0x6B, 0xCD, 0x6D, + 0x6A, 0x34, 0xAD, 0xB3, 0x90, 0xE2, 0xB3, 0x1D, 0x86, 0xD9, 0xEF, 0xB9, + 0xCA, 0xE3, 0x36, 0x09, 0x42, 0x03, 0x37, 0x2C, 0x80, 0xB3, 0x41, 0xBE, + 0xD8, 0xDE, 0xD0, 0xFD, 0x43, 0x6A, 0x4B, 0x2D, 0x30, 0x05, 0x38, 0x0A, + 0xDD, 0xDC, 0xA8, 0x37, 0x60, 0xAB, 0xED, 0xAA, 0xB2, 0x65, 0xA8, 0x2C, + 0x6B, 0x39, 0xEA, 0xCC, 0xBA, 0xDA, 0xAC, 0xAD, 0x6D, 0x36, 0xAB, 0x97, + 0x01, 0x0B, 0x6C, 0xF0, 0x17, 0x01, 0x4D, 0x3E, 0x0D, 0x39, 0xD7, 0x1D, + 0xAC, 0x47, 0x81, 0xCB, 0x81, 0x97, 0xC3, 0x76, 0xD7, 0xC2, 0xCE, 0x6C, + 0xA8, 0x01, 0xA6, 0x01, 0x97, 0xD8, 0xBF, 0x5E, 0x72, 0x37, 0x1A, 0xE5, + 0x5A, 0xEB, 0xF0, 0xDC, 0x09, 0xC0, 0x64, 0xE0, 0x38, 0xFB, 0x3C, 0xC6, + 0xD4, 0x71, 0xA5, 0x01, 0xE9, 0x77, 0xAB, 0x50, 0x0C, 0xF0, 0xB4, 0x05, + 0x3F, 0x56, 0x00, 0x6F, 0x03, 0xF7, 0x03, 0xFF, 0x04, 0xD6, 0x3B, 0x3C, + 0x63, 0x2C, 0xF0, 0x47, 0xE0, 0xB0, 0x02, 0xF7, 0xDD, 0x6F, 0x06, 0xD5, + 0xAB, 0x11, 0xF8, 0xE2, 0x10, 0x41, 0x1C, 0xB6, 0x5A, 0x44, 0x0E, 0x17, + 0x91, 0xE7, 0x3C, 0xE2, 0xC2, 0x2B, 0x44, 0xE4, 0x04, 0x8B, 0x21, 0x7B, + 0x3D, 0xAB, 0x4E, 0x44, 0x4E, 0x15, 0x91, 0x47, 0x45, 0x64, 0xB9, 0x88, + 0x34, 0x5B, 0x1C, 0x37, 0x68, 0x69, 0x17, 0x91, 0x26, 0x11, 0x79, 0x4F, + 0x44, 0xEE, 0x11, 0x91, 0x13, 0x45, 0xA4, 0xB6, 0x40, 0xDB, 0x2A, 0x45, + 0xE4, 0x0C, 0x11, 0xD9, 0xE0, 0xF1, 0xDC, 0x07, 0x44, 0x64, 0x8A, 0xC5, + 0xEE, 0xA3, 0x18, 0xFB, 0x48, 0x00, 0xCE, 0x80, 0x7C, 0xA4, 0x0D, 0x56, + 0x73, 0xB7, 0x81, 0x7C, 0x43, 0x44, 0xCE, 0x15, 0x91, 0x11, 0x1E, 0xDF, + 0x1F, 0x28, 0x22, 0x07, 0x8B, 0xC8, 0x1D, 0x16, 0x94, 0x6F, 0x09, 0x09, + 0xD8, 0x5C, 0x9B, 0x00, 0x2D, 0x22, 0xB2, 0xD8, 0x36, 0x0B, 0xF6, 0x2E, + 0xD0, 0xCF, 0x51, 0x22, 0x72, 0x81, 0x88, 0xBC, 0xDF, 0xED, 0x39, 0x8D, + 0x22, 0xF2, 0x7B, 0x11, 0x99, 0x16, 0x25, 0xB8, 0x22, 0x12, 0x69, 0xF2, + 0x59, 0x0D, 0xBA, 0x25, 0x36, 0xDD, 0x54, 0x6A, 0x95, 0xA9, 0xBE, 0x97, + 0x2C, 0x94, 0xD8, 0x98, 0x27, 0xDC, 0x39, 0x1A, 0x98, 0x05, 0x9C, 0x86, + 0xA6, 0xA3, 0x0C, 0x20, 0x7A, 0xB6, 0x86, 0xD8, 0x7A, 0xFC, 0x0E, 0xF0, + 0x6B, 0xE0, 0x01, 0x34, 0xCF, 0x38, 0x57, 0x28, 0xB6, 0xCE, 0x0C, 0xCB, + 0xC9, 0x66, 0x23, 0xB4, 0x00, 0x4B, 0xCD, 0xD7, 0x5D, 0x13, 0x89, 0x5A, + 0x8E, 0x70, 0x0D, 0xCE, 0x35, 0x00, 0x43, 0xCC, 0x00, 0x4A, 0x99, 0xDF, + 0xD7, 0xEC, 0xD1, 0xE9, 0x4F, 0x99, 0x35, 0xFE, 0x39, 0x73, 0xA5, 0x4A, + 0x4D, 0xC3, 0xE9, 0x30, 0x63, 0xEC, 0x2F, 0x16, 0x62, 0xFD, 0x28, 0xCF, + 0x7D, 0x55, 0xD6, 0xCF, 0x72, 0x7B, 0x69, 0x5B, 0xAD, 0x9F, 0x91, 0x67, + 0x31, 0xC6, 0x35, 0x7D, 0x34, 0x05, 0x7C, 0xC6, 0xC0, 0x3D, 0xD2, 0x67, + 0xE0, 0x20, 0x8A, 0xD9, 0xDC, 0x60, 0xB3, 0xF8, 0x12, 0xE0, 0x7F, 0x71, + 0x8E, 0xBE, 0xC4, 0x15, 0xE0, 0xC3, 0xCD, 0xC5, 0x3A, 0x90, 0x80, 0xF7, + 0x47, 0x03, 0x94, 0xCD, 0xC0, 0xDF, 0x81, 0xEF, 0xC7, 0x19, 0xE4, 0x38, + 0x02, 0x3C, 0x05, 0xB8, 0x02, 0xA5, 0xF9, 0x14, 0x1B, 0xBA, 0x6C, 0x44, + 0x37, 0xF3, 0xD7, 0x98, 0x8F, 0xBB, 0xD2, 0xAE, 0x32, 0x8B, 0x38, 0x8D, + 0x31, 0x9B, 0x60, 0x14, 0xB0, 0x0F, 0x5D, 0x5B, 0x89, 0x7E, 0x65, 0x8B, + 0xCD, 0xE4, 0xF3, 0xC2, 0x88, 0x23, 0xC7, 0x39, 0xD0, 0x51, 0xAC, 0x8C, + 0x02, 0xBE, 0x07, 0x1C, 0x54, 0x04, 0xB8, 0x9D, 0x16, 0x38, 0xF8, 0x17, + 0xBA, 0xF1, 0xF1, 0x1A, 0x5D, 0xFB, 0xAB, 0x2D, 0x74, 0x71, 0x9D, 0xAA, + 0xB3, 0x7C, 0xE6, 0xE1, 0x16, 0x84, 0xD9, 0x15, 0x38, 0x14, 0xE5, 0x47, + 0xF9, 0x91, 0x81, 0x16, 0x9E, 0xDC, 0x00, 0x5C, 0xE0, 0x33, 0x30, 0xD2, + 0xEF, 0x66, 0xF0, 0x60, 0xE0, 0xC7, 0xC0, 0x39, 0xF6, 0xD9, 0x8F, 0xE1, + 0xF3, 0x92, 0x05, 0x4A, 0x5E, 0x04, 0xDE, 0x33, 0xA3, 0xAD, 0x29, 0xCB, + 0x2A, 0x97, 0x1C, 0x6B, 0x3C, 0x66, 0x04, 0x0D, 0xB2, 0xD9, 0xBC, 0x87, + 0xBD, 0x58, 0x33, 0x6D, 0x56, 0xFB, 0x91, 0x8D, 0x16, 0x76, 0xFC, 0x79, + 0x02, 0x70, 0x7E, 0x99, 0x6D, 0xAA, 0xB9, 0xCE, 0xC7, 0x77, 0x96, 0xA1, + 0x4C, 0xCD, 0x79, 0x06, 0x6C, 0x33, 0xC5, 0x33, 0x22, 0xAA, 0x6C, 0x66, + 0xEF, 0x81, 0x12, 0x17, 0xCE, 0x31, 0x8D, 0xE2, 0x2A, 0xCB, 0x81, 0xAF, + 0x03, 0x8F, 0xC4, 0x0A, 0xE1, 0x28, 0x9D, 0x6E, 0x8F, 0x6B, 0x3F, 0x11, + 0x79, 0xC5, 0x67, 0x10, 0xE2, 0x31, 0x11, 0x99, 0x21, 0x22, 0x43, 0x1D, + 0x22, 0x60, 0x7E, 0xAE, 0x0A, 0x0B, 0xBA, 0x9C, 0x2E, 0x22, 0xAF, 0xFA, + 0x68, 0x4F, 0x87, 0xB5, 0x69, 0xE7, 0x98, 0x8C, 0x69, 0xA0, 0xAC, 0xCA, + 0x9E, 0x48, 0x1D, 0xF0, 0x55, 0x73, 0x8B, 0x5C, 0xE5, 0xCF, 0x28, 0xC7, + 0xF8, 0x09, 0x53, 0x8F, 0x41, 0xB2, 0x20, 0xDA, 0x81, 0x75, 0xC0, 0x7D, + 0xC0, 0x0F, 0xED, 0x37, 0x5C, 0xA4, 0xCC, 0xE2, 0xED, 0x27, 0x13, 0xA3, + 0xB4, 0x99, 0x38, 0x00, 0x7C, 0x98, 0xA9, 0xC4, 0x4A, 0xC7, 0xFB, 0x7F, + 0x63, 0x06, 0xCD, 0xBB, 0x84, 0x90, 0x09, 0x90, 0x25, 0x4D, 0xE8, 0x46, + 0xC3, 0x37, 0xD1, 0x0D, 0x02, 0x57, 0xA3, 0x6B, 0x16, 0x4A, 0x64, 0x4F, + 0x00, 0x36, 0x77, 0xE5, 0x44, 0x34, 0x84, 0xE9, 0x22, 0x77, 0x02, 0x97, + 0x9A, 0xCB, 0xD3, 0x19, 0x41, 0xFB, 0x5A, 0xD0, 0xF0, 0xE4, 0xB5, 0xC0, + 0xB3, 0x8E, 0xDF, 0xD9, 0x0D, 0x65, 0x52, 0x56, 0x25, 0x00, 0x6B, 0x20, + 0xE3, 0x68, 0xDC, 0xAA, 0xDD, 0xBC, 0x82, 0x6E, 0xB3, 0x45, 0x99, 0x6E, + 0x92, 0x71, 0xBF, 0xFE, 0x0D, 0x5C, 0x69, 0x86, 0x9C, 0x8B, 0xEB, 0x79, + 0x02, 0x9A, 0xB2, 0xD3, 0xAF, 0x01, 0x1E, 0x08, 0x1C, 0xE0, 0x68, 0xA9, + 0xAE, 0x32, 0x0B, 0x7B, 0x21, 0xA5, 0xA9, 0x4A, 0xD7, 0x86, 0x52, 0x91, + 0xAE, 0xC2, 0x8D, 0x2C, 0xBF, 0x87, 0x45, 0xE3, 0xCA, 0xFB, 0x33, 0xC0, + 0xE3, 0xD0, 0x0D, 0xFB, 0x42, 0x6D, 0x68, 0xB7, 0x35, 0xF0, 0x31, 0x82, + 0x4E, 0xCC, 0xF2, 0x27, 0xAD, 0xB6, 0x44, 0xCC, 0x77, 0xB8, 0xB7, 0xD2, + 0x6C, 0x8B, 0xD1, 0xFD, 0x19, 0xE0, 0x09, 0xB6, 0x5E, 0xB9, 0xF8, 0x97, + 0x7F, 0x20, 0x60, 0x42, 0x78, 0x91, 0xB2, 0x19, 0xB8, 0x05, 0xB7, 0x7C, + 0xE7, 0x43, 0x2D, 0x42, 0xD6, 0x2F, 0x01, 0xAE, 0x03, 0x8E, 0xC0, 0x2D, + 0x54, 0xFA, 0x28, 0xFE, 0xB8, 0xD6, 0x61, 0xCB, 0x53, 0x68, 0x29, 0x62, + 0x97, 0x25, 0x68, 0x9F, 0x52, 0x1B, 0x5B, 0xA5, 0x02, 0xB8, 0x16, 0xB7, + 0x70, 0x60, 0x0B, 0x70, 0x2F, 0x01, 0xE7, 0xEB, 0x04, 0xB0, 0x1E, 0xDF, + 0xE1, 0xE8, 0x7B, 0x1F, 0x89, 0xBF, 0xC8, 0x5C, 0x9F, 0x01, 0x78, 0x88, + 0x63, 0xC7, 0x5F, 0x44, 0xC9, 0x69, 0x71, 0xDB, 0xF2, 0x7A, 0x0D, 0xB7, + 0x44, 0xF6, 0x1D, 0xE9, 0x19, 0x15, 0xB8, 0xC7, 0x92, 0x4F, 0x45, 0x0E, + 0x46, 0xB7, 0xEB, 0x46, 0xE3, 0x56, 0xE6, 0x20, 0x65, 0xEE, 0x44, 0x33, + 0x4A, 0xBF, 0x59, 0x5C, 0xE0, 0xFE, 0x51, 0x74, 0x11, 0xD1, 0xBD, 0x64, + 0x3E, 0xBA, 0xF5, 0x17, 0x37, 0xF9, 0xD0, 0x82, 0x20, 0x3B, 0x39, 0xBC, + 0xC8, 0x43, 0x1D, 0xED, 0x91, 0x89, 0xB8, 0xD1, 0x91, 0x52, 0x74, 0xB1, + 0x40, 0x57, 0xA0, 0xF9, 0x4C, 0x2D, 0x7E, 0x00, 0x1E, 0x0F, 0x7C, 0xCD, + 0xFC, 0xD3, 0x81, 0x3E, 0x67, 0x79, 0x1A, 0xA5, 0x9B, 0x5E, 0xE5, 0xB1, + 0x4E, 0x55, 0xA0, 0x04, 0xF5, 0x1A, 0x87, 0xE7, 0x2D, 0x23, 0x9E, 0xB2, + 0x05, 0xDD, 0x9A, 0x9C, 0x55, 0xE0, 0xBE, 0x11, 0x78, 0xA7, 0x8E, 0xD6, + 0xA2, 0x74, 0xA4, 0x59, 0x36, 0xDB, 0x2B, 0x7D, 0xB4, 0xA1, 0x13, 0xE5, + 0xB4, 0x3D, 0x62, 0x46, 0xE8, 0x62, 0x17, 0x80, 0xEB, 0xD0, 0x6C, 0xBF, + 0x99, 0xA6, 0x5A, 0x8A, 0xE1, 0x17, 0x8F, 0x41, 0xF9, 0x53, 0xDF, 0xB0, + 0x41, 0xC8, 0xF5, 0x9B, 0xE3, 0x1D, 0x9E, 0xD5, 0x88, 0x46, 0x91, 0xE2, + 0x2A, 0x9B, 0x1C, 0xEE, 0x19, 0x60, 0xDA, 0x2A, 0x95, 0x43, 0x0B, 0x96, + 0xA3, 0xC5, 0x6A, 0x2E, 0x41, 0xB9, 0x67, 0xE5, 0x45, 0x8C, 0xF7, 0x18, + 0x94, 0xEC, 0x5F, 0x85, 0x6E, 0x57, 0x6E, 0x2A, 0xB4, 0x06, 0xCF, 0x30, + 0x70, 0x87, 0xD0, 0x45, 0x20, 0xF7, 0x73, 0x95, 0xA1, 0x1B, 0xEA, 0x7B, + 0xA3, 0x89, 0x58, 0x43, 0xF2, 0x34, 0xCC, 0x85, 0x41, 0xB1, 0x94, 0xDC, + 0xE5, 0x17, 0xE2, 0x22, 0x6B, 0x71, 0x4B, 0x73, 0xC9, 0x37, 0x51, 0x76, + 0x04, 0xCE, 0x32, 0x35, 0x5F, 0x59, 0xE4, 0x78, 0x67, 0x2A, 0x2B, 0x9C, + 0x46, 0x1E, 0xC2, 0x7D, 0x77, 0x80, 0x27, 0x7B, 0x80, 0xE2, 0x77, 0x6D, + 0x3F, 0xCC, 0x82, 0x19, 0xB9, 0xD6, 0x10, 0x17, 0xF7, 0x68, 0x23, 0xD1, + 0xC4, 0x9B, 0x8B, 0x95, 0x77, 0x71, 0xCB, 0x78, 0xC8, 0xB7, 0xAE, 0x8E, + 0x45, 0xF3, 0xA8, 0x82, 0x30, 0x74, 0x47, 0x03, 0x9F, 0x76, 0x01, 0x78, + 0x48, 0x80, 0x03, 0x30, 0xCC, 0xC3, 0x82, 0x74, 0x51, 0x45, 0x5B, 0x63, + 0x0E, 0x70, 0x13, 0x6E, 0x1C, 0xE7, 0x7C, 0x06, 0x6A, 0x15, 0xC1, 0x51, + 0xA6, 0x52, 0xE4, 0x21, 0x27, 0x76, 0x07, 0x38, 0xC8, 0x8A, 0x74, 0xAB, + 0xC8, 0x4D, 0x0E, 0x17, 0x47, 0x1F, 0x32, 0xEE, 0xE5, 0xF6, 0x47, 0x3A, + 0xBA, 0x40, 0xE2, 0xE1, 0x4F, 0x07, 0x49, 0x82, 0x6F, 0x71, 0x01, 0x78, + 0x81, 0xA9, 0xC6, 0x20, 0xE4, 0x31, 0x53, 0x63, 0x7E, 0x3A, 0xDD, 0xDD, + 0x02, 0x8D, 0x73, 0x42, 0xF8, 0xEE, 0xE4, 0x2F, 0x8B, 0xD4, 0x5D, 0x13, + 0xE5, 0xEA, 0xEF, 0x62, 0xE0, 0xF9, 0x80, 0xDA, 0xB2, 0x0C, 0x8D, 0xB0, + 0x15, 0x04, 0xF8, 0x49, 0xB4, 0xF4, 0x50, 0x4F, 0xCB, 0xF8, 0x3C, 0x87, + 0xD6, 0x9C, 0xD8, 0x9A, 0xC7, 0xBC, 0x77, 0x61, 0x1F, 0xEE, 0x82, 0x5B, + 0xAC, 0xBA, 0x54, 0x52, 0xED, 0xF0, 0x02, 0x8A, 0x79, 0x03, 0xB9, 0x00, + 0x5E, 0x03, 0xDC, 0x6A, 0x71, 0x83, 0x9E, 0xC8, 0x06, 0x94, 0x04, 0xF1, + 0xB2, 0x8B, 0x9B, 0xB4, 0x12, 0x2D, 0x10, 0xD6, 0x66, 0x7E, 0xF0, 0x10, + 0xC7, 0x59, 0x24, 0x59, 0xC0, 0xBD, 0x02, 0xFC, 0x0E, 0x3D, 0x78, 0x2A, + 0x97, 0x7B, 0xB0, 0x15, 0xF8, 0x8F, 0xC3, 0x33, 0x07, 0x9A, 0xFB, 0xF0, + 0x7C, 0x0C, 0x23, 0x59, 0x65, 0xB8, 0xD5, 0x14, 0x69, 0x36, 0x43, 0x2C, + 0x57, 0xFB, 0x33, 0xC5, 0xDA, 0xBE, 0x63, 0x7E, 0xF0, 0x5E, 0x16, 0x1B, + 0x70, 0x5D, 0x9A, 0xDA, 0x50, 0x2E, 0xF6, 0x9D, 0x28, 0x37, 0x3B, 0xED, + 0x02, 0x70, 0x87, 0xB9, 0x26, 0xD7, 0xA2, 0x34, 0xD4, 0xC1, 0x8E, 0xCE, + 0x77, 0xCA, 0xBE, 0xDB, 0x6C, 0xEE, 0xCD, 0x46, 0x8F, 0x75, 0x56, 0x4C, + 0x3D, 0x35, 0x51, 0x98, 0x1E, 0xBB, 0xBB, 0x0D, 0x66, 0xDC, 0x8E, 0x9F, + 0xDB, 0x06, 0xAD, 0xEC, 0xE7, 0xE2, 0x09, 0xAC, 0x2D, 0xF0, 0x02, 0x3C, + 0x63, 0xC1, 0xA1, 0x7A, 0xFC, 0x25, 0xD6, 0xA5, 0xED, 0xD9, 0xCB, 0xBC, + 0xD6, 0xF2, 0x8A, 0x3C, 0x2A, 0xB4, 0x81, 0xE2, 0x43, 0x84, 0x2E, 0x60, + 0x34, 0x98, 0x6A, 0x29, 0x04, 0xF0, 0x74, 0xE0, 0x97, 0x76, 0x6F, 0x9C, + 0x66, 0xF1, 0x48, 0x0A, 0x27, 0xB4, 0x67, 0x82, 0x21, 0x8D, 0x0E, 0xE3, + 0xB5, 0x1A, 0xB7, 0xC4, 0x77, 0xDF, 0xE3, 0x5D, 0x56, 0xE0, 0x8B, 0xC5, + 0x5C, 0x2E, 0xD2, 0xE8, 0xD8, 0xA1, 0x3D, 0xD1, 0x54, 0x96, 0xB8, 0xA9, + 0xE8, 0xA9, 0xB8, 0x31, 0x51, 0xDE, 0x72, 0x8C, 0x78, 0x85, 0x36, 0xDE, + 0xA5, 0xDA, 0x4D, 0x5A, 0x8F, 0x06, 0xEB, 0x5D, 0xA2, 0x40, 0xA7, 0x50, + 0xE2, 0x1D, 0x99, 0x6E, 0x52, 0x0B, 0x7C, 0xC9, 0x71, 0xE9, 0x9A, 0x4F, + 0x89, 0x8B, 0xA1, 0x97, 0x0A, 0xE0, 0x26, 0x33, 0x30, 0x5C, 0x76, 0xA9, + 0x0E, 0x45, 0xC9, 0x79, 0x71, 0x91, 0x63, 0xD1, 0x88, 0x9F, 0x8B, 0x96, + 0x5A, 0x5A, 0xEA, 0x60, 0x4D, 0x29, 0x29, 0x3B, 0x0B, 0x51, 0xB6, 0x62, + 0x21, 0x19, 0x0B, 0x9C, 0x6A, 0x56, 0x75, 0xA9, 0x65, 0x04, 0x1A, 0x63, + 0x1F, 0xEA, 0x70, 0xEF, 0xB3, 0xC4, 0x60, 0x37, 0xAC, 0x94, 0x00, 0xBF, + 0x6F, 0xC1, 0x90, 0x42, 0x52, 0x81, 0x72, 0xA7, 0xCF, 0xC2, 0xDF, 0x76, + 0x5A, 0xD0, 0x52, 0x85, 0x56, 0x01, 0x3A, 0xD8, 0xF1, 0xFE, 0x7F, 0x58, + 0x1F, 0xFB, 0x2D, 0xC0, 0x69, 0xBA, 0x52, 0x3D, 0x0B, 0xC9, 0x70, 0x34, + 0xB1, 0xAB, 0x94, 0xAA, 0xFA, 0x38, 0x7B, 0xC9, 0x5C, 0xEC, 0x81, 0x97, + 0x6C, 0xFD, 0xED, 0xEC, 0xCF, 0x00, 0x63, 0xD1, 0x97, 0x27, 0x1C, 0xAD, + 0xE4, 0xF1, 0x68, 0xA1, 0xCF, 0x09, 0x25, 0x68, 0xE7, 0x01, 0x68, 0x39, + 0x89, 0x7A, 0xC7, 0xFB, 0x9F, 0x26, 0x9A, 0xB3, 0x29, 0x62, 0x0F, 0x70, + 0x03, 0x70, 0x8F, 0xE3, 0x60, 0xA4, 0x50, 0x12, 0xDB, 0x15, 0x44, 0x97, + 0x35, 0x90, 0x32, 0x37, 0xED, 0x7A, 0xDC, 0x4B, 0x32, 0xBE, 0x00, 0xDC, + 0x45, 0x3C, 0x68, 0xBE, 0xB1, 0x48, 0x3E, 0x7B, 0x0E, 0xF8, 0x1B, 0xEE, + 0xC7, 0xE0, 0xCC, 0x40, 0x13, 0xAD, 0xA7, 0x52, 0x7C, 0xE9, 0x05, 0x17, + 0xA9, 0xB6, 0x40, 0xCB, 0x5C, 0x03, 0xD9, 0x45, 0x5A, 0x81, 0x3F, 0xA1, + 0x44, 0xC1, 0x58, 0x48, 0x5C, 0x12, 0xC0, 0x77, 0x45, 0x03, 0xE6, 0x87, + 0x38, 0xDE, 0xDF, 0x81, 0x86, 0xF7, 0x6E, 0x45, 0x29, 0xAC, 0xEB, 0x02, + 0x6E, 0xCF, 0x76, 0x68, 0xB1, 0xF2, 0xD9, 0x68, 0xF5, 0x76, 0x57, 0xB9, + 0x0F, 0x4D, 0x1C, 0x5F, 0x9B, 0x00, 0xFC, 0x49, 0x39, 0x19, 0x0D, 0x4B, + 0x6E, 0xEF, 0xE3, 0x3B, 0x1B, 0xD1, 0x60, 0xFB, 0xFD, 0xB6, 0x9E, 0x37, + 0x04, 0xE0, 0x06, 0x4D, 0x45, 0xB3, 0x03, 0x67, 0xE2, 0xAF, 0xC2, 0xCF, + 0x22, 0x94, 0x87, 0x36, 0x9F, 0x18, 0x49, 0x9C, 0x00, 0xAE, 0x46, 0x09, + 0x7F, 0x17, 0xE1, 0xBF, 0x74, 0xD2, 0x5B, 0x68, 0x64, 0xEC, 0x61, 0xFB, + 0xBC, 0x12, 0xF7, 0xF0, 0x66, 0x39, 0xBA, 0x6B, 0x35, 0xC9, 0xD4, 0xFF, + 0x11, 0x3E, 0x67, 0x6D, 0xE6, 0x45, 0x3B, 0xCF, 0xD4, 0x73, 0x7B, 0x02, + 0x70, 0x7E, 0x19, 0x83, 0xB2, 0x03, 0x4F, 0x2B, 0xC2, 0xE7, 0x15, 0x94, + 0x60, 0xF0, 0x8E, 0x59, 0xE6, 0xEF, 0xA2, 0x61, 0xC2, 0x15, 0xE8, 0xFE, + 0x76, 0x47, 0x96, 0xDD, 0xB1, 0x3D, 0xBA, 0x23, 0x34, 0xD4, 0x0C, 0xB6, + 0x23, 0xD1, 0xBD, 0xE7, 0x1D, 0x8B, 0x68, 0x73, 0x0B, 0x9A, 0x5A, 0x7A, + 0x15, 0xA5, 0x4D, 0x8E, 0xEB, 0x15, 0x00, 0x63, 0x6E, 0xD0, 0x1C, 0x34, + 0xDE, 0x5B, 0x6C, 0x29, 0x84, 0xCC, 0x2E, 0x4E, 0x93, 0x01, 0x9D, 0x39, + 0x46, 0x27, 0x65, 0x9A, 0x62, 0x77, 0x5B, 0x67, 0xAB, 0x51, 0xEE, 0xD8, + 0xE0, 0x1E, 0xB4, 0xF7, 0x66, 0xB4, 0x18, 0xDA, 0x66, 0x62, 0x28, 0x71, + 0xAD, 0x74, 0x37, 0xC9, 0x54, 0xF5, 0xC9, 0x04, 0x43, 0xDB, 0xC9, 0x14, + 0x00, 0xCF, 0x50, 0x7B, 0x83, 0xA8, 0xA1, 0x91, 0x06, 0x6E, 0x37, 0x8B, + 0x7E, 0x11, 0x31, 0x95, 0x38, 0xD7, 0xAA, 0x9C, 0x48, 0xD7, 0x91, 0x70, + 0x83, 0x62, 0xD6, 0xBE, 0xF5, 0xC0, 0x4D, 0xE8, 0xE9, 0x6D, 0x0D, 0xC4, + 0x8F, 0x90, 0x50, 0x52, 0x80, 0x33, 0x2C, 0x91, 0x32, 0x9B, 0x05, 0x69, + 0x8F, 0xB5, 0x6B, 0x9C, 0xA9, 0xEA, 0xD9, 0x84, 0x7F, 0xB6, 0x92, 0xAB, + 0x7B, 0xB6, 0xC4, 0xD4, 0xF2, 0x4D, 0x1E, 0xED, 0xAE, 0x44, 0x37, 0x47, + 0xAA, 0x50, 0x8A, 0x52, 0x3B, 0x25, 0xAA, 0x82, 0x17, 0x25, 0xC0, 0x83, + 0xD0, 0xD2, 0x06, 0xA7, 0xD2, 0xC5, 0xE6, 0x6F, 0x40, 0xCF, 0x47, 0x98, + 0x67, 0xBE, 0x63, 0xAE, 0xD8, 0x6D, 0x15, 0xBA, 0x27, 0x3C, 0xCB, 0xFC, + 0xE4, 0x52, 0xD1, 0x69, 0x5B, 0xAC, 0x9D, 0xB7, 0x03, 0x0F, 0xE6, 0xB1, + 0x96, 0x53, 0x68, 0x52, 0xDD, 0xF1, 0x28, 0xF1, 0xBF, 0xD6, 0x5E, 0xE0, + 0x85, 0x28, 0x05, 0x6A, 0x09, 0xC5, 0x1F, 0xFA, 0x51, 0x9C, 0x44, 0x58, + 0xF1, 0xFD, 0x14, 0x2B, 0xEB, 0x9F, 0xEE, 0x56, 0x40, 0xEC, 0x03, 0x11, + 0xB9, 0x52, 0x44, 0xB6, 0xF3, 0xF8, 0x7E, 0x99, 0x88, 0x8C, 0x17, 0x91, + 0xEB, 0xAD, 0xE2, 0x7B, 0x5A, 0xA2, 0x93, 0x56, 0x11, 0x59, 0x28, 0x22, + 0x97, 0x89, 0xC8, 0x4E, 0x05, 0x8E, 0xA3, 0x1D, 0x2B, 0x22, 0x73, 0x45, + 0x64, 0x7D, 0xB7, 0x67, 0x6C, 0x16, 0x91, 0xF9, 0x56, 0xB8, 0xAD, 0x3A, + 0xCA, 0x42, 0x68, 0x51, 0x82, 0xFB, 0xBA, 0xC7, 0x20, 0xAE, 0x11, 0x91, + 0xB3, 0x1D, 0xCE, 0xF2, 0x1D, 0x64, 0xE7, 0x27, 0xDC, 0x6A, 0xE7, 0x29, + 0xB4, 0xDA, 0xB1, 0x00, 0x61, 0x9C, 0xD9, 0xD0, 0x2C, 0x22, 0x6F, 0x8B, + 0xC8, 0x8D, 0x22, 0x72, 0x8C, 0x1D, 0x2B, 0x40, 0x81, 0x97, 0xF0, 0xFC, + 0x6E, 0x47, 0x16, 0x74, 0x97, 0x67, 0x44, 0xE4, 0x58, 0x11, 0xA9, 0x89, + 0x0A, 0xE0, 0xB0, 0xAB, 0xCD, 0x0E, 0xB0, 0xA8, 0xD0, 0x45, 0x78, 0x67, + 0x14, 0x8E, 0x34, 0x35, 0xFC, 0x38, 0xDE, 0xB5, 0x97, 0x9B, 0x4D, 0x3D, + 0x3E, 0x85, 0x16, 0x0E, 0x3D, 0xCC, 0xFE, 0xDD, 0xDD, 0x96, 0x80, 0xEA, + 0x22, 0x55, 0x78, 0x86, 0xF6, 0xDB, 0x6A, 0x6B, 0xE5, 0x02, 0x8B, 0x8C, + 0x3D, 0x89, 0xD2, 0x80, 0x5D, 0x5C, 0xA0, 0x9D, 0xAD, 0xAF, 0x5E, 0xC4, + 0x84, 0xCF, 0x5A, 0x1B, 0x2B, 0x89, 0xA8, 0xA8, 0x4C, 0x98, 0x00, 0xD7, + 0x58, 0x87, 0xE7, 0x18, 0x00, 0x85, 0xA4, 0x0E, 0x77, 0xD6, 0x46, 0x23, + 0xBA, 0xA1, 0xFE, 0x84, 0xAD, 0xEB, 0x93, 0x51, 0x82, 0xDE, 0x34, 0x0B, + 0x37, 0xD6, 0xD0, 0x55, 0x45, 0xB6, 0xDC, 0xC3, 0x60, 0xDA, 0x62, 0x57, + 0xE6, 0xC8, 0xD9, 0x67, 0x2D, 0x12, 0xF6, 0x32, 0x5A, 0x13, 0xCB, 0x4F, + 0x54, 0x2A, 0x13, 0x38, 0x29, 0x24, 0x93, 0xD1, 0x12, 0x89, 0x62, 0x20, + 0xA7, 0x7B, 0x23, 0xC0, 0x35, 0xE8, 0x19, 0x7E, 0x17, 0x3B, 0x82, 0x4B, + 0x91, 0xBE, 0xE9, 0x56, 0xB4, 0xF0, 0xF7, 0x1B, 0x66, 0x8C, 0x4D, 0xB0, + 0x41, 0x1E, 0x63, 0xE1, 0xC7, 0xDD, 0xD0, 0xCC, 0xBB, 0x4E, 0xBA, 0x76, + 0xCE, 0x3A, 0xEC, 0xF3, 0x6A, 0xF3, 0x5F, 0x97, 0xD3, 0x75, 0xFA, 0xD9, + 0xC2, 0x1E, 0x86, 0x1A, 0x5D, 0xFB, 0xB0, 0x5F, 0x37, 0x90, 0xB7, 0xF6, + 0x26, 0x80, 0x33, 0x6A, 0xF9, 0x47, 0xB8, 0x97, 0x11, 0x12, 0x94, 0xA0, + 0xD6, 0x13, 0x06, 0x62, 0x9A, 0x4F, 0x66, 0x4C, 0xD4, 0x9A, 0x5B, 0xD6, + 0x91, 0x35, 0x93, 0x33, 0x00, 0x6F, 0x0E, 0xD8, 0x75, 0x59, 0x83, 0x72, + 0xB0, 0x5C, 0xD3, 0x6D, 0xF6, 0x47, 0xEB, 0x63, 0x57, 0xA1, 0x59, 0xFA, + 0xAD, 0xBD, 0x01, 0xE0, 0x01, 0xC0, 0x17, 0x4D, 0x2D, 0x8F, 0xF3, 0xF1, + 0xBD, 0x95, 0xE8, 0x49, 0x26, 0xEB, 0x03, 0x6E, 0x4F, 0x23, 0xD1, 0xD5, + 0xF8, 0x58, 0x81, 0xEE, 0x6C, 0x4D, 0xC1, 0xFD, 0x10, 0x91, 0x7D, 0x6D, + 0xAC, 0x52, 0xE8, 0xF9, 0x0F, 0x81, 0x83, 0x5C, 0x16, 0xF0, 0xCB, 0x32, + 0xB3, 0x08, 0x70, 0x3F, 0x42, 0xF3, 0xA1, 0xE6, 0x11, 0xEF, 0x7C, 0x60, + 0x17, 0x2D, 0x74, 0x2F, 0x70, 0x1B, 0xFE, 0xD8, 0x1C, 0x7B, 0x9B, 0x11, + 0x3A, 0x9D, 0x30, 0x98, 0xA3, 0x01, 0x9A, 0xE4, 0x07, 0x99, 0xBF, 0xE8, + 0xE7, 0x54, 0xB1, 0x95, 0x76, 0x52, 0x58, 0x6D, 0x9C, 0x8A, 0x68, 0xF7, + 0xF0, 0xAA, 0x13, 0x91, 0x6B, 0xEC, 0xB4, 0x33, 0x3F, 0xF2, 0xBC, 0x88, + 0x8C, 0x8B, 0x6B, 0x41, 0xF0, 0xC1, 0xE6, 0xE6, 0x8C, 0xF7, 0xF1, 0xB6, + 0x7F, 0x08, 0xDC, 0x68, 0xB3, 0x37, 0x0A, 0x35, 0x5A, 0x1E, 0x51, 0x14, + 0x6C, 0x03, 0x7A, 0xB2, 0xE8, 0x2D, 0xF8, 0xDB, 0x61, 0x3A, 0x10, 0xDD, + 0x8B, 0x2E, 0x8B, 0xA3, 0x8A, 0xAE, 0xF2, 0x61, 0x2D, 0x67, 0x83, 0x7B, + 0x33, 0xE1, 0x6E, 0xB3, 0x95, 0x9B, 0x45, 0x3F, 0x1A, 0xAD, 0xAC, 0xB7, + 0x17, 0x4A, 0xC1, 0x0D, 0x3B, 0xB1, 0xBC, 0x01, 0xDD, 0x23, 0xBE, 0xD9, + 0xA7, 0x21, 0x37, 0x8D, 0x80, 0x37, 0x56, 0x82, 0xAC, 0x11, 0xE1, 0xE2, + 0x5E, 0x74, 0x1A, 0xB8, 0x37, 0xD8, 0x5A, 0xB5, 0x29, 0xC4, 0x41, 0xAE, + 0xB0, 0x98, 0xF7, 0xA1, 0x68, 0xAE, 0xF3, 0x78, 0x7B, 0xB9, 0x16, 0xA0, + 0xDC, 0xA9, 0xC7, 0x43, 0xD6, 0x1C, 0xEB, 0x51, 0x06, 0x68, 0x07, 0x5A, + 0x77, 0xCC, 0xC5, 0xF0, 0xAA, 0x0E, 0xDA, 0xF0, 0x0D, 0xEA, 0x61, 0x69, + 0xEB, 0x50, 0xA7, 0x87, 0x56, 0xC8, 0x54, 0x66, 0x9B, 0x6B, 0xE0, 0x6E, + 0x0C, 0x79, 0x16, 0x0D, 0x43, 0xCB, 0xF1, 0x9F, 0xCD, 0xC7, 0x29, 0x40, + 0x13, 0xD1, 0xFC, 0xA2, 0x4B, 0xAD, 0x1D, 0xCD, 0x21, 0xCF, 0xE4, 0x6B, + 0xEC, 0xC5, 0x9A, 0x8D, 0x77, 0xC9, 0x87, 0x0E, 0x34, 0xDB, 0x3F, 0xD8, + 0xF6, 0x04, 0xB4, 0x98, 0x97, 0x89, 0xC8, 0x49, 0x76, 0x0E, 0x70, 0x67, + 0x9E, 0x13, 0x49, 0x96, 0x8A, 0xC8, 0x79, 0x22, 0xB2, 0x4D, 0x04, 0x86, + 0x4E, 0xCA, 0xCE, 0xF2, 0xF5, 0x32, 0x74, 0x96, 0x59, 0x9B, 0x53, 0x11, + 0x19, 0x5E, 0x97, 0x8B, 0xC8, 0x3A, 0x8F, 0xF1, 0x79, 0x53, 0x44, 0x26, + 0xC5, 0xD5, 0xC8, 0xEA, 0xB4, 0xF8, 0xF0, 0x6D, 0x36, 0x4B, 0x5B, 0x2D, + 0x3A, 0xB3, 0xD5, 0x3E, 0x2F, 0x41, 0xC9, 0xE3, 0x61, 0xAB, 0xE5, 0x6C, + 0x7F, 0xFC, 0x28, 0xBC, 0xCB, 0x42, 0xD5, 0xA3, 0x5C, 0xAC, 0x28, 0xF2, + 0x9D, 0x36, 0xD8, 0x4C, 0x9E, 0x8B, 0xC6, 0xDA, 0xBB, 0x8F, 0xCF, 0xFB, + 0x28, 0x17, 0x6D, 0x41, 0x9C, 0x03, 0x1D, 0x9B, 0x50, 0xDA, 0xEB, 0x5B, + 0x68, 0xB2, 0xD8, 0xF0, 0x2C, 0x3F, 0xF7, 0x2E, 0x34, 0x0F, 0x29, 0x2A, + 0xDE, 0x52, 0x05, 0x6E, 0xD5, 0x6C, 0x6B, 0x89, 0x8E, 0xFC, 0xDF, 0x80, + 0x1E, 0x49, 0xBB, 0xC0, 0xE2, 0x05, 0x43, 0xCD, 0x76, 0x59, 0x8D, 0x72, + 0xBB, 0x1F, 0x8F, 0x7B, 0x24, 0x4B, 0x6C, 0x1D, 0xBE, 0xDB, 0x82, 0x16, + 0x99, 0x7A, 0x13, 0x4D, 0x44, 0x5F, 0x31, 0x36, 0xE5, 0xA3, 0x6F, 0x51, + 0x9E, 0x71, 0xD4, 0x68, 0xC1, 0x90, 0x27, 0x2D, 0xA8, 0x21, 0x16, 0x14, + 0xD9, 0x14, 0xE6, 0x9B, 0x1E, 0x86, 0x6C, 0x8C, 0xC0, 0x88, 0x72, 0x79, + 0xE1, 0xE2, 0x2A, 0x91, 0x8D, 0x4F, 0x19, 0x7D, 0x57, 0xA4, 0x97, 0xBF, + 0x04, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x27, 0x00, 0x27, 0x43, 0x90, 0x00, + 0x9C, 0x48, 0x02, 0x70, 0x22, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x07, 0x2C, + 0xA9, 0x80, 0xEE, 0x49, 0x00, 0x8E, 0xA1, 0x74, 0xE2, 0x56, 0xF3, 0x3A, + 0x9D, 0x00, 0xDC, 0x3B, 0x25, 0x8D, 0xD2, 0x61, 0xBD, 0xF6, 0xA8, 0xDB, + 0xF0, 0xCF, 0x7D, 0x4E, 0x00, 0x8E, 0x89, 0xB4, 0xA3, 0xB5, 0x32, 0xDE, + 0xCE, 0x03, 0x60, 0x1A, 0xCD, 0x58, 0xB8, 0xAF, 0xAF, 0x03, 0x5C, 0xD1, + 0x47, 0xFB, 0xD5, 0x81, 0x12, 0xCA, 0x87, 0xA1, 0xB5, 0x33, 0x76, 0xA0, + 0x8B, 0x8F, 0x95, 0x21, 0xCB, 0xFF, 0x02, 0x25, 0xBE, 0xF7, 0xE9, 0x70, + 0x65, 0x5C, 0x13, 0xC0, 0x83, 0xD4, 0x50, 0x87, 0xA3, 0x95, 0xEA, 0x86, + 0xD3, 0xC5, 0x07, 0x7B, 0x88, 0x18, 0x67, 0xE5, 0x27, 0x00, 0xF7, 0xCC, + 0xAA, 0xEE, 0x37, 0x1D, 0xEE, 0xCB, 0x2A, 0x3A, 0x97, 0xF4, 0x2B, 0x60, + 0xFB, 0x83, 0x1F, 0x9C, 0x48, 0x02, 0x70, 0xDF, 0x97, 0xFF, 0x0F, 0x00, + 0xAE, 0x7B, 0xCD, 0x15, 0x78, 0xF2, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* visuals_icon = raw::visuals; +} \ No newline at end of file diff --git a/cheat/gmod/identity.cpp b/cheat/gmod/identity.cpp new file mode 100644 index 0000000..de047cf --- /dev/null +++ b/cheat/gmod/identity.cpp @@ -0,0 +1,98 @@ +#include "identity.hpp" +#include "settings.hpp" +#include "interface.hpp" +#include "pattern.hpp" + +namespace features +{ + void c_identity::clantag_changer( ) { + static auto fn_offset = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "53 56 57 8B DA 8B F9 FF 15" ) ); + static auto fn = reinterpret_cast< void( __fastcall* )( const char*, const char* ) >( fn_offset ); + static bool was_enabled = false; + + if ( !g_settings.misc.clantag_changer( ) ) { + if ( was_enabled ) { + fn( "", " " ); + static cvar_t* cl_clanid = g_csgo.m_cvar( )->FindVar( xors( "cl_clanid" ) ); + auto backup_val = cl_clanid->get_int( ); + cl_clanid->set_value( 0 ); + cl_clanid->set_value( backup_val ); + was_enabled = false; + } + + return; + } + + was_enabled = true; + + //fn( xors( "#freeshkreli $" ), xors( "#freeshkreli $" ) ); + + //basically make it completely fade out + static const std::string moneybot_string = xors( "moneybot " ); + static std::string clantag_str = moneybot_string; + + static auto next_settime = g_csgo.m_globals->m_realtime; + auto curtime = g_csgo.m_globals->m_realtime; + + if ( curtime > next_settime ) { + const int length = clantag_str.length( ); + clantag_str.insert( 0, 1, clantag_str[ length - 2 ] ); + clantag_str.erase( length - 1, 1 ); + + std::string set = clantag_str; + set.resize( 15 ); + set[ 14 ] = '$'; + + auto is_full = set.find( xors( "moneybot" ) ) != std::string::npos; + + next_settime = curtime + ( is_full ? 0.85f : 0.4f ); + fn( set.c_str( ), set.c_str( ) ); + } + } + + void c_identity::name_changer( ) { + static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "name" ) ); + auto set_name = [ ]( const char* name ) { + *( int* )( uintptr_t( &cvar->m_change_callback ) + 0xc ) = 0; + cvar->set_value( name ); + }; + + static bool activated = false; + static char original_name[ 100 ]{ }; + + if( !g_settings.misc.name_changer ) { + if( activated ) { + set_name( original_name ); + } + + activated = false; + return; + } + + if( !activated ) { + strcpy( original_name, cvar->get_string( ) ); + if( g_settings.misc.name_changer == 1 ) { + char new_name[ 128 ]; + memset( new_name, '$', sizeof( new_name ) ); + set_name( new_name ); + } + if( g_settings.misc.name_changer == 2 ) { + set_name( xors( "moneybot.cc" ) ); + } + if( g_settings.misc.name_changer == 101 ) { + set_name( "­­­\n\xAD\xAD\xAD" ); + } + } + else if( g_settings.misc.name_changer == 101 ) { + char new_name[ 15 ]; + for( size_t i{ }; i < 15; ++i ) { + auto is_upper = !( math::random_number( 0, 256 ) & 1 ); + new_name[ i ] = is_upper ? math::random_number( 65, 90 ) : math::random_number( 97, 122 ); + } + + set_name( new_name ); + } + + activated = true; + } +} \ No newline at end of file diff --git a/cheat/gmod/identity.hpp b/cheat/gmod/identity.hpp new file mode 100644 index 0000000..0d6e778 --- /dev/null +++ b/cheat/gmod/identity.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "sdk.hpp" + +namespace features +{ + class c_identity { + private: + void clantag_changer( ); + void name_changer( ); + public: + void operator()( ) { + clantag_changer( ); + name_changer( ); + } + }; +} \ No newline at end of file diff --git a/cheat/gmod/iface_dllmain_impl.hpp b/cheat/gmod/iface_dllmain_impl.hpp new file mode 100644 index 0000000..761c215 --- /dev/null +++ b/cheat/gmod/iface_dllmain_impl.hpp @@ -0,0 +1,84 @@ +#pragma once + +namespace factory +{ + namespace interfaces + { + class c_interface_manager + { + struct reg + { + char m_key; + uintptr_t m_ptr; + uintptr_t m_module; + char m_module_name[ 64 ]; + char m_name[ 64 ]; + }; + + size_t m_count; + reg* m_regs; + + void decrypt_str( char* buf, size_t size, char key ) { + for( size_t i{ }; i < size; ++i ) { + buf[ i ] ^= key; + } + } + + public: + void init( uintptr_t iface_addr ) { + m_count = *( size_t* )( iface_addr ); + m_regs = ( reg* )( iface_addr + 4 ); + } + + template < typename t = void* > + t find_interface( const std::string& module_, std::string name ) { + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + char name_buf[ 64 ]; + char module_buf[ 64 ]; + + for( size_t i{ }; i < m_count; ++i ) { + auto& reg = m_regs[ i ]; + + memcpy( name_buf, reg.m_name, 64 ); + memcpy( module_buf, reg.m_module_name, 64 ); + + decrypt_str( name_buf, 64, reg.m_key ); + decrypt_str( module_buf, 64, reg.m_key ); + + if( !module_.compare( module_buf ) && strstr( name_buf, name.c_str( ) ) ) { + return ( t )( reg.m_ptr ); + } + } + + return t{ }; + } + + template < typename t = void* > + t find_interface( std::string name ) { + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + char name_buf[ 64 ]; + char module_buf[ 64 ]; + + for( size_t i{ }; i < m_count; ++i ) { + auto& reg = m_regs[ i ]; + + memcpy( name_buf, reg.m_name, 64 ); + memcpy( module_buf, reg.m_module_name, 64 ); + + decrypt_str( name_buf, 64, reg.m_key ); + decrypt_str( module_buf, 64, reg.m_key ); + + if( strstr( name_buf, name.c_str( ) ) ) { + return ( t )( reg.m_ptr ); + } + } + + return t{ }; + } + }; + } +} \ No newline at end of file diff --git a/cheat/gmod/in_prediction.cpp b/cheat/gmod/in_prediction.cpp new file mode 100644 index 0000000..cb5a7bf --- /dev/null +++ b/cheat/gmod/in_prediction.cpp @@ -0,0 +1,32 @@ +#include "mem.hpp" +#include "hooks.hpp" +#include "context.hpp" + +#undef max + +bool __fastcall hooks::in_prediction( void* ecx_, void* edx_ ) { + static auto in_prediction_o = g_csgo.m_prediction->get_old_function< decltype( &hooks::in_prediction ) >( 14 ); + static auto ret_address = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "84 C0 75 08 57 8B CE E8 ? ? ? ? 8B 06" ) ); + + if( g_ctx.m_local && ret_address && g_settings.rage.enabled && g_settings.rage.resolver ) { + stack_t stack( get_baseptr( ) ); + int local_team = g_ctx.m_local->m_iTeamNum( ); + + if( stack.return_address( ) == ret_address ) { + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_valid( ) || ent == g_ctx.m_local ) + continue; + + if( ent->m_iTeamNum( ) != local_team || g_settings.rage.friendlies ) { + ent->m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); + ent->m_iMostRecentModelBoneCounter( ) -= 1; + } + } + } + } + + return in_prediction_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/input_system.cpp b/cheat/gmod/input_system.cpp new file mode 100644 index 0000000..881fa02 --- /dev/null +++ b/cheat/gmod/input_system.cpp @@ -0,0 +1,527 @@ +#include + +#include "input_system.hpp" +#include "util.hpp" + +util::c_input_manager g_input; + +NAMESPACE_REGION( util ) + +const char* const key_names_short[] = { + "unk", + "m1", + "m2", + "can", + "m3", + "m4", + "m5", + "unk", + "back", + "tab", + "unk", + "unk", + "clr", + "ret", + "unk", + "unk", + "shift", + "ctrl", + "alt", + "pause", + "caps", + "kana", + "unk", + "junja", + "final", + "kanji", + "unk", + "esc", + "convert", + "nonconvert", + "accept", + "modechange", + " ", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "slct", + "prnt", + "execute", + "snapshot", + "ins", + "del", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unk", + "unk", + "num0", + "num1", + "num2", + "num3", + "num4", + "num5", + "num6", + "num7", + "num8", + "num9", + "*", + "+", + "sep", + "-", + ",", + "/", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "lshift", + "rshift", + "lctrl", + "rctrl", + "lalt", + "ralt", +}; + +const char* const key_names[] = { + "unknown", + "mouse_1", + "mouse_2", + "cancel", + "mouse_3", + "mouse_4", + "mouse_5", + "unknown", + "back", + "tab", + "unknown", + "unknown", + "clear", + "return", + "unknown", + "unknown", + "shift", + "control", + "alt", + "pause", + "capital", + "kana", + "unknown", + "junja", + "final", + "kanji", + "unknown", + "escape", + "convert", + "nonconvert", + "accept", + "modechange", + "space", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "select", + "print", + "execute", + "snapshot", + "insert", + "delete", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unknown", + "unknown", + "numpad0", + "numpad1", + "numpad2", + "numpad3", + "numpad4", + "numpad5", + "numpad6", + "numpad7", + "numpad8", + "numpad9", + "multiply", + "add", + "separator", + "subtract", + "decimal", + "divide", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "lshift", + "rshift", + "lcontrol", + "rcontrol", + "lmenu", + "rmenu", +}; + +void c_input_manager::capture_mouse_move( ulong_t lparam ) { + m_mouse_pos[ 0 ] = LOWORD( lparam ); + m_mouse_pos[ 1 ] = HIWORD( lparam ); +} + +void c_input_manager::clear_keys( ) { + memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) ); +} + +bool c_input_manager::register_key_press( int key_event, int key ) +{ + switch ( key_event ) { + case KEYDOWN: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = true; + return true; + } + case KEYUP: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = false; + return true; + } + case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = true; + break; + } + case SYSKEYUP: { + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = false; + break; + } + case LBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE1 ] = true; + return true; + case LBUTTONUP: + m_pressed_keys[ KEYS_MOUSE1 ] = false; + return true; + case RBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE2 ] = true; + return true; + case RBUTTONUP: + m_pressed_keys[ KEYS_MOUSE2 ] = false; + return true; + case MBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE3 ] = true; + return true; + case MBUTTONUP: + m_pressed_keys[ KEYS_MOUSE3 ] = false; + return true; + case XBUTTONDOWN: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; + return true; + } + case XBUTTONUP: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; + return true; + } + case MOUSEWHEEL: { + short scroll_input = ( short )HIWORD( key ); + m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; + return true; + } + } + + return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK +} + +bool c_input_manager::is_key_pressed( int key ) { + auto k = key; + return is_valid_key( k ) && m_pressed_keys[ k ]; +} + +const char* c_input_manager::get_key_name( int key ) { + if ( !is_valid_key( key ) || key > KEYS_MAX ) + return key_names[ KEYS_NONE ]; + + return key_names[ key ]; +} + +const char* c_input_manager::get_short_name( int key ) { + return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; +} + +VirtualKeys_t c_input_manager::is_any_key_pressed( ) { + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( m_pressed_keys[ i ] ) { + return VirtualKeys_t( i ); + } + } + + return KEYS_NONE; +} + +int c_input_manager::get_scroll_state( ) { + int current_state = m_scroll_wheel_state; + m_scroll_wheel_state = 0; + return current_state; +} + +char c_input_manager::get_pressed_char( int* out ) { + size_t pressed_character{ }; + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( is_key_pressed( VirtualKeys_t( i ) ) ) { + if ( ( i >= KEYS_A && i <= KEYS_Z ) + || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { + pressed_character = i; + } + } + } + + if ( pressed_character ) { + if ( out ) { + *out = int( pressed_character ); + } + + if ( is_key_pressed( KEYS_SHIFT ) ) { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( pressed_character ); + + //gay way to shift it to symbols + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) { + switch ( pressed_character ) { + case KEYS_N0: + return ')'; + case KEYS_N1: + return '!'; + case KEYS_N2: + return '@'; + case KEYS_N3: + return '#'; + case KEYS_N4: + return '$'; + case KEYS_N5: + return '%'; + case KEYS_N6: + return '^'; + case KEYS_N7: + return '&'; + case KEYS_N8: + return '*'; + case KEYS_N9: + return '('; + } + } + } + else { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( ::tolower( pressed_character ) ); + + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) + return char( pressed_character ); + } + } + else if ( is_key_pressed( KEYS_SPACE ) ) { + if ( out ) + *out = KEYS_SPACE; + + return ' '; + } + else if ( is_key_pressed( KEYS_BACK ) ) { + if ( out ) + *out = KEYS_BACK; + + return 0; + } + + if ( out ) + *out = KEYS_NONE; + + return 0; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/input_system.hpp b/cheat/gmod/input_system.hpp new file mode 100644 index 0000000..a237667 --- /dev/null +++ b/cheat/gmod/input_system.hpp @@ -0,0 +1,186 @@ +#pragma once +#include "util.hpp" + +enum VirtualKeyEvents_t { + KEYDOWN = 0x0100, + KEYUP = 0x0101, + SYSKEYDOWN = 0x104, + SYSKEYUP = 0x105, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, +}; + +enum VirtualKeys_t { + KEYS_NONE = 0, + KEYS_MOUSE1 = 0X01, + KEYS_MOUSE2 = 0X02, + KEYS_CANCEL = 0X03, + KEYS_MOUSE3 = 0X04, + KEYS_MOUSE4 = 0X05, + KEYS_MOUSE5 = 0X06, + KEYS_BACK = 0X08, + KEYS_TAB = 0X09, + KEYS_CLEAR = 0X0C, + KEYS_RETURN = 0X0D, + KEYS_SHIFT = 0X10, + KEYS_CONTROL = 0X11, + KEYS_ALT = 0X12, + KEYS_PAUSE = 0X13, + KEYS_CAPSLOCK = 0X14, + KEYS_ESCAPE = 0X1B, + KEYS_CONVERT = 0X1C, + KEYS_NONCONVERT = 0X1D, + KEYS_ACCEPT = 0X1E, + KEYS_MODECHANGE = 0X1F, + KEYS_SPACE = 0X20, + KEYS_PRIOR = 0X21, + KEYS_NEXT = 0X22, + KEYS_END = 0X23, + KEYS_HOME = 0X24, + KEYS_LEFT = 0X25, + KEYS_UP = 0X26, + KEYS_RIGHT = 0X27, + KEYS_DOWN = 0X28, + KEYS_SELECT = 0X29, + KEYS_PRINT = 0X2A, + KEYS_EXECUTE = 0X2B, + KEYS_SNAPSHOT = 0X2C, + KEYS_INSERT = 0X2D, + KEYS_DELETE = 0X2E, + KEYS_HELP = 0X2F, + KEYS_N0 = 0X30, + KEYS_N1 = 0X31, + KEYS_N2 = 0X32, + KEYS_N3 = 0X33, + KEYS_N4 = 0X34, + KEYS_N5 = 0X35, + KEYS_N6 = 0X36, + KEYS_N7 = 0X37, + KEYS_N8 = 0X38, + KEYS_N9 = 0X39, + KEYS_A = 0X41, + KEYS_B = 0X42, + KEYS_C = 0X43, + KEYS_D = 0X44, + KEYS_E = 0X45, + KEYS_F = 0X46, + KEYS_G = 0X47, + KEYS_H = 0X48, + KEYS_I = 0X49, + KEYS_J = 0X4A, + KEYS_K = 0X4B, + KEYS_L = 0X4C, + KEYS_M = 0X4D, + KEYS_N = 0X4E, + KEYS_O = 0X4F, + KEYS_P = 0X50, + KEYS_Q = 0X51, + KEYS_R = 0X52, + KEYS_S = 0X53, + KEYS_T = 0X54, + KEYS_U = 0X55, + KEYS_V = 0X56, + KEYS_W = 0X57, + KEYS_X = 0X58, + KEYS_Y = 0X59, + KEYS_Z = 0X5A, + KEYS_LEFTWINDOWS = 0X5B, + KEYS_RIGHTWINDOWS = 0X5C, + KEYS_APPLICATION = 0X5D, + KEYS_NUMPAD0 = 0X60, + KEYS_NUMPAD1 = 0X61, + KEYS_NUMPAD2 = 0X62, + KEYS_NUMPAD3 = 0X63, + KEYS_NUMPAD4 = 0X64, + KEYS_NUMPAD5 = 0X65, + KEYS_NUMPAD6 = 0X66, + KEYS_NUMPAD7 = 0X67, + KEYS_NUMPAD8 = 0X68, + KEYS_NUMPAD9 = 0X69, + KEYS_MULTIPLY = 0X6A, + KEYS_ADD = 0X6B, + KEYS_SEPARATOR = 0X6C, + KEYS_SUBTRACT = 0X6D, + KEYS_DECIMAL = 0X6E, + KEYS_DIVIDE = 0X6F, + KEYS_F1 = 0X70, + KEYS_F2 = 0X71, + KEYS_F3 = 0X72, + KEYS_F4 = 0X73, + KEYS_F5 = 0X74, + KEYS_F6 = 0X75, + KEYS_F7 = 0X76, + KEYS_F8 = 0X77, + KEYS_F9 = 0X78, + KEYS_F10 = 0X79, + KEYS_F11 = 0X7A, + KEYS_F12 = 0X7B, + KEYS_NUMLOCK = 0X90, + KEYS_SCROLLLOCK = 0X91, + KEYS_LEFTSHIFT = 0XA0, + KEYS_RIGHTSHIFT = 0XA1, + KEYS_LEFTCONTROL = 0XA2, + KEYS_RIGHTCONTROL = 0XA3, + KEYS_LEFTMENU = 0XA4, + KEYS_RIGHTMENU = 0XA5, + KEYS_PERIOD = 0xBE, + KEYS_MAX = 0XA6, + KEYS_LAST = 0xfe +}; + +namespace util +{ + class c_input_manager { + public: + bool m_pressed_keys[ KEYS_LAST ]{ }; + int m_mouse_pos[ 2 ]{ }; + int m_scroll_wheel_state{ }; + + + c_input_manager( ) { + memset( m_pressed_keys, 0, KEYS_LAST ); + } + + void capture_mouse_move( ulong_t lparam ); + + //resets all keys so unpressed + void clear_keys( ); + + //registers a key press from wndproc + bool register_key_press( int key_event, int key ); + + //checks if the key is pressed + bool is_key_pressed( int key ); + + //returns the first found key pressed, or KEY_NONE if none are + VirtualKeys_t is_any_key_pressed( ); + + //returns the last scroll state and resets it to 0 + int get_scroll_state( ); + + //returns the key's name + const char* get_key_name( int key ); + const char* get_short_name( int key ); + + //returns the first found currently pressed key + char get_pressed_char( int* pressed_key = nullptr ); + + //check if a key is valid + inline bool is_valid_key( int key ) { return key > KEYS_NONE && key < KEYS_LAST; } + + //get cursor pos + inline void get_cursor_pos( int& x, int& y ) { + x = m_mouse_pos[ 0 ]; + y = m_mouse_pos[ 1 ]; + } + }; +} + +extern util::c_input_manager g_input; \ No newline at end of file diff --git a/cheat/gmod/interface.cpp b/cheat/gmod/interface.cpp new file mode 100644 index 0000000..0d1cfac --- /dev/null +++ b/cheat/gmod/interface.cpp @@ -0,0 +1,217 @@ +#include + +#include "interface.hpp" +#include "console.hpp" +#include "hooks.hpp" +#include "renderer.hpp" +#include "pattern.hpp" +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "settings.hpp" + +using namespace factory; + +interfaces::c_interface_manager g_factory; +factory::c_gmod g_gmod; + +bool factory::create_interfaces( c_gmod* instance ) { + + auto d3d_device = pattern::first_code_match( GetModuleHandleA( + xors( "shaderapidx9.dll" ) ), + xors( "FF 90 ?? ?? ?? ?? A1 ?? ?? ?? ?? 6A 00" ), 0x7 + ); + + auto engine_render = pattern::first_code_match( GetModuleHandleA( + xors( "engine.dll" ) ), + xors( "8B 0D ? ? ? ? FF 75 0C FF 75 08 8B 01 FF 50 0C" ), 2 + ); + + auto view_render = pattern::first_code_match( GetModuleHandleA( + xors( "client.dll" ) ), + xors( "8B 0D ? ? ? ? 56 57 8B 01 FF 50 30" ), 2 + ); + + instance->create( &instance->m_d3d, **reinterpret_cast< uintptr_t** >( d3d_device ) ); + instance->create( &instance->m_engine_render, **reinterpret_cast< uintptr_t** >( engine_render ) ); + instance->create( &instance->m_view_render, **reinterpret_cast< uintptr_t** >( view_render ) ); + instance->create( &instance->m_chl, xors( "VClient" ) ); + instance->create( &instance->m_surface, xors( "VGUI_Surface" ) ); + instance->create( &instance->m_panel, xors( "VGUI_Panel" ) ); + instance->create( &instance->m_engine, xors( "VEngineClient" ) ); + instance->create( &instance->m_entlist, xors( "VClientEntityList" ) ); + instance->create( &instance->m_prediction, xors( "VClientPrediction" ) ); + instance->create( &instance->m_cvar, xors( "VEngineCvar" ) ); + instance->create( &instance->m_game_movement, xors( "GameMovement" ) ); + instance->create( &instance->m_model_info, xors( "VModelInfoClient" ) ); + instance->create( &instance->m_trace, xors( "EngineTraceClient" ) ); + instance->create( &instance->m_model_render, xors( "VEngineModel" ) ); + instance->create( &instance->m_mat_system, xors( "VMaterialSystem" ) ); + instance->create( &instance->m_render_view, xors( "VEngineRenderView" ) ); + instance->create( &instance->m_phys_props, xors( "VPhysicsSurfaceProps" ) ); + instance->create( &instance->m_engine_sound, xors( "IEngineSoundClient" ) ); + instance->create( &instance->m_event_mgr, xors( "GAMEEVENTSMANAGER002" ) ); + instance->create( &instance->m_engine_vgui, xors( "VEngineVGui" ) ); + instance->create( &instance->m_lua_shared, xors( "LUASHARED" ) ); + + //auto kv_fn = ( void*( __cdecl* )( ) )( GetProcAddress( + // GetModuleHandleA( xors( "vstdlib.dll" ) ), + // xors( "KeyValuesSystem" ) ) ); + // + //instance->m_keyvalues = ( IKeyValuesSystem* )kv_fn( ); + // + //instance->m_alloc = *( IMemAlloc** )GetProcAddress( + // GetModuleHandleA( xors( "tier0.dll" ) ), + // xors( "g_pMemAlloc" ) ); + // + uintptr_t* globals = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 0 ) + 0x53 ); + instance->m_globals = reinterpret_cast< global_vars_t* >( globals ); + + uintptr_t* client_mode = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 10 ) + 0x5 ); + instance->create( &instance->m_clientmode, uintptr_t( client_mode ) ); + + uintptr_t* input = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 15 ) + 0x2 ); + instance->m_input = reinterpret_cast< CInput* >( input ); + + //uintptr_t** global_state = pattern::first_code_match< uintptr_t** >( instance->m_engine.dll( ), + // xors( "B9 ? ? ? ? 56 FF 50 14 8B 34 85" ), 0x1 ); + //instance->m_global_state = reinterpret_cast< CGlobalState* >( *global_state ); + // + //auto clientstate = instance->m_global_state->get_client_state( ); + //if( clientstate && clientstate->netchannel ) + // instance->create( &instance->m_net_channel, ( uintptr_t )clientstate->netchannel ); + // + //uintptr_t var_ptr = ( uintptr_t )instance->m_cvar( )->FindVar( xors( "weapon_debug_spread_show" ) ); + //instance->create( &instance->m_debug_show_spread, var_ptr ); + + //instance->listeners.bullet_impact.init( ); + //instance->listeners.player_hurt.init( ); + //instance->listeners.round_start.init( ); + + return true; +} + + +con_fn clear_fn{ fnv( "clear" ), [ ]( const char*, const char* ) { g_con->m_logs.clear( ); }, "" }; +con_fn enable_logs_fn{ fnv( "log_enable" ), + [ ]( const char* a, const char* ) { + g_settings.menu.logs_enable ^= 1; + g_con->log( g_settings.menu.logs_enable ? xors( "logs enabled" ) : xors( "logs disabled" ) ); + }, + "" +}; + +con_fn fnv_fn{ fnv( "fnv" ), + [ ]( const char* a, const char* ) { + auto print = hash::fnv1a( a ); + g_con->log( "%08x", print ); + }, + "%S" +}; + +con_fn sum_fn{ fnv( "sum" ), + [ ]( const char* a, const char* syntax ) { + auto arg_1 = con_fn::get_arg< int >( a, 0, syntax ); + auto arg_2 = con_fn::get_arg< int >( a, 1, syntax ); + g_con->log( "%d + %d = %d", arg_1, arg_2, arg_1 + arg_2 ); + }, + "%D %D" +}; + +con_fn dump_cfg{ fnv( "dump_cfg" ), + [ ]( const char* , const char* ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + g_con->log( "%08x: %s", setting->get_hash( ), setting->get_string( ).c_str( ) ); + } + }, + "" +}; + +con_fn retard_fn{ fnv( "retard" ), + [ ]( const char*, const char* ) { + g_con->log( "snuze" ); + }, + "" +}; + +con_fn unload_fn{ fnv( "unload" ), + [ ]( const char*, const char* ) { + g_gmod.m_panic = true; + }, + "" +}; + +/*con_fn alias_fn{ fnv( "alias" ), + [ ]( const char* a, const char* b ) { + auto var_type = std::string( b ); + if( var_type.length( ) > 1 ) { + g_con->log( xors( "unknown var type: %s" ), var_type.c_str( ) ); + return; + } + + switch( b[ 0 ] ) { + case TYPE_STRING: { + std::shared_ptr< con_alias< const char* > >( fnv( ) ) + } + } + }, + "%S %S" +};*/ + +void factory::c_gmod::initialize( ) { + m_panic = true; + g_con->create( ); + auto now = std::chrono::high_resolution_clock::now( ); + g_con->print( xors( "hello\n" ) ); + + factory::create_interfaces( &g_gmod ); + + //g_fonts.initialize( ); + // + g_netvars.init( ); + //g_settings.load( ); + g_con->register_fn( &clear_fn ); + g_con->register_fn( &enable_logs_fn ); + g_con->register_fn( &fnv_fn ); + g_con->register_fn( &sum_fn ); + g_con->register_fn( &dump_cfg ); + g_con->register_fn( &retard_fn ); + g_con->register_fn( &unload_fn ); + // + hooks::commit( &g_gmod ); + + + ////g_cheat.m_chams.m_materials.initialize_materials( ); + // + //auto offset = g_netvars.get_netvar( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ); + //g_con->log( "lastshottime: %08x", offset ); + //g_con->log( "prop: %08x", g_netvars.get_prop( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ) ); + // + auto after = std::chrono::high_resolution_clock::now( ); + std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); + + std::chrono::duration< float > delta = after - now; + g_con->print( xors( "cheat initialized\n" ) ); + g_con->print( xors( "time taken: %f\n" ), delta.count( ) ); + m_panic = false; +} + +void factory::c_gmod::uninitialize( ) { + m_panic = true; + g_con->destroy( ); + //Sleep( 100 ); + + //restore wndproc + if ( hooks::window_procedure_o ) { + SetWindowLongA( m_hwnd, GWLP_WNDPROC, ( long )hooks::window_procedure_o ); + } + + //restore all interfaces + restore( ); + + //free the library + FreeLibraryAndExitThread( g_dll, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/interface.hpp b/cheat/gmod/interface.hpp new file mode 100644 index 0000000..49fa015 --- /dev/null +++ b/cheat/gmod/interface.hpp @@ -0,0 +1,165 @@ +#pragma once +#include "factory.hpp" +#include "sdk.hpp" +#include "listener.hpp" + +NAMESPACE_REGION( factory ) + +struct IDirect3DDevice9; + +//interface holder +template < typename t > +class c_interface_base { + friend class c_gmod; +public: + t* operator( )( ) { + return m_interface; + } + + //calls a virtual + template< size_t index, typename ret = void, + class... Args > + ret call( Args... args ) { + return util::get_vfunc< ret( __thiscall* )( void*, Args... ) > + ( m_interface, index )( m_interface, args... ); + } + + //also calls a virtual but you supply the typedef instead of return type + template< typename def, size_t index, class... Args > + auto call( Args... args ) { + return util::get_vfunc< def > + ( m_interface, index )( m_interface, args... ); + } + + //allows you to cast the interface + template< typename t0 = t* > + t0 get( ) { + return ( t0 )m_interface; + } + + void operator( )( t* ptr ) { + m_interface = ptr; + m_hook.reset( ); + m_hook = std::make_shared< hooks::c_vmt >( static_cast< void* >( ptr ) ); + + /*find the module the interface is located in + i know i could just pass the pointer but traps are gay*/ + MEMORY_BASIC_INFORMATION info; + VirtualQuery( ptr, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + m_dll = static_cast< HMODULE >( info.AllocationBase ); + } + + void operator( )( void* ptr ) { + operator( )( static_cast< t* >( ptr ) ); + } + + decltype( auto ) operator->( ) { + return m_hook; + } + + template< typename t2 = decltype( m_dll ) > + t2 dll( ) { + return ( t2 )m_dll; + } + +protected: + t* m_interface; + HMODULE m_dll; + std::shared_ptr< hooks::c_vmt > m_hook; +}; + +//declare your interfaces here +class c_gmod { +public: + c_interface_base< IBaseClientDLL > m_chl; + c_interface_base< ISurface > m_surface; + c_interface_base< IPanel > m_panel; + c_interface_base< IClientMode > m_clientmode; + c_interface_base< IVEngineClient > m_engine; + c_interface_base< IClientEntityList > m_entlist; + c_interface_base< IDirect3DDevice9 > m_d3d; + c_interface_base< IPrediction > m_prediction; + c_interface_base< ICSGameMovement > m_game_movement; + c_interface_base< IMoveHelper > m_move_helper; + c_interface_base< IVModelInfoClient > m_model_info; + c_interface_base< IVModelRender > m_model_render; + c_interface_base< IMaterialSystem > m_mat_system; + c_interface_base< IEngineTrace > m_trace; + c_interface_base< IPhysicsSurfaceProps > m_phys_props; + c_interface_base< IVRenderView > m_render_view; + c_interface_base< ICVar > m_cvar; + c_interface_base< IGameEventManager2 > m_event_mgr; + c_interface_base< CHudChat > m_hud_chat; + c_interface_base< uintptr_t > m_engine_sound; + c_interface_base< INetChannel > m_net_channel; + c_interface_base< cvar_t > m_debug_show_spread; + c_interface_base< CLuaShared > m_lua_shared; + c_interface_base< uintptr_t > m_engine_render; + c_interface_base< uintptr_t > m_engine_vgui; + c_interface_base< uintptr_t > m_view_render; + IKeyValuesSystem* m_keyvalues; + global_vars_t* m_globals; + CGlobalState* m_global_state; + CInput* m_input; + IMemAlloc* m_alloc; + float m_frametime; + + HWND m_hwnd{ }; + bool m_panic{ }; + + // struct { + // generic_listener_t bullet_impact{ xors( "bullet_impact" ), &listeners::bullet_impact }; + // generic_listener_t player_hurt{ xors( "player_hurt" ), &listeners::player_hurt }; + // generic_listener_t round_start{ xors( "round_start" ), &listeners::round_start }; + // } listeners; +public: + //find the interface inside of the module + void create( void* iface, const std::string& name, const std::string& mod ) { + auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( mod, name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void create( void* iface, uintptr_t pointer ) { + auto interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + + //msvc is retarded + ( *interface_ )( ( void* )pointer ); + m_container.push_back( interface_ ); + } + + void create( void* iface, const std::string& name ) { + auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void __cdecl initialize( ); + void __cdecl uninitialize( ); + +private: + //restore the vmts to their original + void restore( ) { + for ( const auto& it : m_container ) { + it->m_hook->restore( ); + } + } + +private: + std::vector< c_interface_base< uintptr_t >* > m_container; +}; + +bool create_interfaces( c_gmod* instance ); + +END_REGION + +extern factory::c_gmod g_gmod; \ No newline at end of file diff --git a/cheat/gmod/is_connected.cpp b/cheat/gmod/is_connected.cpp new file mode 100644 index 0000000..7b1055a --- /dev/null +++ b/cheat/gmod/is_connected.cpp @@ -0,0 +1,14 @@ +#include "mem.hpp" +#include "hooks.hpp" + +bool __fastcall hooks::is_connected( void* ecx_, void* edx_ ) { + static auto inventory = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 75 04 B0 01 5F" ) ); + static auto is_connected_o = g_csgo.m_engine->get_old_function< decltype( &is_connected ) >( 27 ); + stack_t stack( get_baseptr( ) ); + + if( stack.return_address( ) == inventory && g_settings.misc.unlock_inventory( ) ) + return false; + + + return is_connected_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/is_hltv.cpp b/cheat/gmod/is_hltv.cpp new file mode 100644 index 0000000..a611d2e --- /dev/null +++ b/cheat/gmod/is_hltv.cpp @@ -0,0 +1,31 @@ +#include "hooks.hpp" +#include "pattern.hpp" +#include "mem.hpp" + +bool __fastcall hooks::is_hltv( void* ecx, uintptr_t pvs_ent ) { + static auto is_hltv_o = g_csgo.m_engine->get_old_function< decltype( &hooks::is_hltv ) >( 93 ); + static auto pvs_retaddr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 0F 85 ? ? ? ? A1 ? ? ? ? 8B B7" ) ); + + if ( !g_csgo.m_panic && pvs_retaddr ) { + stack_t stack( get_baseptr( ) ); + auto return_address = stack.return_address( ); + + if ( return_address == pvs_retaddr ) { + if ( pvs_ent && reinterpret_cast< c_base_player* >( pvs_ent )->is_valid( ) ) { + *( int* )( pvs_ent + 0xa24 ) = -1; + *( int* )( pvs_ent + 0xa2c ) = *( int* )( pvs_ent + 0xa28 ); + *( int* )( pvs_ent + 0xa28 ) = 0; + return true; + } + } + } + + return is_hltv_o( ecx, pvs_ent ); +} + +bool __declspec( naked ) __fastcall hooks::is_hltv_proxy( void*, void* ) { + __asm { + mov edx, edi; + jmp is_hltv; + } +} \ No newline at end of file diff --git a/cheat/gmod/is_paused.cpp b/cheat/gmod/is_paused.cpp new file mode 100644 index 0000000..48916a4 --- /dev/null +++ b/cheat/gmod/is_paused.cpp @@ -0,0 +1,19 @@ +#include "mem.hpp" +#include "hooks.hpp" + +bool __fastcall hooks::is_paused( void* ecx_, void* edx_ ) { + static auto return_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "FF D0 A1 ? ? ? ? B9 ? ? ? ? D9 1D ? ? ? ? FF 50 34 85 C0 74 22 8B 0D" ), 0x29 ); + static auto is_paused_o = g_csgo.m_engine->get_old_function< decltype( &is_paused ) >( 91 ); + + stack_t stack( get_baseptr( ) ); + uintptr_t return_address = stack.return_address( ); + + //printf( "return address: %08x sig: %08x deref: %08x delta: %08x delta: %08x\n", return_address, return_addr, *( uintptr_t* )return_addr, return_address - return_addr, return_addr - return_address ); + + if( return_address == return_addr ) { + printf( "extrapolate\n" ); + return true; + } + + return is_paused_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/gmod/lag_mgr.cpp b/cheat/gmod/lag_mgr.cpp new file mode 100644 index 0000000..4f9d04b --- /dev/null +++ b/cheat/gmod/lag_mgr.cpp @@ -0,0 +1,79 @@ +#include "lag_mgr.hpp" +#include "c_base_player.hpp" +#include "context.hpp" +#include "interface.hpp" +#include "base_cheat.hpp" + +namespace features +{ + void c_lagmgr::on_antiaim( ) { + static bool lag_flip{ }; //fuck you and ur cmdnr + *m_sendpacket = lag_flip; + lag_flip ^= 1; + + if( m_sent_ticks ) { + *m_sendpacket = false; + } + } + + + void c_lagmgr::fakelag( ) { + //2017 sucked + //i hope 2018 goes better + + if( !g_settings.rage.fakelag.mode( ) || + !g_settings.rage.fakelag.ticks( ) ) { + m_breaking_lc = false; + return; + } + + auto& settings = g_settings.rage.fakelag; + + if( g_ctx.m_local->m_vecVelocity( ).length( ) < 0.1f ) { + return; + } + + vec3_t delta = g_ctx.m_last_origin - g_ctx.m_local->m_vecOrigin( ); + int max_ticks = math::min( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ? 10 : 16, g_settings.rage.fakelag.ticks( ) ); + bool force_send = m_held_ticks > max_ticks; + if( settings.mode == 1 ) { + if( delta.length2dsqr( ) > 4096.f ) { + force_send = get_choked( ) > 3; + } + } + + if( settings.mode == 2 ) { + auto fluc = math::random_number( -settings.fluctuate( ), settings.fluctuate( ) ) * 0.01f; + force_send = m_held_ticks > math::min( max_ticks + ( int )fluc, 15 ); + } + + bool send = false; + static bool was_onground{ }; + + if( !settings.in_move ) { + send = true; + } + + if( settings.in_air && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + send = false; + } + + if( settings.avoid_ground ) { + if( !was_onground && g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { + send = false; + } + } + + was_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + + if( ( m_cmd->m_buttons & IN_ATTACK ) && + !settings.in_attack ) { + send = true; + } + + *m_sendpacket = ( send || force_send ) && !get_sent( ); + if( *m_sendpacket ) { + m_breaking_lc = delta.length2dsqr( ) > 4096.f; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/lag_mgr.hpp b/cheat/gmod/lag_mgr.hpp new file mode 100644 index 0000000..ae5fb6c --- /dev/null +++ b/cheat/gmod/lag_mgr.hpp @@ -0,0 +1,70 @@ +#pragma once +#include "sdk.hpp" +#include "settings.hpp" +#include "console.hpp" + +namespace features +{ + class c_lagmgr { + public: + void operator()( user_cmd_t* cmd, byte* sendpacket ) { + if( !sendpacket ) return; + if( !cmd ) return; + + m_cmd = cmd; + m_sendpacket = sendpacket; + + if( g_settings.rage.anti_aim( ) ) { + on_antiaim( ); + } + + //let fakelag override whatever happened in antiaim + //this also means we will call stuff like fakewalk etc + //after this + fakelag( ); + } + + void on_cmove_end( ) { + if( !m_sendpacket ) return; + + if( *m_sendpacket ) { + ++m_sent_ticks; + m_held_ticks = 0; + } + else { + ++m_held_ticks; + m_sent_ticks = 0; + } + } + + void set_state( bool state ) { + *m_sendpacket = state; + } + + int get_choked( ) const { + return m_held_ticks; + } + + int get_sent( ) const { + return m_sent_ticks; + } + + bool get_state( ) const { + return m_sendpacket ? !!*m_sendpacket : true; + } + + bool is_breaking_lc( ) const { + return m_breaking_lc; + } + + private: + void on_antiaim( ); + void fakelag( ); + + user_cmd_t* m_cmd{ }; + byte* m_sendpacket{ }; + int m_sent_ticks{ }; + int m_held_ticks{ }; + bool m_breaking_lc{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/legitbot.cpp b/cheat/gmod/legitbot.cpp new file mode 100644 index 0000000..fe819cf --- /dev/null +++ b/cheat/gmod/legitbot.cpp @@ -0,0 +1,309 @@ +#include "interface.hpp" +#include "input_system.hpp" +#include "context.hpp" +#include "legitbot.hpp" +#include "settings.hpp" +#include "math.hpp" + +namespace features +{ + int c_legitbot::get_aim_target( float fov ) { + float best_fov = fov ? fov : g_settings.legit.active->m_fov; + int target{ -1 }; + vec3_t aim_angle{ }; + vec3_t cur_angle{ }; + vec3_t local_pos{ }; + vec3_t aim_pos{ }; + + g_csgo.m_engine( )->GetViewAngles( cur_angle ); + local_pos = g_ctx.m_local->get_eye_pos( ); + + for ( int i{ 1 }; i <= g_csgo.m_globals->m_maxclients; ++i ) { + auto entity = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if ( !entity ) continue; + if ( entity == g_ctx.m_local ) continue; + if ( !entity->is_valid( ) ) continue; + int team = entity->m_iTeamNum( ); + if ( team == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.legit.friendlies( ) ) { + continue; + } + + bool visible = entity->is_visible( 0 ); + if( !visible && g_settings.legit.backtracking_target( ) ) { + auto record = m_lagcomp.find_best_record( i ); + if( record ) { + visible = util::trace_ray( local_pos, record->m_position, + g_ctx.m_local->ce( ), entity->ce( ) ); + } + } + + if ( !visible ) { + continue; + } + + aim_angle = math::vector_angles( local_pos, entity->get_hitbox_pos( 0 ) ); + aim_angle.clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if ( fov < best_fov ) { + best_fov = fov; + target = i; + } + } + + return target; + } + + void c_legitbot::assist( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t move_ang; + vec3_t view_ang; + vec3_t enemy_pos; + vec3_t local_pos; + vec3_t view_delta; + vec3_t delta; + vec2_t pixels; + + local_pos = g_ctx.m_local->get_eye_pos( ); + enemy_pos = target->get_hitbox_pos( 0 ); + + aim_ang = math::vector_angles( local_pos, enemy_pos ); + aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * g_settings.legit.active->m_rcs; + + move_ang = pixels_to_angle( vec2_t( *x, *y ) ); + g_csgo.m_engine( )->GetViewAngles( view_ang ); + + view_delta = ( aim_ang - view_ang ).clamp( ); + + move_ang *= g_settings.legit.active->m_assist_strength; + float delta_y = std::abs( move_ang.y ); + float delta_x = std::abs( move_ang.x ); + + delta.x = std::clamp( view_delta.x, -delta_x, delta_x ); + delta.y = std::clamp( view_delta.y, -delta_y, delta_y ); + + pixels = angle_to_pixels( delta ); + *x += pixels.x; *y += pixels.y; + } + + void c_legitbot::triggerbot( user_cmd_t* cmd ) { + if( !g_settings.legit.triggerbot( ) ) + return; + + if( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.trigger_key( ) ) ) + return; + + vec3_t viewangles{ }; + vec3_t forward{ }; + g_csgo.m_engine( )->GetViewAngles( viewangles ); + + auto wep = g_ctx.m_local->get_weapon( ); + if( !wep ) return; + if( wep->is_knife( ) ) return; + + auto wpn_info = wep->get_wpn_info( ); + if( !wpn_info ) return; + + float length = wpn_info->range; + + if( length > 1.0f ) { + viewangles += g_ctx.m_local->m_aimPunchAngle( ) * 2.f; + + forward = math::angle_vectors( viewangles ); + forward *= length; + + vec3_t src = g_ctx.m_local->get_eye_pos( ); + vec3_t dst = src + forward; + + CTraceFilter filter{ }; + CGameTrace tr{ }; + Ray_t ray{ }; + + filter.pSkip = g_ctx.m_local; + ray.Init( src, dst ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); + + if( tr.m_pEnt ) { + auto ent = tr.m_pEnt->as< c_base_player >( ); + if( ent->is_valid( ) ) { + if( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.legit.friendlies ) + cmd->m_buttons |= IN_ATTACK; + } + } + } + } + + void c_legitbot::sample_angle_data( const vec3_t& cur_angles ) { + auto time = g_csgo.m_globals->m_curtime; + + if ( !m_aiming ) { + m_angle_samples.push_front( { cur_angles, time } ); + } + + while ( m_angle_samples.size( ) > g_settings.legit.sample_size( ) ) { + m_angle_samples.pop_back( ); + } + } + + float c_legitbot::get_avg_delta( ) { + if ( m_angle_samples.empty( ) ) + return 0.f; + + float avg_delta{ }; + + for ( auto& it : m_angle_samples ) { + static vec3_t last_angle = it.m_viewangles; + + //doing this implements nonsticky aswell + //once you already are at the target + //after lets say a flick + //it will reduce the aim speed + //making it not "stick" to the bone + //as we dont store records when aiming + float time_delta = g_csgo.m_globals->m_curtime - it.m_time; + float delta_diff = m_deltatime / ( time_delta * 2.f ); + + vec3_t angle_delta = ( last_angle - it.m_viewangles ).clamp( ); + float delta_length = angle_delta.length( ) * delta_diff; + + avg_delta += delta_length; + last_angle = it.m_viewangles; + } + + //scale the delta down + return avg_delta / float( g_settings.legit.sample_size( ) ); + } + + vec2_t c_legitbot::angle_to_pixels( const vec3_t& angle ) { + static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = angle.x / m_pitch->get_float( ); + float y = angle.y / m_yaw->get_float( ); + + return vec2_t( -y, x ); + } + + vec3_t c_legitbot::pixels_to_angle( const vec2_t& pixel ) { + static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = pixel.x * m_pitch->get_float( ); + float y = pixel.y * m_yaw->get_float( ); + + return vec3_t( -y, x, 0.f ).clamp( ); + } + + bool c_legitbot::update_settings( ) { + if ( !g_ctx.run_frame( ) ) return false; + + auto weapon = g_ctx.m_local->get_weapon( ); + if ( !weapon ) return false; + + if ( weapon->is_grenade( ) || weapon->is_knife( ) ) { + return false; + } + + if ( weapon->is_rifle( ) ) { + g_settings.legit.active = &g_settings.legit.rifles; + } + else if ( weapon->is_sniper( ) ) { + g_settings.legit.active = &g_settings.legit.snipers; + } + else if ( weapon->is_pistol( ) ) { + g_settings.legit.active = &g_settings.legit.pistols; + } + else { + g_settings.legit.active = &g_settings.legit.general; + } + + return true; + } + + void c_legitbot::aim_at_target( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t cur_ang; + vec3_t delta; + vec2_t pixels; + vec2_t mouse; + + g_csgo.m_engine( )->GetViewAngles( cur_ang ); + + if ( g_settings.legit.backtracking( ) && m_lagcomp.find_best_record( target->ce( )->GetIndex( ) ) ) { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + m_lagcomp.get_backtracked_position( target->ce( )->GetIndex( ) ) ).clamp( ); + } + else { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + target->get_hitbox_pos( 0 ) ).clamp( ); + } + + aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * ( g_settings.legit.active->m_rcs / 100.f ); + + delta = ( aim_ang - cur_ang ).clamp( ); + float delta_length = delta.length( ); + + if ( delta_length ) { + float final_time = delta_length / ( g_settings.legit.active->m_speed( ) / 100.f ); + m_curtime += m_deltatime; + + if ( m_curtime > final_time ) { + m_curtime = final_time; + } + + float aim_progress = m_curtime / final_time; + delta *= aim_progress; + aim_ang = delta; + + pixels = angle_to_pixels( delta ); + *x += pixels.x; + *y += pixels.y; + } + } + + void c_legitbot::aimbot( float* x, float* y ) { + if ( !g_settings.legit.enabled( ) ) return; + if ( !update_settings( ) ) return; + + m_aiming = false; + static float old_time = g_csgo.m_globals->m_curtime; + float time = g_csgo.m_globals->m_curtime; + + m_deltatime = time - old_time; + if ( g_settings.legit.dynamic_smoothing( ) ) { + float avg_delta = get_avg_delta( ) * g_settings.legit.smooth_factor( ); + if ( avg_delta > m_deltatime ) { + m_deltatime = avg_delta; + } + } + + old_time = time; + + bool in_attack = false; + if ( g_settings.legit.activation_type == 0 ) + in_attack = true; + if ( g_settings.legit.activation_type == 1 + && g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) { + in_attack = true; + } + + int target_index = get_aim_target( ); + auto target = g_csgo.m_entlist( )->GetClientEntity< >( target_index ); + + if ( target_index != -1 ) { + if( in_attack ) { + m_aiming = true; + aim_at_target( target, x, y ); + } + if( g_settings.legit.assist ) { + assist( target, x, y ); + } + } + else { + m_curtime = 0; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/legitbot.hpp b/cheat/gmod/legitbot.hpp new file mode 100644 index 0000000..f5d4243 --- /dev/null +++ b/cheat/gmod/legitbot.hpp @@ -0,0 +1,75 @@ +#pragma once +#include +#include + +#include "sdk.hpp" + +namespace features +{ + class c_legitbot { + public: + void operator()( float* x, float* y ) { + aimbot( x, y ); + } + + //call once per tick + void sample_angle_data( const vec3_t& angle ); + void triggerbot( user_cmd_t* cmd ); + private: + struct aim_record_t { + vec3_t m_viewangles; + float m_time; + }; + + struct lag_record_t { + int m_tickcount{ }; + vec3_t m_position{ }; + matrix3x4 m_matrix[ 128 ]{ }; + + bool is_valid( ); + }; + + class c_lagcomp { + public: + friend class c_legitbot; + using lag_deque_t = std::deque< lag_record_t >; + + lag_record_t* find_best_record( int ent_index ); + vec3_t get_backtracked_position( int ent_index ); + auto& get_records( int ent_index ) { + return m_data[ ent_index ]; + } + + void store( ); + void operator()( user_cmd_t* cmd ); + + private: + bool backtrack_entity( int ent_index ); + bool can_backtrack_entity( int ent_index ); + void store_player( int ent_index ); + + lag_deque_t m_data[ 65 ]; + user_cmd_t* m_cmd; + }; + + vec2_t angle_to_pixels( const vec3_t& angle ); + vec3_t pixels_to_angle( const vec2_t& pixel ); + void aimbot( float* x, float* y ); + void assist( c_base_player* player, float* x, float* y ); + void aim_at_target( c_base_player*, float*, float* ); + + bool update_settings( ); + float get_avg_delta( ); + int get_aim_target( float fov = 0.f ); + + private: + float m_deltatime{ }; + float m_curtime{ }; + bool m_aiming{ }; + + std::deque< aim_record_t > m_angle_samples; + + public: + c_lagcomp m_lagcomp; + }; +} \ No newline at end of file diff --git a/cheat/gmod/legitbot_lagcomp.cpp b/cheat/gmod/legitbot_lagcomp.cpp new file mode 100644 index 0000000..b2ab3c0 --- /dev/null +++ b/cheat/gmod/legitbot_lagcomp.cpp @@ -0,0 +1,155 @@ +#include "legitbot.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "math.hpp" +#include "base_cheat.hpp" +#include "input_system.hpp" +#include "d3d.hpp" + +namespace features +{ + bool c_legitbot::lag_record_t::is_valid( ) { + return util::is_tick_valid( m_tickcount ); + } + + void c_legitbot::c_lagcomp::store_player( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + vec3_t pos = ent->get_hitbox_pos( 0 ); + int tickcount = TIME_TO_TICKS( ent->m_flSimulationTime( ) ); + + lag_record_t new_record; + if ( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { + new_record.m_position = pos; + new_record.m_tickcount = tickcount; + + m_data[ ent_index ].push_front( new_record ); + } + + while ( !m_data[ ent_index ].empty( ) && + ( m_data[ ent_index ].size( ) > TIME_TO_TICKS( 1.0f ) ) ) { + m_data[ ent_index ].pop_back( ); + } + } + + bool c_legitbot::c_lagcomp::can_backtrack_entity( int ent_index ) { + if ( m_data[ ent_index ].empty( ) ) { + return false; + } + + for( auto& it : m_data[ ent_index ] ) { + if( it.is_valid( ) ) return true; + } + + return false; + } + + c_legitbot::lag_record_t* c_legitbot::c_lagcomp::find_best_record( int ent_index ) { + c_legitbot::lag_record_t* best_record = nullptr; + float best_fov{ g_settings.legit.backtracking_fov( ) }; + vec3_t cur_angle; + vec3_t aim_angle; + vec3_t aim_pos; + vec3_t cur_pos; + int cur_tick; + + if( m_data[ ent_index ].empty( ) ) { + return nullptr; + } + + if( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) { + best_fov = 360.f; + } + + g_csgo.m_engine( )->GetViewAngles( cur_angle ); + cur_pos = g_ctx.m_local->get_eye_pos( ); + cur_tick = g_csgo.m_globals->m_tickcount; + + for( auto& it : m_data[ ent_index ] ) { + int delta = std::abs( cur_tick - it.m_tickcount ); + + if( !( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) ) { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float max_latency = g_settings.legit.backtracking_time + nci->GetLatency( 0 ); + if( delta > TIME_TO_TICKS( max_latency ) ) + continue; + } + } + + if( !it.is_valid( ) ) + continue; + + aim_pos = it.m_position; + aim_angle = math::vector_angles( cur_pos, aim_pos ).clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if ( fov < best_fov ) { + best_fov = fov; + best_record = ⁢ + } + } + + return best_record; + } + + vec3_t c_legitbot::c_lagcomp::get_backtracked_position( int ent_index ) { + if( !m_data[ ent_index ].size( ) ) return vec3_t( ); + auto lag_record = find_best_record( ent_index ); + + vec3_t last_position{ }; + for( auto& it : util::reverse_iterator( m_data[ ent_index ] ) ) { + if( it.is_valid( ) ) last_position = it.m_position; break; + } + + return lag_record ? lag_record->m_position : last_position; + } + + void c_legitbot::c_lagcomp::store( ) { + for ( int i = 1; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if ( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { + store_player( i ); + } + else { + m_data[ i ].clear( ); + } + } + } + + bool c_legitbot::c_lagcomp::backtrack_entity( int ent_index ) { + if ( !m_cmd ) return false; + + if ( !can_backtrack_entity( ent_index ) ) return false; + + auto best_record = find_best_record( ent_index ); + + if ( best_record ) { + m_cmd->m_tick_count = best_record->m_tickcount; + return true; + } + + return false; + } + + void c_legitbot::c_lagcomp::operator()( user_cmd_t* cmd ) { + if ( !g_settings.legit.enabled( ) || !g_settings.legit.backtracking( ) ) + return; + + m_cmd = cmd; + store( ); + + auto target = g_cheat.m_legitbot.get_aim_target( g_settings.legit.backtracking_fov( ) ); + bool active = false; + + if ( g_settings.legit.activation_type( ) == 0 ) + active = true; + if ( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) + active = true; + + if ( active && target != -1 ) { + backtrack_entity( target ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/listener.cpp b/cheat/gmod/listener.cpp new file mode 100644 index 0000000..a1939aa --- /dev/null +++ b/cheat/gmod/listener.cpp @@ -0,0 +1,217 @@ +#include "listener.hpp" +#include "interface.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +#undef PlaySound + +generic_listener_t::generic_listener_t( const char* name, void( *function )( IGameEvent* ) ) : + m_function( function ), m_name( name ) { } + +generic_listener_t::~generic_listener_t( ) { + if( m_registered ) + g_csgo.m_event_mgr( )->RemoveListener( this ); + +} + +void generic_listener_t::init( ) { + g_csgo.m_event_mgr( )->AddListener( this, m_name, false ); + m_registered = true; +} + +namespace listeners +{ + bool dbg_spread( ) { + static con_var< bool > var{ &data::holder_, fnv( "dbg_spread" ), 0 }; + return var( ); + } + + void bullet_impact( IGameEvent* e ) { + if( !g_csgo.m_panic && e ) { + static float last_time = g_csgo.m_globals->m_curtime; + float x = e->GetFloat( xors( "x" ) ); + float y = e->GetFloat( xors( "y" ) ); + float z = e->GetFloat( xors( "z" ) ); + int user_id = e->GetInt( xors( "userid" ) ); + int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); + + vec3_t impact{ x, y, z }; + if( std::abs( last_time - g_csgo.m_globals->m_curtime ) > ( 1.f / 64.f ) && + player_id == g_csgo.m_engine( )->GetLocalPlayer( ) ) { + + + g_ctx.m_last_shot_ack++; + g_ctx.m_last_shot_ack %= 128; + + if( std::abs( last_time - g_csgo.m_globals->m_curtime ) > 1.0f ) { + if( std::abs( g_ctx.m_last_shot - g_ctx.m_last_shot_ack ) ) { + //if( dbg_spread( ) ) + //g_con->log( "shot queue desynced: delta too high ( %d %d )", g_ctx.m_last_shot_ack, g_ctx.m_last_shot ); + g_ctx.reset_shot_queue( ); + } + } + + if( g_ctx.m_last_shot_ack > g_ctx.m_last_shot ) { + //if( dbg_spread( ) ) + //g_con->log( "shot queue desynced: ack > last" ); + g_ctx.reset_shot_queue( ); + } + + auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack ]; + //if( dbg_spread( ) ) + //g_con->log( "shot: %d ack shot: %d", g_ctx.m_last_shot, g_ctx.m_last_shot_ack ); + + if( shot.m_enemy_index ) { + auto ang = math::vector_angles( shot.m_local_pos, shot.m_enemy_pos ); + auto shot_ang = math::vector_angles( shot.m_local_pos, impact ); + + auto dist = shot.m_local_pos.dist_to( shot.m_enemy_pos ); + auto ang_delta = ( ang - shot_ang ).clamp( ); + + float pitch_delta = sin( DEG2RAD( std::abs( ang_delta.x ) ) ) * dist; + float yaw_delta = sin( DEG2RAD( std::abs( ang_delta.y ) ) ) * dist; + + float delta = sqrtf( pitch_delta * pitch_delta + yaw_delta * yaw_delta ); + //scale it up a bit, hitboxes arent *really* boxes anymore + float max = shot.m_hitbox_radius; + + if( delta > max ) { + if( dbg_spread( ) ) + g_con->log( xors( "missed shot due to spread: %f > %f" ), delta, max ); + if( g_settings.misc.log_hits ) { + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, xors( "[\3moneybot\1] missed shot due to spread" ) ); + } + + if( shot.m_resolver_state ) { + g_cheat.m_ragebot.m_resolver->on_missed_spread( shot.m_enemy_index, shot.m_resolver_shots ); + } + } + else { + shot.m_missed = false; + } + } + + last_time = g_csgo.m_globals->m_curtime; + } + + if( g_settings.visuals.bullet_tracers( ) ) { + g_cheat.m_visuals.store_tracer( player_id, vec3_t( x, y, z ) ); + } + } + } + + void player_hurt( IGameEvent* e ) { + if( !g_csgo.m_panic && e ) { + int user_id = e->GetInt( xors( "userid" ) ); + int attacker = e->GetInt( xors( "attacker" ) ); + int hitgroup = e->GetInt( xors( "hitgroup" ) ); + int dmg = e->GetInt( xors( "dmg_health" ) ); + int hp = e->GetInt( xors( "health" ) ); + int attacker_id = g_csgo.m_engine( )->GetPlayerForUserID( attacker ); + int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); + + + if( attacker_id == g_csgo.m_engine( )->GetLocalPlayer( ) && user_id != attacker_id ) { + g_cheat.m_visuals.store_hit( ); + + auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack % 128 ]; + if( hitgroup == shot.m_hitgroup && shot.m_resolver_state && !shot.m_missed ) { + g_cheat.m_ragebot.m_resolver->listener( player_id, shot.m_resolver_shots ); + } + + if( !shot.m_missed || !shot.m_resolver_state ) { + //if( dbg_spread( ) ) + //g_con->log( xors( "hit enemy in %s" ), util::hitgroup_to_string( hitgroup ).c_str( ) ); + + if( g_settings.misc.log_hits ) { + char hit_str[ 100 ]; + if( hitgroup == HITGROUP_HEAD && hp <= 0 ) { + strenc::w_sprintf_s( hit_str, 100, xors( "[\3moneybot\1] pHit" ) ); + } + else { + strenc::w_sprintf_s( hit_str, 100, xors( "[\3moneybot\1] hit player in %s for %d" ), util::hitgroup_to_string( hitgroup ).c_str( ), dmg ); + } + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, hit_str ); + } + } + } + } + } + + void round_start( IGameEvent * e ) { + if( g_ctx.run_frame( ) ) { + switch( g_settings.misc.autobuy.main_weapon ) { + case 1: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy g3sg1" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy scar20" ) ); + break; + case 2: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg08" ) ); + break; + case 3: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy awp" ) ); + break; + case 4: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ak47" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy m4a1" ) ); + break; + case 5: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg556" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy aug" ) ); + break; + case 6: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mac10" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mp9" ) ); + break; + } + + switch( g_settings.misc.autobuy.secondary_weapon ) { + case 1: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy deagle" ) ); + break; + case 2: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy elite" ) ); + break; + } + + if( g_ctx.m_local->m_iAccount( ) > 1000 ) { + if( g_settings.misc.autobuy.armor( ) ) { + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vest" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vesthelm" ) ); + } + + if( g_settings.misc.autobuy.zeus( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy taser 34" ) ); + + + if( g_settings.misc.autobuy.defuser( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy defuser" ) ); + + + if( g_settings.misc.autobuy.molly( ) ) { + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy molotov" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy incgrenade" ) ); + } + + if( g_settings.misc.autobuy.smoke( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy smokegrenade" ) ); + + + if( g_settings.misc.autobuy.grenade( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy hegrenade" ) ); + + + if( g_settings.misc.autobuy.flash( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); + + + if( g_settings.misc.autobuy.decoy( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy decoy" ) ); + + + if( g_settings.misc.autobuy.flash( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/listener.hpp b/cheat/gmod/listener.hpp new file mode 100644 index 0000000..182a615 --- /dev/null +++ b/cheat/gmod/listener.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "sdk.hpp" + +struct generic_listener_t : public IGameEventListener2 { + generic_listener_t( const char* event_name, + void( *function )( IGameEvent* ) ); + + generic_listener_t( ) = default; + + ~generic_listener_t( ); + + void init( ); + + void FireGameEvent( IGameEvent* event ) override { m_function( event ); } + int GetEventDebugID( ) override { return 0x2a; } +private: + void( *m_function )( IGameEvent* ); + const char* m_name{ }; + bool m_registered{ }; +}; + +namespace listeners { + extern void bullet_impact( IGameEvent* e ); + extern void player_hurt( IGameEvent* e ); + extern void round_start( IGameEvent* e ); +} \ No newline at end of file diff --git a/cheat/gmod/lock_cursor.cpp b/cheat/gmod/lock_cursor.cpp new file mode 100644 index 0000000..477847d --- /dev/null +++ b/cheat/gmod/lock_cursor.cpp @@ -0,0 +1,13 @@ +#include "hooks.hpp" + +void __fastcall hooks::lock_cursor( void* ecx, void* edx ) { + static auto lock_cursor_o = g_gmod.m_surface->get_old_function< decltype( &hooks::lock_cursor ) >( 62 ); + if( g_gmod.m_panic ) return lock_cursor_o( ecx, edx ); + + if( g_settings.menu.open ) { + g_gmod.m_surface( )->UnlockCursor( ); + } + else { + lock_cursor_o( ecx, edx ); + } +} \ No newline at end of file diff --git a/cheat/gmod/math.cpp b/cheat/gmod/math.cpp new file mode 100644 index 0000000..5326fdd --- /dev/null +++ b/cheat/gmod/math.cpp @@ -0,0 +1,16 @@ +#include "math.hpp" +#include "interface.hpp" + +namespace math +{ + uint32_t md5_pseudorandom( uint32_t seed ) { + using fn = uint32_t( __thiscall * )( uint32_t seed ); + + static auto func = pattern::first_code_match< uint32_t( __cdecl* )( uint32_t ) >( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 EC 68 6A 58 8D 45 98 6A 00 50 E8 ? ? ? ? 6A" ) ); + if( !func ) { + return 0; + } + + return func( seed ); + } +} \ No newline at end of file diff --git a/cheat/gmod/math.hpp b/cheat/gmod/math.hpp new file mode 100644 index 0000000..4d5003e --- /dev/null +++ b/cheat/gmod/math.hpp @@ -0,0 +1,137 @@ +#pragma once +#include +#include "util.hpp" +#include "pattern.hpp" +#include "sdk.hpp" + +static constexpr long double M_PI = 3.14159265358979323846f; +static constexpr long double M_RADPI = 57.295779513082f; +static constexpr long double M_PIRAD = 0.01745329251f; +static constexpr float M_PI_F = ( ( float )( M_PI ) ); +__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } +__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } + +namespace { + //make a random generator and seed it with a p random number + static std::random_device rd; + static std::mt19937 gen( rd( ) ); +} + +NAMESPACE_REGION( math ) + +#undef min +#undef max + +template < typename t > +t min( const t& t1, const t& t2 ) { + return t1 < t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t min( const t& t1, const t& t2, ts_&&... ts ) { + return t1 < t2 ? + min( t1, std::forward< ts_ >( ts )... ) : + min( t2, std::forward< ts_ >( ts )... ); +} + +template < typename t > +t max( const t& t1, const t& t2 ) { + return t1 > t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t max( const t& t1, const t& t2, ts_&&... ts ) { + return t1 > t2 ? + max( t1, std::forward< ts_ >( ts )... ) : + max( t2, std::forward< ts_ >( ts )... ); +} + +// todo - dex; make 2 random generator funcs here, this one only works for floats normally + +template < typename t > +__forceinline t random_number( t min, t max ) { + if constexpr( !std::is_integral_v< t > ) { + std::uniform_real_distribution< t > dist( min, max ); + return dist( gen ); + } + else { + std::uniform_int_distribution< t > dist( min, max ); + return dist( gen ); + } +} + +__forceinline vec3_t get_rotated_pos( vec3_t start, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + start.x += cos( rad ) * distance; + start.y += sin( rad ) * distance; + + return start; +} + +__forceinline vec3_t vector_angles( const vec3_t& start, const vec3_t& end ) { + vec3_t delta = end - start; + + float magnitude = sqrtf( delta.x * delta.x + delta.y * delta.y ); + float pitch = atan2f( -delta.z, magnitude ) * M_RADPI; + float yaw = atan2f( delta.y, delta.x ) * M_RADPI; + + vec3_t angle( pitch, yaw, 0.0f ); + return angle.clamp( ); +} + +__forceinline vec3_t angle_vectors( const vec3_t& angles ) { + float sp, sy, cp, cy; + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + + return vec3_t{ cp * cy, cp * sy, -sp }; +} + +__forceinline void angle_vectors( const vec3_t& angles, vec3_t* forward, vec3_t* right, vec3_t* up ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + if ( forward ) { + forward->x = cp * cy; + forward->y = cp * sy; + forward->z = -sp; + } + + if ( right ) { + right->x = -1 * sr * sp * cy + -1 * cr * -sy; + right->y = -1 * sr * sp * sy + -1 * cr * cy; + right->z = -1 * sr * cp; + } + + if ( up ) { + up->x = cr * sp * cy + -sr * -sy; + up->y = cr * sp * sy + -sr * cy; + up->z = cr * cp; + } +} + +__forceinline float find_closest_step( float angle, float step ) { + int steps = ( int )( angle / step + 0.5f ); + + return steps * step; +} + +__forceinline vec3_t vector_transform( const vec3_t& in, const matrix3x4& matrix ) { + vec3_t out; + for ( int i{ }; i < 3; i++ ) + out[ i ] = in.dot( ( const vec3_t& )matrix[ i ] ) + matrix[ i ][ 3 ]; + + return out; +} + +extern uint32_t md5_pseudorandom( uint32_t seed ); + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/mem.hpp b/cheat/gmod/mem.hpp new file mode 100644 index 0000000..f5c8ec4 --- /dev/null +++ b/cheat/gmod/mem.hpp @@ -0,0 +1,66 @@ +#pragma once +#include +#include "util.hpp" + +#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) + +class stack_t { + uintptr_t m_ptr; + +public: + __forceinline stack_t( ) : m_ptr( get_baseptr( ) ) { } + + __forceinline stack_t( uintptr_t ptr ) : m_ptr( ptr ) { } + + template < typename t = uintptr_t > + __forceinline t get( ) { + return ( t )m_ptr; + } + + template < typename t = uintptr_t > + __forceinline t return_address( ) { + return *( t* )( m_ptr + sizeof( void* ) ); + } + + template < typename t = uintptr_t > + __forceinline t address_of_return_address( ) { + return ( t )( m_ptr + sizeof( uintptr_t ) ); + } + + __forceinline stack_t& next( ) { + return *( stack_t* )( m_ptr ); + } + + template < typename t = uintptr_t > + __forceinline t local( size_t at ) { + return ( t )( m_ptr - at ); + } + + template < typename t = uintptr_t > + __forceinline t arg( size_t at ) { + return ( t )( m_ptr + at ); + } +}; + +namespace util { + template < typename t = uint8_t > + __forceinline t* memcpy( t* dst, t* src, size_t size = sizeof( t ) ) { + __movsb( + ( uint8_t* )dst, + ( uint8_t* )src, + size + ); + + return dst; + } + + __forceinline void* memset( uint8_t* dst, uint8_t val, size_t size ) { + __stosb( + dst, + val, + size + ); + + return dst; + } +} \ No newline at end of file diff --git a/cheat/gmod/movement.cpp b/cheat/gmod/movement.cpp new file mode 100644 index 0000000..2815767 --- /dev/null +++ b/cheat/gmod/movement.cpp @@ -0,0 +1,269 @@ +#include "movement.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" + +#include +#include "base_cheat.hpp" +#include "input_system.hpp" + +NAMESPACE_REGION( features ) + +void c_movement::bhop( ) { + if ( !g_settings.misc.bunny_hop ) + return; + + if ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || + g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) + return; + + //jump like you nohat + if ( m_ucmd->m_buttons & IN_JUMP && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + m_ucmd->m_buttons &= ~IN_JUMP; + } +} + +void c_movement::auto_strafer( ) { + if ( !g_settings.misc.auto_strafe ) + return; + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + + if ( m_ucmd->m_buttons & IN_JUMP && speed > 1.0f ) { + if ( !m_ucmd->m_forwardmove && !m_ucmd->m_sidemove ) { + if ( !m_ucmd->m_mousedx ) { + m_ucmd->m_forwardmove = std::min< float >( 450.f, 5850.f / speed ); + m_ucmd->m_sidemove = ( m_ucmd->m_cmd_nr % 2 ) == 0 ? -450.f : 450.f; + } + else { + m_ucmd->m_sidemove = m_ucmd->m_mousedx < 0.f ? -450.f : 450.f; + } + } + } +} + +void c_movement::edge_jump( ) { + if ( !g_settings.misc.edge_jump ) + return; + + if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.edge_jump_key( ) ) ) + return; + + //needs key check here so its not always on + //what?? + bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; + + if ( pre_onground && !post_onground ) { + m_ucmd->m_buttons |= IN_JUMP; + } +} + +void c_movement::auto_jumpbug( ) { + if ( !g_settings.misc.auto_jumpbug( ) ) + return; + + if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.auto_jumpbug_key( ) ) ) + return; + + static bool jumped = false; + static bool jump_next = false; + + m_ucmd->m_buttons |= IN_DUCK; + + bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; + + if ( jump_next ) { + m_ucmd->m_buttons &= ~IN_DUCK; + jump_next = false; + } + else if ( !pre_onground && post_onground && !jumped ) { + jump_next = true; + jumped = true; + } + else if ( !pre_onground && !post_onground ) { + jumped = false; + } +} + +//fuck hardcode +const vec3_t mins( -17.f, -17.f, 0 ); +const vec3_t maxs( 17.f, 17.f, 42.f ); + +void rotate_movement( user_cmd_t* cmd, float rotation ) { + rotation = rotation * M_PIRAD; + + float cos_rot = cos( rotation ); + float sin_rot = sin( rotation ); + + float new_forwardmove = ( cos_rot * cmd->m_forwardmove ) - ( sin_rot * cmd->m_sidemove ); + float new_sidemove = ( sin_rot * cmd->m_forwardmove ) + ( cos_rot * cmd->m_sidemove ); + + cmd->m_forwardmove = new_forwardmove; + cmd->m_sidemove = new_sidemove; +} + +float get_ideal_strafe_step( float speed ) { + static auto* sv_airaccelerate = g_gmod.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); + float airaccel = std::min< float >( sv_airaccelerate->get_float( ), 30.f ); + + float step = std::atan2( airaccel, speed ) * M_RADPI; + + //tickcount correction + float tickcount = 1.0f / g_gmod.m_globals->m_interval_per_tick; + step *= ( 64.f / tickcount ); + + return step; +} + +float trace_ideal_step( bool direction, vec3_t direction_vec, float ideal_step, float multiplier, float max_correction ) { + Ray_t ray; + CTraceFilterWorldOnly filter; + filter.pSkip = g_ctx.m_local; + vec3_t start = g_ctx.m_local->m_vecOrigin( ); + start.z += 5.0f; + + CGameTrace trace; + + float step = ideal_step; + float correction = 0.5f; + + if( direction ) { + step = -step; + correction = -correction; + max_correction = -max_correction; + } + + while( true ) { + vec3_t new_dir = direction_vec; + new_dir.y += step; + + vec3_t forward = math::angle_vectors( new_dir ); + forward *= multiplier; + + vec3_t end = start + forward; + ray.Init( start, end, mins, maxs ); + + g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &trace ); + + if( !trace.DidHit( ) ) { + break; + } + else { + new_dir.x -= 20.f; + vec3_t forward_up = math::angle_vectors( new_dir ); + forward_up *= multiplier; + + vec3_t endUp = start + forward_up; + ray.Init( start, endUp, mins, maxs ); + + CGameTrace trace_up; + g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &trace_up ); + if( !trace_up.DidHit( ) ) { + break; + } + } + + step += correction; + + if( direction && step <= max_correction ) { + break; + } + if( !direction && step >= max_correction ) { + break; + } + } + + return step; +} + +float get_trace_length_multiplier( float speed ) { + float multiplier = speed * 0.2f; + if( multiplier < 32.f ) multiplier = 32.f; + if( multiplier > 256.f ) multiplier = 256.f; + + return multiplier; +} + +bool c_movement::get_best_direction( float ideal_step, float left, float right, float weight ) { + float left_delta = std::fabs( ideal_step - left ); + float right_delta = std::fabs( -ideal_step - right ); + + if( m_direction ) right_delta -= weight; + else left_delta -= weight; + + return ( left_delta > right_delta ); +} + +float c_movement::get_best_strafe_step( float speed, vec3_t direction ) { + float multiplier = get_trace_length_multiplier( speed ); + float ideal_step = get_ideal_strafe_step( speed ); + + float left_step = trace_ideal_step( false, direction, ideal_step, multiplier, 90.f ); + float right_step = trace_ideal_step( true, direction, ideal_step, multiplier, 90.f ); + + m_direction = get_best_direction( ideal_step, left_step, right_step, 25.f ); + + if( m_direction ) { + float max_clamped_correction = -ideal_step - 5.0f; + if( right_step < max_clamped_correction ) right_step = max_clamped_correction; + return right_step; + } + else { + float max_clamped_correction = ideal_step + 5.0f; + if( left_step > max_clamped_correction ) left_step = max_clamped_correction; + return left_step; + } +} + +float c_movement::get_best_strafe_angle( ) { + vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); + velocity.z = 0.0f; + float speed = velocity.length2d( ); + + vec3_t direction = math::vector_angles( vec3_t( 0.0f, 0.0f, 0.0f ), velocity ); + float step = get_best_strafe_step( speed, direction ); + + return direction.y + step; +} + +void c_movement::circle_strafe( ) { + if( g_settings.misc.circle_strafe ) { + if( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) + return; + + static bool can_finish = true; + auto cmd = g_ctx.get_last_cmd( ); + if( g_input.is_key_pressed( g_settings.misc.circle_strafe_key ) || !can_finish ) { + m_ucmd->m_buttons |= IN_JUMP; + cmd->m_forwardmove = 450.f; + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed > 1.f ) { + can_finish = false; + float angle = get_best_strafe_angle( ); + + float delta = std::remainderf( m_ucmd->m_viewangles.y - angle, 360.f ); + + cmd->m_forwardmove = 5850.f / speed; + cmd->m_sidemove = m_direction ? 450.f : -450.f; + rotate_movement( cmd, delta ); + + vec3_t current_view; + g_gmod.m_engine( )->GetViewAngles( current_view ); + float view_delta = std::remainderf( current_view.y - angle, 360.f ); + + if( std::fabs( view_delta ) < 10.0f || speed < 250.f ) { + can_finish = true; + } + } + else { + can_finish = true; + } + } + } +} + + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/movement.hpp b/cheat/gmod/movement.hpp new file mode 100644 index 0000000..f9e3ced --- /dev/null +++ b/cheat/gmod/movement.hpp @@ -0,0 +1,36 @@ +#pragma once +#include "util.hpp" + +//forward declarations +class user_cmd_t; + +NAMESPACE_REGION( features ) + +class c_movement { + user_cmd_t* m_ucmd{ }; + bool m_direction{ }; + + void bhop( ); + void auto_strafer( ); + void edge_jump( ); + void auto_jumpbug( ); + void jump_stats( ); + + bool get_best_direction( float ideal_step, float left, float right, float weight ); + float get_best_strafe_step( float speed, vec3_t direction ); + float get_best_strafe_angle( ); + void circle_strafe( ); + +public: + void operator()( user_cmd_t* ucmd ) { + m_ucmd = ucmd; + auto_strafer( ); + //circle_strafe( ); + bhop( ); + edge_jump( ); + //auto_jumpbug( ); + //jump_stats( ); + } +}; + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/movement_recorder.cpp b/cheat/gmod/movement_recorder.cpp new file mode 100644 index 0000000..60f082e --- /dev/null +++ b/cheat/gmod/movement_recorder.cpp @@ -0,0 +1,79 @@ +#include "movement_recorder.hpp" +#include "input_system.hpp" +#include "settings.hpp" +#include "interface.hpp" + +namespace features +{ + void c_move_recorder::operator()( user_cmd_t* cmd ) { + if( !g_settings.misc.recorder_enable ) + return; + + if( g_input.is_key_pressed( g_settings.misc.recording_start_key( ) ) ) + start_recording( ); + + if( g_input.is_key_pressed( g_settings.misc.recording_stop_key( ) ) ) + stop_recording( ); + + if( m_recording ) { + record_cmd( cmd ); + } + + if( m_playing ) { + if( m_move_data.empty( ) ) { + m_playing = false; + } + else if( ++m_record_index >= m_move_data.size( ) ) { + m_playing = false; + } + else { + auto& old_cmd = m_move_data.at( m_record_index ); + + if( g_settings.misc.recording_show_angles == 1 && ( old_cmd.m_buttons & IN_ATTACK ) || + g_settings.misc.recording_show_angles == 2 ) { + g_csgo.m_engine( )->SetViewAngles( old_cmd.m_viewangles ); + } + + cmd->m_buttons = old_cmd.m_buttons; + cmd->m_aimdirection = old_cmd.m_aimdirection; + cmd->m_forwardmove = old_cmd.m_forwardmove; + cmd->m_impulse = old_cmd.m_impulse; + cmd->m_mousedx = old_cmd.m_mousedx; + cmd->m_mousedy = old_cmd.m_mousedy; + cmd->m_sidemove = old_cmd.m_sidemove; + cmd->m_upmove = old_cmd.m_upmove; + cmd->m_viewangles = old_cmd.m_viewangles; + cmd->m_weaponselect = old_cmd.m_weaponselect; + cmd->m_weaponsubtype = old_cmd.m_weaponsubtype; + } + } + else { + m_record_index = 0; + } + } + + void c_move_recorder::record_cmd( user_cmd_t* cmd ) { + m_move_data.push_back( *cmd ); + } + + void c_move_recorder::start_recording( ) { + m_recording = true; + } + + void c_move_recorder::stop_recording( ) { + m_recording = false; + } + + void c_move_recorder::play_back( ) { + m_recording = false; + m_playing = true; + } + + void c_move_recorder::stop_playback( ) { + m_playing = false; + } + + void c_move_recorder::clear_recording( ) { + m_move_data.clear( ); + } +} \ No newline at end of file diff --git a/cheat/gmod/movement_recorder.hpp b/cheat/gmod/movement_recorder.hpp new file mode 100644 index 0000000..dcfe511 --- /dev/null +++ b/cheat/gmod/movement_recorder.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "sdk.hpp" +#include "vector.hpp" + +namespace features +{ + class c_move_recorder { + public: + void play_back( ); + void stop_playback( ); + void clear_recording( ); + + bool is_recording( ) const { return m_recording; } + bool is_playing( ) const { return m_playing; } + int get_record_count( ) const { return m_move_data.size( ); } + auto get_current_record( ) const { return m_record_index; } + + void operator()( user_cmd_t* ); + private: + void record_cmd( user_cmd_t* cmd ); + void start_recording( ); + void stop_recording( ); + + bool m_recording = false; + bool m_playing = false; + size_t m_record_index = 0; + std::vector< user_cmd_t > m_move_data; + }; +} \ No newline at end of file diff --git a/cheat/gmod/netvar_proxy.hpp b/cheat/gmod/netvar_proxy.hpp new file mode 100644 index 0000000..cb329c3 --- /dev/null +++ b/cheat/gmod/netvar_proxy.hpp @@ -0,0 +1,37 @@ +#pragma once +#include "Valve/dt_recv.h" + +//dont leave things out of namespaces +namespace hooks +{ + class c_netvar_proxy { + public: + c_netvar_proxy( RecvProp* target_property, RecvVarProxyFn new_proxy ) { + m_target = target_property; + m_original = target_property->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + c_netvar_proxy( ) = default; + + void init( RecvProp* target, RecvVarProxyFn new_proxy ) { + m_target = target; + m_original = target->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + ~c_netvar_proxy( ) { + if( !m_target ) return; + m_target->m_ProxyFn = m_original; + } + + RecvVarProxyFn get_old_function( ) const { + return m_original; + } + + private: + //overcomplicated... + RecvProp* m_target; + RecvVarProxyFn m_original; + }; +} \ No newline at end of file diff --git a/cheat/gmod/netvars.cpp b/cheat/gmod/netvars.cpp new file mode 100644 index 0000000..19ab6d1 --- /dev/null +++ b/cheat/gmod/netvars.cpp @@ -0,0 +1,93 @@ +#include "netvars.hpp" +#include "interface.hpp" + +factory::c_netvars g_netvars; + +NAMESPACE_REGION( factory ) + +void c_netvars::init( ) { + for ( auto client_class = g_gmod.m_chl( )->GetAllClasses( ); + !!client_class; + client_class = client_class->m_next + ) { + auto table = client_class->m_rt_table; + m_tables.push_back( table ); + } +} + +RecvTable* c_netvars::get_table( hash_t hash ) const { + if ( m_tables.empty( ) ) return nullptr; + + for ( auto& table : m_tables ) { + if ( !table ) continue; + + if ( hash == hash::fnv1a( table->m_pNetTableName ) ) { + return table; + } + } + + return nullptr; +} + +//iterating this too much results in a stack overflow, so thats cool +RecvProp* c_netvars::get_prop( hash_t data, hash_t name ) const { + RecvProp* prop{ }; + RecvTable* child{ }; + + auto table = get_table( data ); + if( !table ) return nullptr; + + for( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if( child && child->m_nProps ) { + auto tmp = get_prop( hash::fnv1a( child->m_pNetTableName ), name ); + if( tmp ) return tmp; + } + + if( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop; + } + + return nullptr; +} + +std::ptrdiff_t c_netvars::get_entry( hash_t name, RecvTable* table ) const { + std::ptrdiff_t ret{ }; + RecvProp* prop; + RecvTable* child; + + for ( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if ( child && child->m_nProps ) { + auto tmp = get_entry( name, child ); + if ( tmp ) ret += prop->GetOffset( ) + tmp; + } + + if ( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop->GetOffset( ) + ret; + } + + return ret; +} + +std::ptrdiff_t c_netvars::get_netvar( hash_t data, hash_t name ) const { + std::ptrdiff_t ret{ }; + auto table = get_table( data ); + if ( !table ) return 0; + + ret = get_entry( name, table ); +#ifdef DEBUG + printf( "%s:\t\t 0x%05x\n", name.c_str( ), ret ); +#endif + return ret; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/netvars.hpp b/cheat/gmod/netvars.hpp new file mode 100644 index 0000000..9924b43 --- /dev/null +++ b/cheat/gmod/netvars.hpp @@ -0,0 +1,44 @@ +#pragma once +#include + +#include "Valve\dt_recv.h" +#include "util.hpp" +#include "fnv.hpp" + +class RecvTable; + +#define NETVAR( funcname, name, table, extra, type ) \ +__forceinline auto& funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return get< type >( offset + extra ); \ +} + +#define PNETVAR( funcname, name, table, extra, type ) \ +__forceinline type* funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return reinterpret_cast< type* >( uintptr_t( this ) + offset + extra ); \ +} + +#define OFFSET( funcname, offset, type ) \ +__forceinline auto& funcname( ) { \ + return get< type >( offset ); \ +} + +NAMESPACE_REGION( factory ) + +class c_netvars { +public: + void init( ); + //search through the netvar list + std::ptrdiff_t get_netvar( hash_t table, hash_t hash ) const; + RecvProp* get_prop( hash_t table, hash_t name ) const; +public: + std::ptrdiff_t get_entry( hash_t hash, RecvTable* table ) const; + RecvTable* get_table( hash_t hash ) const; +private: + std::vector< RecvTable* > m_tables; +}; + +END_REGION + +extern factory::c_netvars g_netvars; \ No newline at end of file diff --git a/cheat/gmod/on_screen_size_changed.cpp b/cheat/gmod/on_screen_size_changed.cpp new file mode 100644 index 0000000..7b33762 --- /dev/null +++ b/cheat/gmod/on_screen_size_changed.cpp @@ -0,0 +1,9 @@ +#include "hooks.hpp" + +void __fastcall hooks::on_screen_size_changed( void* ecx_, void* edx_, int old_w, int old_h ) { + static auto old_fn = g_csgo.m_surface->get_old_function< decltype( &on_screen_size_changed ) >( 116 ); + + old_fn( ecx_, nullptr, old_w, old_h ); + + g_fonts.initialize( ); +} \ No newline at end of file diff --git a/cheat/gmod/override_mouse_input.cpp b/cheat/gmod/override_mouse_input.cpp new file mode 100644 index 0000000..792c5d2 --- /dev/null +++ b/cheat/gmod/override_mouse_input.cpp @@ -0,0 +1,14 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::override_mouse_input( void* ecx_, void* edx_, float* x, float* y ) { + static auto omi_o = g_csgo.m_clientmode->get_old_function< decltype( &hooks::override_mouse_input ) >( 23 ); + omi_o( ecx_, edx_, x, y ); + + if( g_csgo.m_panic ) return; + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + g_cheat.m_legitbot( x, y ); + } +} \ No newline at end of file diff --git a/cheat/gmod/override_view.cpp b/cheat/gmod/override_view.cpp new file mode 100644 index 0000000..92b559d --- /dev/null +++ b/cheat/gmod/override_view.cpp @@ -0,0 +1,22 @@ +#include "base_cheat.hpp" +#include "context.hpp" +#include "hooks.hpp" +#include "settings.hpp" + +void __fastcall hooks::override_view( void* ecx_, void* edx_, CViewSetup* setup ) { + static auto override_view_o = g_gmod.m_clientmode->get_old_function< decltype( &hooks::override_view ) >( 16 ); + if( g_gmod.m_panic ) { + return override_view_o( ecx_, edx_, setup ); + } + + //g_ctx.m_fov = setup->m_flFov; + //if ( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( )) { + // setup->m_flFov = g_settings.misc.fov_changer( ); + //} + //g_cheat.m_extra.third_person( ); + override_view_o( ecx_, edx_, setup ); + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) && g_settings.misc.no_recoil ) { + setup->angles -= g_ctx.m_local->m_vecPunchAngle( ); + } +} \ No newline at end of file diff --git a/cheat/gmod/paint.cpp b/cheat/gmod/paint.cpp new file mode 100644 index 0000000..d744d9d --- /dev/null +++ b/cheat/gmod/paint.cpp @@ -0,0 +1,21 @@ +#include + +#include "hooks.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "math.hpp" + +#include "base_cheat.hpp" + +void __fastcall hooks::paint( void* ecx, void* edx, int mode ) { + static auto paint_o = g_gmod.m_engine_vgui->get_old_function< decltype( &hooks::paint ) >( 13 ); + if( g_gmod.m_panic ) return paint_o( ecx, edx, mode ); + + paint_o( ecx, edx, mode ); + + if( mode & 2 ) { + if( g_ctx.run_frame( ) ) { + g_cheat.m_visuals.store_data( ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/paint_traverse.cpp b/cheat/gmod/paint_traverse.cpp new file mode 100644 index 0000000..c3dd47e --- /dev/null +++ b/cheat/gmod/paint_traverse.cpp @@ -0,0 +1,28 @@ +#include "hooks.hpp" +#include "renderer.hpp" +#include "context.hpp" +#include "console.hpp" +#include "base_cheat.hpp" +#include "math.hpp" +#include "settings.hpp" + +void __fastcall hooks::paint_traverse( void* ecx_, void* edx_, unsigned int panel, bool force_repaint, bool allowforce ) { + static auto paint_traverse_o = g_gmod.m_panel->get_old_function< decltype( &hooks::paint_traverse ) >( 41 ); + if( g_gmod.m_panic ) return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); + + + static uint32_t mat_system_top_panel{ }; + if( !mat_system_top_panel ) { + auto panel_name = g_gmod.m_panel( )->GetName( panel ); + auto panel_hash = hash::fnv1a( panel_name ); + if( fnv( "MatSystemTopPanel" ) == panel_hash ) { + mat_system_top_panel = panel; + } + } + + if( panel && panel == mat_system_top_panel ) { + g_gmod.m_panel( )->SetMouseInputEnabled( panel, g_settings.menu.open ); + } + + return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); +} \ No newline at end of file diff --git a/cheat/gmod/pattern.hpp b/cheat/gmod/pattern.hpp new file mode 100644 index 0000000..0bc4b1b --- /dev/null +++ b/cheat/gmod/pattern.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma warning ( disable : 4018 ) + +namespace pattern +{ + inline bool bin_match( uint8_t* code, uint8_t* pattern, size_t size ) { + for( size_t j = 0; j < size; j++ ) { + if( pattern[ j ] && code[ j ] != pattern[ j ] ) { + return false; + } + } + return true; + } + + template< typename t = uintptr_t > static t first_match( uintptr_t start, std::string sig, size_t len, std::ptrdiff_t offset = 0 ) { + std::istringstream iss( sig ); + std::vector< std::string > tokens{ std::istream_iterator< std::string >{ iss }, std::istream_iterator< std::string >{} }; + std::vector< uint8_t > sig_bytes; + + for( const auto& hex_byte : tokens ) { + sig_bytes.push_back( static_cast< uint8_t >( std::strtoul( hex_byte.c_str( ), nullptr, 16 ) ) ); + } + + if( sig_bytes.empty( ) || sig_bytes.size( ) < 2 ) { + return t{ }; + } + + auto sig_data = sig_bytes.data( ); + auto sig_size = sig_bytes.size( ); + + for( size_t i{ }; i < len; i++ ) { + uint8_t* code_ptr = reinterpret_cast< uint8_t* >( start + i ); + + if( bin_match( code_ptr, sig_data, sig_size ) ) { + return( ( t )( start + i + offset ) ); + } + } + + return t{ }; + } + + //ultimately the function you want to call to sigscan ( ida style ) + template< typename t = uintptr_t > static t first_code_match( HMODULE start, std::string sig, std::ptrdiff_t offset = 0 ) { + auto dos_hdr = reinterpret_cast< PIMAGE_DOS_HEADER >( start ); + + if( !dos_hdr ) return t{ }; + + //DOS header, verifies if module is valid + if( dos_hdr->e_magic != 0x5a4d ) { + return t{ }; + } + + auto nt_hdrs = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< uintptr_t >( dos_hdr ) + dos_hdr->e_lfanew ); + + return first_match< t >( reinterpret_cast< uintptr_t >( dos_hdr ) + nt_hdrs->OptionalHeader.BaseOfCode, sig, nt_hdrs->OptionalHeader.SizeOfCode, offset ); + } +}; \ No newline at end of file diff --git a/cheat/gmod/play_sound.cpp b/cheat/gmod/play_sound.cpp new file mode 100644 index 0000000..7a701ad --- /dev/null +++ b/cheat/gmod/play_sound.cpp @@ -0,0 +1,25 @@ +#include "hooks.hpp" + +void __fastcall hooks::play_sound( void* ecx_, void*, const char* file ) { + static auto play_sound_o = g_csgo.m_surface->get_old_function< decltype( &play_sound ) >( 82 ); + static auto is_ready = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 08 56 8B 35 00 00 00 00 57 83 BE" ), 0 ); + static bool was_played = false; + static float played_tick = 0.f; + + play_sound_o( ecx_, 0, file ); + + if( !g_settings.misc.auto_accept || g_csgo.m_engine( )->IsInGame( ) ) { + was_played = false; + return; + } + + if( strstr( file, xors( "competitive_accept_beep.wav" ) ) && !was_played ) { + was_played = true; + played_tick = GetTickCount( ) * 0.001f + g_settings.misc.auto_accept_delay; + } + + if( was_played && GetTickCount( ) * 0.001f > played_tick ) { + reinterpret_cast< void( __cdecl* )( ) >( is_ready )( ); + was_played = false; + } +} \ No newline at end of file diff --git a/cheat/gmod/player_manager.cpp b/cheat/gmod/player_manager.cpp new file mode 100644 index 0000000..a531965 --- /dev/null +++ b/cheat/gmod/player_manager.cpp @@ -0,0 +1,38 @@ +#include "player_manager.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +namespace features +{ + void c_player_record::update( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + if( !ent ) { clear( ); return; } + + if( ent != m_ent || ent->m_flSimulationTime( ) > g_csgo.m_globals->m_curtime + 1.f ) + clear( ); + + m_ent = ent; + if( !ent->is_valid( ) ) + return; + + update_simtime( ); + update_antiaim( ); + + update_cheater( ); + } + + bool c_player_manager::is_cheater( int ent_index ) { + return m_players[ ent_index ].is_cheater( ); + } + + void c_player_manager::frame_stage_notify( ) { + if( !g_ctx.m_local ) return; + + for( int i{ 1 }; i < 65; ++i ) { + if( i == g_csgo.m_engine( )->GetLocalPlayer( ) ) + continue; + + m_players[ i ].update( i ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/player_manager.hpp b/cheat/gmod/player_manager.hpp new file mode 100644 index 0000000..6a89b36 --- /dev/null +++ b/cheat/gmod/player_manager.hpp @@ -0,0 +1,67 @@ +#pragma once +#include "sdk.hpp" + +namespace features +{ + constexpr int CHEATER_SIMTIME_THRESHOLD = 10; + constexpr int CHEATER_AA_THRESHOLD = 50; + constexpr int CHEATER_MAX_DETECTIONS = 200; + + class c_player_record { + float m_last_simtime; + int m_simtime_detections; + int m_aa_detections; + bool m_is_cheater; + + c_base_player* m_ent; + + void clear( ) { + m_last_simtime = { }; + m_simtime_detections = { }; + m_aa_detections = { }; + m_is_cheater = { }; + m_ent = { }; + } + + void update_simtime( ) { + if( !m_ent ) return; + + if( m_ent->m_flSimulationTime( ) == m_last_simtime ) { + m_simtime_detections += 2; + } + else if( m_simtime_detections > 0 ) { + m_simtime_detections--; + } + m_last_simtime = m_ent->m_flSimulationTime( ); + } + + void update_antiaim( ) { + if( !m_ent ) return; + + auto pitch = m_ent->m_angEyeAngles( ).x; + if( pitch > 75.f && m_aa_detections < CHEATER_MAX_DETECTIONS ) { + m_aa_detections++; + } + else if( m_aa_detections > 0 ) { + m_aa_detections--; + } + } + + void update_cheater( ) { + m_is_cheater = m_simtime_detections > CHEATER_SIMTIME_THRESHOLD + || m_aa_detections > CHEATER_AA_THRESHOLD; + } + + public: + c_player_record( ) { clear( ); } + bool is_cheater( ) const { return m_is_cheater; } + void update( int ent_index ); + }; + + class c_player_manager { + std::array< c_player_record, 65 > m_players; + public: + void frame_stage_notify( ); + bool is_cheater( int ent_index ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/playerlist.cpp b/cheat/gmod/playerlist.cpp new file mode 100644 index 0000000..10f7d82 --- /dev/null +++ b/cheat/gmod/playerlist.cpp @@ -0,0 +1,114 @@ +#include "playerlist.hpp" + +/* something in here caused the file size to increase alot lol */ + +namespace features +{ + + bool c_player_list::is_friend( const std::string& guid ) { + return m_friends[ guid ]; // if a guid is not there, then it is automatically set to false + } + + // handles players and drawing. + void c_player_list::operator()( ) { + if( g_gmod.m_engine( )->IsInGame( ) ) { + g_gmod.m_engine( )->GetScreenSize( m_scrw, m_scrh ); + + m_x = 50; + m_y = 50; + m_w = m_scrw - 100; + m_h = m_scrh - 100; + + m_tabwidth = m_w / 3; + + m_tab = 0; + m_items.clear( ); + + player_info_t info; + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + if( i == g_gmod.m_engine( )->GetLocalPlayer( ) ) + continue; + + auto player = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !player ) + continue; + + if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) + continue; + + m_items.push_back( playeritem_t( info.name, &m_friends[ info.m_steamid ] ) ); + } + + // sort first character alphabetically. + std::sort( m_items.begin( ), m_items.end( ), []( const auto& lhs, const auto& rhs ) { + return lhs.m_name[ 0 ] < rhs.m_name[ 0 ]; + } ); + + + if( m_open ) { + int i = 0; + int j = 0; + + // get d3d font info. + TEXTMETRICA metric{ }; + d3d::fonts.f_esp_small->GetTextMetricsA( &metric ); + + // construct size of list and how much to draw. + const int font_size = metric.tmHeight; + const int list_height = m_items.size( ) * font_size; + const int tabs_to_draw = std::min< int >( ( int )std::ceil( ( float )list_height / ( float )m_h ), 3 ); // template arg to stop the min define taking action + + // pixel padding. + const int m_pad_y = 2; + const int m_pad_x = 5; + + // draw blue background. + g_d3d.draw_filled_rect( ui::ui_get_bg_col( ), m_x, m_y, m_tabwidth * tabs_to_draw, m_h ); + + // for each player add to list. + for( const auto& item : m_items ) { + int str_pos_x{ }; + int str_pos_y = m_y + font_size * i + m_pad_y; + + if( str_pos_y > m_y + m_h ) { + i = 0; + m_tab++; + + str_pos_y = m_y + font_size * i + m_pad_y; + } + + str_pos_x = m_x + m_tabwidth * m_tab + m_pad_x; + + m_tab = std::min< int >( m_tab, tabs_to_draw ); + + // draw rectangle per element. + g_d3d.draw_rect( clr_t( 0, 0, 0 ), m_x + m_tabwidth * m_tab + 1, m_y + font_size * i, m_tabwidth - 2, font_size ); + + // if selected index is this current index, do special stuff. + if( m_index == j ) { + g_d3d.draw_filled_rect( clr_t( 200, 200, 200 ), m_x + m_tabwidth * m_tab + 1, m_y + font_size * i + 1, m_tabwidth - 1, font_size - 1 ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), str_pos_x + 10, str_pos_y - 2 , D3DFONTFLAG_DROPSHADOW, item.m_name ); + g_d3d.draw_text< ALIGN_RIGHT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), m_x + m_tabwidth * ( m_tab + 1 ) - 5, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, *item.m_friend ? "true" : "false" ); + + } + else { + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), str_pos_x, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, item.m_name ); + g_d3d.draw_text< ALIGN_RIGHT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), m_x + m_tabwidth * ( m_tab + 1 ) - 5, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, *item.m_friend ? "true" : "false" ); + } + + i++; + j++; + } + + + // draw pink outlines per tab. + for( uint8_t k = 0; k < ( uint8_t )tabs_to_draw; k++ ) { + g_d3d.draw_rect( ui::ui_get_accent_col( ), m_x + m_tabwidth * k, m_y, m_tabwidth, m_h ); + } + + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/playerlist.hpp b/cheat/gmod/playerlist.hpp new file mode 100644 index 0000000..56eac50 --- /dev/null +++ b/cheat/gmod/playerlist.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include "context.hpp" +#include "d3d.hpp" +#include "interface.hpp" +#include "ui_draw.h" + +#include +#include + +NAMESPACE_REGION( features ) + +class c_player_list +{ + struct playeritem_t + { + playeritem_t( ) = default; + playeritem_t( char* name, bool* friends ) { + strcpy( m_name, name ); + m_friend = friends; + } + + char m_name[ 32 ]{ }; + bool* m_friend{ }; + }; + + bool m_open; + int m_x, m_y, m_w, m_h; + int m_tabwidth; + int m_tab; + int m_scrw, m_scrh; + int m_index; + + std::vector< playeritem_t > m_items; + std::map< std::string, bool > m_friends; +public: + inline bool& is_open( ) { + return m_open; + } + + inline int& get_index( ) { + return m_index; + } + + inline auto get_list( ) { + return m_items; + } + + bool is_friend( const std::string& guid ); + + void operator()( ); +}; + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/prediction.cpp b/cheat/gmod/prediction.cpp new file mode 100644 index 0000000..ebfea5b --- /dev/null +++ b/cheat/gmod/prediction.cpp @@ -0,0 +1,111 @@ +#include "prediction.hpp" +#include "hooks.hpp" +#include "context.hpp" + +NAMESPACE_REGION( features ) + +void c_prediction::predict_player( c_base_player* player ) { + static uintptr_t run_command_address = g_gmod.m_prediction->get_old_function< uintptr_t >( 17 ); + static uintptr_t set_prediction_random_seed_address = ( run_command_address + 0x21 + 4 + *( uintptr_t* )( run_command_address + 0x21 ) ); + + + CMoveData move_data{ }; + auto ce = player->ce( ); + + float old_curtime = g_gmod.m_globals->m_curtime; + float old_frametime = g_gmod.m_globals->m_frametime; + + int backup_tickbase = player->m_nTickBase( ); + int backup_simtime = player->m_flSimulationTime( ); + + + //random seed is already being calculated and set in createmove + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = g_ctx.get_last_cmd( )->m_random_seed; //prediction seed + **( uintptr_t** )( run_command_address + 0x2F ) = uintptr_t( g_ctx.m_local ); //prediction player + + //start prediction + g_gmod.m_game_movement( )->StartTrackPredictionErrors( ce ); + + //run prediction + g_gmod.m_prediction( )->SetupMove( ce, *player->get< user_cmd_t** >( 0x24B0 ), g_gmod.m_move_helper( ), &move_data ); + g_gmod.m_game_movement( )->ProcessMovement( ce, &move_data ); + g_gmod.m_prediction( )->FinishMove( ce, *player->get< user_cmd_t** >( 0x24B0 ), &move_data ); + + //finish prediction + g_gmod.m_game_movement( )->FinishTrackPredictionErrors( ce ); + + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = 0xffffffff; + **( uintptr_t*** )( run_command_address + 0x2F ) = nullptr; + + player->m_nTickBase( ) = backup_tickbase; + player->m_flSimulationTime( ) = backup_simtime; + + g_gmod.m_globals->m_curtime = old_curtime; + g_gmod.m_globals->m_frametime = old_frametime; +} + +void c_prediction::run( user_cmd_t* ucmd ) { + if ( !ucmd || !g_ctx.m_local || !g_ctx.m_local->is_alive( ) ) + return; + + static uintptr_t run_command_address = g_gmod.m_prediction->get_old_function< uintptr_t >( 17 ); + static uintptr_t relative_call_addr = run_command_address + 0x21; + static uintptr_t set_prediction_random_seed_address = ( relative_call_addr + 4 + *( uintptr_t* )( relative_call_addr ) ); + + static auto sv_footsteps = g_gmod.m_cvar( )->FindVar( "sv_footsteps" ); + + CMoveData move_data{ }; + IClientEntity* local_ent = g_ctx.m_local->ce( ); + + //backup data + int old_buttons = ucmd->m_buttons; + float old_curtime = g_gmod.m_globals->m_curtime; + float old_frame_time = g_gmod.m_globals->m_frametime; + int old_tickbase = g_ctx.m_local->m_nTickBase( ); + int old_flags = g_ctx.m_local->m_fFlags( ); + MoveType_t old_move_type = g_ctx.m_local->m_nMoveType( ); + vec3_t old_velocity = g_ctx.m_local->m_vecVelocity( ); + int old_sv_flags = sv_footsteps->m_flags; + + sv_footsteps->m_flags = 0; + sv_footsteps->m_nvalue = 0; + + //set globals + g_gmod.m_globals->m_curtime = g_gmod.m_globals->m_interval_per_tick * old_tickbase; + g_gmod.m_globals->m_frametime = g_gmod.m_globals->m_interval_per_tick; + + //random seed is already being calculated and set in createmove + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = ucmd->m_random_seed; //prediction seed + **( uintptr_t** )( run_command_address + 0x2F ) = uintptr_t( g_ctx.m_local ); //prediction player + + //start prediction + g_gmod.m_game_movement( )->StartTrackPredictionErrors( local_ent ); + + //run prediction + g_gmod.m_prediction( )->SetupMove( local_ent, ucmd, nullptr, &move_data ); + g_gmod.m_game_movement( )->ProcessMovement( local_ent, &move_data ); + g_gmod.m_prediction( )->FinishMove( local_ent, ucmd, &move_data ); + + //finish prediction + g_gmod.m_game_movement( )->FinishTrackPredictionErrors( local_ent ); + + **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = 0xffffffff; + **( uintptr_t*** )( run_command_address + 0x2F ) = nullptr; + + //good to have, can be used for edge jump and such + m_predicted_flags = g_ctx.m_local->m_fFlags( ); + + //restore + ucmd->m_buttons = old_buttons; + g_gmod.m_globals->m_curtime = old_curtime; + g_gmod.m_globals->m_frametime = old_frame_time; + g_ctx.m_local->m_nTickBase( ) = old_tickbase; + g_ctx.m_local->m_fFlags( ) = old_flags; + g_ctx.m_local->m_nMoveType( ) = old_move_type; + g_ctx.m_local->m_vecVelocity( ) = old_velocity; + + sv_footsteps->m_nvalue = 1; + sv_footsteps->m_flags = old_sv_flags; +} + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/prediction.hpp b/cheat/gmod/prediction.hpp new file mode 100644 index 0000000..ca0fb93 --- /dev/null +++ b/cheat/gmod/prediction.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "util.hpp" + +class user_cmd_t; +class c_base_player; + +NAMESPACE_REGION( features ) + +class c_prediction { + user_cmd_t* m_ucmd{ }; + int m_predicted_flags{ }; + + void run( user_cmd_t* ucmd ); +public: + void operator()( user_cmd_t* ucmd ) { + m_ucmd = ucmd; + run( m_ucmd ); + } + + int get_predicted_flags( ) const { + return m_predicted_flags; + } + + void predict_player( c_base_player* player ); +}; + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/proxies.cpp b/cheat/gmod/proxies.cpp new file mode 100644 index 0000000..200a370 --- /dev/null +++ b/cheat/gmod/proxies.cpp @@ -0,0 +1,43 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +void __cdecl hooks::lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { + lby_proxy.get_old_function( )( proxy_data_const, entity, output ); + + if( !g_csgo.m_panic ) { + auto player = ( c_base_player* )( entity ); + if( player && player == g_ctx.m_local ) { + g_cheat.m_ragebot.m_antiaim->on_lby_proxy( ); + } + } +} + +void __cdecl hooks::last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { + last_shot_proxy.get_old_function( )( proxy_data_const, entity, output ); + + if( !g_csgo.m_panic && proxy_data_const ) { + auto wep = ( c_base_weapon* )( entity ); + if( wep ) { + auto owner = g_csgo.m_entlist( )->GetClientEntityFromHandle( wep->m_hOwner( ) ); + if( owner && owner->is_valid( ) ) { + + auto records = g_cheat.m_ragebot.m_lagcomp->get_records( owner->ce( )->GetIndex( ), RECORD_NORMAL ); + if( records && records->size( ) ) { + for( auto& it : *records ) { + float sim = it.m_flSimulationTime; + if( sim == wep->get< float >( 0x3314 ) ) { + it.m_tickcount -= it.m_choked; + auto ang = math::vector_angles( owner->get_hitbox_pos( 0 ), g_ctx.m_local->get_eye_pos( ) ); + //g_con->log( "found shot record for %d: %f angles: %f %f", owner->ce( )->GetIndex( ), sim, it.m_vecAngles.x, it.m_vecAngles.y ); + + it.m_vecAngles = it.m_vecRenderAngles = ang; + it.m_vecAbsAngles.y = ang.y; + break; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ragebot_antiaim.cpp b/cheat/gmod/ragebot_antiaim.cpp new file mode 100644 index 0000000..1cb9af9 --- /dev/null +++ b/cheat/gmod/ragebot_antiaim.cpp @@ -0,0 +1,750 @@ +#include "ragebot.hpp" +#include "base_cheat.hpp" +#include "context.hpp" +#include "math.hpp" +#include "input_system.hpp" + +namespace features +{ + void c_ragebot::c_lby_breaker::update_animstate( ) { + static bool valid = false; + static float last_spawn = 0.f; + static float last_update = 0.f; + if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { + if( m_animstate ) { + g_csgo.m_alloc->Free( m_animstate ); + m_animstate = nullptr; + } + valid = false; + return; + } + + if( m_animstate && ( m_animstate->pBaseEntity != g_ctx.m_local || g_ctx.m_local->m_flSpawnTime( ) != last_spawn ) ) { + last_spawn = g_ctx.m_local->m_flSpawnTime( ); + g_csgo.m_alloc->Free( m_animstate ); + m_animstate = nullptr; + valid = false; + } + + if( !m_animstate ) { + m_animstate = ( CCSGOPlayerAnimState* )g_csgo.m_alloc->Alloc( sizeof( CCSGOPlayerAnimState ) ); + } + + if( !valid && m_animstate ) { + g_ctx.m_local->create_animstate( m_animstate ); + valid = true; + } + else if( valid && m_animstate && !g_cheat.m_lagmgr.get_choked( ) ) { + static float time_delta = g_csgo.m_globals->m_curtime - last_update; + if( std::abs( time_delta ) > g_csgo.m_globals->m_interval_per_tick ) { + vec3_t angles = g_ctx.m_last_realangle; + + C_AnimationLayer anim_backup[ 13 ]; + float param_backup[ 24 ]; + + memcpy( anim_backup, g_ctx.m_local->m_AnimOverlay( ).GetElements( ), sizeof( anim_backup ) ); + memcpy( param_backup, g_ctx.m_local->m_flPoseParameter( ), sizeof( param_backup ) ); + + m_animstate->update( angles.y, angles.x ); + m_animstate->m_flFeetSpeedForwardsOrSideWays = std::clamp( m_animstate->m_flFeetSpeedForwardsOrSideWays, 0.f, 2.f ); + m_animstate->m_flFeetSpeedUnknownForwardOrSideways = std::clamp( m_animstate->m_flFeetSpeedUnknownForwardOrSideways, 0.f, 3.f ); + + memcpy( g_ctx.m_local->m_AnimOverlay( ).GetElements( ), anim_backup, sizeof( anim_backup ) ); + memcpy( g_ctx.m_local->m_flPoseParameter( ), param_backup, sizeof( param_backup ) ); + + last_update = g_csgo.m_globals->m_curtime; + } + } + + bool moving = m_animstate->m_velocity > 0.1f && g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + if( g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) moving = false; + + static bool was_moving = moving; + float time = g_ctx.pred_time( ); + + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + float real = g_ctx.m_last_realangle.y; + + if( moving ) { + m_next_update = time + 0.22f; + m_state = BS_MOVING; + } + else if( time >= m_next_update ) { + //idk + float latency = g_csgo.m_globals->m_interval_per_tick; + + m_next_update = time + ( was_moving ? 0.22f : 1.1f ) + latency; + + m_state = was_moving ? BS_WAS_MOVING : BS_BREAKING; + } + + was_moving = moving; + + if( g_ctx.m_tickbase > 0 ) { + auto& cur_update = m_lby_updates[ g_ctx.m_tickbase % 64 ]; + cur_update.m_tickbase = g_ctx.m_tickbase; + cur_update.m_state = m_state; + } + } + + void c_ragebot::c_lby_breaker::on_lby_proxy( ) { + float oldsimtime_1tickfuture = g_ctx.m_local->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + int oldsimtime_ticks = TIME_TO_TICKS( oldsimtime_1tickfuture ); + + float latency = g_csgo.m_engine( )->GetNetChannelInfo( )->GetLatency( 0 ) + g_csgo.m_globals->m_interval_per_tick; + for( auto& it : m_lby_updates ) { + if( it.m_tickbase == oldsimtime_ticks ) + if( it.m_state == BS_WAS_MOVING ) { + //m_next_update = oldsimtime_1tickfuture + 0.22f - latency; + + if( it.m_state == BS_BREAKING ) + m_next_update = oldsimtime_1tickfuture + 1.1f - latency; + + break; + } + } + } + + int c_ragebot::c_lby_breaker::get_next_update( ) const { + auto current_tick = TIME_TO_TICKS( g_ctx.pred_time( ) ); + auto update_tick = TIME_TO_TICKS( m_next_update ); + + return update_tick - current_tick; + } + + void c_ragebot::c_lby_breaker::override_angles( float* angles, float original, float offset ) { + const float angle = original; + int update_ticks = get_next_update( ); + + if( g_cheat.m_lagmgr.get_state( ) ) + return; + + //yep + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return; + + float break_angle = angle - offset; + + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + float real = angle; + float delta = std::remainderf( lby - real, 360.f ); + + if( std::abs( delta ) < 37.f && get_state( ) == BS_BREAKING ) { + if( update_ticks < -TIME_TO_TICKS( 1.f ) ) { + *angles = break_angle; + return; + } + } + + if( update_ticks < -1 ) + return; + + if( ( get_state( ) == BS_WAS_MOVING || g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) + && update_ticks >= 1 && offset < 140.f ) { + *angles = angle + 140.f - offset; + } + + if( /*get_state( ) > BS_MOVING &&*/ update_ticks < 1 || + get_state( ) == BS_WAS_MOVING && update_ticks < 3 ) { + *angles = break_angle; + } + + g_ctx.m_thirdperson_angle.y = *angles; + } + + void c_ragebot::c_antiaim::fix_movement( ) { + auto last_cmd = g_ctx.get_last_cmd( ); + auto old_yaw = last_cmd->m_viewangles.y; + auto cur_yaw = m_cmd->m_viewangles.y; + + float yaw_delta = cur_yaw - old_yaw; + + float f1 = old_yaw < 0.f ? old_yaw + 360.f : old_yaw; + float f2 = cur_yaw < 0.f ? cur_yaw + 360.f : cur_yaw; + + if( f2 < f1 ) + yaw_delta = abs( f2 - f1 ); + else + yaw_delta = 360.f - abs( f1 - f2 ); + yaw_delta = 360.f - yaw_delta; + + m_cmd->m_forwardmove = cos( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + cos( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; + m_cmd->m_sidemove = sin( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + sin( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; + + if( g_ctx.m_local->m_nMoveType( ) != MOVETYPE_LADDER ) { + if( m_cmd->m_forwardmove ) { + m_cmd->m_buttons &= ~( m_cmd->m_forwardmove < 0 ? IN_FORWARD : IN_BACK ); + m_cmd->m_buttons |= ( m_cmd->m_forwardmove > 0 ? IN_FORWARD : IN_BACK ); + } + if( m_cmd->m_sidemove ) { + m_cmd->m_buttons &= ~( m_cmd->m_sidemove < 0 ? IN_MOVERIGHT : IN_MOVELEFT ); + m_cmd->m_buttons |= ( m_cmd->m_sidemove > 0 ? IN_MOVERIGHT : IN_MOVELEFT ); + } + } + } + + float get_damage( const vec3_t& start, const vec3_t& end, c_base_player* a, c_base_player* b ) { + static weapon_info_t wpn_data{ }; + wpn_data.damage = 200; + wpn_data.range_modifier = 1.0f; + wpn_data.penetration = 3.0f; + wpn_data.armor_ratio = 0.5f; + wpn_data.range = 8192.f; + + fire_bullet_data_t data{ }; + data.src = start; + data.filter.pSkip = a; + data.length_to_end = ( end - start ).length( ); + + vec3_t angle = math::vector_angles( start, end ); + data.direction = math::angle_vectors( angle ); + + data.direction.normalize_vector( ); + + if( g_cheat.m_autowall.fire_bullet( a, b, &wpn_data, data, false, false ) ) { + return data.current_damage; + } + + return -1.f; + } + + bool is_visible( const vec3_t& start, const vec3_t& end, void* skip ) { + CTraceFilter filter; + CGameTrace tr; + Ray_t ray; + + filter.pSkip = skip; + ray.Init( start, end ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); + + return tr.fraction >= 0.98f; + } + + bool c_ragebot::c_antiaim::run_edge_dtc( ) { + if( !g_settings.rage.edge_dtc_normal ) + return false; + + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return false; + + if( g_settings.rage.edge_dtc_normal == 1 ) { + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed < 30.f ) return false; + } + + bool peeking = g_ctx.m_local->m_vecVelocity( ).length( ) > 30.f; + if( is_fakewalking( ) ) peeking = false; + CTraceFilterWorldAndPropsOnly filter; + + float max_dist = peeking ? g_settings.rage.edge_dtc_moving : g_settings.rage.edge_dtc_standing; + float min_dist = 64.f; + float edge_yaw = 0.f; + float final_yaw = 0.f; + bool detected = false; + + const float step = 45.f; + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + + for( float rot = -180.f; rot < 180.f; rot += step ) { + float rot_left = rot - 90.f; + float rot_right = rot + 90.f; + + vec3_t pos_left = math::get_rotated_pos( eye_pos, rot_left, 30.f ); + vec3_t pos_right = math::get_rotated_pos( eye_pos, rot_right, 30.f ); + + vec3_t forward = math::angle_vectors( vec3_t( 0.f, rot, 0.f ) ); + forward *= 4000.f; + + CGameTrace trace_left, trace_right; + Ray_t ray_left, ray_right; + + ray_left.Init( pos_left, pos_left + forward ); + ray_right.Init( pos_right, pos_right + forward ); + + g_csgo.m_trace( )->TraceRay( ray_left, MASK_SHOT_HULL, &filter, &trace_left ); + g_csgo.m_trace( )->TraceRay( ray_right, MASK_SHOT_HULL, &filter, &trace_right ); + + float dist_left = ( pos_left - trace_left.endpos ).length( ); + float dist_right = ( pos_right - trace_right.endpos ).length( ); + + if( dist_right > dist_left ) { + if( dist_right > max_dist && dist_left < min_dist ) { + max_dist = dist_right; + edge_yaw = rot_left; + detected = true; + } + } + else { + if( dist_left > max_dist && dist_right < min_dist ) { + max_dist = dist_left; + edge_yaw = rot_right; + detected = true; + } + } + } + + if( !detected ) + return false; + + final_yaw = edge_yaw; + if( g_cheat.m_lagmgr.get_state( ) ) { + final_yaw = edge_yaw + 180.f; + } + + int state = m_breaker.get_state( ); + int ticks = m_breaker.get_next_update( ); + switch( g_settings.rage.edge_dtc_type( ) ) { + case 0: { + break; + } + case 1: { + m_breaker.override_angles( &final_yaw, edge_yaw, 110.f ); + m_cmd->m_viewangles.y = final_yaw; + return true; + } + case 2: { + m_breaker.override_angles( &final_yaw, edge_yaw, 180.f ); + m_cmd->m_viewangles.y = final_yaw; + return true; + } + default: + break; + } + + m_cmd->m_viewangles.y = final_yaw; + return true; + } + + bool c_ragebot::c_antiaim::run_freestanding( ) { + if( !g_settings.rage.edge_detection ) + return false; + + bool is_fake = g_cheat.m_lagmgr.get_state( ); + vec3_t enemy_pos; + vec3_t local_pos; + + vec3_t aim_angle; + vec3_t final_angle; + vec3_t final_enemy_pos; + vec3_t final_local_pos; + + float cur_damage{ 30.f }; + bool direction{ false }; + int enemy_index; + + enemy_index = util::get_closest_player( ); + + if( enemy_index == -1 ) + return false; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( enemy_index ); + + enemy_pos = ent->m_vecOrigin( ); + enemy_pos.z = ent->get_hitbox_pos( 0 ).z; + + local_pos = g_ctx.m_local->get_eye_pos( ); + + aim_angle = math::vector_angles( enemy_pos, local_pos ); + + for( int step_local = 1; step_local <= 4; ++step_local ) { + float offset = step_local * 20.f; + + vec3_t local_left = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, -offset ); + vec3_t local_right = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, offset ); + + bool visible_left = is_visible( local_pos, local_left, g_ctx.m_local ); + bool visible_right = is_visible( local_pos, local_right, g_ctx.m_local ); + + if( !visible_left && !visible_right ) break; + + const float enemy_offset = 60.f; + + vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_offset ); + vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, -enemy_offset ); + + CTraceFilter filter; + CGameTrace tr_right; + CGameTrace tr_left; + Ray_t ray; + + filter.pSkip = ent; + ray.Init( enemy_pos, enemy_left ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_left ); + ray.Init( enemy_pos, enemy_right ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_right ); + + enemy_left = tr_left.endpos; + enemy_right = tr_right.endpos; + + auto update_damage = [ & ]( const vec3_t& position, bool dir, bool center ) { + if( is_visible( enemy_pos, position, ent ) || center ) { + float dmg_left{ }; + float dmg_right{ }; + + if( visible_left ) { + dmg_left = get_damage( position, local_left, ent, g_ctx.m_local ); + } + + if( visible_right ) { + dmg_right = get_damage( position, local_right, ent, g_ctx.m_local ); + } + + if( step_local == 1 ) { + float delta = std::abs( dmg_left - dmg_right ); + if( delta < 35.f && dmg_left > 30.f && dmg_right > 30.f ) { + return false; + } + } + + float max_dmg = std::max< float >( dmg_left, dmg_right ); + vec3_t end_pos = dmg_left > dmg_right ? local_left : local_right; + bool new_dir = dmg_left > dmg_right; + + + //add a bit of tolerance + if( max_dmg > cur_damage + 10.f ) { + final_enemy_pos = position; + final_local_pos = end_pos; + cur_damage = max_dmg; + direction = new_dir; + } + } + + return true; + }; + + if( !update_damage( enemy_pos, true, true ) ) + return false; + + update_damage( enemy_left, true, false ); + update_damage( enemy_right, false, false ); + } + + + if( cur_damage > 50.f ) { + auto angle = math::vector_angles( final_local_pos, final_enemy_pos ); + + m_direction = direction; + angle.y += direction ? -90.f : 90.f; + angle.y = math::find_closest_step( angle.y, 30.f ); + + if( g_settings.rage.pitch == 3 && g_settings.rage.edge_detection > 1 && m_breaker.get_next_update( ) < 2 ) { + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + vec3_t rotated_pos = math::get_rotated_pos( eye_pos, angle.y - 180.f, 25.f ); + + vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); + + vec3_t middle_pos = eye_pos + velocity * TICK_INTERVAL( ) * 2.f; + middle_pos.z += 10.f; + + int dmg_rot = get_damage( final_enemy_pos, rotated_pos, ent, g_ctx.m_local ); + int dmg_mid = get_damage( final_enemy_pos, middle_pos, ent, g_ctx.m_local ); + + if( dmg_mid < dmg_rot && ( dmg_mid < 100 || velocity.length2d( ) < 0.1f ) ) { + m_cmd->m_viewangles.x = 0.f; + } + } + + if( is_fake ) { + int jitter = g_settings.rage.edge_dtc_jitter; + if( jitter ) { + angle.y += math::random_number< float >( -jitter, jitter ); + } + angle.y -= 180.f; + } + else { + switch( g_settings.rage.edge_detection( ) ) { + case 2: + m_breaker.override_angles( &angle.y, angle.y, 110.f ); + break; + case 3: + m_breaker.override_angles( &angle.y, angle.y, 180.f ); + break; + } + } + + m_cmd->m_viewangles.y = angle.clamp( ).y; + return true; + } + + return false; + } + + void c_ragebot::c_antiaim::run_fakewalk( ) { + m_is_fakewalking = false; + bool in_move = !( m_cmd->m_buttons & IN_FORWARD ) && !( m_cmd->m_buttons & IN_BACK ) && !( m_cmd->m_buttons & IN_LEFT ) && !( m_cmd->m_buttons & IN_RIGHT ); + + if( !m_cmd->m_sidemove && !m_cmd->m_forwardmove && !g_ctx.m_local->m_vecVelocity( ) && !in_move ) + return; + + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return; + + if( m_cmd->m_buttons & IN_WALK ) { + m_cmd->m_buttons &= ~IN_WALK; + } + + m_is_fakewalking = true; + + auto velocity = g_ctx.m_local->m_vecVelocity( ); + + static auto predict_velocity = [ ]( vec3_t* velocity ) { + static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); + static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); + + float speed = velocity->length( ); + if( speed >= 0.1f ) { + float friction = sv_friction->get_float( ); + float stop_speed = std::max< float >( speed, sv_stopspeed->get_float( ) ); + float time = std::max< float >( g_csgo.m_globals->m_interval_per_tick, g_csgo.m_globals->m_frametime ); + *velocity *= std::max< float >( 0.f, speed - friction * stop_speed * time / speed ); + } + }; + + static auto quick_stop = [ & ]( ) { + vec3_t vel = g_ctx.m_local->m_vecVelocity( ); + float speed = vel.length2d( ); + if( speed > 13.f ) { + vec3_t direction = math::vector_angles( { 0.f, 0.f, 0.f }, vel ); + direction.y = g_ctx.get_last_cmd( )->m_viewangles.y - direction.y; + + vec3_t new_move = math::angle_vectors( direction ); + new_move *= -450.f; + + g_ctx.get_last_cmd( )->m_forwardmove = new_move.x; + g_ctx.get_last_cmd( )->m_sidemove = new_move.y; + } + else { + g_ctx.get_last_cmd( )->m_forwardmove = 0.f; + g_ctx.get_last_cmd( )->m_sidemove = 0.f; + } + }; + + //check how many ticks before LBY update comes in + int ticks_to_update = m_breaker.get_next_update( ) - 1; + + int ticks_to_stop; + for( ticks_to_stop = 0; ticks_to_stop < 15; ++ticks_to_stop ) { + if( velocity.length2d( ) < 0.1f ) + break; + + predict_velocity( &velocity ); + } + + const int max_ticks = std::min< int >( g_settings.rage.fakewalk_ticks, ticks_to_update ); + const int choked = g_cheat.m_lagmgr.get_choked( ); + int ticks_left = max_ticks - choked; + + if( choked < max_ticks || ticks_to_stop ) { + g_cheat.m_lagmgr.set_state( false ); + } + + if( !ticks_to_stop && !g_ctx.m_local->m_vecVelocity( ).length2d( ) && !g_cheat.m_lagmgr.get_sent( ) + && choked > max_ticks ) { + g_cheat.m_lagmgr.set_state( true ); + } + + if( ticks_to_stop > ticks_left || !choked || g_cheat.m_lagmgr.get_state( ) ) { + quick_stop( ); + } + } + + float c_ragebot::c_antiaim::get_pitch( ) { + switch( g_settings.rage.pitch( ) ) { + case 1: //custom + return float( g_settings.rage.pitch_offset( ) ); + case 2: //flip + return g_cheat.m_lagmgr.get_state( ) ? 75.f : 89.f; + case 3: + return 89.f; + case 4: //random + return math::random_number( -89.f, 89.f ); + } + + return 0.f; + } + + float c_ragebot::c_antiaim::get_yaw( bool fake, float original, bool no_jitter ) { + constexpr static double rate = 360.0 / 1.618033988749895; + constexpr static int switch_rate = 10; + static float last_onground = 0.f; + static int ticks = 0; + static bool side_switch = false; + bool on_ground = false; + + int setting = fake ? g_settings.rage.fake_yaw : g_settings.rage.real_yaw; + int jitter = fake ? g_settings.rage.fake_yaw_jitter : g_settings.rage.real_yaw_jitter; + int add = fake ? g_settings.rage.fake_yaw_add : g_settings.rage.real_yaw_add; + if( g_ctx.m_local->m_vecVelocity( ).length( ) > 0.1f && !is_fakewalking( ) ) { + if( fake && g_settings.rage.fake_yaw_moving( ) ) { + setting = g_settings.rage.fake_yaw_moving( ); + jitter = g_settings.rage.fake_moving_jitter( ); + add = g_settings.rage.fake_yaw_moving_add( ); + } + else if( g_settings.rage.real_yaw_moving( ) ) { + setting = g_settings.rage.real_yaw_moving( ); + jitter = g_settings.rage.real_moving_jitter( ); + add = g_settings.rage.real_yaw_moving_add( ); + } + } + + if( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { + last_onground = g_ctx.pred_time( ); + on_ground = true; + } + + ticks++; + if( ticks > switch_rate ) { + side_switch ^= 1; + ticks = 0; + } + + float rand = 0.f; + if( setting && jitter && !no_jitter ) { + rand = math::random_number( -float( jitter ), float( jitter ) ); + } + + if( setting && add ) { + original += add; + } + + switch( setting ) { + case 1: //back + return original - 180.f + rand; + case 2: {//back spin + float time = on_ground ? g_csgo.m_globals->m_curtime * 0.5f : ( g_csgo.m_globals->m_curtime - last_onground ); + float range = on_ground ? jitter : jitter * 2.f; + return original - 180.f - range * 0.5f + ( no_jitter ? range : std::fmod( time * rate, range + 1.f ) ); + } + case 3: //sideways + //to be updated with the last saved yaw from freestanding/breaker + return rand + fake ? ( side_switch ? original - 90.f : original + 90.f ) : + ( side_switch ? original + 90.f : original - 90.f ); + case 4: //slowpin lol + return rand + std::fmod( g_csgo.m_globals->m_curtime * rate, 360.f ); + case 5: //random + return math::random_number( -180.f, 180.f ); + case 6: + return rand + fake ? ( m_direction ? original - 90.f : original + 90.f ) : + ( m_direction ? original + 90.f : original - 90.f ); + } + + return original; + } + + float c_ragebot::c_antiaim::get_yaw( bool no_jitter ) { + const auto is_fake = g_cheat.m_lagmgr.get_state( ); + auto original = g_ctx.get_last_cmd( )->m_viewangles.y; + + if( g_settings.rage.at_players ) { + auto closest_ent = util::get_closest_player( ); + if( closest_ent != -1 ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( closest_ent ); + vec3_t ang = math::vector_angles( g_ctx.m_local->m_vecOrigin( ), + ent->m_vecOrigin( ) ); + + original = ang.y; + } + } + + if( is_fake && !g_settings.rage.fake_yaw( ) ) + return original; + if( !is_fake && !g_settings.rage.real_yaw( ) ) + return original; + + if( g_settings.rage.angle_step( ) && g_settings.rage.angle_step_degrees( ) ) { + float step = float( g_settings.rage.angle_step_degrees( ) ); + original = math::find_closest_step( original, step ); + } + return get_yaw( is_fake, original, no_jitter ); + } + + void c_ragebot::c_antiaim::run( ) { + m_is_edging = false; + if( !g_settings.rage.anti_aim( ) || !g_settings.rage.enabled( ) ) + return; + + auto is_everyone_dormant = [ ]( ) { + for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + if( ent && ent->is_valid( ) && + ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) + || g_settings.rage.friendlies ) ) { + return false; + } + } + + return true; + }; + + if( ( m_cmd->m_forwardmove || m_cmd->m_sidemove ) && + ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || + g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) ) + return; + + if( g_ctx.m_local->m_fFlags( ) & FL_FROZEN ) + return; + + if( is_everyone_dormant( ) && g_settings.rage.dormant_check ) + return; + + if( g_settings.rage.fakewalk( ) && g_input.is_key_pressed( g_settings.rage.fakewalk_key( ) ) ) { + run_fakewalk( ); + } + else { + m_is_fakewalking = false; + } + + if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( weapon && weapon->is_grenade( ) ) { + if( weapon->m_fThrowTime( ) > g_csgo.m_globals->m_interval_per_tick ) { + return; + } + } + + if( m_cmd->m_buttons & IN_USE ) + return; + + if( g_settings.rage.real_yaw( ) || + g_settings.rage.fake_yaw( ) ) { + m_cmd->m_viewangles.y = get_yaw( ); + if( g_settings.rage.break_lby( ) ) { + m_breaker.override_angles( &m_cmd->m_viewangles.y, + get_yaw( true ), + float( g_settings.rage.lby_delta ) ); + } + } + + bool edge_detected = false; + bool freestanding = false; + + if( g_settings.rage.pitch( ) ) { + m_cmd->m_viewangles.x = get_pitch( ); + } + + if( !g_settings.rage.edge_dtc_priority ) { + freestanding = run_freestanding( ); + if( !freestanding ) + edge_detected = run_edge_dtc( ); + } + else { + edge_detected = run_edge_dtc( ); + if( !edge_detected ) + freestanding = run_freestanding( ); + } + + m_is_edging = freestanding || edge_detected; + + if( edge_detected && g_cheat.m_lagmgr.get_choked( ) && m_breaker.get_next_update( ) > 1 ) { + vec3_t vang{ }; + g_csgo.m_engine( )->GetViewAngles( vang ); + + float delta = std::remainderf( vang.y - m_cmd->m_viewangles.y, 360.f ); + m_direction = delta < 0; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ragebot_lagcomp.cpp b/cheat/gmod/ragebot_lagcomp.cpp new file mode 100644 index 0000000..0fe3a0b --- /dev/null +++ b/cheat/gmod/ragebot_lagcomp.cpp @@ -0,0 +1,595 @@ +#include "ragebot.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "mem.hpp" + +namespace features +{ + c_ragebot::lag_record_t::lag_record_t( c_base_player* ent ) : m_ent( ent ) { + if( !m_ent || !m_ent->is_valid( ) ) return; + m_valid = true; + + m_flSimulationTime = m_ent->m_flSimulationTime( ); + m_tickcount = TIME_TO_TICKS( m_flSimulationTime + util::get_lerptime( ) ); + m_choked = m_ent->get_choked_ticks( ); + + m_flLowerBodyYaw = m_ent->m_flLowerBodyYawTarget( ); + m_vecVelocity = m_ent->m_vecVelocity( ); + m_fFlags = m_ent->m_fFlags( ); + m_flCycle = m_ent->m_flCycle( ); + m_nSequence = m_ent->m_nSequence( ); + + m_vecAngles = m_ent->m_angEyeAngles( ); + m_vecOrigin = m_ent->m_vecOrigin( ); + + m_vecRenderAngles = m_ent->ce( )->GetRenderAngles( ); + m_vecAbsAngles = *( vec3_t* )( uintptr_t( m_ent ) + 0xc4 ); + + m_vecAbsOrigin = *( vec3_t* )( uintptr_t( m_ent ) + 0xa0 ); + m_vecRenderOrigin = m_ent->ce( )->GetRenderOrigin( ); + + m_vecHeadPos = ent->get_hitbox_pos( 0 ); + m_vecPelvisPos = ent->get_hitbox_pos( HITBOX_PELVIS ); + m_can_render = ent->ce( )->SetupBones( m_matrix, 128, 0x100, 0.f ); + + m_vecMins = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ); + m_vecMaxs = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ); + + float* pose_params = m_ent->m_flPoseParameter( ); + memcpy( m_PoseParameters, + pose_params, + sizeof( float ) * 24 ); + + size_t count = std::min< size_t >( m_ent->m_AnimOverlay( ).GetSize( ), 13 ); + memcpy( m_AnimLayers, + m_ent->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * count ); + + memcpy( &m_state, + m_ent->get_animstate( ), + sizeof( CCSGOPlayerAnimState ) ); + } + + //this shit doesnt work and im going to lose my fucking mind + bool c_ragebot::lag_record_t::restore( bool recalculate ) { + if( !m_ent || !m_ent->is_valid( ) ) return false; + + m_ent->m_flLowerBodyYawTarget( ) = m_flLowerBodyYaw; + + m_ent->m_vecVelocity( ) = m_vecVelocity; + m_ent->m_flCycle( ) = m_flCycle; + m_ent->m_nSequence( ) = m_nSequence; + + m_ent->m_angEyeAngles( ) = m_vecAngles; + m_ent->m_vecOrigin( ) = m_vecOrigin; + m_ent->m_fFlags( ) = m_fFlags; + + m_ent->ce( )->GetRenderAngles( ) = m_vecRenderAngles; + m_ent->ce( )->GetRenderOrigin( ) = m_vecRenderOrigin; + + m_ent->set_abs_angles( m_vecAbsAngles ); + m_ent->set_abs_origin( m_vecAbsOrigin ); + + *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ) = m_vecMins; + *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ) = m_vecMaxs; + + memcpy( m_ent->m_flPoseParameter( ), + m_PoseParameters, + sizeof( float ) * 24 ); + + size_t count = std::min< int >( m_ent->m_AnimOverlay( ).GetSize( ), 13 ); + memcpy( m_ent->m_AnimOverlay( ).GetElements( ), + m_AnimLayers, + sizeof( C_AnimationLayer ) * count ); + + if( recalculate ) { + m_ent->fix_animations( nullptr ); + //m_ent->invalidate_bone_cache( ); + return m_ent->ce( )->SetupBones( nullptr, -1, 0x100, 0.f ); + } + else { + m_ent->invalidate_bone_cache( ); + return true; + } + + return false; + } + + bool c_ragebot::lag_record_t::is_valid( ) { + if( !m_valid ) return false; + if( m_balanceadjust && m_shot ) return false; + + return util::is_tick_valid( m_tickcount ); + } + + void c_ragebot::c_lagcomp::restore_animations( ) { + if( g_csgo.m_engine( )->IsInGame( ) ) { + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_player( ) && ent != g_ctx.m_local ) { + ent->m_flLastBoneSetupTime( ) = g_csgo.m_globals->m_curtime; + ent->m_iMostRecentModelBoneCounter( ) = g_csgo.m_globals->m_framecount; + ent->m_bClientSideAnimation( ) = true; + } + } + } + } + } + + void c_ragebot::c_lagcomp::store_visuals( ) { + if( g_csgo.m_engine( )->IsInGame( ) && g_settings.rage.resolver( ) ) { + static float last_simtime[ 65 ]{ }; + + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + for( int i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + auto& data = m_data_render[ i ]; + + if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) && + !!std::abs( last_simtime[ i ] - ent->m_flSimulationTime( ) ) ) { + render_record_t new_record; + new_record.m_simtime = ent->m_flSimulationTime( ) + util::get_lerptime( ); + new_record.m_origin = ent->m_vecOrigin( ); + if( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { + data.push_front( new_record ); + } + + last_simtime[ i ] = ent->m_flSimulationTime( ); + } + + while( !data.empty( ) && + data.size( ) > TIME_TO_TICKS( 1.f ) ) { + data.pop_back( ); + } + } + } + } + } + + c_ragebot::render_record_t* c_ragebot::c_lagcomp::get_render_record( int ent_index ) { + auto& data = m_data_render[ ent_index ]; + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + for( auto& it : util::reverse_iterator( data ) ) { + if( util::is_tick_valid( TIME_TO_TICKS( it.m_simtime ) ) ) { + return it.m_origin.dist_to( ent->m_vecOrigin( ) ) > 5.f ? &it : nullptr; + } + } + + return nullptr; + } + + void c_ragebot::c_lagcomp::fsn_net_update_start( ) { + static bool restored{ }; + + if( !g_settings.rage.enabled( ) ) { + if( !restored ) { + restore_animations( ); + restored = true; + } + + return; + } + + restored = false; + if( g_csgo.m_engine( )->IsInGame( ) ) { + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + static float last_simtime[ 65 ]{ }; + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { + ent->disable_interpolaton( ); + if( ent != g_ctx.m_local ) { + ent->m_bClientSideAnimation( ) = false; + } + + float simtime = ent->m_flSimulationTime( ); + + last_simtime[ i ] = simtime; + } + } + } + } + } + + void c_ragebot::c_lagcomp::fsn_render_start( ) { + if( !g_settings.rage.enabled( ) ) + return; + + if( !g_ctx.m_local ) + return; + + static float stored_lby[ 65 ]; + + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_player( ) ) { + //invalidate_animstate( i ); + continue; + } + + if( ent == g_ctx.m_local && ent->is_alive( ) ) { + ent->m_bClientSideAnimation( ) = true; + //fuck ya + + auto breaker_animstate = g_cheat.m_ragebot.m_antiaim->get_animstate( ); + if( breaker_animstate && g_settings.rage.anti_aim( ) ) { + if( breaker_animstate->pBaseEntity == ent ) { + memcpy( g_ctx.m_local->get_animstate( ), + breaker_animstate, + sizeof( CCSGOPlayerAnimState ) ); + ent->get_animstate( )->m_flLastClientSideAnimationUpdateTime = FLT_MAX; + ent->get_animstate( )->m_iLastClientSideAnimationUpdateFramecount = INT_MAX; + } + } + + continue; + } + + //return; + + if( !ent->is_alive( ) ) { + ent->m_bClientSideAnimation( ) = true; + //invalidate_animstate( i ); + continue; + } + + if( ent->ce( )->IsDormant( ) ) { + ent->invalidate_bone_cache( ); + continue; + } + + if( ent->m_bGunGameImmunity( ) ) { + ent->fix_animations( ); + ent->enforce_animations( ); + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.rage.friendlies ) { + ent->fix_animations( ); + ent->enforce_animations( ); + continue; + } + + if( m_data_lby[ i ].size( ) && + m_data_lby[ i ].front( ).m_ent != ent ) { + m_data_lby[ i ].clear( ); + } + + if( m_data_normal[ i ].size( ) && + m_data_normal[ i ].front( ).m_ent != ent ) { + m_data_normal[ i ].clear( ); + } + + auto update_anims = [ this, &ent ]( int e ) { + ent->fix_animations( ); + }; + + bool is_moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) + && ( ent->m_fFlags( ) & FL_ONGROUND ); + + float lby = ent->m_flLowerBodyYawTarget( ); + + float last_simtime = m_last_simtime[ i ]; + float simtime = ent->m_flSimulationTime( ); + + if( !!std::abs( simtime - last_simtime ) ) { + if( is_moving && g_settings.rage.resolver ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); + //abs_ang.y = lby; + //ent->set_abs_angles( abs_ang ); + + update_anims( i ); + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( ( lby != stored_lby[ i ] ) && g_settings.rage.resolver ) { + stored_lby[ i ] = lby; + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); + //abs_ang.y = lby; + //ent->set_abs_angles( abs_ang ); + + update_anims( i ); + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( g_settings.rage.resolver ) { + static C_AnimationLayer last_layer[ 65 ]{ }; + auto layer = m_anim_backup[ i ][ 3 ]; + auto ent_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; + if( g_cheat.m_ragebot.m_resolver->get_breaking_state( i ) == BREAKING_ADJUST && + layer.m_flCycle == 0.f && layer.m_flWeight == 0.f && ent_layer && + last_layer[ i ].m_flCycle > layer.m_flCycle ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); + //abs_ang.y = lby; + //ent->set_abs_angles( abs_ang ); + + update_anims( i ); + + auto anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + + int flick_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + new_record.m_flSimulationTime = anim_time; + new_record.m_tickcount = flick_tick; + + new_record.m_balanceadjust = true; + m_data_lby[ i ].push_front( new_record ); + } + else { + update_anims( i ); + m_data_normal[ i ].push_front( lag_record_t( ent ) ); + } + + last_layer[ i ] = layer; + } + else { + update_anims( i ); + m_data_normal[ i ].push_front( lag_record_t( ent ) ); + } + } + + m_last_simtime[ i ] = simtime; + ent->enforce_animations( ); + + while( !m_data_lby[ i ].empty( ) && + m_data_lby[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { + m_data_lby[ i ].pop_back( ); + } + + while( !m_data_normal[ i ].empty( ) && + m_data_normal[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { + m_data_normal[ i ].pop_back( ); + } + } + } + + void c_ragebot::c_lagcomp::fsn_postdataupdate_start( ) { + if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) + return; + + static float stored_lby[ 65 ]; + + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_player( ) ) { + //invalidate_animstate( i ); + continue; + } + + if( ent == g_ctx.m_local ) { + continue; + } + + if( !ent->is_alive( ) ) { + continue; + } + + if( ent->ce( )->IsDormant( ) ) { + continue; + } + + memcpy( m_anim_backup.at( i ), + ent->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 ); + + if( ent->m_bGunGameImmunity( ) ) { + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.rage.friendlies ) + continue; + + bool is_moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) + && ( ent->m_fFlags( ) & FL_ONGROUND ); + + float lby = ent->m_flLowerBodyYawTarget( ); + + float last_simtime = m_last_simtime[ i ]; + float simtime = ent->m_flSimulationTime( ); + + if( !!std::abs( simtime - last_simtime ) ) { + memcpy( m_anim_backup.at( i ), + ent->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 ); + + if( is_moving && g_settings.rage.resolver ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + m_last_simtime[ i ] = simtime; + ent->fix_animations( ); + + lag_record_t new_record( ent ); + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( ( lby != stored_lby[ i ] ) && g_settings.rage.resolver ) { + stored_lby[ i ] = lby; + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + m_last_simtime[ i ] = simtime; + ent->fix_animations( ); + + auto anim_time = ent->m_flSimulationTime( ) + TICK_INTERVAL( ); + auto anim_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); + + lag_record_t new_record( ent ); + new_record.m_tickcount = anim_tick; + //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + // = new_record.m_vecRenderAngles.y = lby; + + m_data_lby[ i ].push_front( new_record ); + } + + else if( g_settings.rage.resolver ) { + static C_AnimationLayer last_layer[ 65 ]{ }; + auto layer = m_anim_backup[ i ][ 3 ]; + auto ent_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; + if( g_cheat.m_ragebot.m_resolver->get_breaking_state( i ) == BREAKING_ADJUST && + layer.m_flCycle == 0.f && layer.m_flWeight == 0.f && ent_layer && + last_layer[ i ].m_flCycle > layer.m_flCycle ) { + ent->m_angEyeAngles( ).y = lby; + //ent->ce( )->GetRenderAngles( ).y = lby; + + ent->fix_animations( ); + m_last_simtime[ i ] = simtime; + float anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + + int flick_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); + lag_record_t new_record( ent ); + new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y + = new_record.m_vecRenderAngles.y = lby; + new_record.m_flSimulationTime = anim_time; + new_record.m_tickcount = flick_tick; + + new_record.m_balanceadjust = true; + m_data_lby[ i ].push_front( new_record ); + } + + last_layer[ i ] = layer; + } + } + + ent->enforce_animations( ); + } + } + + RecordType_t c_ragebot::c_lagcomp::can_backtrack_entity( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + if( ent->is_breaking_lc( ) ) { + return RECORD_NONE; + } + + auto data_lby = &m_data_lby[ ent_index ]; + auto data_normal = &m_data_normal[ ent_index ]; + + if( !data_lby->empty( ) ) { + for( auto& it : *data_lby ) { + if( it.is_valid( ) ) return RECORD_LBY; + } + } + + if( !data_normal->empty( ) ) { + for( auto& it : *data_normal ) { + if( it.is_valid( ) ) return RECORD_NORMAL; + } + } + + return RECORD_NONE; + } + + int c_ragebot::c_lagcomp::backtrack_entity( int ent_index, RecordType_t type, lag_record_t** out_record ) { + if( type == RECORD_NONE ) return -1; + + auto& data = *get_records( ent_index, type ); + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + auto check_record = [ &ent, &out_record ]( lag_record_t* record, bool check_pelvis ) { + if( record->m_balanceadjust && record->m_shot ) return -1; + + vec3_t head_pos = record->m_vecHeadPos; + vec3_t pelvis_pos = record->m_vecPelvisPos; + + float damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, head_pos, false ) * 4.f; + float min_damage = std::min< float >( ent->m_iHealth( ), + g_settings.rage.active->m_damage ); + + //g_con->log( xors( "record: %d damage: %f" ), counter++, damage ); + + if( damage > min_damage ) { + if( !record->restore( ) ) + return -1; + + if( out_record ) { + *out_record = record; + } + return record->m_tickcount; + } + + if( check_pelvis ) { + float pelvis_damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, pelvis_pos, false ); + if( pelvis_damage > min_damage ) { + if( !record->restore( ) ) + return -1; + + if( out_record ) { + *out_record = record; + } + return record->m_tickcount; + } + } + + return -1; + }; + + if( data.empty( ) ) + return -1; + + auto* back = &data.back( ); + auto* front = &data.front( ); + + for( auto& it : data ) { + if( !it.is_valid( ) ) continue; + front = ⁢ + break; + } + + for( auto& it : util::reverse_iterator( data ) ) { + if( !it.is_valid( ) ) continue; + back = ⁢ + break; + } + + int front_result = check_record( front, false ); + if( front_result != -1 ) return front_result; + + int back_result = check_record( back, true ); + if( back_result != -1 ) return back_result; + + if( g_settings.rage.bt_scan_all && !( g_settings.rage.preserve_fps && util::is_low_fps( ) ) ) { + for( auto& it : data ) { + if( &it == front ) continue; + if( &it == back ) break; + if( !it.is_valid( ) ) continue; + + auto result = check_record( &it, false ); + if( result != -1 ) return result; + } + } + + return -1; + } +} \ No newline at end of file diff --git a/cheat/gmod/ragebot_resolver.cpp b/cheat/gmod/ragebot_resolver.cpp new file mode 100644 index 0000000..0de8f13 --- /dev/null +++ b/cheat/gmod/ragebot_resolver.cpp @@ -0,0 +1,471 @@ +#include "ragebot.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "math.hpp" +#include "input_system.hpp" + +namespace features +{ + constexpr float FLT_ANG_LBY = 360.f; + constexpr float FLT_ANG_MOVING_LBY = -360.f; + constexpr float FLT_ANG_180 = 720.f; + constexpr float FLT_ANG_90 = -720.f; + constexpr float FLT_ANG_MINUS_90 = -480.f; + + static const std::vector< float > possible_angles_none = { + FLT_ANG_LBY, + FLT_ANG_MOVING_LBY, + FLT_ANG_180, + FLT_ANG_90, + FLT_ANG_MINUS_90, + 180.f + }; + + static const std::vector< float > possible_angles_adjust = { + FLT_ANG_MOVING_LBY, + 180.f, + FLT_ANG_180, + FLT_ANG_90, + FLT_ANG_MINUS_90, + -130.f, + 130.f, + }; + + static const std::vector< float > possible_angles_noadjust = { + FLT_ANG_MOVING_LBY, + 110.f, + FLT_ANG_180, + FLT_ANG_90, + FLT_ANG_MINUS_90, + 90.f, + -90.f + }; + + bool dbg_resolver( ) { + static con_var< bool > var{ &data::holder_, fnv( "dbg_resolver" ), false }; + return var( ); + } + + c_ragebot::c_resolver::resolve_log_t::resolve_log_t( ) { + auto register_vec = [ ]( c_ragebot::c_resolver::angle_vec_t* vec, const std::vector< float >& vec1 ) { + vec->clear( ); + + for( auto& it : vec1 ) { + vec->push_back( it ); + } + }; + + register_vec( &m_logged_angles[ 0 ], possible_angles_none ); + register_vec( &m_logged_angles[ 1 ], possible_angles_adjust ); + register_vec( &m_logged_angles[ 2 ], possible_angles_noadjust ); + } + + void c_ragebot::c_resolver::resolve_log_t::update( int ent_index ) { + static C_AnimationLayer last_layer[ 65 ]{ }; + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + if( !ent || ent == g_ctx.m_local || !ent->is_player( ) || !ent->is_alive( ) || ent->ce( )->IsDormant( ) ) { + m_was_invalid = true; + return; + } + + if( !( ent->m_fFlags( ) & FL_ONGROUND ) ) { + m_breaking = BREAKING_NONE; + return; + } + + //they moved since the last time they were dormant - reset the data + if( m_was_invalid && m_last_pos.dist_to( ent->m_vecOrigin( ) ) > 4.f ) { + m_last_pos = ent->m_vecOrigin( ); + reset( ); + } + + m_was_invalid = false; + m_shots %= 100; + float lby = ent->m_flLowerBodyYawTarget( ); + if( lby != m_last_lby ) { + m_last_lby = lby; + m_last_update = ent->m_flSimulationTime( ); + m_breaking = BREAKING_NONE; + } + + //filter out the first lby update + if( ent->m_flSimulationTime( ) - m_last_update > 0.1f ) { + C_AnimationLayer* adjust_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; + C_AnimationLayer* prev_layer = &last_layer[ ent_index ]; + + auto cur_seq = ent->get_seq_activity( adjust_layer->m_nSequence ); + auto old_seq = ent->get_seq_activity( prev_layer->m_nSequence ); + + if( old_seq == 979 && cur_seq == 979 && ( adjust_layer->m_flCycle != prev_layer->m_flCycle + || adjust_layer->m_flWeight == 1.f ) ) { + m_breaking = BREAKING_ADJUST; + m_last_adjust = ent->m_flSimulationTime( ); + } + else if( ent->m_flSimulationTime( ) - m_last_adjust > TICKS_TO_TIME( 14 ) ) { + m_breaking = BREAKING_NOADJUST; + } + + *prev_layer = *adjust_layer; + } + else { + m_breaking = BREAKING_NONE; + } + } + + void c_ragebot::c_resolver::resolve_log_t::reset( ) { + //assuming theyre STILL not moving this shouldnt change + //however if they are, it will be reset to none anyway + m_breaking = BREAKING_NONE; + m_last_adjust = 0.f; + m_last_update = 0.f; + m_last_lby = 0.f; + m_missed_shots = 0; + } + + void c_ragebot::c_resolver::resolve_log_t::reset_angles( ) { + std::vector< float > ang_vec; + auto& cur_vec = m_logged_angles[ m_breaking ]; + + switch( m_breaking ) { + case BREAKING_NONE: + ang_vec = possible_angles_none; + break; + case BREAKING_NOADJUST: + ang_vec = possible_angles_noadjust; + break; + case BREAKING_ADJUST: + ang_vec = possible_angles_adjust; + break; + } + + cur_vec.clear( ); + for( auto& it : ang_vec ) cur_vec.emplace_back( it ); + } + + void c_ragebot::c_resolver::resolve_log_t::blacklist_shot( int shots ) { + auto& angles = m_logged_angles[ m_breaking ]; + + if( angles.empty( ) ) { + reset_angles( ); + } + + shots %= angles.size( ); + + if( dbg_resolver( ) ) + g_con->log( "blacklisting angle: %f", angles.at( shots ).ang ); + + angles.at( shots ).missed = true; + } + + float c_ragebot::c_resolver::get_shot_yaw( int shots, int ent_index ) { + auto& data = m_data[ ent_index ]; + auto ang_vec = &data.m_logged_angles[ data.m_breaking ]; + + std::vector< float > angles; + + for( size_t i{ }; i < ang_vec->size( ); ++i ) { + if( !ang_vec->at( i ).missed ) { + angles.push_back( ang_vec->at( i ).ang ); + } + } + + if( angles.empty( ) ) { + data.reset_angles( ); + return ang_vec->at( 0 ).ang; + } + + if( angles.size( ) <= 1 ) { + return angles.at( 0 ); + } + + return angles[ shots % angles.size( ) ]; + } + + void c_ragebot::c_resolver::aimbot( int ent_index, int hitbox, vec3_t angle, vec3_t position ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + bool moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && ( ent->m_fFlags( ) & FL_ONGROUND ); + + if( moving && !ent->is_fakewalking( ) ) { + return; + } + + auto model = ent->ce( )->GetModel( ); + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); + + if( hitbox == HITBOX_HEAD ) { + auto box = set->pHitbox( 0 ); + if( box ) { + auto dist = box->bbmin.dist_to( box->bbmax ); + + context::shot_data_t new_shot{ }; + new_shot.m_angle = angle; + new_shot.m_enemy_pos = position; + new_shot.m_enemy_index = ent_index; + new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); + new_shot.m_resolver_shots = data.m_shots; + new_shot.m_resolver_state = true; + new_shot.m_hitbox_radius = dist; + new_shot.m_missed = true; + new_shot.m_hitgroup = HITGROUP_HEAD; + + g_ctx.m_last_shot++; + g_ctx.m_last_shot %= 128; + g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; + + g_ctx.m_has_incremented_shots = true; + data.m_snapshot[ g_ctx.m_last_shot ] = data; + + increment_shots( ent_index ); + data.blacklist_shot( data.m_shots ); + } + } + else { + matrix3x4 bone_matrix[ 128 ]; + if( model && hdr && set && ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) { + auto box = set->pHitbox( hitbox ); + if( !box ) return; + + auto origin = ent->m_vecOrigin( ); + + vec3_t shot_pos = position; + vec3_t rotated_center; + + vec3_t offset = position - origin; + float radius = offset.length2d( ); + float cos_ = offset.x / radius; + + float deg = RAD2DEG( acos( cos_ ) ); + if( offset.y < 0 ) deg = -deg; + + float rot = ( deg - 180.f ) * ( M_PI / 180.f ); + rotated_center.x = origin.x + cos( rot ) * radius; + rotated_center.y = origin.y + sin( rot ) * radius; + rotated_center.z = position.z; + + Ray_t ray; + CTraceFilterOneEntity filter; + CGameTrace tr_center; + CGameTrace tr_rot; + + filter.ent = ent; + + ray.Init( g_ctx.m_local->get_eye_pos( ), position ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_center ); + + ray.Init( g_ctx.m_local->get_eye_pos( ), rotated_center ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_rot ); + + bool is_within = tr_center.hitbox == tr_rot.hitbox; + + if( !is_within ) { + auto dist = box->bbmin.dist_to( box->bbmax ); + + context::shot_data_t new_shot{ }; + new_shot.m_angle = angle; + new_shot.m_enemy_pos = position; + new_shot.m_enemy_index = ent_index; + new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); + new_shot.m_resolver_shots = data.m_shots; + new_shot.m_resolver_state = true; + new_shot.m_hitbox_radius = dist; + new_shot.m_missed = true; + new_shot.m_hitgroup = util::hitbox_to_hitgroup( hitbox ); + + g_ctx.m_last_shot++; + g_ctx.m_last_shot %= 128; + g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; + + g_ctx.m_has_incremented_shots = true; + data.m_snapshot[ g_ctx.m_last_shot ] = data; + + increment_shots( ent_index ); + data.blacklist_shot( data.m_shots ); + } + } + } + //printf( "resolver: logging aimbot shot %d missed: %d state: %d time: %f\n", + // data.m_shots, data.m_missed_shots[ data.m_breaking ], data.m_breaking, g_Interfaces.Globals->curtime ); + } + + void c_ragebot::c_resolver::on_missed_spread( int ent_index, int shots ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + auto& snapshot = data.m_snapshot[ shots ]; + + auto& shot_vec = data.m_logged_angles[ snapshot.m_breaking ]; + + if( shot_vec.empty( ) ) { + data.reset_angles( ); + } + + if( shot_vec.size( ) <= 1 ) { + shot_vec.at( 0 ).missed = false; + } + else + shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).missed = false; + + + if( dbg_resolver( ) ) + g_con->log( "shot missed due to spread: %f", shot_vec.size( ) <= 1 ? shot_vec.at( 0 ).ang : shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).ang ); + + } + + void c_ragebot::c_resolver::listener( int ent_index, int shots ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + auto& snapshot = data.m_snapshot[ shots ]; + + auto& shot_vec = data.m_logged_angles[ snapshot.m_breaking ]; + + if( shot_vec.empty( ) ) { + data.reset_angles( ); + } + + if( shot_vec.size( ) <= 1 ) { + shot_vec.at( 0 ).missed = false; + } + else + shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).missed = false; + + data.m_shots = snapshot.m_shots; + + if( dbg_resolver( ) ) + g_con->log( "hit angle: %f", shot_vec.size( ) <= 1 ? shot_vec.at( 0 ).ang : shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).ang ); + + } + + void c_ragebot::c_resolver::frame_stage_notify( ) { + if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) + return; + + for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || ent == g_ctx.m_local || ent->ce( )->IsDormant( ) + || !ent->is_alive( ) || !g_cheat.m_player_mgr.is_cheater( i ) ) { + m_data[ i ].m_was_invalid = true; + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) + continue; + + m_data[ i ].update( i ); + if( g_settings.rage.resolver_override( ) ) { + if( g_input.is_key_pressed( g_settings.rage.resolver_override_key( ) ) ) { + int dir = manual_override( ent ); + if( dir ) { + //to be finished + m_data[ i ].m_overriding = dir; + continue; + } + } + } + + m_data[ i ].m_overriding = 0; + brute_force( ent ); + } + } + + void c_ragebot::c_resolver::force_yaw( c_base_player* ent, float yaw ) { + //could be used to just store resolved yaw on entities + //so then this data can be used in CM + ent->m_angEyeAngles( ).y = yaw;// + 180.f; + + //ent->ce( )->GetRenderAngles( ).y = yaw; + //auto new_ang = ent->get< vec3_t >( 0xc4 ); + //new_ang.y = yaw; + + //ent->set_abs_angles( new_ang ); + } + + int c_ragebot::c_resolver::manual_override( c_base_player* ent ) { + if( ent->m_vecVelocity( ).length2d( ) > 35.f ) { //no point in overriding moving targets, it will also fuck up backtrack records otherwise + return OVERRIDE_NONE; + } + + vec3_t pos; + vec3_t angle; + vec3_t local_angle; + vec3_t local_pos; + float delta; + float dist; + + + local_pos = g_ctx.m_local->m_vecOrigin( ); + g_csgo.m_engine( )->GetViewAngles( local_angle ); + pos = ent->get_hitbox_pos( 0 ); + + angle = math::vector_angles( local_pos, pos ); + dist = pos.dist_to( local_pos ); + delta = ( angle - local_angle ).clamp( ).y; + float yaw_delta = sin( DEG2RAD( ( angle - local_angle ).clamp( ).y ) ) * dist; + + if( std::abs( yaw_delta ) < 25.f ) { + force_yaw( ent, angle.y ); + return OVERRIDE_CENTER; + } + else { + force_yaw( ent, angle.y + ( ( delta < 0.f ) ? 90.f : -90.f ) ); + return delta > 0.f ? OVERRIDE_LEFT : OVERRIDE_RIGHT; + } + } + + void c_ragebot::c_resolver::force_lby( c_base_player* ent ) { + force_yaw( ent, ent->m_flLowerBodyYawTarget( ) ); + } + + void c_ragebot::c_resolver::brute_force( c_base_player* ent ) { + if( ent->m_vecVelocity( ).length( ) > 0.1f && !ent->is_fakewalking( ) ) { + m_data[ ent->ce( )->GetIndex( ) ].m_last_moving_lby = ent->m_flLowerBodyYawTarget( ); + force_lby( ent ); + return; + } + + int i = ent->ce( )->GetIndex( ); + auto& data = m_data[ i ]; + float start = ent->m_flLowerBodyYawTarget( ); + float new_yaw{ }; + float new_ang{ }; + int shots{ }; + + shots = data.m_shots; + new_ang = get_shot_yaw( shots, i ); + float ang; + if( g_ctx.run_frame( ) ) { + auto local_pos = g_ctx.m_local->m_vecOrigin( ); + auto enemy_pos = ent->m_vecOrigin( ); + + ang = math::vector_angles( enemy_pos, local_pos ); + } + else { + ang = start; + } + + if( new_ang == FLT_ANG_LBY ) + new_yaw = ent->m_flLowerBodyYawTarget( ); + else if( new_ang == FLT_ANG_MOVING_LBY ) + new_yaw = data.m_last_moving_lby; + else if( new_ang == FLT_ANG_180 ) + new_yaw = ang - 180.f; + else if( new_ang == FLT_ANG_90 ) + new_yaw = ang + 90.f; + else if( new_ang == FLT_ANG_MINUS_90 ) + new_yaw = ang - 90.f; + else + new_yaw = std::remainderf( start + new_ang, 360.f ); + + force_yaw( ent, new_yaw ); + } +} \ No newline at end of file diff --git a/cheat/gmod/render_view.cpp b/cheat/gmod/render_view.cpp new file mode 100644 index 0000000..c68a244 --- /dev/null +++ b/cheat/gmod/render_view.cpp @@ -0,0 +1,10 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" + +void __fastcall hooks::render_view( void* ecx, void* edx, CViewSetup& view, int clear_flags, int what_to_draw ) { + static auto render_view_o = g_gmod.m_view_render->get_old_function< decltype( &hooks::render_view ) >( 6 ); + if( g_gmod.m_panic ) return render_view_o( ecx, edx, view, clear_flags, what_to_draw ); + + render_view_o( ecx, edx, view, clear_flags, what_to_draw ); + g_cheat.m_visuals.store_data( ); +} \ No newline at end of file diff --git a/cheat/gmod/renderer.cpp b/cheat/gmod/renderer.cpp new file mode 100644 index 0000000..82b6432 --- /dev/null +++ b/cheat/gmod/renderer.cpp @@ -0,0 +1,94 @@ +#include "renderer.hpp" +#include "interface.hpp" + +#undef CreateFont + +/* +drawings::c_fonts g_fonts; +drawings::c_drawings g_renderer; + +NAMESPACE_REGION( drawings ) + +c_fonts::font_t::font_t( std::string name, int size, + int weight, ulong_t flags ) : + m_name( name ), m_size( size ), + m_weight( weight ), m_flags( flags ) { + g_fonts.m_container.push_back( this ); +}; + +void c_fonts::font_t::initialize( ) { + m_font = g_gmod.m_surface( )->CreateFont( ); + g_gmod.m_surface( )->SetFontGlyphSet( + m_font, m_name.c_str( ), m_size, + m_weight, 0, 0, + m_flags + ); +} + +void c_fonts::initialize( ) { + for( auto& it : m_container ) { + it->initialize( ); + } +} + +void c_drawings::draw_string( const wchar_t* text, HFont font, int x, int y, const clr_t& color ) { + g_gmod.m_surface( )->DrawSetTextPos( x, y ); + g_gmod.m_surface( )->DrawSetTextFont( font ); + g_gmod.m_surface( )->DrawSetTextColor( color ); + g_gmod.m_surface( )->DrawPrintText( text, wcslen( text ) ); +} + +void c_drawings::draw_rect( int x, int y, int w, int h, const clr_t& color ) { + g_gmod.m_surface( )->DrawSetColor( color ); + g_gmod.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); +} + +void c_drawings::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + g_gmod.m_surface( )->DrawSetColor( clr ); + g_gmod.m_surface( )->DrawLine( x, y, x1, y1 ); +} + +void c_drawings::draw_box( int x, int y, int w, int h, const clr_t& clr ) { + draw_line( x, y, x + w, y, clr ); + draw_line( x + w, y, x + w, y + h, clr ); + draw_line( x, y + h, x + w + 1, y + h, clr ); + draw_line( x, y, x, y + h, clr ); +} + +void c_drawings::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + g_gmod.m_surface( )->DrawSetColor( col ); + g_gmod.m_surface( )->DrawOutlinedCircle( x, y, r, res ); +} + +void c_drawings::draw_filled_circle( int x, int y, int r, const clr_t& col, int res ) { + vertex_t* v = ( vertex_t* )( _alloca( res * sizeof( vertex_t ) ) ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + v[ i ].init( x + x_off, y + y_off ); + } + + draw_polygon( res, v, col ); +} + +void c_drawings::draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& clr ) { + draw_line( ( int )begin.x, ( int )begin.y, ( int )end.x, ( int )end.y, clr ); +} + +void c_drawings::draw_polygon( int count, vertex_t* vertices, const clr_t& col ) { + static int texture = g_gmod.m_surface( )->CreateNewTextureID( true ); + + clr_t buf( 255, 255, 255 ); + + g_gmod.m_surface( )->DrawSetTextureRGBA( texture, ( byte* )( &buf ), 1, 1 ); + g_gmod.m_surface( )->DrawSetColor( col ); + g_gmod.m_surface( )->DrawSetTexture( texture ); + + g_gmod.m_surface( )->DrawTexturedPolygon( count, vertices ); +} + +END_REGION +*/ \ No newline at end of file diff --git a/cheat/gmod/renderer.hpp b/cheat/gmod/renderer.hpp new file mode 100644 index 0000000..1ae0c00 --- /dev/null +++ b/cheat/gmod/renderer.hpp @@ -0,0 +1,120 @@ +#pragma once +#include +#include +#include + +#include "util.hpp" +#include "sdk.hpp" + +enum e_font_style : size_t { + +}; + +enum FontAlign_t : size_t { + ALIGN_CENTER, + ALIGN_LEFT, + ALIGN_RIGHT +}; + +NAMESPACE_REGION( drawings ) + + +class c_fonts { +protected: + struct font_t { + friend class c_fonts; + font_t( std::string name, int size, + int weight, ulong_t flags ); + + operator HFont( ) { + return m_font; + } + + private: + void initialize( ); + + HFont m_font; + std::string m_name; + int m_size; + int m_weight; + ulong_t m_flags; + }; + + std::vector< font_t* > m_container; + friend struct c_fonts::font_t; +public: + void initialize( ); + + font_t f_esp_small{ xors( "Tahoma" ), 11, 500, FONTFLAG_OUTLINE }; + font_t f_bold{ xors( "Verdana" ), 18, 900, FONTFLAG_DROPSHADOW | FONTFLAG_ANTIALIAS }; + font_t f_12{ xors( "Verdana" ), 12, 700, 128 }; + font_t f_14{ xors( "Verdana" ), 14, 700, 128 }; + font_t f_16{ xors( "Verdana" ), 16, 700, 128 }; + font_t f_18{ xors( "Verdana" ), 18, 700, 128 }; +}; + + + +//im going to fill ur triangles +class c_drawings { +private: + //dumb hacky fix for template functions + void draw_string( const wchar_t* msg, HFont font, int x, int y, const clr_t& color ); + +public: + void draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& color ); + void draw_line( int x, int y, int x1, int y2, const clr_t& color ); + void draw_rect( int x, int y, int w, int h, const clr_t& color ); + void draw_box( int x, int y, int w, int h, const clr_t& color ); //thicc + void draw_polygon( int count, vertex_t* vertices, const clr_t& col ); + void draw_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + void draw_filled_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + + template < FontAlign_t align = ALIGN_LEFT > //fuck ur sprintf nigga varargs nigga + void draw_string( HFont font, int x, int y, const clr_t& color, const wchar_t* msg, ... ) { + wchar_t* buffer = ( wchar_t* )_alloca( 2048 ); + va_list list{ }; + int wide, tall; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vswprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + g_gmod.m_surface( )->GetTextSize( + font, buffer, wide, tall ); + + switch( align ) { + case ALIGN_CENTER: + x -= wide / 2; + break; + case ALIGN_RIGHT: + x -= wide; + break; + default: break; + } + + draw_string( buffer, font, x, y, color ); + } + + template < FontAlign_t align = ALIGN_LEFT > //debatable whether it should be center or not + void draw_string( HFont font, int x, int y, const clr_t& color, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + auto wide_str = util::ascii_to_unicode( buffer ); + draw_string< align >( font, x, y, color, wide_str.c_str( ) ); + } +}; + +END_REGION + +extern drawings::c_fonts g_fonts; +extern drawings::c_drawings g_renderer; \ No newline at end of file diff --git a/cheat/gmod/run_command.cpp b/cheat/gmod/run_command.cpp new file mode 100644 index 0000000..fad382d --- /dev/null +++ b/cheat/gmod/run_command.cpp @@ -0,0 +1,18 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::run_command( void* ecx_, void* edx_, IClientEntity* entity, user_cmd_t* ucmd, IMoveHelper* move_helper) { + static auto run_command_o = g_gmod.m_prediction->get_old_function< decltype( &hooks::run_command ) >( 17 ); + if( g_gmod.m_panic ) return run_command_o( ecx_, edx_, entity, ucmd, move_helper ); + + if( g_settings.misc.no_recoil ) { + vec3_t angle; + g_gmod.m_engine( )->GetViewAngles( angle ); + run_command_o( ecx_, edx_, entity, ucmd, move_helper ); // weapon events are done during prediction, any viewangle change( could be recoil could be not ) during these weapon events will be changed back to its original state. + g_gmod.m_engine( )->SetViewAngles( angle ); + } + else { + run_command_o( ecx_, 0, entity, ucmd, move_helper ); + } +} diff --git a/cheat/gmod/scene_end.cpp b/cheat/gmod/scene_end.cpp new file mode 100644 index 0000000..1e42543 --- /dev/null +++ b/cheat/gmod/scene_end.cpp @@ -0,0 +1,43 @@ +#include "hooks.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::scene_end( void* ecx_, void* edx_ ) { + static auto scene_end_o = g_csgo.m_render_view->get_old_function< decltype( &hooks::scene_end ) >( 9 ); + scene_end_o( edx_, 0 ); + + if( !g_csgo.m_panic && g_ctx.m_local && g_settings.visuals.chams.enabled( ) && g_settings.visuals.chams.ignore_z( ) ) { + g_ctx.m_drawing_screneend = true; + for( int i = 1; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) ) { + if( ent == g_ctx.m_local && ent->m_bIsScoped( ) ) { + continue; + } + + int team = ent->m_iTeamNum( ); + bool enemy = team != g_ctx.m_local->m_iTeamNum( ); + + if( enemy || g_settings.visuals.chams.friendlies( ) ) { + IMaterial* mat = g_settings.visuals.chams.flat ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; + fclr_t clr_vis = enemy ? g_settings.visuals.chams.color_visible_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_visible_friendly( ).to_fclr( ); + fclr_t clr_hid = enemy ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); + g_cheat.m_chams.m_materials.force_material( mat, clr_hid ); + ent->ce( )->DrawModel( 0x1, 255 ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + g_cheat.m_chams.m_materials.force_material( mat, clr_vis ); + ent->ce( )->DrawModel( 0x1, 255 ); + + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); + } + } + } + + g_ctx.m_drawing_screneend = false; + } +} \ No newline at end of file diff --git a/cheat/gmod/sdk.hpp b/cheat/gmod/sdk.hpp new file mode 100644 index 0000000..fbed28a --- /dev/null +++ b/cheat/gmod/sdk.hpp @@ -0,0 +1,26 @@ +#pragma once +#include "vector.hpp" + +#include "IClientMode.hpp" +#include "CHLClient.hpp" +#include "ISurface.hpp" +#include "IPanel.hpp" +#include "IVEngineClient.hpp" +#include "IClientEntityList.hpp" +#include "GlobalVars_t.hpp" +#include "IPrediction.hpp" +#include "ICvar.hpp" +#include "IVModelInfoClient.hpp" +#include "IMaterialSystem.hpp" +#include "IEngineTrace.hpp" +#include "IVRenderView.hpp" +#include "IPhysicsSurfaceProps.hpp" +#include "CUtlVector.hpp" +#include "IMemAlloc.hpp" +#include "IGameEventManager.hpp" +#include "KeyValues.hpp" +#include "CInput.hpp" +#include "bf_write.hpp" +#include "CLuaShared.hpp" + +#include "c_base_player.hpp" \ No newline at end of file diff --git a/cheat/gmod/send_datagram.cpp b/cheat/gmod/send_datagram.cpp new file mode 100644 index 0000000..dc55887 --- /dev/null +++ b/cheat/gmod/send_datagram.cpp @@ -0,0 +1,29 @@ +#include "base_cheat.hpp" +#include "hooks.hpp" + +int __fastcall hooks::send_datagram( INetChannel* channel, void* edx_, void* datagram ) { + auto send_datagram_o = g_csgo.m_net_channel->get_old_function< decltype( &hooks::send_datagram ) >( 48 ); + if( g_csgo.m_panic || !g_settings.misc.net_fakelag || datagram ) { + return send_datagram_o( channel, 0, datagram ); + } + + int backup_state = channel->m_nInReliableState; + int backup_sequence = channel->m_nInSequenceNr; + //int backup_o_state = channel->m_nOutReliableState; + + if( g_settings.misc.net_fakelag != 4 && g_settings.misc.net_fakeping_amount ) + g_cheat.m_extra.add_latency( channel ); + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci && g_settings.misc.net_fakelag == 4 && g_cheat.m_ragebot.can_fakeping( ) ) { + channel->m_nInReliableState = backup_state; + channel->m_nInSequenceNr = backup_sequence + 10; + } + + int ret = send_datagram_o( channel, 0, datagram ); + + channel->m_nInReliableState = backup_state; + channel->m_nInSequenceNr = backup_sequence; + + return ret; +} \ No newline at end of file diff --git a/cheat/gmod/settings.hpp b/cheat/gmod/settings.hpp new file mode 100644 index 0000000..0033391 --- /dev/null +++ b/cheat/gmod/settings.hpp @@ -0,0 +1,276 @@ +#pragma once +#include "simple_settings.hpp" +#include "strings.hpp" +#include "color.hpp" + +//later i will implement a way to load all config files + +namespace data +{ + extern SettingHolder holder_; + + class c_settings { + public: + void load( ) { + switch( menu.cur_setting ) { + case 0: + holder_.load( "", xors( "./garrysmod/cfg/money_legit.cfg" ) ); + break; + case 1: + holder_.load( "", xors( "./garrysmod/cfg/money_closet.cfg" ) ); + break; + case 2: + holder_.load( "", xors( "./garrysmod/cfg/money_rage1.cfg" ) ); + break; + case 3: + holder_.load( "", xors( "./garrysmod/cfg/money_rage2.cfg" ) ); + break; + } + } + + void save( ) { + switch( menu.cur_setting ) { + case 0: + holder_.save( "", xors( "./garrysmod/cfg/money_legit.cfg" ) ); + break; + case 1: + holder_.save( "", xors( "./garrysmod/cfg/money_closet.cfg" ) ); + break; + case 2: + holder_.save( "", xors( "./garrysmod/cfg/money_rage1.cfg" ) ); + break; + case 3: + holder_.save( "", xors( "./garrysmod/cfg/money_rage2.cfg" ) ); + break; + } + } + + struct { + con_var< bool > enabled{ &holder_, fnv( "rage_enabled" ), false }; + con_var< int > activation_type{ &holder_, fnv( "rage_activation_type" ), 0 }; + con_var< float > fov{ &holder_, fnv( "rage_fov" ), 0.f }; + con_var< int > hitbox{ &holder_, fnv( "rage_hitbox" ), false }; + con_var< bool > auto_fire{ &holder_, fnv( "rage_auto_fire" ), false }; + + struct { + con_var< bool > head{ &holder_, fnv( "rage_hitscan_head" ), true }; + con_var< bool > body{ &holder_, fnv( "rage_hitscan_body" ), true }; + con_var< bool > arms{ &holder_, fnv( "rage_hitscan_arms" ), false }; + con_var< bool > legs{ &holder_, fnv( "rage_hitscan_legs" ), false }; + } hitscan; + + con_var< bool > nospread{ &holder_, fnv( "rage_no_spread" ), false }; + con_var< bool > norecoil{ &holder_, fnv( "rage_no_recoil" ), false }; + con_var< bool > ignore_limbs_moving{ &holder_, fnv( "rage_ignore_limbs_moving" ), false }; + con_var< int > silent{ &holder_, fnv( "rage_silent" ), false }; + con_var< int > aimkey{ &holder_, fnv( "rage_key" ), 0 }; + con_var< bool > auto_scope{ &holder_, fnv( "rage_auto_scope" ), false }; + con_var< bool > auto_stop{ &holder_, fnv( "rage_auto_stop" ), false }; + con_var< bool > spread_limit{ &holder_, fnv( "rage_spread_limit" ), false }; + con_var< float > min_spread{ &holder_, fnv( "rage_min_spread" ), 100.f }; + con_var< bool > resolver{ &holder_, fnv( "rage_resolver" ), false }; + con_var< bool > resolver_override{ &holder_, fnv( "rage_resolver_override" ), false }; + con_var< int > resolver_override_key{ &holder_, fnv( "override_key" ), 0 }; + con_var< bool > bt_scan_all{ &holder_, fnv( "rage_scan_all_records" ), false }; + con_var< bool > bt_visualize{ &holder_, fnv( "rage_visualize_records" ), false }; + con_var< clr_t > bt_col{ &holder_, fnv( "rage_bt_color" ), clr_t( 150, 150, 150, 20 ) }; + con_var< bool > preserve_fps{ &holder_, fnv( "rage_preserve_fps" ), false }; + con_var< int > multipoint{ &holder_, fnv( "rage_multipoint" ), false }; + con_var< float > point_scale{ &holder_, fnv( "rage_point_scale" ), 1.0f }; + + con_var< int > selection_type{ &holder_, fnv( "rage_selection_type" ) }; + con_var< bool > prefer_moving{ &holder_, fnv( "rage_prefer_moving" ) }; + con_var< bool > prefer_low_hp{ &holder_, fnv( "rage_low_hp" ) }; + + con_var< bool > ignore_team{ &holder_, fnv( "rage_ignoreteam" ), false }; + con_var< bool > ignore_teamcolor{ &holder_, fnv( "rage_ignoreteamcolor" ), false }; + con_var< bool > ignore_spawnprot{ &holder_, fnv( "rage_ignorespawnprot" ), false }; + con_var< bool > ignore_noclip{ &holder_, fnv( "rage_ignorenoclip" ), false }; + + + + struct { + con_var< int > mode{ &holder_, fnv( "fakelag_mode" ), 0 }; + con_var< int > ticks{ &holder_, fnv( "fakelag_ticks" ), 0 }; + con_var< int > fluctuate{ &holder_, fnv( "fakelag_fluctuate" ), 0 }; + con_var< bool > in_air{ &holder_, fnv( "fakelag_in_air" ), false }; + con_var< bool > on_peek{ &holder_, fnv( "fakelag_on_peek" ), false }; + con_var< bool > in_move{ &holder_, fnv( "fakelag_in_move" ), false }; + con_var< bool > in_attack{ &holder_, fnv( "fakelag_in_attack" ), false }; + con_var< bool > avoid_ground{ &holder_, fnv( "fakelag_avoid_ground" ), false }; + } fakelag; + + con_var< bool > anti_aim{ &holder_, fnv( "rage_anti_aim" ), false }; + con_var< bool > dormant_check{ &holder_, fnv( "rage_dormant_check" ), false }; + con_var< bool > at_players{ &holder_, fnv( "rage_at_players" ), false }; + con_var< int > pitch{ &holder_, fnv( "rage_pitch" ), 0 }; + con_var< int > pitch_offset{ &holder_, fnv( "rage_pitch_offset" ), 0 }; + + con_var< int > real_yaw{ &holder_, fnv( "rage_real_yaw" ), 0 }; + con_var< int > real_yaw_add{ &holder_, fnv( "rage_real_yaw_add" ), 0 }; + con_var< int > real_yaw_jitter{ &holder_, fnv( "rage_real_jitter" ), 0 }; + + con_var< int > fake_yaw{ &holder_, fnv( "rage_fake_yaw" ), 0 }; + con_var< int > fake_yaw_add{ &holder_, fnv( "rage_fake_yaw_add" ), 0 }; + con_var< int > fake_yaw_jitter{ &holder_, fnv( "rage_fake_jitter" ), 0 }; + + con_var< int > real_yaw_moving{ &holder_, fnv( "rage_real_yaw_moving" ), 0 }; + con_var< int > real_yaw_moving_add{ &holder_, fnv( "rage_real_yaw_moving_add" ), 0 }; + con_var< int > real_moving_jitter{ &holder_, fnv( "rage_real_moving_jitter" ), 0 }; + + con_var< int > fake_yaw_moving{ &holder_, fnv( "rage_fake_yaw_moving" ), 0 }; + con_var< int > fake_yaw_moving_add{ &holder_, fnv( "rage_fake_yaw_moving_add" ), 0 }; + con_var< int > fake_moving_jitter{ &holder_, fnv( "rage_fake_moving_jitter" ), 0 }; + + con_var< int > edge_detection{ &holder_, fnv( "rage_edge_dtc" ), 0 }; + con_var< int > edge_dtc_jitter{ &holder_, fnv( "rage_edge_dtc_jitter" ), 0 }; + + con_var< int > edge_dtc_normal{ &holder_, fnv( "rage_edge_dtc_normal" ), 0 }; + con_var< int > edge_dtc_type{ &holder_, fnv( "rage_edge_dtc_type" ), 0 }; + con_var< int > edge_dtc_standing{ &holder_, fnv( "rage_edge_dtc_standing" ), 100 }; + con_var< int > edge_dtc_moving{ &holder_, fnv( "rage_edge_dtc_moving" ), 100 }; + con_var< int > edge_dtc_priority{ &holder_, fnv( "rage_edge_dtc_priority" ), 0 }; + + con_var< bool > break_lby{ &holder_, fnv( "rage_break_lby" ), 0 }; + con_var< int > lby_delta{ &holder_, fnv( "rage_lby_delta" ), 0 }; + + con_var< bool > fakewalk{ &holder_, fnv( "rage_fakewalk" ), 0 }; + con_var< int > fakewalk_key{ &holder_, fnv( "rage_fakewalk_key" ), 0 }; + con_var< int > fakewalk_ticks{ &holder_, fnv( "rage_fakewalk_ticks" ), 7 }; + + con_var< bool > draw_angles{ &holder_, fnv( "rage_draw_angles" ), false }; + con_var< clr_t > real_color{ &holder_, fnv( "rage_real_color" ), clr_t( 255, 255, 255, 150 ) }; + con_var< clr_t > lby_color{ &holder_, fnv( "rage_lby_color" ), clr_t( 231, 105, 105, 150 ) }; + + con_var< bool > angle_step{ &holder_, fnv( "rage_angle_step" ), false }; + con_var< int > angle_step_degrees{ &holder_, fnv( "range_angle_step_degrees" ), false }; + } rage; + + struct { + struct { + con_var< bool > enabled{ &holder_, fnv( "visuals_chams_enabled" ), 0 }; + con_var< bool > flat{ &holder_, fnv( "visuals_chams_flat" ), 0 }; + con_var< bool > ignore_z{ &holder_, fnv( "visuals_chams_ignore_z" ), 0 }; + con_var< float > reflectivity{ &holder_, fnv( "visuals_chams_reflectivity" ), 1.0f }; + con_var< float > shine{ &holder_, fnv( "visuals_chams_shine" ), 1.0f }; + con_var< bool > friendlies{ &holder_, fnv( "visuals_chams_friendlies" ), 0 }; + con_var< clr_t > color_visible_friendly{ &holder_, fnv( "visuals_chams_color_friendly" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > color_visible_enemy{ &holder_, fnv( "visuals_chams_color_enemy" ), clr_t( 255, 255, 0 ) }; + con_var< clr_t > color_hidden_friendly{ &holder_, fnv( "visuals_chams_color_h_friendly" ), clr_t( 0, 0, 255 ) }; + con_var< clr_t > color_hidden_enemy{ &holder_, fnv( "visuals_chams_color_h_enemy" ), clr_t( 255, 0, 0 ) }; + } chams; + + con_var< int > activation_type{ &holder_, fnv( "visuals_activation" ), false }; + con_var< bool > box{ &holder_, fnv( "visuals_box" ), false }; + con_var< bool > dormant{ &holder_, fnv( "visuals_dormant" ), false }; + con_var< bool > health{ &holder_, fnv( "visuals_health" ), false }; + con_var< bool > weapon{ &holder_, fnv( "visuals_weapon" ), false }; + con_var< bool > name{ &holder_, fnv( "visuals_name" ), false }; + con_var< bool > rank{ &holder_, fnv( "visuals_rank" ), false }; + con_var< bool > out_of_pov{ &holder_, fnv( "visuals_out_of_pov" ), false }; + con_var< bool > ignore_team{ &holder_, fnv( "visuals_ignoreteam" ), false }; + con_var< bool > ignore_teamcolor{ &holder_, fnv( "visuals_ignoreteamcolor" ), false }; + + con_var< bool > skeleton{ &holder_, fnv( "visuals_skeleton" ) }; + con_var< bool > glow{ &holder_, fnv( "visuals_glow" ), false }; + con_var< bool > flags{ &holder_, fnv( "visuals_flags" ), false }; + con_var< bool > resolver_indicator{ &holder_, fnv( "visuals_resolver_indicator" ), false }; + con_var< bool > ammo{ &holder_, fnv( "visuals_ammo" ), false }; + con_var< bool > money{ &holder_, fnv( "visuals_money" ) }; + con_var< bool > ping{ &holder_, fnv( "visuals_ping" ) }; + con_var< bool > floating_ragdolls{ &holder_, fnv( "visuals_floating_ragdolls" ) }; + con_var< clr_t > box_enemy{ &holder_, fnv( "visuals_clr_enemy" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > box_friendly{ &holder_, fnv( "visuals_clr_friendly" ), clr_t( 255, 0, 255 ) }; + + con_var< clr_t > glow_enemy{ &holder_, fnv( "visuals_glow_enemy" ), clr_t( 255, 0, 255, 150 ) }; + con_var< clr_t > glow_friendly{ &holder_, fnv( "visuals_glow_friendly" ), clr_t( 255, 120, 0, 150 ) }; + con_var< clr_t > skeleton_enemy{ &holder_, fnv( "visuals_skeleton_enemy" ), clr_t( 255, 255, 255 ) }; + con_var< clr_t > skeleton_friendly{ &holder_, fnv( "visuals_skeleton_friendly" ), clr_t( 255, 255, 255 ) }; + + con_var< bool > bullet_tracers{ &holder_, fnv( "visuals_bullet_tracers" ), false }; + + con_var< int > key{ &holder_, fnv( "visuals_key" ), 0 }; + con_var< bool > hitmarkers{ &holder_, fnv( "visuals_hitmarkers" ), false }; + bool active = true; + + con_var< bool > world_modulate{ &holder_, fnv( "visuals_world_modulate" ), false }; + con_var< bool > night_mode{ &holder_, fnv( "visuals_night_mode" ), false }; + con_var< bool > transparent_props{ &holder_, fnv( "visuals_transparent_props" ), false }; + + con_var< bool > recoil_crosshair{ &holder_, fnv( "misc_recoil_crosshair" ), false }; + con_var< bool > autowall_crosshair{ &holder_, fnv( "visual_recoil_crosshair" ), false }; + con_var< bool > draw_spread{ &holder_, fnv( "visual_draw_spread" ), false }; + con_var< bool > snipers_crosshair{ &holder_, fnv( "visuals_sniper_crosshair" ), false }; + con_var< bool > grenade_prediction{ &holder_, fnv( "visuals_grenade_prediction" ), false }; + + con_var< int > weapon_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; + con_var< int > grenade_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; + + con_var< clr_t > weapon_esp_clr{ &holder_, fnv( "visuals_weapon_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + con_var< clr_t > grenade_esp_clr{ &holder_, fnv( "visuals_grenade_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + + con_var< bool > spec_list{ &holder_, fnv( "visuals_spec_list" ), false }; + con_var< bool > radar{ &holder_, fnv( "visuals_radar" ), false }; + } visuals; + + struct { + con_var< bool > watermark{ &holder_, fnv( "misc_watermark" ), false }; + con_var< bool > bunny_hop{ &holder_, fnv( "misc_bhop" ), false }; + con_var< bool > auto_strafe{ &holder_, fnv( "misc_autostrafe" ), false }; + con_var< bool > circle_strafe{ &holder_, fnv( "misc_circlestrafe" ), false }; + con_var< int > circle_strafe_key{ &holder_, fnv( "misc_circle_key" ), 0 }; + con_var< bool > edge_jump{ &holder_, fnv( "misc_edgejump" ), false }; + con_var< int > edge_jump_key{ &holder_, fnv( "misc_edge_jump_key" ), false }; + con_var< bool > auto_jumpbug{ &holder_, fnv( "misc_auto_jumpbug" ), false }; + con_var< int > auto_jumpbug_key{ &holder_, fnv( "misc_auto_jumpbug_key" ), 0 }; + con_var< bool > show_jump_stats{ &holder_, fnv( "misc_show_jump_stats" ), 0 }; + con_var< int > viewmodel_fov{ &holder_, fnv( "misc_viewmodel_fov" ), 0 }; + con_var< int > fov_changer{ &holder_, fnv( "fov_changer" ), 90 }; + con_var< bool > clantag_changer{ &holder_, fnv( "misc_clantag" ), false }; + con_var< bool > log_hits{ &holder_, fnv( "misc_log_hits" ) }; + con_var< int > name_changer{ &holder_, fnv( "misc_namechanger" ), 0 }; + con_var< bool > thirdperson{ &holder_, fnv( "misc_thirdperson" ), false }; + con_var< int > thirdperson_key{ &holder_, fnv( "misc_tp_key" ), 0 }; + con_var< bool > auto_accept{ &holder_, fnv( "misc_autoaccept" ), false }; + con_var< int > auto_accept_delay{ &holder_, fnv( "misc_autoaccept_delay" ), 0 }; + con_var< int > net_fakelag{ &holder_, fnv( "misc_net_fakelag" ), false }; + con_var< int > net_fakeping_amount{ &holder_, fnv( "net_fakeping_amount" ), 0 }; + con_var< int > net_fakeping_key{ &holder_, fnv( "net_fakeping_key" ), 0 }; + bool net_fakeping_active = false; + + con_var< bool > rank_reveal{ &holder_, fnv( "misc_rank_reveal" ), 0 }; + con_var< bool > unlock_inventory{ &holder_, fnv( "misc_unlock_inventory" ), 0 }; + con_var< bool > auto_revolver{ &holder_, fnv( "misc_auto_revolver" ), 0 }; + con_var< bool > no_scope{ &holder_, fnv( "misc_no_scope" ), false }; + con_var< bool > no_recoil{ &holder_, fnv( "misc_no_recoil" ), false }; + con_var< bool > no_smoke{ &holder_, fnv( "misc_no_smoke" ), false }; + con_var< bool > no_flash{ &holder_, fnv( "misc_no_flash" ), false }; + con_var< bool > transparent_vm{ &holder_, fnv( "misc_transparent_vm" ), false }; + con_var< bool > disable_post_process{ &holder_, fnv( "misc_disable_post_process" ), false }; + con_var< int > recording_start_key{ &holder_, fnv( "recording_start_key" ), 0 }; + con_var< int > recording_stop_key{ &holder_, fnv( "recording_stop_key" ), 0 }; + con_var< int > recording_show_angles{ &holder_, fnv( "recording_show_angles" ), 0 }; + + con_var< bool > use_spam{ &holder_, fnv( "misc_use_spam" ), false }; + con_var< int > use_spam_key{ &holder_, fnv( "misc_use_spam_key" ), 0 }; + + bool recorder_enable = false; + } misc; + + struct { + con_var< uint8_t > menu_color_1r{ &holder_, fnv( "menu_color_1r" ), 231 }; + con_var< uint8_t > menu_color_1g{ &holder_, fnv( "menu_color_1g" ), 105 }; + con_var< uint8_t > menu_color_1b{ &holder_, fnv( "menu_color_1b" ), 105 }; + + con_var< uint8_t > menu_color_2r{ &holder_, fnv( "menu_color_2r" ), 0xf4 }; + con_var< uint8_t > menu_color_2g{ &holder_, fnv( "menu_color_2g" ), 0x7c }; + con_var< uint8_t > menu_color_2b{ &holder_, fnv( "menu_color_2b" ), 0xa8 }; + + bool open = false; + bool logs_enable = false; + int cur_setting = 0; + } menu; + }; +} + +extern data::c_settings g_settings; \ No newline at end of file diff --git a/cheat/gmod/simple_settings.cpp b/cheat/gmod/simple_settings.cpp new file mode 100644 index 0000000..156151a --- /dev/null +++ b/cheat/gmod/simple_settings.cpp @@ -0,0 +1,32 @@ +#include "settings.hpp" + +SettingHolder data::holder_{ "iloveyou" }; +data::c_settings g_settings; + +#pragma warning(disable: 4996) + +void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< const uint8_t* >( src ); + + for ( size_t i = 0; i < size; i++ ) + sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); + + WritePrivateProfileStringA( path, name, buffer, filename ); +} + +void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< uint8_t* >( dest ); + + GetPrivateProfileStringA( path, name, "", buffer, size * 2 + 1, filename ); + + if ( *buffer == 0 ) + return; + + for ( size_t i = 0; i < size; i++ ) { + unsigned temp; + sscanf( &buffer[ 2 * i ], "%02X", &temp ); + data[ i ] = temp; + } +} \ No newline at end of file diff --git a/cheat/gmod/simple_settings.hpp b/cheat/gmod/simple_settings.hpp new file mode 100644 index 0000000..e3a8655 --- /dev/null +++ b/cheat/gmod/simple_settings.hpp @@ -0,0 +1,171 @@ +#pragma once +#include +#include +#include +#include + +#include "util.hpp" +#include "fnv.hpp" + +//nama stuff +extern void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ); +extern void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ); + +class ISettingNode { +public: + virtual ~ISettingNode( ) = default; + + virtual void load( const char* path, const char* file ) = 0; + virtual void save( const char* path, const char* file ) const = 0; + virtual void register_( ISettingNode* node_ptr ) = 0; + virtual hash_t get_hash( ) { return 0; } +}; + +class SettingHolder : public ISettingNode { +public: + __forceinline SettingHolder( const char* name ) : name_( name ) {} + __forceinline SettingHolder( SettingHolder* holder_ptr, const char* name ) : name_( name ) { holder_ptr->register_( this ); } + + void register_( ISettingNode* node_ptr ) override { + setting_nodes_.push_back( node_ptr ); + } + + void load( const char* path, const char* file ) override { + char full_path[ 64 ]; + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_ ); + for ( auto x : setting_nodes_ ) + x->load( full_path, file ); + } + + void save( const char* path, const char* file ) const override { + char full_path[ 64 ]; + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_ ); + for ( auto x : setting_nodes_ ) + x->save( full_path, file ); + } + + auto& get_nodes( ) { + return setting_nodes_; + } + +private: + const char* name_; + std::vector setting_nodes_; +}; + +class ISetting : public ISettingNode { + void register_( ISettingNode* node_ptr ) override {} +public: + virtual void set( float value ) = 0; + virtual void set( int value ) = 0; + virtual void set( ulong_t value ) = 0; + virtual std::string get_string( ) = 0; + virtual hash_t get_hash( ) = 0; +}; + +template < size_t L > +class SettingString : ISetting { +public: + __forceinline SettingString( SettingHolder* holder_ptr, hash_t hash ) : + m_name( name ), m_value( "" ) { + holder_ptr->register_( this ); + }; + + void load( const char* path, const char* file ) override { + GetPrivateProfileStringA( path, std::to_string( m_name ).c_str( ), "", m_value, L, file ); + } + + void save( const char* path, const char* file ) const override { + WritePrivateProfileStringA( path, std::to_string( m_name ).c_str( ), m_value, file ); + } + + char* get( ) { + return m_value; + } + +private: + char m_value[ L ]; + hash_t m_name; +}; + +template < typename T > +class con_var : public ISetting { +public: + __forceinline con_var( SettingHolder* holder_ptr, hash_t name ) : + name_( name ), + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + __forceinline con_var( SettingHolder* holder_ptr, hash_t name , const T& rhs ) : + value_( rhs ), + name_( name ), + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + + void load( const char* path, const char* file ) override { simple_load( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } + + void save( const char* path, const char* file ) const override { simple_save( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } + + __forceinline operator T&( ) { return value_; } + __forceinline T* operator &( ) { return &value_; } + + __forceinline T& operator ()( ) { return value_; } + + virtual std::string get_string( ) { + if constexpr( std::is_arithmetic_v< T > ) { + return std::to_string( value_ ); + } + else { + return util::to_hex_str( *( ulong_t* )( &value_ ) ); + } + } + + virtual void set( float value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + } + + virtual void set( int value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + else { + value_ = *( T* )( &value ); + } + } + + virtual void set( ulong_t value ) { + if constexpr( sizeof( T ) == sizeof( ulong_t ) ) { + *( ulong_t* )( &value_ ) = value; + return; + } + + memcpy( &value_, &value, sizeof( value_ ) ); + } + + virtual hash_t get_hash( ) { + return name_; + } + + __forceinline bool is_floating_point( ) { + return is_float_; + } + + __forceinline bool is_integral( ) { + return is_integral_; + } + +private: + hash_t name_; + bool is_float_; + bool is_integral_; + T value_; +}; \ No newline at end of file diff --git a/cheat/gmod/skins.cpp b/cheat/gmod/skins.cpp new file mode 100644 index 0000000..9564abf --- /dev/null +++ b/cheat/gmod/skins.cpp @@ -0,0 +1,75 @@ +#include "skins.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "interface.hpp" + +namespace features +{ + int c_skins::get_knife_index( ) { + switch( g_settings.misc.skins.knife( ) ) { + case 0: + return 0; + case 1: + return 500; + case 2: + return 505; + case 3: + return 506; + case 4: + return 507; + case 5: + return 508; + case 6: + return 509; + } + + return 0; + } + + const char* c_skins::get_model_str( ) { + switch( g_settings.misc.skins.knife( ) ) { + case 0: + return 0; + case 1: + return xors( "models/weapons/v_knife_bayonet.mdl" ); + case 2: + return xors( "models/weapons/v_knife_flip.mdl" ); + case 3: + return xors( "models/weapons/v_knife_gut.mdl" ); + case 4: + return xors( "models/weapons/v_knife_karam.mdl" ); + case 5: + return xors( "models/weapons/v_knife_m9_bay.mdl" ); + case 6: + return xors( "models/weapons/v_knife_tactical.mdl" ); + } + + return nullptr; + } + + void c_skins::override_knife( ) { + auto weapons = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2DE8 ); + for( int i{ }; weapons[ i ]; ++i ) { + auto wep = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weapons[ i ] ); + auto vm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hViewModel( ) ); + if( wep && wep->is_knife( ) ) { + int index = get_knife_index( ); + if( index ) { + int model = g_csgo.m_model_info( )->GetModelIndex( get_model_str( ) ); + + wep->m_iItemDefinitionIndex( ) = index; + wep->m_nModelIndex( ) = model; + if( weapons[ i ] == g_ctx.m_local->m_hActiveWeapon( ) ) { + vm->m_nModelIndex( ) = model; + } + } + } + } + } + + void c_skins::operator()( ) { + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + override_knife( ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/skins.hpp b/cheat/gmod/skins.hpp new file mode 100644 index 0000000..4ce5971 --- /dev/null +++ b/cheat/gmod/skins.hpp @@ -0,0 +1,14 @@ +#pragma once + +namespace features +{ + class c_skins { + private: + int get_knife_index( ); + const char* get_model_str( ); + + void override_knife( ); + public: + void operator()( ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/strings.hpp b/cheat/gmod/strings.hpp new file mode 100644 index 0000000..dfdeb8b --- /dev/null +++ b/cheat/gmod/strings.hpp @@ -0,0 +1,162 @@ +//-------------------------------------------------------------------------------- +//-- XorCompileTime.hpp +// +// Author: frk +// Date: 12.12.2015 +// +//-------------------------------------------------------------------------------- + +#pragma once +#include +#include +#include + +#define BEGIN_NAMESPACE( x ) namespace x { +#define END_NAMESPACE } + +BEGIN_NAMESPACE( strenc ) + +constexpr auto time = __TIME__; +constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; + +// 1988, Stephen Park and Keith Miller +// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" +// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: +// with 32-bit math and without division + +template < int N > +struct RandomGenerator { +private: + static constexpr unsigned a = 16807; // 7^5 + static constexpr unsigned m = 2147483647; // 2^31 - 1 + + static constexpr unsigned s = RandomGenerator< N - 1 >::value; + static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 + static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 + static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits + static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi + static constexpr unsigned lo3 = lo2 + hi; + +public: + static constexpr unsigned max = m; + static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; +}; + +template <> +struct RandomGenerator< 0 > { + static constexpr unsigned value = seed; +}; + +template < int N, int M > +struct RandomInt { + static constexpr auto value = RandomGenerator< N + 1 >::value % M; +}; + +template < int N > +struct RandomChar { + static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); +}; + +template < size_t N, int K > +struct XorString { +private: + const char _key; + std::array< char, N + 1 > _encrypted; + bool decrypted = false; + + constexpr char enc( char c ) const { + return c ^ _key; + } + + char dec( char c ) const { + return c ^ _key; + } + +public: + template < size_t... Is > + constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { + } + + __forceinline const char* decrypt( void ) { + if( !decrypted ) { + for( size_t i = 0; i < N; ++i ) { + _encrypted[ i ] = dec( _encrypted[ i ] ); + } + _encrypted[ N ] = '\0'; + decrypted = true; + } + printf( "N: %u K: %d str: %s address: %08x\n", N, K, _encrypted.data( ), _encrypted.data( ) ); + + return _encrypted.data( ); + } +}; + +//-------------------------------------------------------------------------------- +//-- Note: XorStr will __NOT__ work directly with functions like printf. +// To work with them you need a wrapper function that takes a const char* +// as parameter and passes it to printf and alike. +// +// The Microsoft Compiler/Linker is not working correctly with variadic +// templates! +// +// Use the functions below or use std::cout (and similar)! +//-------------------------------------------------------------------------------- + +static auto w_printf = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_printf_s = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf( buf, fmt, args ); + va_end( args ); +}; + +static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf_s( buf, buf_size, fmt, args ); + va_end( args ); +}; + +//for compatibility with debug mode +struct debug_ret { +private: + const char* ret; + +public: + debug_ret( const char* str ) : ret( str ) { }; + + auto decrypt( ) { + return ret; + } +}; + +constexpr size_t strlen_ct( const char* const str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; +} + +#if 0 +#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) +#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) +#else +#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) +#define xors( s ) ( s ) +#endif + +END_NAMESPACE \ No newline at end of file diff --git a/cheat/gmod/ui.h b/cheat/gmod/ui.h new file mode 100644 index 0000000..b25a98d --- /dev/null +++ b/cheat/gmod/ui.h @@ -0,0 +1,457 @@ +#pragma once +#include "ui_base_item.h" +#include "ui_menu.h" +#include "ui_form.h" +#include "ui_render.h" +#include "ui_checkbox.h" +#include "ui_tab_manager.h" +#include "ui_slider.h" +#include "ui_dropdown.h" +#include "ui_key_picker.h" +#include "ui_button.h" +#include "ui_color_picker.h" +#include "ui_label.h" + +#include "settings.hpp" +#include "base_cheat.hpp" + +namespace ui +{ + static std::string date_str = __DATE__; + auto menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "quebot" ), + __DATE__ ); + + static void render( ) { + static bool was_setup = false; + if ( !was_setup ) { + std::transform( date_str.begin( ), date_str.end( ), date_str.begin( ), + [ ]( char c ) { return ::tolower( c ); } + ); + + menu.reset( ); + menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "moneybot" ), + date_str.c_str( ) ); + auto tab_sheet = std::make_shared< ui::c_tab_manager >( ); + + //todo: replace with icons? + + auto tab_rage = std::make_shared< ui::c_tab_sheet >( xors( "rage" ), &icons::sprite_rage ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_aimbot = std::make_shared< ui::c_tab_sheet >( xors( "aimbot" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ), 0 ); { + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.enabled ) ); + main_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 180.f, xors( "max fov" ), &g_settings.rage.fov ) ); + + + main_form->add_item( std::make_shared< ui::c_dropdown< int > >( + 0, 0, 120, xors( "activation type" ), + &g_settings.rage.activation_type, + &dropdowns::activation_types_aimbot ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.aimkey ) )->set_cond( + [ ]( ) { return g_settings.rage.activation_type == 1; } ); + + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "silent" ), + &g_settings.rage.silent, &dropdowns::silent_aimbot_types ) ); + + + main_form->add_item( std::make_shared< ui::c_dropdown< int > >( 0, 0, 120, xors( "hitbox" ), + &g_settings.rage.hitbox, &dropdowns::hitboxes ) ); + + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "autofire" ), &g_settings.rage.auto_fire ) ); + } + + auto accuracy_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "accuracy" ) ); { + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no spread" ), &g_settings.rage.nospread ) ); + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.rage.norecoil ) ); + } + + auto selection_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "selection" ) ); { + selection_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "type" ), &g_settings.rage.selection_type, &dropdowns::selection_type ) ); + } + + auto filter_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "filters" ) ); { + filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team" ), &g_settings.rage.ignore_team ) ); + filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team color" ), &g_settings.rage.ignore_teamcolor ) ); + filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore spawn protection" ), &g_settings.rage.ignore_spawnprot ) ); + } + + left_column->add_item( main_form ); + right_column->add_item( accuracy_form ); + right_column->add_item( selection_form ); + right_column->add_item( filter_form ); + + subtab_aimbot->add_item( left_column ); + subtab_aimbot->add_item( right_column ); + } + + //auto subtab_antiaim = std::make_shared< ui::c_tab_sheet >( xors( "antiaim" ) ); { + // auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + // auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + // + // auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.anti_aim ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "at players" ), &g_settings.rage.at_players ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant check" ), &g_settings.rage.dormant_check ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "angle step" ), &g_settings.rage.angle_step ) ); + // main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, &g_settings.rage.angle_step_degrees ) )->set_cond( + // [ ]( ) { return g_settings.rage.angle_step( ); } ); + // } + // + // auto pitch_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "pitch" ) ); { + // pitch_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "pitch" ), &g_settings.rage.pitch, &dropdowns::antiaim_pitch ) ); + // pitch_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -89, 89, &g_settings.rage.pitch_offset ) )->set_cond( + // [ ]( ) { return g_settings.rage.pitch == 1; } ); + // } + // + // auto yaw_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "yaw" ), 200 ); { + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw" ), &g_settings.rage.real_yaw, &dropdowns::antiaim_yaw ) ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.real_yaw_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw jitter" ), &g_settings.rage.real_yaw_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw moving" ), &g_settings.rage.real_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.real_yaw_moving_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw moving jitter" ), &g_settings.rage.real_moving_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); + // + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw" ), &g_settings.rage.fake_yaw, &dropdowns::antiaim_yaw ) ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.fake_yaw_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw jitter" ), &g_settings.rage.fake_yaw_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw moving" ), &g_settings.rage.fake_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.fake_yaw_moving_add( ) ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw_moving( ) && !!g_settings.rage.fake_yaw( ); } ); + // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw moving jitter" ), &g_settings.rage.fake_moving_jitter ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.fake_yaw_moving( ) && !!g_settings.rage.fake_yaw( ); } ); + // } + // + // auto edge_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "edge detection" ), 110 ); { + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge" ), &g_settings.rage.edge_dtc_normal, + // &dropdowns::antiaim_edge ) ); + // + // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_standing ) )->set_cond( + // [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); + // + // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_moving ) )->set_cond( + // [ ]( ) { return !!g_settings.rage.edge_dtc_normal( ); } ); + // + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge type" ), &g_settings.rage.edge_dtc_type, + // &dropdowns::antiaim_edge_type ) )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); + // + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "freestanding" ), + // &g_settings.rage.edge_detection, &dropdowns::antiaim_freestanding ) ); + // + // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "priority" ), + // &g_settings.rage.edge_dtc_priority, &dropdowns::edge_priority ) + // )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) && g_settings.rage.edge_detection( ); } ); + // + // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, xors( "fake jitter" ), &g_settings.rage.edge_dtc_jitter ) ); + // } + // + // auto lby_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "lby breaker" ) ); { + // lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "break lby" ), &g_settings.rage.break_lby ) ); + // lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 105, 195, &g_settings.rage.lby_delta ) )->set_cond( + // [ ]( ) { return g_settings.rage.break_lby( ); } ); + // + // auto angles_box = lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "draw angles" ), &g_settings.rage.draw_angles ) ); + // angles_box->set_cond( [ ]( ) { return g_settings.rage.break_lby( ); } ); + // angles_box->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.rage.lby_color ) ); + // angles_box->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.rage.real_color ) ); + // + // lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fakewalk" ), &g_settings.rage.fakewalk ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.fakewalk_key ) + // ); + // lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 7, 13, &g_settings.rage.fakewalk_ticks ) )->set_cond( + // [ ]( ) { return g_settings.rage.fakewalk; } ); + // } + // + // auto fakelag_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "fakelag" ), 165 ); { + // fakelag_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "mode" ), &g_settings.rage.fakelag.mode, &dropdowns::fakelag_types ) ); + // fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 15, xors( "max ticks" ), &g_settings.rage.fakelag.ticks ) ); + // fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 50, xors( "fluctuate" ), &g_settings.rage.fakelag.fluctuate ) )->set_cond( + // [ ]( ) { return g_settings.rage.fakelag.mode == 2; } + // ); + // + // auto flags_form = fakelag_form->add_item( std::make_shared< ui::c_form >( 0, 5, 139, 0, xors( "flags" ), 0, true ) ); + // + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "in air" ), &g_settings.rage.fakelag.in_air ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on move" ), &g_settings.rage.fakelag.in_move ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on peek" ), &g_settings.rage.fakelag.on_peek ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "while shooting" ), &g_settings.rage.fakelag.in_attack ) ); + // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid ground" ), &g_settings.rage.fakelag.avoid_ground ) ); + // } + // + // left_column->add_item( main_form ); + // left_column->add_item( pitch_form ); + // left_column->add_item( yaw_form ); + // + // right_column->add_item( edge_form ); + // right_column->add_item( lby_form ); + // right_column->add_item( fakelag_form ); + // + // subtab_antiaim->add_item( left_column ); + // subtab_antiaim->add_item( right_column ); + //} + + //subtab_sheet->add_item( subtab_antiaim ); + subtab_sheet->add_item( subtab_aimbot ); + + tab_rage->add_item( subtab_sheet ); + } + + + auto tab_visuals = std::make_shared< ui::c_tab_sheet >( xors( "visuals" ), &icons::sprite_visuals ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_players = std::make_shared< ui::c_tab_sheet >( xors( "players" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "activation type" ), &g_settings.visuals.activation_type, &dropdowns::activation_type_visuals ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.visuals.key ) )->set_cond( [ ]( ) { return g_settings.visuals.activation_type > 1; } ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team" ), &g_settings.visuals.ignore_team ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team color" ), &g_settings.visuals.ignore_teamcolor ) ); + + } + + auto player_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "players" ) ); { + auto box_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "box" ), &g_settings.visuals.box ) ); + box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.box_enemy( ) ) ); + + auto skeleton_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "skeleton" ), &g_settings.visuals.skeleton ) ); + skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.skeleton_enemy ) ); + + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "health" ), &g_settings.visuals.health ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "name" ), &g_settings.visuals.name ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "weapon" ), &g_settings.visuals.weapon ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "rank" ), &g_settings.visuals.rank ) ); + } + + auto hud_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "hud" ) ); { + // hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hitmarkers" ), &g_settings.visuals.hitmarkers ) ); will probably add soon. + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spectator list" ), &g_settings.visuals.spec_list ) ); + } + + //auto chams_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "chams" ) ); { soon + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.visuals.chams.enabled( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "through walls" ), &g_settings.visuals.chams.ignore_z( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.chams.friendlies( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flat" ), &g_settings.visuals.chams.flat( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "reflectivity" ), &g_settings.visuals.chams.reflectivity ) + // )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); + // + // chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "shine" ), &g_settings.visuals.chams.shine ) + // )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); + // + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies visible" ), &g_settings.visuals.chams.color_visible_friendly( ) ) )->set_cond( + // [ ]( ) { return g_settings.visuals.chams.friendlies( ); } ); + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies hidden" ), &g_settings.visuals.chams.color_hidden_friendly( ) ) )->set_cond( + // [ ]( ) { return g_settings.visuals.chams.friendlies( ) && g_settings.visuals.chams.ignore_z( ); } ); + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies visible" ), &g_settings.visuals.chams.color_visible_enemy( ) ) ); + // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies hidden" ), &g_settings.visuals.chams.color_hidden_enemy( ) ) )->set_cond( + // [ ]( ) { return g_settings.visuals.chams.ignore_z( ); } ); + //} + + left_column->add_item( main_form ); + left_column->add_item( player_form ); + + right_column->add_item( hud_form ); + //right_column->add_item( chams_form ); + + subtab_players->add_item( left_column ); + subtab_players->add_item( right_column ); + } + + auto subtab_other = std::make_shared< ui::c_tab_sheet >( xors( "other" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + //auto world_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "world" ) ); { + // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "world modulate" ), &g_settings.visuals.world_modulate ) ); + // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "night mode" ), &g_settings.visuals.night_mode ) + // )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate; } ); + // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent props" ), &g_settings.visuals.transparent_props ) + // )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate; } ); + // + // world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "dropped weapons" ), &g_settings.visuals.weapon_esp, &dropdowns::world_esp_type ) + // )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.weapon_esp_clr( ) ) ); + // + // world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "grenades" ), &g_settings.visuals.grenade_esp, &dropdowns::world_esp_type ) + // )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.grenade_esp_clr( ) ) ); + //} + + + auto view_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "view" ) ); { + view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "watermark" ), &g_settings.misc.watermark ) ); + // will add soon + //view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thirdperson" ), &g_settings.misc.thirdperson( ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.thirdperson_key ) + //); + //view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 40, xors( "viewmodel fov" ), &g_settings.misc.viewmodel_fov( ) ) ); + //view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 90, 130, xors( "view fov" ), &g_settings.misc.fov_changer( ) ) ); + } + + auto removals_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "removals" ) ); { + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.misc.no_recoil ) ); + } + + left_column->add_item( view_form ); + left_column->add_item( removals_form ); + + //right_column->add_item( view_form ); + //right_column->add_item( removals_form ); + + subtab_other->add_item( left_column ); + //subtab_other->add_item( right_column ); + } + + subtab_sheet->add_item( subtab_other ); + subtab_sheet->add_item( subtab_players ); + + tab_visuals->add_item( subtab_sheet ); + } + + + auto tab_misc = std::make_shared< ui::c_tab_sheet >( xors( "miscellaneous" ), &icons::sprite_misc ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_general = std::make_shared< ui::c_tab_sheet >( xors( "general" ) ); { + auto column_left = subtab_general->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 0 ) ); + auto column_right = subtab_general->add_item( std::make_shared< ui::base_item >( 220, -5, 0, 0 ) ); + + auto movement_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "movement" ) ); { + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto strafe" ), &g_settings.misc.auto_strafe ) ); + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bhop" ), &g_settings.misc.bunny_hop( ) ) ); + //auto circle_box = movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "circle strafe" ), &g_settings.misc.circle_strafe ) ); + //circle_box->add_item( std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.circle_strafe_key ) ); + //circle_box->set_cond( [ ]( ) { return g_settings.misc.bunny_hop && g_settings.misc.auto_strafe; } ); + + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "edge jump" ), &g_settings.misc.edge_jump( ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.edge_jump_key( ) ) + ); + //movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto jumpbug" ), &g_settings.misc.auto_jumpbug( ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.auto_jumpbug_key( ) ) + //); + //movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "show jump stats" ), &g_settings.misc.show_jump_stats ) ); + } + + //auto identity_form = std::make_shared< ui::c_form >( 0, 1, 215, 0, xors( "identity" ) ); { + // // need to add + // identity_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "name changer" ), &g_settings.misc.name_changer, + // &dropdowns::name_changers ) ); + //} + + + auto helpers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "helpers" ) ); { + // e spammer + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "use spammer" ), &g_settings.misc.use_spam ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.use_spam_key ) ); + + } + + + + column_left->add_item( movement_form ); + //column_left->add_item( identity_form ); + + column_right->add_item( helpers_form ); + } + + + //auto subtab_movement_recorder = std::make_shared< ui::c_tab_sheet >( xors( "movement recorder" ) ); { + // auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "idle" ) ) ); + // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.misc.recorder_enable ) ); + // main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "show angles" ), &g_settings.misc.recording_show_angles, &dropdowns::recorder_angles ) ); + // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording start key" ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_start_key ) + // ); + // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording stop key" ) ) )->add_item( + // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_stop_key ) + // ); + // + // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "play" ), [ ]( ) { g_cheat.m_move_rec.play_back( ); } ) ); + // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "stop playing" ), [ ]( ) { g_cheat.m_move_rec.stop_playback( ); } ) ); + // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "clear recording" ), [ ]( ) { g_cheat.m_move_rec.clear_recording( ); } ) ); + // } + // + // subtab_movement_recorder->add_item( main_form ); + //} + // + //subtab_sheet->add_item( subtab_movement_recorder ); + subtab_sheet->add_item( subtab_general ); + + tab_misc->add_item( subtab_sheet ); + } + + + auto tab_config = std::make_shared< ui::c_tab_sheet >( xors( "config" ), &icons::sprite_config ); { + auto cfg_form = std::make_shared< ui::c_form >( 0, 10, 200, 75, xors( "config" ) ); + cfg_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 180, xors( "setting" ), &g_settings.menu.cur_setting, &dropdowns::configs ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 0, 0, 85, 20, xors( "save" ), []( ) { g_settings.save( ); } ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 95, -25, 85, 20, xors( "load" ), []( ) { g_settings.load( ); } ) ); + + tab_config->add_item( cfg_form ); + } + + tab_sheet->add_item( tab_config ); + tab_sheet->add_item( tab_misc ); + tab_sheet->add_item( tab_visuals ); + tab_sheet->add_item( tab_rage ); + //tab_sheet->add_item( tab_legit ); + + menu->add_item( tab_sheet ); + + was_setup = true; + } + else { + //static auto movement_state = menu->find_item( + // xors( "movement recorder" ) )->find_item( + // xors( "main" ) )->find_item( + // xors( "idle" ) + // ); + // + //if( !g_settings.misc.recorder_enable ) + // movement_state->set_text( xors( "idle" ) ); + //else if( g_cheat.m_move_rec.is_playing( ) ) { + // movement_state->set_text( xors( "playing" ) ); + //} + //else if( g_cheat.m_move_rec.is_recording( ) ) { + // movement_state->set_text( xors( "recording" ) ); + //} + //else { + // movement_state->set_text( xors( "idle" ) ); + //} + + //static auto jitter_real = menu->find_item( xors( "real yaw jitter" ) ); + //jitter_real->set_text( g_settings.rage.real_yaw == 2 ? xors( "spin range" ) : xors( "real yaw jitter" ) ); + // + //static auto jitter_real_moving = menu->find_item( xors( "real yaw moving jitter" ) ); + //jitter_real_moving->set_text( g_settings.rage.real_yaw_moving == 2 ? xors( "spin range" ) : xors( "real yaw moving jitter" ) ); + // + //static auto jitter_fake = menu->find_item( xors( "fake yaw jitter" ) ); + //jitter_fake->set_text( g_settings.rage.fake_yaw == 2 ? xors( "spin range" ) : xors( "fake yaw jitter" ) ); + // + //static auto jitter_fake_moving = menu->find_item( xors( "fake yaw moving jitter" ) ); + //jitter_fake_moving->set_text( g_settings.rage.fake_yaw_moving == 2 ? xors( "spin range" ) : xors( "fake yaw moving jitter" ) ); + + render_item( menu.get( ) ); + + //reset the menu if home is pressed for debugging purposes + if ( g_input.is_key_pressed( KEYS_HOME ) ) { + menu.reset( ); + menu = std::make_shared< c_menu >( 10, 10, 580, 470, xors( "golden cheat" ) ); + was_setup = false; + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_base_item.h b/cheat/gmod/ui_base_item.h new file mode 100644 index 0000000..68c2198 --- /dev/null +++ b/cheat/gmod/ui_base_item.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include + +#include "ui_draw.h" + +namespace ui +{ + //the offset between each item + constexpr int ITEM_OFFSET = 5; + + class base_item : public std::enable_shared_from_this< base_item > { + public: + base_item( ) { } + base_item( int x, int y, int w, int h, const char* name = nullptr ) : + m_x( x ), m_y( y ), m_width( w ), m_height( h ) { + if( name ) { + strcpy( m_text, name ); + } + } + + virtual void render( ) { }; + virtual bool is_hovered( ) { return false; } + virtual bool is_form( ) const { return false; } + + virtual void reset( ) { + m_y_offset = 0; + } + + virtual int get_total_height( ) const { + return m_height; + } + + void set_y_offset( int offset ) { + m_y_offset = offset; + } + + int get_y_offset( ) const { + return m_y_offset; + } + + auto add_item( std::shared_ptr< base_item > item ) { + item.get( )->m_parent = shared_from_this( ); + m_items.emplace( m_items.begin( ), item ); + + return item; + } + + auto& get_items( ) { return m_items; } + auto get_parent( ) { return m_parent; } + + virtual int x( ) const { return m_x; } + virtual int y( ) const { return m_y; } + virtual int w( ) const { return m_width; } + virtual int h( ) const { return m_height; } + + void set_x( int x ) { m_x = x; } + void set_y( int y ) { m_y = y; } + + void set_width( int w ) { m_width = w; } + void set_height( int h ) { m_height = h; } + + bool get_visible( ) const { + if( m_cond && !m_cond( ) ) { + return false; + } + + return m_visible; + } + + void set_cond( std::function< bool( ) > func ) { + m_cond = func; + } + + void set_visible( bool vis ) { m_visible = vis; } + void set_text( const char* text ) { + strcpy( m_text, text ); + } + auto get_text( ) const { + return m_text; + } + + std::shared_ptr< base_item > find_item( const char* name ) { + if( !m_items.empty( ) ) { + for( auto& it : m_items ) { + if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { + return it; + } + + auto it_find = it->find_item( name ); + if( it_find != it ) return it_find; + } + } + + return shared_from_this( ); + } + + auto get_top_parent( ) { + for( auto parent = m_parent; ; + parent = parent->get_parent( ) ) { + if( !parent->get_parent( ) ) { + return parent; + } + } + + return shared_from_this( ); + } + + int get_relative_x( ) { + int x = m_x; + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + x += parent->x( ); + } + + return x; + } + + int get_relative_y( ) { + int y = m_y + get_y_offset( ); + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + y += parent->y( ) + parent->get_y_offset( ); + } + + return y; + } + + void set_disabled( bool disabled ) { + m_disabled = disabled; + + for( auto& it : m_items ) { + it->set_disabled( disabled ); + } + } + + void set_disabled_callbacks( bool disabled ) { + auto top = get_top_parent( ); + + top->set_disabled( disabled ); + + m_disabled = false; + } + + protected: + int m_x{ }; + int m_y{ }; + + int m_width{ }; + int m_height{ }; + + //current y position for rendering + int m_y_offset{ }; + + bool m_visible = true; + bool m_disabled = false; + char m_text[ 256 ]{ }; + + std::shared_ptr< base_item > m_parent; + std::vector< std::shared_ptr< base_item > > m_items; + std::function< bool( ) > m_cond; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_button.h b/cheat/gmod/ui_button.h new file mode 100644 index 0000000..022fc67 --- /dev/null +++ b/cheat/gmod/ui_button.h @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "ui_base_item.h" + +namespace ui +{ + class c_button : public base_item { + public: + c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : + base_item( x, y, w, h, name ), m_fn( fn ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); + if ( !m_mouse_held ) { + m_fn( ); + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); + } + + protected: + std::function< void( ) > m_fn; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_checkbox.h b/cheat/gmod/ui_checkbox.h new file mode 100644 index 0000000..50cad1c --- /dev/null +++ b/cheat/gmod/ui_checkbox.h @@ -0,0 +1,68 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_checkbox : public base_item { + public: + c_checkbox( int x, int y, const char* txt, bool* setting ) : + base_item( x, y, 16, 16, txt ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int rel_x = get_relative_x( ); + int rel_y = get_relative_y( ); + + return mouse_x >= rel_x && mouse_x <= rel_x + m_width + && mouse_y >= rel_y && mouse_y <= rel_y + m_height; + } + + inline void render_checkbox( const int& x, const int& y ) { + clr_t col = ui_get_bg_col( ); + if ( is_hovered( ) ) { + col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; + } + else if ( *m_setting ) { + col = ui_get_accent_col( ); + } + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); + + //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + } + + inline void input( ) { + bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) && mouse_presesed ) { + if ( !m_mouse_held ) { + *m_setting = !*m_setting; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + render_checkbox( x, y ); + input( ); + + + ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); + } + + protected: + bool* m_setting; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_color_picker.h b/cheat/gmod/ui_color_picker.h new file mode 100644 index 0000000..2711d29 --- /dev/null +++ b/cheat/gmod/ui_color_picker.h @@ -0,0 +1,201 @@ +#pragma once + +#include "ui_base_item.h" +#include "d3d.hpp" + +namespace ui +{ + class c_color_picker : public base_item { + static constexpr int BOX_WIDTH = 106; + static constexpr int BOX_HEIGHT = 125; + public: + c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : + base_item( x, y, w, 4, name ), m_setting( setting ), + m_has_text( true ) { } + + c_color_picker( int x, int y, int w, clr_t* setting ) : + base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), + m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + + int cursor_x, cursor_y; + ui_get_cursor_pos( cursor_x, cursor_y ); + + if ( m_has_text ) y += 12; + + if ( !m_active ) { + return cursor_x >= x && cursor_x <= x + m_width + && cursor_y >= y && cursor_y <= y + m_height; + } + + return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 + && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; + } + + virtual int get_total_height( ) const override { + return m_has_text ? ( m_height + 12 ) : m_height; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_active ) { + m_mouse_held = true; + } + + m_active = true; + } + else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_active = false; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + + m_hue = m_setting->hue( ); + if ( m_hue > 1.0f ) { + m_hue -= 359.f; + } + + m_saturation = m_setting->saturation( ); + m_brightness = m_setting->brightness( ) / 255.f; + m_alpha = m_setting->a( ); + } + + void output( ) { + *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); + m_setting->a( ) = m_alpha; + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + if ( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + y += 12; + } + + input( ); + + if ( m_active ) { + RECT old_rect; + g_d3d.get_device( )->GetScissorRect( &old_rect ); + + RECT new_rect{ + x - 1, y - 1, + x + BOX_WIDTH + 22, + y + BOX_HEIGHT + 2 + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + clr_t bg_col( 0, 0, 0, 90 ); + ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); + ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); + + for ( int i{ }; i < 100; i += 3 ) { + for ( int i2{ }; i2 < 100; i2 += 3 ) { + ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, + clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); + } + } + + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held + && mouse_x > x && mouse_x <= x + 100 + && mouse_y > y && mouse_y <= y + 100 ) { + + int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); + int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); + + int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); + int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); + + m_saturation = float( delta_y ) * 0.01f; + m_brightness = float( delta_x ) * 0.01f; + } + + auto is_hue_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 110 && mouse_x < x + 122 + && mouse_y > y && mouse_y < y + 100; + }; + + auto draw_slider_hue = [&]( ) { + for ( int i{ }; i < 100; ++i ) { + auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); + + ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); + } + + ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, + is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + auto is_alpha_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 1 && mouse_x < x + 122 + && mouse_y > y + 110 && mouse_y < y + 124; + }; + + auto draw_slider_alpha = [&]( ) { + for ( int i{ 121 }; i >= 0; --i ) { + auto col = *m_setting; + col.a( ) = ( int )( float( i ) * 255.f / 121.f ); + + ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); + } + + int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); + ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, + is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + draw_slider_hue( ); + if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_y - y, 0, 100 ); + m_hue = float( delta ) * 0.01f; + } + + draw_slider_alpha( ); + if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_x - x, 0, 121 ); + m_alpha = ( int )( float( delta ) * 255.f / 121.f ); + } + + output( ); + + g_d3d.get_device( )->SetScissorRect( &old_rect ); + } + else { + if ( is_hovered( ) ) { + ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); + } + ui_draw_rect( x, y, m_width, m_height, *m_setting ); + } + } + + protected: + clr_t* m_setting = nullptr; + bool m_active = false; + bool m_mouse_held = false; + float m_saturation = 1.0f; + float m_brightness = 1.0f; + float m_hue = 0.f; + uint8_t m_alpha = 255; + bool m_has_text = false; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_draw.h b/cheat/gmod/ui_draw.h new file mode 100644 index 0000000..336c4fa --- /dev/null +++ b/cheat/gmod/ui_draw.h @@ -0,0 +1,163 @@ +#pragma once +#include "color.hpp" +#include "d3d.hpp" +#include "icons.hpp" +#include "d3d_sprite.hpp" +#include "input_system.hpp" + +namespace ui +{ + /*__forceinline auto ui_get_background_texture( ) { + static auto buffer = std::make_shared< byte[ 512 ] >( ); + static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); + static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); + static IDirect3DTexture9* texture; + + if ( !texture ) { + for ( int i = 0; i < 512; i += 4 ) { + *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; + } + + D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); + } + + return texture; + }*/ + + static float anim_time{ }; + + __forceinline void set_animtime( float animtime ) { + anim_time = animtime; + } + + __forceinline void setup_sprites( IDirect3DDevice9* device ) { + //fuck msvc + icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + icons::sprite_visuals_.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); + icons::sprite_visuals.init( device, icons::raw::visuals, icons::visuals_size, 66, 66 ); + icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); + icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); + } + + __forceinline clr_t ui_get_accent_col( ) { + clr_t col_start = { + g_settings.menu.menu_color_1r, + g_settings.menu.menu_color_1g, + g_settings.menu.menu_color_1b + }; + + clr_t col_end = { + g_settings.menu.menu_color_2r, + g_settings.menu.menu_color_2g, + g_settings.menu.menu_color_2b + }; + + clr_t col = clr_t::blend( col_start, col_end, anim_time ); + + return col; + } + + __forceinline clr_t& ui_get_disabled_col( ) { + static clr_t col = clr_t( 61, 61, 61, 255 ); + return col; + } + + __forceinline clr_t& ui_get_bg_col( ) { + static clr_t col = clr_t( 24, 25, 27, 255 ); + return col; + } + + __forceinline clr_t& ui_get_text_col( ) { + static clr_t col = clr_t( 221, 221, 221, 255 ); + return col; + } + + __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, + clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { + + g_d3d.draw_gradient( start, end, x, y, w, h, type ); + } + + __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { + g_d3d.draw_line( color, x, y, x1, y1 ); + } + + __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_filled_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_filled_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { + char buf[ 2048 ]{ }; + va_list list{ }; + + __crt_va_start( list, str ); + vsprintf_s( buf, 2048, str, list ); + __crt_va_end( list ); + + g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, + center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); + } + + __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { + char* buf = ( char* )_alloca( 2048 ); + va_list list{ }; + + __crt_va_start( list, text ); + vsprintf_s( buf, 2048, text, list ); + __crt_va_end( list ); + + w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); + h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); + } + + __forceinline void ui_get_cursor_pos( int& x, int& y ) { + g_input.get_cursor_pos( x, y ); + } + + __forceinline float ui_get_frametime( ) { + return g_gmod.m_frametime; + } + + __forceinline void ui_draw_cursor( ) { + const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); + int x, y; + ui_get_cursor_pos( x, y ); + + + for ( int i{ }; i <= 9; ++i ) { + ui_draw_line( x, y, x + i, y + 11, accent ); + } + + for ( int i{ }; i <= 7; ++i ) { + ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); + } + + for ( int i{ }; i <= 3; ++i ) { + ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); + } + + ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); + ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); + + ui_draw_line( x, y, x, y + 17, black ); + ui_draw_line( x, y + 17, x + 3, y + 14, black ); + ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); + ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); + ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); + ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); + ui_draw_line( x + 11, y + 12, x, y, black ); + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_dropdown.h b/cheat/gmod/ui_dropdown.h new file mode 100644 index 0000000..0c4e990 --- /dev/null +++ b/cheat/gmod/ui_dropdown.h @@ -0,0 +1,217 @@ +#pragma once +#include "ui_dropdown_item.h" + +namespace ui +{ + template < typename t = int > + class c_dropdown : public base_item { + public: + c_dropdown( int x, int y, int w, const char* name, t* setting, + std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : + base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), + m_max_items( max_items ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + inline bool is_any_item_hovered( ) { + if ( m_disabled || !m_active ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + m_height + 12; + int h = m_height * ( std::min< size_t >( + m_dropdown_items->size( ), m_max_items ) ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 13; + } + + void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { + ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); + ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); + } + + void update_value( ) { + for ( auto& it : *m_dropdown_items ) { + if ( it.m_value == *m_setting ) { + m_selected_item = ⁢ + } + } + } + + void draw_items( const int& x, const int& y ) { + auto& items = *m_dropdown_items; + auto it = &items.front( ); + int offset = m_height + 1; + int hovered = 0; + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + auto is_hovered = [ & ] ( int y_offset ) { + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; + }; + + + for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; + i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); + ++i, offset += m_height + 1 + ) { + it = &items.at( i ); + + draw_box( x, y + offset, it->m_name ); + + if ( is_hovered( offset ) ) { + hovered = offset; + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_selected_item = it; + *m_setting = it->m_value; + m_active = false; + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + } + } + + if ( hovered ) { + ui_draw_outlined_rect( x - 1, y - 1 + hovered, + m_width + 1, m_height + 1, ui_get_text_col( ) ); + } + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = !m_active; + } + m_mouse_held = true; + } + else if ( !is_any_item_hovered( ) ) { + m_mouse_held = false; + } + + if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { + m_active = false; + } + + if ( GetTickCount( ) * 0.001f > m_enable_time && m_enable_next_frame ) { + set_disabled_callbacks( false ); + m_enable_next_frame = false; + } + + + active_changed = m_active != active_backup; + //disable input on all items + if ( active_changed ) { + if ( !m_active ) { + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + else { + set_disabled_callbacks( true ); + } + } + + if ( m_selected_item ) { + *m_setting = m_selected_item->m_value; + } + + if ( m_active && m_dropdown_items->size( ) > m_max_items ) { + int scroll_input = g_input.get_scroll_state( ); + + if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max + m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it + + if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) + m_curr_scroll = m_dropdown_items->size( ) - m_max_items; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + bool restore = false; + RECT prev_rect{ }; + + if ( m_active ) { + restore = true; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + RECT new_rect{ + prev_rect.left, + prev_rect.top, + g_d3d.m_width, + g_d3d.m_height, + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_items( x, y + 11 ); + + + //draw scrollbar + size_t total_items = m_dropdown_items->size( ); + if ( total_items > m_max_items ) { + const size_t height = ( m_height + 1 ) * m_max_items; + const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); + + size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); + ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); + } + } + + update_value( ); + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( m_selected_item ) { + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); + } + + if( restore ) { + g_d3d.get_device( )->SetScissorRect( &prev_rect ); + } + } + + protected: + std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; + dropdowns::dropdown_item_t< t >* m_selected_item{ }; + bool m_active = false; + bool m_mouse_held = false; + t* m_setting{ }; + size_t m_max_items{ }; + size_t m_curr_scroll{ }; + float m_enable_time{ }; + int m_enable_next_frame{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_dropdown_item.h b/cheat/gmod/ui_dropdown_item.h new file mode 100644 index 0000000..4723af8 --- /dev/null +++ b/cheat/gmod/ui_dropdown_item.h @@ -0,0 +1,183 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + namespace dropdowns + { + template < typename t = int > + struct dropdown_item_t { + const char* m_name; + t m_value; + }; + + std::vector< dropdown_item_t< > > activation_types_aimbot = { + { xors( "always" ), 0 }, + { xors( "on key" ), 1 }, + }; + + std::vector< dropdown_item_t< > > silent_aimbot_types = { + { xors( "none" ), 0 }, + { xors( "client-side" ), 1 }, + { xors( "server-side" ), 2 }, + }; + + std::vector< dropdown_item_t< > > hitboxes = { + { xors( "hitscan" ), -1 }, + { xors( "head" ), 0 }, + { xors( "neck" ), 1 }, + { xors( "pelvis" ), 2 }, + { xors( "chest" ), 3 }, + }; + + std::vector< dropdown_item_t< > > antiaim_yaw = { + { xors( "normal" ), 0 }, + { xors( "backwards" ), 1 }, + { xors( "backwards spin" ), 2 }, + { xors( "direction" ), 6 }, + { xors( "sideways" ), 3 }, + { xors( "golden spin" ), 4 }, + { xors( "random" ), 5 }, + }; + + std::vector< dropdown_item_t< > > delay_type = { + { xors( "none" ), 0 }, + { xors( "fake lag" ), 1 }, + { xors( "time" ), 2 }, + { xors( "velocity" ), 3 }, + }; + + std::vector< dropdown_item_t< > > antiaim_pitch = { + { xors( "normal" ), 0 }, + { xors( "custom" ), 1 }, + { xors( "flip" ), 2 }, + { xors( "minimal" ), 3 }, + { xors( "random" ), 4 } + }; + + std::vector< dropdown_item_t< > > antiaim_freestanding = { + { xors( "disabled" ), 0 }, + { xors( "static" ), 1 }, + { xors( "narrow angle" ), 2 }, + { xors( "wide angle" ), 3 }, + }; + + std::vector< dropdown_item_t< > > antiaim_edge = { + { xors( "off" ), 0 }, + { xors( "peek" ), 1 }, + { xors( "full" ), 2 }, + }; + + std::vector< dropdown_item_t< > > antiaim_edge_type = { + { xors( "static" ), 0 }, + { xors( "narrow angle" ), 1 }, + { xors( "wide angle" ), 2 }, + }; + + std::vector< dropdown_item_t< > > fakelag_types = { + { xors( "disabled" ), 0 }, + { xors( "adaptive" ), 1 }, + { xors( "fluctuate" ), 2 }, + { xors( "static" ), 3 }, + }; + + std::vector< dropdown_item_t< > > activation_type_visuals = { + { xors( "never" ), 0 }, + { xors( "always" ), 1 }, + { xors( "on hold" ), 2 }, + { xors( "toggle" ), 3 }, + }; + + std::vector< dropdown_item_t< > > configs = { + { xors( "legit" ), 0 }, + { xors( "closet" ), 1 }, + { xors( "rage 1" ), 2 }, + { xors( "rage 2" ), 3 }, + }; + + std::vector< dropdown_item_t< > > recorder_angles = { + { xors( "none" ), 0 }, + { xors( "shot" ), 1 }, + { xors( "all" ), 2 } + }; + + std::vector< dropdown_item_t< > > baim_types = { + { xors( "off" ), 0 }, + { xors( "basic" ), 1 }, + { xors( "smart" ), 2 }, + { xors( "aggressive" ), 3 }, + { xors( "force" ), 4 }, + }; + + std::vector< dropdown_item_t< > > name_changers = { + { xors( "off" ), 0 }, + { xors( "dollar" ), 1 }, + { xors( "moneybot.cc" ), 2 }, + }; + + std::vector< dropdown_item_t< > > weapon_esp_types = { + { xors( "none" ), 0 }, + { xors( "icon" ), 1 }, + { xors( "name" ), 2 }, + }; + + std::vector< dropdown_item_t< > > fake_ping_activation = { + { xors( "off" ), 0 }, + { xors( "on hold" ), 1 }, + { xors( "toggle" ), 2 }, + { xors( "always" ), 3 }, + { xors( "auto" ), 4 } + }; + + std::vector< dropdown_item_t< > > world_esp_type = { + { xors( "off" ), 0 }, + { xors( "name" ), 1 }, + { xors( "glow" ), 2 }, + { xors( "both" ), 3 } + }; + + std::vector< dropdown_item_t< > > multipoint_types = { + { xors( "off" ), 0 }, + { xors( "minimal" ), 1 }, + { xors( "vitals" ), 2 }, + { xors( "full" ), 3 } + }; + + std::vector< dropdown_item_t< > > edge_priority = { + { xors( "freestanding" ), 0 }, + { xors( "edge" ), 1 } + }; + + std::vector< dropdown_item_t< > > selection_type = { + { xors( "fov" ), 0 }, + { xors( "distance" ), 1 } + }; + + std::vector< dropdown_item_t< > > autobuy_main_wep = { + { xors( "none" ), 0 }, + { xors( "autosniper" ), 1 }, + { xors( "scout" ), 2 }, + { xors( "sniper" ), 3 }, + { xors( "ak/m4" ), 4 }, + { xors( "aug/sg" ), 5 }, + { xors( "mac10/mp9" ), 6 }, + }; + + std::vector< dropdown_item_t< > > autobuy_second_wep = { + { xors( "none" ), 0 }, + { xors( "deagle/r8" ), 1 }, + { xors( "dualies" ), 2 }, + }; + + std::vector< dropdown_item_t< > > skin_knives = { + { xors( "none" ), 0 }, + { xors( "bayonet" ), 1 }, + { xors( "flip knife" ), 2 }, + { xors( "gut knife" ), 3 }, + { xors( "karambit" ), 4 }, + { xors( "m9 bayonet" ), 5 }, + { xors( "huntsman" ), 6 }, + }; + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_form.h b/cheat/gmod/ui_form.h new file mode 100644 index 0000000..0791528 --- /dev/null +++ b/cheat/gmod/ui_form.h @@ -0,0 +1,187 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_form : public base_item { + public: + c_form( int x, int y, int w, int h, const char* name, int max_h = 0, bool collapse = false ) : + base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ), m_collapse( collapse ) { }; + + virtual int x( ) const override { + return m_x + 10; + } + + virtual int y( ) const override { + return m_y + m_scroll_offset + 9; + } + + virtual bool is_form( ) const override { + return true; + } + + virtual bool is_hovered( ) override { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ); + int y = get_relative_y( ); + + return mouse_x > x && mouse_x < x + w( ) + && mouse_y > y && mouse_y < y + h( ); + } + + bool is_collapse_hovered( ) { + if( !m_collapse ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ) + m_width - 8; + int y = get_relative_y( ) + 2; + + return mouse_x >= x && mouse_x <= x + 5 + && mouse_y >= y && mouse_y <= y + 7; + } + + bool is_collapsed( ) { + return ( m_collapse && !m_open ); + } + + inline void update_size( ) { + if ( !m_dynamic ) return; + + int total_height{ ITEM_OFFSET * 2 }; + for ( auto& it : m_items ) { + if ( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + if( m_max_height && total_height + item_height > m_max_height ) { + total_height = m_max_height; + break; + } + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + m_height = total_height; + } + + virtual int get_total_height( ) const override { + if( !m_open && m_collapse ) return 18; + return m_height + 5; + } + + int get_total_item_height( ) { + int total_height{ ITEM_OFFSET * 2 }; + for( auto& it : m_items ) { + if( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + return total_height; + } + + void input( ) { + if( m_collapse ) { + bool hovered = is_collapse_hovered( ); + bool clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + if( hovered && clicked ) { + if( !m_was_pressed ) { + m_open ^= 1; + } + m_was_pressed = true; + } + else { + m_was_pressed = false; + } + } + + if( m_max_height && get_total_item_height( ) > m_max_height ) { + if( !m_disabled && is_hovered( ) ) { + auto scroll_state = g_input.get_scroll_state( ); + if( !!scroll_state && m_was_hovered ) { + scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; + } + m_scroll_offset = std::clamp( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ), 0 ); + } + } + else { + m_scroll_offset = 0; + } + } + + virtual void render( ) override { + update_size( ); + input( ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int text_w, text_h; + ui_get_text_size( text_w, text_h, m_text ); + + if( m_collapse ) { + if( !m_open && m_collapse ) { + ui_draw_outlined_rect( x, y, m_width, 14, ui_get_accent_col( ) ); + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "+" ); + return; + } + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); + } + + ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_max_height && get_total_item_height( ) > m_height ) { + const size_t height = get_total_height( ) - 20; + const float delta = ( float )( get_total_item_height( ) - height + 1 ); + const float slider_step = ( ( float )( height ) / delta ); + const float slider_height = slider_step * 13.f; + + size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); + ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); + ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); + } + + if( is_hovered( ) != m_was_hovered ) { + bool backup = m_disabled; + if( !backup ) { + set_disabled( !is_hovered( ) ); + } + m_disabled = backup; + } + + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + if( m_collapse ) { + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "-" ); + } + + m_was_hovered = is_hovered( ); + } + + protected: + bool m_dynamic{ }; + bool m_was_hovered{ }; + int m_max_height{ }; + int m_scroll_offset{ }; + bool m_was_pressed{ }; + bool m_collapse{ }; + bool m_open{ true }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_key_picker.h b/cheat/gmod/ui_key_picker.h new file mode 100644 index 0000000..03aed84 --- /dev/null +++ b/cheat/gmod/ui_key_picker.h @@ -0,0 +1,164 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_key_picker : public base_item { + public: + c_key_picker( int x, int y, int w, const char* name, int* setting ) : + base_item( x, y, w, 16, name ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 12; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), + g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); + } + + protected: + int* m_setting{ }; + bool m_active{ }; + bool m_mouse_held{ }; + }; + + //skEeT PiCkErS + class c_key_picker_small : public base_item { + public: + c_key_picker_small( int x, int y, int* setting ) : + base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } + + virtual int get_total_height( ) const override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int w, h; + ui_get_text_size( w, h, name ); + + return h; + } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + int mouse_x, mouse_y; + int w, h; + + ui_get_text_size( w, h, "[%s]", name ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= x - w && mouse_x <= x + && mouse_y >= y && mouse_y <= y + h; + } + + void input( ) { + + bool active_backup = m_active; + bool active_changed = false; + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int w, h; + ui_get_text_size( w, h, "[%s]", name ); + + input( ); + + ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? + ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); + } + + protected: + int* m_setting; + bool m_active{ }; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_label.h b/cheat/gmod/ui_label.h new file mode 100644 index 0000000..9df46b5 --- /dev/null +++ b/cheat/gmod/ui_label.h @@ -0,0 +1,18 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_label : public base_item { + public: + c_label( int x, int y, const char* text ) : + base_item( x, y, 0, 16, text ) { } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); + } + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_menu.h b/cheat/gmod/ui_menu.h new file mode 100644 index 0000000..53a17a0 --- /dev/null +++ b/cheat/gmod/ui_menu.h @@ -0,0 +1,89 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_menu : public base_item { + public: + c_menu( int start_x, int start_y, int width, + int height, const char* name, const char* right_text = nullptr ) : + base_item( start_x, start_y, width, height, name ), + m_right_text( right_text ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= m_x && mouse_x <= m_x + w( ) + && mouse_y >= m_y && mouse_y <= m_y + 19; + } + + virtual int y( ) const override { + return m_y + 19; + } + + inline void input( ) { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) ) { + m_mouse_held = true; + } + + if ( !mouse_clicked ) { + m_mouse_held = is_hovered( ); + } + + if ( m_mouse_held && !mouse_clicked ) { + m_drag_offset_y = mouse_y - m_y; + m_drag_offset_x = mouse_x - m_x; + } + + if ( m_mouse_held && mouse_clicked ) { + m_x = mouse_x - m_drag_offset_x; + m_y = mouse_y - m_drag_offset_y; + } + } + + virtual void render( ) override { + constexpr auto top_height = 19; + + input( ); + + //draw a c00l shadow + ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); + + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); + if( is_hovered( ) ) { + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); + } + ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_right_text ) { + ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); + + int width, height; + ui_get_text_size( width, height, m_right_text ); + + ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); + } + else { + ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); + } + } + + protected: + int m_drag_offset_x{ }; + int m_drag_offset_y{ }; + bool m_mouse_held{ }; + const char* m_right_text{ }; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_render.h b/cheat/gmod/ui_render.h new file mode 100644 index 0000000..f67f16b --- /dev/null +++ b/cheat/gmod/ui_render.h @@ -0,0 +1,63 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + //recursively render all items + static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { + if( !item->get_visible( ) ) return; + + item->reset( ); + item->render( ); + bool reset = false; + RECT original; + + if( allow_rect && item->is_form( ) ) { + auto device = g_d3d.get_device( ); + device->GetScissorRect( &original ); + + auto x = item->get_relative_x( ); + auto y = item->get_relative_y( ); + + RECT new_rect{ + x, + y + 4, + x + item->w( ), + y + item->get_total_height( ) - 7 + }; + + device->SetScissorRect( &new_rect ); + reset = true; + } + + bool draw = true; + if( item->is_form( ) ) { + auto form_cast = static_cast< c_form* >( item ); + draw = !form_cast->is_collapsed( ); + } + + if( item->get_items( ).size( ) && draw ) { + //madr0fl + int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); + int cur_offset = 0; + for( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { + auto& cur_item = item->get_items( )[ i ]; + height_offset[ i ] = cur_offset; + cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; + } + + int i{ }; + for( auto& it : item->get_items( ) ) { + item->set_y_offset( height_offset[ i ] ); + render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); + ++i; + } + } + + if( reset ) { + auto device = g_d3d.get_device( ); + device->SetScissorRect( &original ); + } + } +} \ No newline at end of file diff --git a/cheat/gmod/ui_slider.h b/cheat/gmod/ui_slider.h new file mode 100644 index 0000000..0e55a73 --- /dev/null +++ b/cheat/gmod/ui_slider.h @@ -0,0 +1,165 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + template < typename t > + class c_slider : public base_item { + public: + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + if( !m_has_text ) { + x += 4; + return mouse_x >= x && mouse_x <= x + m_width - 8 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + void input( ) { + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + bool hovered = is_hovered( ); + float progress = 0.f; + int x = get_relative_x( ); + int y = get_relative_y( ) + 2; + int mouse_x, mouse_y; + + *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + if ( hovered && mouse_clicked ) { + + float progress{ }; + + if( m_has_text ) { + progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); + } + else { + progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); + } + + *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); + } + + if( !m_has_text ) { + bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; + + bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; + bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; + + if( mouse_clicked ) { + if( !m_mouse_held ) { + if( !std::is_floating_point< t >::value ) { + if( minus_hovered ) *m_setting -= ( t )1; + if( plus_hovered ) *m_setting += ( t )1; + } + else if( m_max - m_min <= 2.0f ) { + if( minus_hovered ) *m_setting -= ( t )0.1f; + if( plus_hovered ) *m_setting += ( t )0.1f; + } + } + + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + }; + + void draw_slider( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + } + + void draw_slider_small( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + x -= 1; //i couldnt be fucked + + ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + + ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); + ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); + + char val_str[ 12 ]; + if( m_suffix ) + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ) + 3, y + 2, true, ui_get_text_col( ), val_str ); + } + + virtual int get_total_height( ) const override { + return m_height + ( m_has_text ? 12 : 6 ); + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + int text_w, text_h; + char val[ 12 ]; + + input( ); + + //weird hacky fix for floating point vars + if ( m_suffix ) + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + if( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_get_text_size( text_w, text_h, val ); + ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); + draw_slider( x, y + 12 ); + } + else { + draw_slider_small( x, y + 2 ); + } + } + + + protected: + t* m_setting; + t m_full; + float m_min; + float m_max; + bool m_has_text = true; + const char* m_suffix; + bool m_mouse_held = false; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_tab_manager.h b/cheat/gmod/ui_tab_manager.h new file mode 100644 index 0000000..b771470 --- /dev/null +++ b/cheat/gmod/ui_tab_manager.h @@ -0,0 +1,228 @@ +#pragma once +#include "ui_base_item.h" + + + +namespace ui +{ + namespace { + constexpr int BUTTON_WIDTH = 120; + constexpr int BUTTON_HEIGHT = 100; + + constexpr int SUBTAB_HEIGHT = 25; + } + + class c_tab_sheet : public base_item { + public: + c_tab_sheet( const char* tab_name ) : + base_item( 0, 0, 0, 0, tab_name ), + m_fade_progress( 0 ) { }; + + c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : + base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), + m_fade_progress( 0.f ) { + }; + + virtual void render( ) override { }; + virtual bool is_hovered( ) override { + return false; + }; + + public: + float m_fade_progress{ }; + d3d::c_sprite* m_sprite{ }; + }; + + + class c_tab_manager : public base_item { + public: + c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, + xors( "TAB_MANAGER" ) ) { }; + + virtual bool is_hovered( ) override { + return false; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto text = item->get_text( ); + auto parent_x = m_parent->x( ) + 5; + auto parent_y = m_parent->y( ) + 5; + int item_height = BUTTON_HEIGHT; + + scale_button_fade( item, hovered ); + + ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, + item_height + 1, ui_get_bg_col( ) ); + + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_disabled_col( ) ); + + if( hovered ) { + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); + } + + if( item->m_sprite ) { + auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); + item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, + parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); + } + else { + g_con->log( "sprite is null" ); + } + } + + inline bool is_button_hovered( int start ) { + auto item_x = m_parent->x( ) + 5; + auto item_y = m_parent->y( ) + 5 + start; + int item_height = BUTTON_HEIGHT; + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 + && mouse_y >= item_y && mouse_y <= item_y + item_height; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int cur_y{ 10 }; + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( cur_y ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); + cur_y += BUTTON_HEIGHT + 4; + } + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + + protected: + decltype( m_parent ) m_selected_tab{ }; + }; + + + class c_subtab_manager : public base_item { + public: + c_subtab_manager( ) : base_item( 0, 35, 0, 5, + xors( "SUBTAB_MANAGER" ) ) { } + + virtual bool is_hovered( ) override { return false; } + + int get_button_width( ) { + int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; + + if ( !m_items.empty( ) ) + return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); + + return width; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void render_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto item_x = get_relative_x( ) + start - 2; + auto item_y = get_relative_y( ) + 3 - m_y; + auto width = get_button_width( ); + + scale_button_fade( item, hovered ); + clr_t tab_clr = ui_get_disabled_col( ); + + //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); + if ( hovered ) { + clr_t col = ui_get_accent_col( ); + col.a( ) *= item->m_fade_progress; + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); + } + + ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); + } + + bool is_button_hovered( decltype( m_parent )& button, int start ) { + int item_x = get_relative_x( ) + start - 2; + int item_y = get_relative_y( ) + 3 - m_y - 3; + int item_w = get_button_width( ); + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + item_w && + mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int start = 2; + int width = get_button_width( ); + + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( it, start ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + render_button( it, start, hovered || it == m_selected_tab ); + start += width; + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + } + + protected: + decltype( m_parent ) m_selected_tab; + }; +} \ No newline at end of file diff --git a/cheat/gmod/ui_text_input.h b/cheat/gmod/ui_text_input.h new file mode 100644 index 0000000..f486106 --- /dev/null +++ b/cheat/gmod/ui_text_input.h @@ -0,0 +1,47 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_text_input : public base_item { + c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str ) : + base_item( x, y, w, 16, name ), m_length( max_chars ), m_str( str ) { } + + virtual bool is_hovered( ) override { + + } + + void input( ) { + static float last_press[ KEYS_MAX ]{ }; + + int key = g_input.is_any_key_pressed( ); + if ( key == KEYS_BACK ) { + if ( strlen( m_str ) ) { + m_str[ strlen( m_str ) - 1 ] = 0; + } + } + if ( key != KEYS_NONE ) { + float cur_time = GetTickCount( ) * 0.001f; + if ( std::abs( cur_time - last_press[ key ] ) > 0.1f ) { + + auto scan_code = MapVirtualKeyA( key, MAPVK_VK_TO_VSC ); + uword_t ascii; + ToAscii( key, scan_code, 0, &ascii, 0 ); + char str[ 2 ] = { ( char )ascii, 0 }; + strcat_s( m_str, m_length, str ); + + last_press[ key ] = cur_time; + } + } + } + + virtual void render( ) override { + + } + + protected: + size_t m_length{ }; + char* m_str{ }; + + }; +} \ No newline at end of file diff --git a/cheat/gmod/util.cpp b/cheat/gmod/util.cpp new file mode 100644 index 0000000..a038871 --- /dev/null +++ b/cheat/gmod/util.cpp @@ -0,0 +1,265 @@ +#include "util.hpp" + +#include "interface.hpp" +#include "c_base_player.hpp" +#include "pattern.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "math.hpp" +#include "base_cheat.hpp" + +float TICK_INTERVAL( ) { + return g_gmod.m_globals->m_interval_per_tick; +} + +int TIME_TO_TICKS( float dt ) { + return static_cast< int >( 0.5f + dt / TICK_INTERVAL( ) ); +} + +float TICKS_TO_TIME( int tick ) { + return tick * TICK_INTERVAL( ); +} + +bool util::is_low_fps( ) { + return g_gmod.m_globals->m_frametime > g_gmod.m_globals->m_interval_per_tick; +} + +/* +int util::get_closest_player( ) { + float cur_fov{ 360.f }; + int ret{ -1 }; + vec3_t viewangles{ }; + vec3_t local_pos{ }; + + bool friendlies = g_settings.rage.active ? + g_settings.rage.friendlies : g_settings.legit.friendlies; + + local_pos = g_ctx.m_local->get_eye_pos( ); + g_gmod.m_engine( )->GetViewAngles( viewangles ); + + for( int i{ 1 }; i < g_gmod.m_globals->m_maxclients; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + + if( !ent ) continue; + if( ent == g_ctx.m_local ) continue; + if( !ent->is_valid( ) ) continue; + int team = ent->m_iTeamNum( ); + if( team == g_ctx.m_local->m_iTeamNum( ) && !friendlies ) { + continue; + } + + auto ang = math::vector_angles( local_pos, ent->get_hitbox_pos( 0 ) ); + ang.clamp( ); + + float fov = ( viewangles - ang ).clamp( ).length2d( ); + if( fov < cur_fov ) { + ret = i; + cur_fov = fov; + } + } + + return ret; +} +*/ + +void util::clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* tr ) { + CGameTrace player_trace; + Ray_t ray; + float smallest_fraction = tr->fraction; + + ray.Init( src, end ); + + if ( !filter->ShouldHitEntity( player, mask ) ) { + return; + } + + g_gmod.m_trace( )->ClipRayToEntity( ray, mask | CONTENTS_HITBOX, player, &player_trace ); + + if ( player_trace.fraction < smallest_fraction ) { + *tr = player_trace; + smallest_fraction = player_trace.fraction; + } +} + +std::string util::hitgroup_to_string( int hitgroup ) { + switch( hitgroup ) { + case HITGROUP_CHEST: + return xors( "chest" ); + case HITGROUP_HEAD: + return xors( "head" ); + case HITGROUP_LEFTARM: + return xors( "left arm" ); + case HITGROUP_LEFTLEG: + return xors( "left leg" ); + case HITGROUP_RIGHTARM: + return xors( "right arm" ); + case HITGROUP_RIGHTLEG: + return xors( "right leg" ); + case HITGROUP_STOMACH: + return xors( "stomach" ); + default: + return xors( "generic" ); + } +} + +bool util::trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ) { + CGameTrace tr; + Ray_t ray; + CTraceFilter filter; + + filter.pSkip = a; + + ray.Init( start, end ); + + g_gmod.m_trace( )->TraceRay( ray, 0x46004003 | CONTENTS_HITBOX, &filter, &tr ); + clip_trace_to_player( b, start, end, ( unsigned )0x46004003, &filter, &tr ); + + return tr.m_pEnt == b || tr.fraction > 0.98f; +} + +void util::set_random_seed( int seed ) { + using fn = int( __cdecl* )( int ); + static fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomSeed" ) ) ); + + fn_ptr( seed ); +} + +float util::get_random_float( float min, float max ) { + using fn = float( *)( float, float ); + static fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomFloat" ) ) ); + + return fn_ptr( min, max ); +} + +vec3_t util::get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ) { + set_random_seed( ( seed & 0xff ) + 1 ); + + float rand_a = get_random_float( 0.0f, 1.0f ); + float pi_rand_a = get_random_float( 0.f, 2.f * M_PI ); + float rand_b = get_random_float( 0.f, 1.0f ); + float pi_rand_b = get_random_float( 0.f, 2.f * M_PI ); + + float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); + float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); + + vec3_t forward, right, up; + math::angle_vectors( angles, &forward, &right, &up ); + + vec3_t spread_dir = forward + ( right * spread_x ) + ( up * spread_y ); + spread_dir.normalize_vector( ); + + return spread_dir; +} + +float util::get_total_latency( ) { + auto nci = g_gmod.m_engine( )->GetNetChannelInfo( ); + + if ( nci ) { + float latency = nci->GetLatency( 0 ) + nci->GetLatency( 1 ); + return latency; + } + + return 0.f; +} + +float util::get_lerptime( ) { + static cvar_t* cl_interpolate = g_gmod.m_cvar( )->FindVar( xors( "cl_interpolate" ) ); + static cvar_t* cl_interp = g_gmod.m_cvar( )->FindVar( xors( "cl_interp" ) ); + static cvar_t* cl_updaterate = g_gmod.m_cvar( )->FindVar( xors( "cl_updaterate" ) ); + static cvar_t* cl_interp_ratio = g_gmod.m_cvar( )->FindVar( xors( "cl_interp_ratio" ) ); + + if( cl_interp && cl_interpolate && cl_updaterate && cl_interp_ratio ) { + bool interpolate = cl_interpolate->get_int( ); + if( interpolate ) { + float interp = cl_interp->get_float( ); + float interp_ratio = cl_interp_ratio->get_float( ); + float updaterate = cl_updaterate->get_float( ); + + return std::max< float >( interp, interp_ratio / updaterate ); + } + } + + return 0.f; +} + +/* +bool util::is_tick_valid( int tickcount ) { + float latency = get_total_latency( ); + float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); + float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) + TICK_INTERVAL( ) * 2.f ); + + return std::abs( delta ) < 0.2f; +} + +bool util::is_tick_valid( int tickcount, float in_latency ) { + float latency = in_latency; + auto nci = g_gmod.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + latency += nci->GetLatency( 0 ); + } + + float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); + float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) + TICK_INTERVAL( ) ); + + return std::abs( delta ) < 0.2f; +} +*/ +void util::disable_pvs( ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_valid( ) ) + continue; + + if( ent == g_ctx.m_local ) + continue; + + *( int* )( uintptr_t( ent ) + 0xa30 ) = g_gmod.m_globals->m_framecount; + *( int* )( uintptr_t( ent ) + 0xa28 ) = 0; + } +} + +vec2_t util::screen_transform( vec3_t world ) { + vec2_t screen; + auto w2s = [ &world, &screen ]( ) -> bool { + + //matrix3x4& matrix2 = *( matrix3x4* )( 0x18C * 2 + *( uintptr_t * )( ( uintptr_t )g_gmod.m_engine_render( ) + 0xDC ) - 0x44 ); + VMatrix& matrix = g_cheat.m_visuals.get_matrix( ); + + screen.x = matrix[ 0 ][ 0 ] * world[ 0 ] + matrix[ 0 ][ 1 ] * world[ 1 ] + matrix[ 0 ][ 2 ] * world[ 2 ] + matrix[ 0 ][ 3 ]; + screen.y = matrix[ 1 ][ 0 ] * world[ 0 ] + matrix[ 1 ][ 1 ] * world[ 1 ] + matrix[ 1 ][ 2 ] * world[ 2 ] + matrix[ 1 ][ 3 ]; + + float w = matrix[ 3 ][ 0 ] * world[ 0 ] + matrix[ 3 ][ 1 ] * world[ 1 ] + matrix[ 3 ][ 2 ] * world[ 2 ] + matrix[ 3 ][ 3 ]; + + if( w < 0.001f ) { + //screen.x *= 100000.f; + //screen.y *= 100000.f; + return true; + } + + float invw = 1.0f / w; + screen.x *= invw; + screen.y *= invw; + + return false; + }; + + w2s( ); + //if ( !w2s( ) ) { + int w, h; + g_gmod.m_engine( )->GetScreenSize( w, h ); + + screen.x = ( w * .5f ) + ( screen.x * w ) * .5f; + screen.y = ( h * .5f ) - ( screen.y * h ) * .5f; + + return screen; + //} + + return vec2_t{ }; +} + diff --git a/cheat/gmod/util.hpp b/cheat/gmod/util.hpp new file mode 100644 index 0000000..0013611 --- /dev/null +++ b/cheat/gmod/util.hpp @@ -0,0 +1,102 @@ +#pragma once +#include +#include + +#include "strings.hpp" + +#define NAMESPACE_REGION( x ) namespace x { +#define END_REGION } + +extern int TIME_TO_TICKS( float dt ); +extern float TICKS_TO_TIME( int tick ); +extern float TICK_INTERVAL( ); + +//WEE WOO WEE WOO ITS THE DWORD POLICE +using ulong_t = unsigned long; +using uword_t = unsigned short; + +class IClientEntity; +class CTraceFilter; +class CGameTrace; +class vec3_t; +class vec2_t; + +NAMESPACE_REGION( util ) + +template < typename t > +struct reverse_iterable { + reverse_iterable( t&& it ) : + iterable( it ) { } + + t& iterable; + inline auto begin( ) { + return std::rbegin( iterable ); + } + + inline auto end( ) { + return std::rend( iterable ); + } +}; + +template< typename t > +reverse_iterable< t > +reverse_iterator( t&& iter ) { + return reverse_iterable< t >{ iter }; +} + +template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { + if ( !classbase ) return fn{ }; + return ( fn )( *( uintptr_t** )classbase )[ index ]; +} + +template < size_t index, typename ret, class ... args_ > +__forceinline ret get_vfunc( void* thisptr, args_... args ) { + using fn = ret( __thiscall* )( void*, args_... ); + + auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; + return fn_ptr( thisptr, args... ); +} + +__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { + std::string ascii_str( unicode.begin( ), unicode.end( ) ); + return ascii_str; +} + +__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { + std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); + return unicode_str; +} + +template < typename integer > +__forceinline auto to_hex_str( const integer& w, + size_t hex_len = sizeof( integer ) << 1 ) { + constexpr const char* hex_digits = xors( "0123456789abcdef" ); + std::string rc( hex_len, 0 ); + + for( size_t i{ }, j{ ( hex_len - 1 ) * 4 } ; i < hex_len; ++i, j -= 4 ) + rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; + + return rc; +} + +extern void clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* trace ); + +extern bool trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ); +extern bool is_low_fps( ); +extern bool is_tick_valid( int tickcount ); +extern bool is_tick_valid( int tickcount, float in_latency ); +extern void set_random_seed( int seed ); +extern vec3_t get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ); +extern float get_random_float( float min, float max ); +extern bool hitchance( int target, const vec3_t& angles, int percentage ); +extern float get_total_latency( ); +extern float get_lerptime( ); +extern int get_closest_player( ); +extern vec2_t screen_transform( vec3_t world ); +extern const char* definition_index_to_name( int index ); +extern void disable_pvs( ); +extern int hitbox_to_hitgroup( int hitbox ); +extern std::string hitgroup_to_string( int hitgroup ); + +END_REGION \ No newline at end of file diff --git a/cheat/gmod/vector.hpp b/cheat/gmod/vector.hpp new file mode 100644 index 0000000..a917bb8 --- /dev/null +++ b/cheat/gmod/vector.hpp @@ -0,0 +1,329 @@ +#pragma once +#include +#include + +class vec2_t { +public: + vec2_t( ) { + x = y = 0.0f; + } + + vec2_t( float X, float Y ) { + x = X; y = Y; + } + + vec2_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const vec2_t& v ) { + x = v.x; y = v.y; + } + + vec2_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec2_t& operator+=( const vec2_t& v ) { + x += v.x; y += v.y; return *this; + } + + vec2_t& operator-=( const vec2_t& v ) { + x -= v.x; y -= v.y; return *this; + } + + vec2_t& operator*=( const vec2_t& v ) { + x *= v.x; y *= v.y; return *this; + } + + vec2_t& operator/=( const vec2_t& v ) { + x /= v.x; y /= v.y; return *this; + } + + vec2_t& operator+=( float v ) { + x += v; y += v; return *this; + } + + vec2_t& operator-=( float v ) { + x -= v; y -= v; return *this; + } + + vec2_t& operator*=( float v ) { + x *= v; y *= v; return *this; + } + + vec2_t& operator/=( float v ) { + x /= v; y /= v; return *this; + } + + vec2_t operator+( const vec2_t& v ) const { + return vec2_t( x + v.x, y + v.y ); + } + + vec2_t operator-( const vec2_t& v ) const { + return vec2_t( x - v.x, y - v.y ); + } + + vec2_t operator*( const vec2_t& v ) const { + return vec2_t( x * v.x, y * v.y ); + } + + vec2_t operator/( const vec2_t& v ) const { + return vec2_t( x / v.x, y / v.y ); + } + + vec2_t operator+( float v ) const { + return vec2_t( x + v, y + v ); + } + + vec2_t operator-( float v ) const { + return vec2_t( x - v, y - v ); + } + + vec2_t operator*( float v ) const { + return vec2_t( x * v, y * v ); + } + + vec2_t operator/( float v ) const { + return vec2_t( x / v, y / v ); + } + + void set( float X = 0.0f, float Y = 0.0f ) { + x = X; y = Y; + } + + float length( void ) const { + return sqrtf( x * x + y * y ); + } + + float lengthsqr( void ) const { + return ( x * x + y * y ); + } + + float dist_to( const vec2_t& v ) const { + return ( *this - v ).length( ); + } + + float dist_to_sqr( const vec2_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + float dot( const vec2_t& v ) const { + return ( x * v.x + y * v.y ); + } + + bool is_zero( void ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON ); + } + + operator bool( ) const noexcept { + return !is_zero( ); + } + +public: + float x, y; +}; + +class vec3_t { +public: + vec3_t( ) { + x = y = z = 0.0f; + } + + vec3_t( float X, float Y, float Z ) { + x = X; y = Y; z = Z; + } + + vec3_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; + } + + vec3_t( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; + } + + __forceinline vec3_t& operator=( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; return *this; + } + + __forceinline vec3_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + __forceinline float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec3_t& operator+=( const vec3_t& v ) { + x += v.x; y += v.y; z += v.z; return *this; + } + + vec3_t& operator-=( const vec3_t& v ) { + x -= v.x; y -= v.y; z -= v.z; return *this; + } + + vec3_t& operator*=( const vec3_t& v ) { + x *= v.x; y *= v.y; z *= v.z; return *this; + } + + vec3_t& operator/=( const vec3_t& v ) { + x /= v.x; y /= v.y; z /= v.z; return *this; + } + + vec3_t& operator+=( float v ) { + x += v; y += v; z += v; return *this; + } + + vec3_t& operator-=( float v ) { + x -= v; y -= v; z -= v; return *this; + } + + vec3_t& operator*=( float v ) { + x *= v; y *= v; z *= v; return *this; + } + + vec3_t& operator/=( float v ) { + x /= v; y /= v; z /= v; return *this; + } + + __forceinline vec3_t operator+( const vec3_t& v ) const { + return vec3_t( x + v.x, y + v.y, z + v.z ); + } + + __forceinline vec3_t operator-( const vec3_t& v ) const { + return vec3_t( x - v.x, y - v.y, z - v.z ); + } + + __forceinline vec3_t operator*( const vec3_t& v ) const { + return vec3_t( x * v.x, y * v.y, z * v.z ); + } + + __forceinline vec3_t operator/( const vec3_t& v ) const { + return vec3_t( x / v.x, y / v.y, z / v.z ); + } + + __forceinline vec3_t operator+( float v ) const { + return vec3_t( x + v, y + v, z + v ); + } + + __forceinline vec3_t operator-( float v ) const { + return vec3_t( x - v, y - v, z - v ); + } + + __forceinline vec3_t operator*( float v ) const { + return vec3_t( x * v, y * v, z * v ); + } + + __forceinline vec3_t operator/( float v ) const { + return vec3_t( x / v, y / v, z / v ); + } + + __forceinline float length( ) const { + return sqrtf( x * x + y * y + z * z ); + } + + __forceinline float lengthsqr( ) const { + return ( x * x + y * y + z * z ); + } + + __forceinline float length2d( ) const { + return sqrtf( x * x + y * y ); + } + + __forceinline float length2dsqr( ) const { + return ( x * x + y * y ); + } + + __forceinline float dist_to( const vec3_t& v ) const { + return ( *this - v ).length( ); + } + + __forceinline float dist_to_sqr( const vec3_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + __forceinline float dot( const vec3_t& v ) const { + return ( x * v.x + y * v.y + z * v.z ); + } + + __forceinline float fov_to( const vec3_t& to ) const { + const float from_length = length( ); + const float to_length = to.length( ); + + if( from_length && to_length ) { + return acos( dot( to ) / from_length * to_length ); + } + + return 0.f; + } + + vec3_t cross( const vec3_t& v ) const { + return vec3_t( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); + } + + bool is_zero( ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON && + z > -FLT_EPSILON && z < FLT_EPSILON ); + } + + operator bool( ) const { + return !is_zero( ); + } + + inline void normalize_vector( ) { + vec3_t& v = *this; + + float iradius = 1.f / ( this->length( ) + FLT_EPSILON ); //FLT_EPSILON + + v.x *= iradius; + v.y *= iradius; + v.z *= iradius; + } + + vec3_t clamp( ) { + for ( size_t axis{ }; axis < 2; axis++ ) { + auto &cur_axis = operator[]( axis ); + if ( !std::isfinite( cur_axis ) ) { + cur_axis = 0.f; + } + } + + x = std::clamp( x, -89.f, 89.f ); + y = std::clamp( std::remainder( y, 360.f ), -180.f, 180.f ); + z = 0.f; + return *this; + } + +public: + float x, y, z; +}; + +__forceinline vec3_t operator*( float f, const vec3_t& v ) { + return v * f; +} diff --git a/cheat/gmod/visual.hpp b/cheat/gmod/visual.hpp new file mode 100644 index 0000000..748497f --- /dev/null +++ b/cheat/gmod/visual.hpp @@ -0,0 +1,51 @@ +#pragma once +#include +#include "interface.hpp" +#include "vector.hpp" +#include "color.hpp" +#include "d3d.hpp" +#include +#include "strings.hpp" +#include "IVRenderView.hpp" + +class c_base_player; + +namespace features +{ + class c_visuals + { + void draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ); + void draw_line( int x, int y, int x1, int y1, const clr_t& clr ); + void draw_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_filled_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_circle( int x, int y, int r, const clr_t& clr, int res = 48 ); + + void draw_really_big_string( int x, int y, const clr_t& clr, const char* msg, ... ); + void draw_string( int x, int y, int align, bool big, const clr_t& clr, const char* msg, ... ); + + struct stored_player_data_t + { + std::string m_rank{ }; + clr_t m_team_color{ }; + matrix3x4 m_matrix[ 128 ]{ }; + vec3_t m_pos{ }; + matrix3x4 m_coordinate_frame{ }; + }; + + struct stored_data_t + { + std::array< stored_player_data_t, 256 > m_player{ }; + VMatrix m_matrix{ }; + }; + + stored_data_t m_data{ }; + + void spectator_list( ); + void draw_players( ); + + public: + void operator( )( ); + void store_data( ); + VMatrix& get_matrix( ); + }; +} \ No newline at end of file diff --git a/cheat/gmod/visual_draw.cpp b/cheat/gmod/visual_draw.cpp new file mode 100644 index 0000000..db282a7 --- /dev/null +++ b/cheat/gmod/visual_draw.cpp @@ -0,0 +1,64 @@ +#include "d3d.hpp" +#include "interface.hpp" +#include "renderer.hpp" +#include "visual.hpp" +#include "settings.hpp" + +namespace features +{ + void c_visuals::draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ) { + g_d3d.draw_line( clr, a.x, a.y, b.x, b.y ); + } + + void c_visuals::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + g_d3d.draw_line( clr, x, y, x1, y1 ); + } + + void c_visuals::draw_rect( int x, int y, int w, int h, const clr_t& clr ) { + g_d3d.draw_rect( clr, x, y, w, h ); + } + + void c_visuals::draw_filled_rect( int x, int y, int w, int h, const clr_t& col ) { + g_d3d.draw_filled_rect( col, x, y, w, h ); + } + + void c_visuals::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + g_d3d.draw_circle( col, x, y, r, res ); + } + + void c_visuals::draw_string( int x, int y, int align, bool big, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + switch( align ) { + case ALIGN_CENTER: + g_d3d.draw_text< ALIGN_CENTER >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + break; + case ALIGN_LEFT: + g_d3d.draw_text< ALIGN_LEFT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + break; + case ALIGN_RIGHT: + g_d3d.draw_text< ALIGN_RIGHT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + break; + } + } + + void c_visuals::draw_really_big_string( int x, int y, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + g_d3d.draw_text< ALIGN_LEFT >( ::d3d::fonts.f_18, col, x, y, D3DFONTFLAG_OUTLINE, buffer ); + } +} \ No newline at end of file diff --git a/cheat/gmod/visual_local.cpp b/cheat/gmod/visual_local.cpp new file mode 100644 index 0000000..94de96b --- /dev/null +++ b/cheat/gmod/visual_local.cpp @@ -0,0 +1,503 @@ +#include + +#include "visual.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.hpp" + +namespace features +{ + void c_visuals::draw_local( ) { + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + if( g_ctx.m_local->is_valid( ) ) { + static float incoming_latency; + if( g_settings.misc.net_fakelag ) { + float desired_latency = incoming_latency + g_settings.misc.net_fakeping_amount * 0.001f; + if( g_settings.misc.net_fakelag == 4 ) + desired_latency = 1.0f; + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float cur_latency = nci->GetLatency( 1 ); + float percentage = cur_latency / desired_latency; + percentage = std::clamp( percentage + 0.1f, 0.f, 1.f ); + + clr_t col = clr_t::blend( esp_red( ), esp_green( ), percentage ); + + bool visible = g_settings.misc.net_fakeping_active; + if( g_settings.misc.net_fakelag == 4 ) + visible = true; + + if( percentage > 0.35f || visible ) { + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, col, xors( "PING" ) ); + } + } + } + else { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + incoming_latency = nci->GetLatency( 1 ); + } + } + + if( g_settings.rage.enabled( ) && + g_settings.rage.anti_aim( ) && + g_settings.rage.break_lby( ) ) { + static float last_lby = 0.f; + static float last_update = 0.f; + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + if( lby != last_lby ) { + last_update = g_csgo.m_globals->m_curtime; + last_lby = lby; + } + + float lby_delta = std::abs( std::remainderf( lby - g_ctx.m_last_realangle.y, 360.f ) ); + float time_delta = g_csgo.m_globals->m_curtime - last_update; + + bool breaking = lby_delta > 35.f && time_delta > 0.2f; + + if( g_cheat.m_ragebot.m_antiaim->is_edging( ) ) { + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, esp_green( ), xors( "EDGE" ) ); + } + + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, breaking ? esp_green( ) : esp_red( ), xors( "LBY" ) ); + + if( g_settings.rage.preserve_fps && g_settings.rage.enabled && util::is_low_fps( ) ) { + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, esp_red( ), xors( "FPS" ) ); + } + + if( g_settings.rage.draw_angles ) { + auto get_rotated_point = [ ]( vec2_t point, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + + point.x += sin( rad ) * distance; + point.y += cos( rad ) * distance; + + return point; + }; + + auto draw_rotated_triangle = [ &get_rotated_point ]( vec2_t point, float rotation, clr_t col ) { + vec2_t rotated_pos_1 = get_rotated_point( point, rotation + 205.f, 30.f ); + vec2_t rotated_pos_2 = get_rotated_point( point, rotation + 155.f, 30.f ); + + vertex_t v[ ] = { + { point }, + { rotated_pos_1 }, + { rotated_pos_2 } + }; + + g_renderer.draw_polygon( 3, v, col ); + }; + + vec2_t rotated_lby{ screen_w * 0.5f, screen_h * 0.5f }; + vec2_t rotated_real{ screen_w * 0.5f, screen_h * 0.5f }; + + vec3_t angles{ }; + g_csgo.m_engine( )->GetViewAngles( angles ); + + float rotation_lby = std::remainderf( g_ctx.m_local->m_flLowerBodyYawTarget( ) - angles.y, 360.f ) - 180.f; + float rotation_real = std::remainderf( g_ctx.m_last_realangle.y - angles.y, 360.f ) - 180.f; + + rotated_lby = get_rotated_point( rotated_lby, rotation_lby, 120.f ); + rotated_real = get_rotated_point( rotated_real, rotation_real, 120.f ); + + draw_rotated_triangle( rotated_lby, rotation_lby, g_settings.rage.lby_color ); + draw_rotated_triangle( rotated_real, rotation_real, g_settings.rage.real_color ); + } + } + + if( g_settings.rage.fakelag.mode( ) && + g_settings.rage.fakelag.ticks( ) && + g_settings.rage.fakelag.in_air( ) ) { + int min_dist = 64; + int max_ticks = g_settings.rage.fakelag.ticks; + if( g_settings.rage.fakelag.mode == 2 ) { + max_ticks += g_settings.rage.fakelag.fluctuate * 0.01f; + max_ticks = math::min( max_ticks, 15 ); + } + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed > 255 && speed * g_csgo.m_globals->m_interval_per_tick * max_ticks > 50 ) { + bool breaking = g_cheat.m_lagmgr.is_breaking_lc( ); + g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, breaking ? esp_green( ) : esp_red( ), xors( "LC" ) ); + } + } + } + + if( g_settings.misc.no_scope( ) && + g_ctx.m_local->m_bIsScoped( ) ) { + int w, h; + g_csgo.m_engine( )->GetScreenSize( w, h ); + + g_renderer.draw_line( 0, h / 2, w, h / 2, clr_t( 0, 0, 0 ) ); + g_renderer.draw_line( w / 2, 0, w / 2, h, clr_t( 0, 0, 0 ) ); + } + + draw_spread( ); + draw_autowall( ); + spectator_list( ); + grenade_prediction( ); + } + + void c_visuals::spectator_list( ) { + if( !g_settings.visuals.spec_list ) + return; + + std::vector< std::string > spec_list; + + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + if( ent && ent->is_player( ) && !ent->ce( )->IsDormant( ) ) { + auto spec_handle = ent->m_hObserverTarget( ); + auto spec_ent = g_csgo.m_entlist( )->GetClientEntityFromHandle< >( spec_handle ); + + if( spec_ent == g_ctx.m_local ) { + char player_name[ 32 ]; + ent->get_name_safe( player_name ); + spec_list.push_back( player_name ); + } + } + } + + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + if( g_settings.misc.watermark ) { + cur_pos = 20; + } + + for( auto& it : spec_list ) { + g_renderer.draw_string< ALIGN_RIGHT >( g_fonts.f_12, screen_w - 3, cur_pos, clr_t( 255, 255, 255 ), it.c_str( ) ); + cur_pos += 10; + } + } + + void c_visuals::grenade_prediction( ) { + static auto molotov_detonate_time = g_csgo.m_cvar( )->FindVar( xors( "molotov_throw_detonate_time" ) ); + static auto molotov_detonate_slope = g_csgo.m_cvar( )->FindVar( xors( "weapon_molotov_maxdetonateslope" ) ); + static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + + if( !g_settings.visuals.grenade_prediction ) + return; + + auto is_grenade = [ ]( int defindex ) { + switch( defindex ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + case WEAPON_SMOKEGRENADE: + case WEAPON_MOLOTOV: + case WEAPON_INCGRENADE: + case WEAPON_DECOY: + return true; + default: return false; + } + }; + + auto get_detonate_time = [ ]( int defindex ) { + switch( defindex ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + return 1.5f; + case WEAPON_INCGRENADE: + case WEAPON_MOLOTOV: + return molotov_detonate_time->get_float( ); + case WEAPON_DECOY: + return 5.f; + default: return 3.f; + } + }; + + auto draw_3d_line = [ ]( const vec3_t& start, const vec3_t& end, clr_t col, bool circle = false ) { + vec2_t start_w2s = util::screen_transform( start ); + vec2_t end_w2s = util::screen_transform( end ); + + g_renderer.draw_line( start_w2s, end_w2s, col ); + if( circle ) + g_renderer.draw_filled_circle( end_w2s.x, end_w2s.y, 2, clr_t( 230, 230, 230 ), 24 ); + }; + + auto clip_velocity = [ ]( const vec3_t& in, const vec3_t& normal, vec3_t& out, float overbounce ) { + int blocked = 0; + float angle = normal[ 2 ]; + + if( angle > 0.f ) + blocked |= 1; + + if( !angle ) + blocked |= 2; + + float backoff = in.dot( normal ) * overbounce; + + for( int i{ }; i < 3; ++i ) { + out[ i ] = in[ i ] - ( normal[ i ] * backoff ); + + if( out[ i ] > -0.1f && out[ i ] < 0.1f ) { + out[ i ] = 0.f; + } + } + + return blocked; + }; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) return; + + int def_index = weapon->m_iItemDefinitionIndex( ); + if( !is_grenade( def_index ) || !weapon->m_bPinPulled( ) ) + return; + + auto wpn_info = weapon->get_wpn_info( ); + + vec3_t throw_ang, forward; + g_csgo.m_engine( )->GetViewAngles( throw_ang ); + throw_ang.x -= ( 90.f - abs( throw_ang.x ) ) * 0.11111111f; + throw_ang.x = std::remainderf( throw_ang.x, 360.f ); + + forward = math::angle_vectors( throw_ang ); + + float throw_strength = weapon->m_flThrowStrength( ); + float throw_velocity = std::min( std::max( wpn_info->throw_velocity * 0.9f, 15.f ), 750.f ); + + float throw_height = ( throw_strength * 12.f ) - 12.f; + float v68 = throw_velocity * ( ( 0.7f * throw_strength ) + 0.3f ); + + vec3_t start_pos = g_ctx.m_local->get_eye_pos( ) + vec3_t( 0, 0, throw_height ); + vec3_t end_pos = start_pos + ( forward * 22.f ); + + CTraceFilter filter; + filter.pSkip = g_ctx.m_local; + + CGameTrace trace; + Ray_t ray; + ray.Init( start_pos, end_pos, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); + end_pos = trace.endpos - forward * 6.f; + vec3_t throw_pos = g_ctx.m_local->m_vecVelocity( ) * 1.25f + forward * v68; + + //draw_3d_line( start_pos, end_pos, clr_t( 66, 143, 244 ) ); + float gravity = sv_gravity->get_float( ) * 0.4f; + + player_info_t info{ }; + + for( int ticks = TIME_TO_TICKS( get_detonate_time( def_index ) ); ticks >= 0; --ticks ) { + auto throw_dir = vec3_t( throw_pos.x, throw_pos.y, throw_pos.z + ( throw_pos.z - ( gravity * TICK_INTERVAL( ) ) ) * 0.5f ); + auto temp = throw_dir * TICK_INTERVAL( ); + throw_pos.z -= gravity * TICK_INTERVAL( ); + + vec3_t src = end_pos, end = end_pos + temp; + Ray_t ray; + ray.Init( src, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); + if( trace.allsolid ) + throw_pos = vec3_t( ); + + end_pos = trace.endpos; + draw_3d_line( src, end_pos, clr_t( 66, 143, 244 ) ); + + if( trace.fraction != 1.f ) { + float surf_elasticity = 1.f; + vec3_t throw_pos2{ }; + clip_velocity( throw_pos, trace.plane.normal, throw_pos2, 2.f ); + + if( trace.m_pEnt && g_csgo.m_engine( )->GetPlayerInfo( trace.m_pEnt->GetIndex( ), &info ) ) { + surf_elasticity = 0.3f; + } + + throw_pos2 *= std::clamp( surf_elasticity * 0.45f, 0.f, 0.9f ); + end = end_pos + throw_pos2 * ( ( 1.f - trace.fraction ) * TICK_INTERVAL( ) ); + + if( def_index == WEAPON_MOLOTOV || def_index == WEAPON_INCGRENADE ) { + if( trace.plane.normal.z >= cos( DEG2RAD( molotov_detonate_slope->get_float( ) ) ) ) { + return; + } + } + + ray.Init( end_pos, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); + + draw_3d_line( end_pos, end, clr_t( 66, 143, 244 ), true ); + end_pos = trace.endpos; + throw_pos = throw_pos2; + } + } + } + + void c_visuals::draw_autowall( ) { + if( !g_settings.visuals.autowall_crosshair ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon || weapon->is_knife( ) || weapon->is_grenade( ) ) + return; + + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + auto wpn_data = weapon->get_wpn_info( ); + + vec3_t angles{ }; + g_csgo.m_engine( )->GetViewAngles( angles ); + + fire_bullet_data_t data{ }; + data.src = g_ctx.m_local->get_eye_pos( ); + vec3_t end = data.src; + end += math::angle_vectors( angles ) * wpn_data->range; + + data.filter.pSkip = g_ctx.m_local; + data.current_damage = wpn_data->damage; + data.penetrate_count = 1; + data.trace_length = 0.f; + + //data.length_to_end = ( end - data.src ).length( ); + data.trace_length_remaining = wpn_data->range - data.trace_length; + data.direction = math::angle_vectors( angles ); + + data.direction.normalize_vector( ); + + CTraceFilter filter; + Ray_t ray; + + filter.pSkip = g_ctx.m_local; + ray.Init( data.src, end ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT | CONTENTS_GRATE, &filter, &data.enter_trace ); + + bool can_penetrate = g_cheat.m_autowall.handle_bullet_penetration( wpn_data, data ); + + g_renderer.draw_box( screen_w / 2 - 1, screen_h / 2, 1, 1, + can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ) ); + } + + void c_visuals::draw_spread( ) { + if( !g_settings.visuals.draw_spread ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( weapon ) { + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + int cross_x = screen_w / 2, cross_y = screen_h / 2; + + float recoil_step = screen_h / g_ctx.m_fov; + + cross_x -= ( int )( g_ctx.m_local->m_aimPunchAngle( ).y * recoil_step ); + cross_y += ( int )( g_ctx.m_local->m_aimPunchAngle( ).x * recoil_step ); + + weapon->update_accuracy_penalty( ); + float inaccuracy = weapon->get_inaccuracy( ); + float spread = weapon->get_spread( ); + + float cone = inaccuracy * spread; + cone *= screen_h * 0.7f; + cone *= 90.f / g_ctx.m_fov; + + for( int seed{ }; seed < 256; ++seed ) { + util::set_random_seed( math::random_number( 0, 255 ) + 1 ); + float rand_a = util::get_random_float( 0.f, 1.0f ); + float pi_rand_a = util::get_random_float( 0.f, 2.0f * M_PI ); + float rand_b = util::get_random_float( 0.0f, 1.0f ); + float pi_rand_b = util::get_random_float( 0.f, 2.f * M_PI ); + + float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); + float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); + + float max_x = cos( pi_rand_a ) * cone + cos( pi_rand_b ) * cone; + float max_y = sin( pi_rand_a ) * cone + sin( pi_rand_b ) * cone; + + float step = screen_h / g_ctx.m_fov * 90.f; + int screen_spread_x = ( int )( spread_x * step * 0.7f ); + int screen_spread_y = ( int )( spread_y * step * 0.7f ); + + float percentage = ( rand_a * inaccuracy + rand_b * spread ) / ( inaccuracy + spread ); + + g_renderer.draw_rect( cross_x + screen_spread_x, cross_y + screen_spread_y, 1, 1, + clr_t( 255, 255, 255, 255 * ( 0.4f + percentage * 0.6f ) ) * ( 0.1f + percentage * 0.9f ) ); + } + } + } + + void c_visuals::store_tracer( int index, vec3_t pos ) { + static float last_time[ 65 ]{ }; + tracer_t new_tracer; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); + if( ent && ent->is_valid( ) ) { + bool valid = ent == g_ctx.m_local; + float time = g_csgo.m_globals->m_curtime; + auto ent_pos = ent->get_hitbox_pos( 0 ); + + if( ent != g_ctx.m_local && g_ctx.m_local->is_valid( ) && + ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.visuals.friendlies( ) ) ) { + vec3_t ang = math::vector_angles( ent_pos, pos ); + vec3_t local_pos = g_ctx.m_local->get_hitbox_pos( 0 ); + float dist = local_pos.dist_to( ent_pos ); + + vec3_t local_ang = math::vector_angles( ent_pos, local_pos ); + + constexpr float max_delta_sqr = 30.f * 30.f; + + float pitch_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).x ) ) ) * dist; + float yaw_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).y ) ) ) * dist; + float delta_sqr = ( yaw_delta * yaw_delta + pitch_delta * pitch_delta ); + + + if( delta_sqr > max_delta_sqr ) return; + + vec3_t vec = math::angle_vectors( ang ); + vec *= dist; + vec += ent_pos; + + pos = vec; + + valid = true; + } + + if( valid ) { + float delta = std::abs( g_csgo.m_globals->m_curtime - last_time[ index ] ); + if( delta > g_csgo.m_globals->m_interval_per_tick ) { + new_tracer.m_time = time; + new_tracer.m_start = ent_pos; + new_tracer.m_end = pos; + new_tracer.m_local = ent == g_ctx.m_local; + m_tracers.emplace_back( new_tracer ); + + last_time[ index ] = g_csgo.m_globals->m_curtime; + } + } + } + } + + void c_visuals::draw_tracers( ) { + if( !g_settings.visuals.bullet_tracers ) return; + float time = g_csgo.m_globals->m_curtime; + + for( size_t i{ }; i < m_tracers.size( ) && !m_tracers.empty( ); ++i ) { + auto& tr = m_tracers[ i ]; + + float delta = time - tr.m_time; + if( delta > 1.0f ) m_tracers.erase( m_tracers.begin( ) + i ); + } + + if( !m_tracers.empty( ) ) { + for( auto& it : m_tracers ) { + float delta = time - it.m_time; + auto w2s_begin = util::screen_transform( it.m_start ); + auto w2s_end = util::screen_transform( it.m_end ); + + clr_t col = it.m_local ? clr_t::from_hsb( delta, 1.0f, 1.0f ) : clr_t( 255, 15, 46 ); + col.a( ) = 1.0f - delta * 255; + + g_renderer.draw_line( w2s_begin, w2s_end, col ); + } + } + } +} \ No newline at end of file diff --git a/cheat/gmod/visual_player.cpp b/cheat/gmod/visual_player.cpp new file mode 100644 index 0000000..fb65458 --- /dev/null +++ b/cheat/gmod/visual_player.cpp @@ -0,0 +1,308 @@ +#include + +#include "visual.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.hpp" + +/* + Change hook where grabbing lua related from RenderView to CEngineVGui::Paint to see if that works. + I do all my drawing in Paint and should not crash( I never crash ). +*/ + +namespace features +{ + + struct box_t + { + int x, y, w, h; + }; + + box_t get_box( c_base_player* ent, matrix3x4& frame ) { + const matrix3x4& matrix = frame; + + vec3_t min = ent->m_vecMins( ); + vec3_t max = ent->m_vecMaxs( ); + + std::array< vec3_t, 8 > point_list = { + vec3_t{ min.x, min.y, min.z }, + vec3_t{ min.x, max.y, min.z }, + vec3_t{ max.x, max.y, min.z }, + vec3_t{ max.x, min.y, min.z }, + vec3_t{ max.x, max.y, max.z }, + vec3_t{ min.x, max.y, max.z }, + vec3_t{ min.x, min.y, max.z }, + vec3_t{ max.x, min.y, max.z } + }; + + std::array< float, 8 > x_points; + std::array< float, 8 > y_points; + + for( auto& it : point_list ) { + vec3_t backup = it; + for( int i{ }; i < 3; ++i ) { + it[ i ] = backup.dot( ( const vec3_t& )( matrix[ i ] ) ) + matrix[ i ][ 3 ]; + } + } + + for( size_t i{ }; i < 8; ++i ) { + vec2_t w2s = util::screen_transform( point_list[ i ] ); + x_points[ i ] = w2s.x; + y_points[ i ] = w2s.y; + } + + std::sort( x_points.begin( ), x_points.end( ) ); + std::sort( y_points.begin( ), y_points.end( ) ); + + int x = ( int )x_points.front( ); + int w = ( int )x_points.back( ) - x; + + int y = ( int )y_points.front( ); + int h = ( int )y_points.back( ) - y; + + return { x, y, w, h }; + } + + void c_visuals::store_data( ) { + g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); + if( !g_ctx.m_lua ) + return; + + m_data.m_matrix = *( VMatrix* )( 0x18C * 2 + *( uintptr_t* )( ( uintptr_t )g_gmod.m_engine_render( ) + 0xDC ) - 0x44 ); + + const auto local_id = g_gmod.m_engine( )->GetLocalPlayer( ); + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !ent || !ent->is_valid( ) ) + continue; + + auto& data = m_data.m_player.at( i ); + + if( g_settings.visuals.ignore_teamcolor ) { + data.m_team_color = ent->get_team_color( ); + } + + if( i == local_id ) + continue; + + data.m_coordinate_frame = ent->m_CoordinateFrame( ); + + if( g_settings.visuals.skeleton ) { + ent->ce( )->SetupBones( data.m_matrix, 128, 0x100, g_gmod.m_globals->m_curtime ); // yep, 256 is the max bone count in gmod, but i doubt it's used for anything. + } + + if( g_settings.visuals.rank || g_settings.visuals.spec_list ) { + data.m_rank = ent->get_rank( ); + } + } + } + + void c_visuals::spectator_list( ) { + if( !g_settings.visuals.spec_list ) + return; + + int cur_pos{ }; + player_info_t info{ }; + char buffer[ 128 ]{ }; + std::vector< const char* > list_of_names{ }; + + const int local_id = g_gmod.m_engine( )->GetLocalPlayer( ); + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + if( i == local_id ) + continue; + + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !ent ) + continue; + + if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) + continue; + + auto target = ent->get_observer_target( ); + if( !target ) + continue; + + if( target->ce( )->GetIndex( ) != local_id ) + continue; + + sprintf_s( buffer, "%s - (%s)", info.name, m_data.m_player.at( i ).m_rank.c_str( ) ); + + list_of_names.push_back( buffer ); + } + + int screen_w, screen_h; + g_gmod.m_engine( )->GetScreenSize( screen_w, screen_h ); + + if( g_settings.misc.watermark ) { + cur_pos = 20; + } + + for( const auto& it : list_of_names ) { + draw_string( screen_w - 3, cur_pos, ALIGN_RIGHT, true, clr_t( 255, 255, 255 ), it ); + cur_pos += 10; + } + } + + + void c_visuals::draw_players( ) { + const auto local_id = g_gmod.m_engine( )->GetLocalPlayer( ); + const auto local_team_color = m_data.m_player.at( local_id ).m_team_color; + + for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { + if( i == local_id ) + continue; + + auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); + if( !ent || !ent->is_valid( ) ) + continue; + + auto& data = m_data.m_player.at( i ); + + if( g_settings.visuals.ignore_team && + g_ctx.m_local->m_iTeamNum( ) == ent->m_iTeamNum( ) ) + continue; + + if( g_settings.visuals.ignore_teamcolor && + local_team_color == data.m_team_color ) + continue; + + //clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? + // g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; + + clr_t col = g_settings.visuals.box_enemy; + + auto box = get_box( ent, data.m_coordinate_frame ); + int health = ent->m_iHealth( ); + int bottom_pos = 0; + + if( g_settings.visuals.skeleton( ) ) { + //clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.skeleton_friendly : g_settings.visuals.skeleton_enemy; + clr_t col = g_settings.visuals.skeleton_enemy; + + auto hdr = g_gmod.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); + if( hdr ) { + for( size_t bone{ }; bone < hdr->numbones; ++bone ) { + auto b = hdr->get_bone( bone ); + if( b && b->flags & 0x100 && b->parent != -1 ) { + vec3_t child = vec3_t{ data.m_matrix[ bone ][ 0 ][ 3 ], data.m_matrix[ bone ][ 1 ][ 3 ], data.m_matrix[ bone ][ 2 ][ 3 ] }; + vec3_t parent = vec3_t{ data.m_matrix[ b->parent ][ 0 ][ 3 ], data.m_matrix[ b->parent ][ 1 ][ 3 ], data.m_matrix[ b->parent ][ 2 ][ 3 ] }; + + auto child_screen = util::screen_transform( child ); + auto parent_screen = util::screen_transform( parent ); + + draw_line( child_screen, parent_screen, col ); + } + } + } + } + + if( g_settings.visuals.box( ) ) { + draw_rect( box.x + 1, box.y + 1, box.w - 2, box.h - 2, clr_t( 0, 0, 0, 180 ) ); + draw_rect( box.x, box.y, box.w, box.h, col ); + } + + if( g_settings.visuals.health( ) ) { + auto fill = box.h - 1; + fill *= std::clamp( health, 0, 100 ) * 0.01f; + + auto hp_col = clr_t( + std::min< int >( 510 * ( 100 - health ) / 100, 255 ), + std::min< int >( 510 * health / 100, 255 ), + 0, + 255 ); + + draw_filled_rect( box.x - 4, box.y, 3, box.h + 1, clr_t( 0, 0, 0, 170 ) ); + draw_filled_rect( box.x - 3, box.y + box.h - fill, 1, fill, hp_col ); + + if( health != 100 ) + draw_string( box.x - 2, box.y + 1 + box.h - fill - 3, ALIGN_CENTER, false, clr_t( 255, 255, 255, 255 ), "%d", health ); + } + + if( g_settings.visuals.name( ) ) { + draw_string( box.x + box.w / 2, box.y - 12, ALIGN_CENTER, true, + clr_t( 255, 255, 255, 255 ), ent->get_info( ).name ); + } + + if( g_settings.visuals.weapon( ) ) { + auto weapon = ent->get_weapon( ); + if( weapon ) { + std::string wep_str = weapon->get_print_name( ); + if( !wep_str.empty( ) ) { + std::transform( wep_str.begin( ), wep_str.end( ), wep_str.begin( ), ::tolower ); // lowercase gang + + draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, + clr_t( 255, 255, 255, 255 ), wep_str.c_str( ) ); // font is a little ugly + + bottom_pos += 11; + } + } + } + + if( g_settings.visuals.rank( ) ) { + auto rank = data.m_rank; + if( !rank.empty( ) ) { + draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, + clr_t( 255, 255, 255, 255 ), rank.c_str( ) ); + + bottom_pos += 11; + } + } + + //if( g_settings.visuals.ammo ) { m_iClip1 just returns the max clip??? doesn't work. + // if( auto weapon = ent->get_weapon( ) ) { // hacker codes 8) + // draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, + // clr_t( 255, 255, 255, 255 ), "%d / %d", weapon->m_iClip1( ), m_stored_data.at( i ).m_max_clip1 ); + // } + //} + } + } + + void c_visuals::operator()( ) { + g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); + if( !g_ctx.m_lua ) + return; + + switch( g_settings.visuals.activation_type( ) ) { + case 0: + g_settings.visuals.active = false; + break; + case 1: + g_settings.visuals.active = true; + break; + case 2: + g_settings.visuals.active = g_input.is_key_pressed( g_settings.visuals.key ); + break; + case 3: + { + static bool held = false; + bool pressed = g_input.is_key_pressed( g_settings.visuals.key ); + if( pressed ) { + if( !held ) + g_settings.visuals.active ^= 1; + held = true; + } + else held = false; + } + break; + default: + g_settings.visuals.active = false; + break; + } + + if( g_ctx.run_frame( ) ) { + spectator_list( ); + g_cheat.m_playerlist( ); + if( g_settings.visuals.active ) { + draw_players( ); + } + } + } + + VMatrix& c_visuals::get_matrix( ) { + return m_data.m_matrix; + } +} \ No newline at end of file diff --git a/cheat/gmod/visual_world.cpp b/cheat/gmod/visual_world.cpp new file mode 100644 index 0000000..1f504bd --- /dev/null +++ b/cheat/gmod/visual_world.cpp @@ -0,0 +1,207 @@ +#include + +#include "context.hpp" +#include "visual.hpp" +#include "interface.hpp" +#include "renderer.hpp" + +namespace features +{ + void fix_static_props( ) { + static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) ); + static bool fixed{ }; + if( !fixed ) { + cvar->m_flags |= 0; + cvar->set_value( 1 ); + + fixed = true; + } + } + + void c_visuals::draw_world( ) { + if( !g_settings.visuals.active ) + return; + + static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) ); + + for( int i{ 64 }; i < g_csgo.m_entlist( )->GetHighestEntityIndex( ); ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< IClientEntity >( i ); + if( !ent ) continue; + + auto client_class = ent->GetClientClass( ); + if( !client_class ) continue; + + int class_id = client_class->m_class_id; + + if( class_id != CBaseWeaponWorldModel && ( strstr( client_class->m_name, xors( "Weapon" ) ) + || class_id == CDEagle || class_id == CAK47 ) ) { + auto owner = ( int )ent->as< c_base_weapon >( )->m_hOwner( ) & 0xfff; + if( owner <= 0 || owner > 64 ) { + auto origin = ent->GetRenderOrigin( ); + if( origin ) { + bool draw = g_settings.visuals.weapon_esp( ) == 1; + bool glow = g_settings.visuals.weapon_esp( ) == 2; + + if( draw || g_settings.visuals.weapon_esp == 3 ) { + if( !glow ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false; + } + + auto w2s = util::screen_transform( origin ); + auto def_index = ent->as< c_base_weapon >( )->m_iItemDefinitionIndex( ); + auto name = util::definition_index_to_name( def_index ); + + g_renderer.draw_string< ALIGN_CENTER >( g_fonts.f_esp_small, w2s.x, w2s.y, + g_settings.visuals.weapon_esp_clr( ), name ); + } + if( glow || g_settings.visuals.weapon_esp == 3 ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + } + } + } + else { + if( g_settings.visuals.grenade_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) { + auto model = ent->GetModel( ); + if( !model ) continue; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) + continue; + + std::string name = xors( "nade" ); + if( strstr( hdr->name, xors( "flash" ) ) ) { + name = xors( "flash" ); + } + else if( strstr( hdr->name, xors( "smoke" ) ) ) { + name = xors( "smoke" ); + } + else if( strstr( hdr->name, xors( "decoy" ) ) ) { + name = xors( "decoy" ); + } + else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) { + name = xors( "molotov" ); + } + + if( g_settings.visuals.grenade_esp == 2 || g_settings.visuals.grenade_esp == 3 ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + + if( g_settings.visuals.grenade_esp == 1 || g_settings.visuals.grenade_esp == 3 ) { + auto pos = ent->GetRenderOrigin( ); + auto w2s = util::screen_transform( pos ); + + g_renderer.draw_string< ALIGN_CENTER >( g_fonts.f_esp_small, w2s.x, w2s.y, + g_settings.visuals.grenade_esp_clr, name.c_str( ) ); + } + } + } + + } + } + + void c_visuals::world_modulate( ) { + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials; + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2; + static c_base_player* local_player = nullptr; + static auto night_mode = false; + static bool modulated = false; + static bool alpha = false; + + if( !g_settings.visuals.world_modulate || !g_csgo.m_engine( )->IsInGame( ) ) { + modulated = false; + if( !world_materials2.empty( ) ) { + for( auto& it : world_materials2 ) { + auto mat = g_csgo.m_mat_system( )->GetMaterial( it.first ); + if( !mat ) continue; + + auto original_col = it.second; + mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) ); + mat->AlphaModulate( original_col.a( ) ); + } + + world_materials.clear( ); + world_materials2.clear( ); + } + + return; + } + + if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) { + fix_static_props( ); + + if( local_player == g_ctx.m_local && + night_mode == g_settings.visuals.night_mode( ) && + alpha == g_settings.visuals.transparent_props( ) && + modulated == g_settings.visuals.world_modulate( ) ) + return; + + + for( auto i = g_csgo.m_mat_system( )->FirstMaterial( ); + i != g_csgo.m_mat_system( )->InvalidMaterial( ); + i = g_csgo.m_mat_system( )->NextMaterial( i ) ) { + + auto mat = g_csgo.m_mat_system( )->GetMaterial( i ); + if( !mat ) continue; + + const char* group = mat->GetTextureGroupName( ); + bool is_world = strstr( group, xors( "World" ) ); + bool is_sky = strstr( group, xors( "Sky" ) ); + bool is_prop = strstr( group, xors( "StaticProp" ) ); + + if( is_world || is_sky || is_prop ) { + const char* name = mat->GetName( ); + if( world_materials.find( i ) == world_materials.end( ) ) { + fclr_t clr; + + mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) ); + clr.a( ) = mat->GetAlphaModulation( ); + + world_materials.emplace( i, clr ); + world_materials2.emplace( i, clr ); + } + + fclr_t new_color; + + new_color = world_materials2.find( i )->second; + bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate; + + if( is_world ) { + if( apply ) { + new_color.r( ) *= 0.15f; + new_color.g( ) *= 0.15f; + new_color.b( ) *= 0.15f; + } + } + else if( is_prop ) { + if( apply ) { + new_color.r( ) *= 0.3f; + new_color.g( ) *= 0.3f; + new_color.b( ) *= 0.3f; + } + if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) { + new_color.a( ) *= 0.6f; + } + } + else if( is_sky ) { + if( apply ) { + new_color = fclr_t( 0.f, 0.f, 0.f ); + } + } + + if( !( world_materials.at( i ) == new_color ) ) { + mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) ); + mat->AlphaModulate( new_color.a( ) ); + + world_materials.at( i ) = new_color; + } + } + } + + modulated = g_settings.visuals.world_modulate; + night_mode = g_settings.visuals.night_mode; + alpha = g_settings.visuals.transparent_props; + local_player = g_ctx.m_local; + } + } +} \ No newline at end of file diff --git a/cheat/gmod/vmt.hpp b/cheat/gmod/vmt.hpp new file mode 100644 index 0000000..0665e17 --- /dev/null +++ b/cheat/gmod/vmt.hpp @@ -0,0 +1,94 @@ +#pragma once +#include +#include "util.hpp" + +// todo - dex; rewrite this, VirtualQuery (except for custom codeptr / readptr) and VirtualProtect shouldnt be used +// and we need to copy rtti over too or stuff will break later on + +// correct me if im wrong, but the vtable isnt replaced, instead the original is edited during hooking, rtti should be intact and accessable by game +// class could definetly do with a rewrite tho! + +// ^ you're corrct, but changing page rights and replacing ptrs direclty in rdata (or usually the heap, since thats where vmts go) is not a safe solution +// copying table + aligning it to compensate for rtti is safer +// vac loves scanning memory regions but it doesnt really do much outside of game servers (only loads some shit for checking DEP and stuff) + +// trash + +//llama is a fucking nigger +//true + +namespace hooks +{ + class c_vmt { + uintptr_t* m_table; + uintptr_t* m_original; + std::vector< uintptr_t > m_new; + public: + int count( ) { + int vfunc_count{ }; + + while ( m_original[ vfunc_count ] ) { + vfunc_count++; + }; + + return vfunc_count; + } + + c_vmt( void* table ) { + if ( !table ) { + return; + } + + this->m_table = reinterpret_cast< uintptr_t* >( table ); + this->m_original = *reinterpret_cast< uintptr_t** >( this->m_table ); + + for ( int i = -1; i < this->count( ); ++i ) { + this->m_new.push_back( this->m_original[ i ] ); + } + + auto data = this->m_new.data( ); + *this->m_table = uintptr_t( &data[ 1 ] ); + } + + ~c_vmt( ) { } + + template< typename T = uintptr_t > T get_function( int index ) { + return( ( T )( this->m_new.at( index + 1 ) ) ); + } + + template< typename T = uintptr_t > T get_old_function( int index ) { + return( ( T )( this->m_original[ index ] ) ); + } + + void hook( int index, uintptr_t new_func ) { + this->m_new.at( index + 1 ) = new_func; + } + + void unhook( int index ) { + this->m_new.at( index + 1 ) = this->m_original[ index ]; + } + + void hook( int index, void* new_func ) { + hook( index, reinterpret_cast< uintptr_t >( new_func ) ); + } + + void restore( ) const { + *this->m_table = uintptr_t( m_original ); + } + + static void* hook_method( void* instance, int index, void* function ) { + // edits the vtable itself + // i cannot be bothered re-hooking stuff on every instance creation + // so this should fix this problem, (should be fine on gmod cuz no AC) + void** vfunc = *( void*** )instance + index; + void* oldvf = *vfunc; + + unsigned long prot; + ::VirtualProtect( vfunc, 4, 0x40, &prot ); + *vfunc = function; + ::VirtualProtect( vfunc, 4, prot, &prot ); + + return oldvf; + } + }; +} \ No newline at end of file diff --git a/cheat/gmod/window_procedure.cpp b/cheat/gmod/window_procedure.cpp new file mode 100644 index 0000000..f47027b --- /dev/null +++ b/cheat/gmod/window_procedure.cpp @@ -0,0 +1,98 @@ +#include "base_cheat.hpp" +#include "hooks.hpp" +#include "input_system.hpp" +#include "settings.hpp" + +decltype( &hooks::window_procedure ) hooks::window_procedure_o; +long __stdcall hooks::window_procedure( HWND hwnd, uint32_t msg, uint32_t wparam, long lparam ) { + if ( g_gmod.m_panic ) { + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); + } + + if ( msg == WM_ACTIVATE && wparam == WA_INACTIVE ) { + g_input.clear_keys( ); + } + + if ( msg == WM_MOUSEMOVE ) { + g_input.capture_mouse_move( lparam ); + g_con->get_input( )->capture_mouse_move( lparam ); + } + + auto enable_screen_clicker = []( bool enable ) -> void { + + }; + + //static auto cvar = g_gmod.m_cvar( )->FindVar( xors( "cl_mouseenable" ) ); + static auto con_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_HOME ) ) { + if( !con_pressed ) { + if( !g_con->m_open ) { + g_con->m_consuming_input = true; + } + + g_con->m_open ^= 1; + } + + //cvar->set_value( !g_con->m_open ); + con_pressed = true; + } + else con_pressed = false; + + static auto list_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_DELETE ) ) { + if( !list_pressed ) { + g_cheat.m_playerlist.is_open( ) ^= 1; + list_pressed = true; + } + } + else list_pressed = false; + + if( g_cheat.m_playerlist.is_open( ) ) { + if( g_con->get_input( )->is_key_pressed( KEYS_DOWN ) ) { + g_cheat.m_playerlist.get_index( )++; + } + else if( g_con->get_input( )->is_key_pressed( KEYS_UP ) ) { + g_cheat.m_playerlist.get_index( )--; + } + + if( g_cheat.m_playerlist.get_index( ) < 0 ) + g_cheat.m_playerlist.get_index( ) = g_cheat.m_playerlist.get_list( ).size( ) - 1; + else if( g_cheat.m_playerlist.get_index( ) >= ( signed )g_cheat.m_playerlist.get_list( ).size( ) ) + g_cheat.m_playerlist.get_index( ) = 0; + + static bool was_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_LEFT ) || g_con->get_input( )->is_key_pressed( KEYS_RIGHT ) ) { + if( !was_pressed ) { + *g_cheat.m_playerlist.get_list( )[ g_cheat.m_playerlist.get_index( ) ].m_friend ^= 1; + was_pressed = true; + } + } + else was_pressed = false; + } + + if( g_con->get_input( )->register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) ) { + if( g_con->m_open ) return false; + } + + if( !g_con->m_open ) { + static bool was_pressed = false; + if( g_input.is_key_pressed( KEYS_INSERT ) ) { + if( !was_pressed ) { + g_settings.menu.open ^= 1; + //cvar->set_value( !g_settings.menu.open ); + //g_gmod.m_surface( )->SetCursorVisible( g_settings.menu.open ); + was_pressed = true; + } + } + else { + was_pressed = false; + } + + if( g_input.register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) + && g_settings.menu.open ) { + return false; + } + } + + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); +} \ No newline at end of file diff --git a/cheat/gmod/x86.hpp b/cheat/gmod/x86.hpp new file mode 100644 index 0000000..e96c469 --- /dev/null +++ b/cheat/gmod/x86.hpp @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace x86 +{ + enum class reg : size_t { + eax = 0, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + + /* + x64: + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15,*/ + }; + + enum instruction : uint8_t { + retn_imm16 = 0xc2, + retn = 0xc3, + fs = 0x64, + //its big nigga season + call = 0xff + }; + + __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { + return ( 0xb8 + ( size_t( dreg ) ) ); + } + + __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { + return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); + } + + __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { + return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); + } +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/CHLClient.hpp b/cheat/internal_rewrite/CHLClient.hpp new file mode 100644 index 0000000..94d209f --- /dev/null +++ b/cheat/internal_rewrite/CHLClient.hpp @@ -0,0 +1,83 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "ClientClass.hpp" +#include "color.hpp" + +enum ClientFrameStage_t { + FRAME_UNDEFINED = -1, + FRAME_START, + FRAME_NET_UPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_END, + FRAME_NET_UPDATE_END, + FRAME_RENDER_START, + FRAME_RENDER_END +}; + +struct GlowObject_t { + IClientEntity* m_pEntity; + fclr_t color; + char junk0[ 8 ]; + float m_flBloomAmount; + char junk1[ 4 ]; + bool m_bRenderWhenOccluded; + bool m_bRenderWhenUnoccluded; + bool m_bFullBloom; + char junk2[ 14 ]; +}; + +struct GlowObjectManager_t { + GlowObject_t* DataPtr; //0000 + unsigned int Max; //0004 + unsigned int unk02; //0008 + unsigned int Count; //000C + unsigned int DataPtrBack; //0010 + int m_nFirstFreeSlot; //0014 + unsigned int unk1; //0018 + unsigned int unk2; //001C + unsigned int unk3; //0020 + unsigned int unk4; //0024 + unsigned int unk5; //0028 +}; + +class IBaseClientDLL +{ +public: + ClientClass* GetAllClasses( ) { + using fn = ClientClass*( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 8 )( this ); + } + + /* + DONTCARE + void SetCrosshairAngle( Vector& angle ) + { + typedef void( __thiscall* SetCrosshairAngleFn )( void*, Vector& ); + CallVFunction( this, 29 )( this, angle ); + } + + void HudProcessInput( bool enable ) + { + using fn = void( __thiscall* )( void*, bool ); + CallVFunction( this, 10 )( this, enable ); + } + + void HudUpdate( bool enable ) + { + using fn = void( __thiscall* )( void*, bool ); + CallVFunction( this, 11 )( this, enable ); + } + + void IN_ActivateMouse( ) + { + using fn = void( __thiscall* )( void* ); + CallVFunction( this, 15 )( this ); + } + + void IN_DeactivateMouse( ) + { + using fn = void( __thiscall* )( void* ); + CallVFunction( this, 16 )( this ); + }*/ +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/CInput.hpp b/cheat/internal_rewrite/CInput.hpp new file mode 100644 index 0000000..84802d3 --- /dev/null +++ b/cheat/internal_rewrite/CInput.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include "vector.hpp" +#include "IClientMode.hpp" + +#define MULTIPLAYER_BACKUP 150 + +struct verified_cmd_t { + user_cmd_t m_cmd; + CRC32_t m_crc; +}; + +class CInput { + void* pvftable; //0x00 +public: + bool m_fTrackIRAvailable; //0x04 + bool m_fMouseInitialized; //0x05 + bool m_fMouseActive; //0x06 + bool m_fJoystickAdvancedInit; //0x07 +private: + char pad_0x08[ 0x2C ]; //0x08 +public: + void* m_pKeys; //0x34 +private: + char pad_0x38[ 0x64 ]; //0x38 + int pad_0x41; + int pad_0x42; +public: + bool m_fCameraInterceptingMouse; //0x9C + bool m_fCameraInThirdPerson; //0x9D + bool m_fCameraMovingWithMouse; //0x9E + vec3_t m_vecCameraOffset; //0xA0 + bool m_fCameraDistanceMove; //0xAC + int m_nCameraOldX; //0xB0 + int m_nCameraOldY; //0xB4 + int m_nCameraX; //0xB8 + int m_nCameraY; //0xBC + bool m_CameraIsOrthographic; //0xC0 + vec3_t m_angPreviousViewAngles; //0xC4 + vec3_t m_angPreviousViewAnglesTilt; //0xD0 + float m_flLastForwardMove; //0xDC + int m_nClearInputState; //0xE0 +public: + user_cmd_t* m_pCommands; //0xEC + verified_cmd_t* m_pVerifiedCommands; //0xF0 + int m_hSelectedWeapon; + + user_cmd_t* GetUserCmd( int slot, int seq_num ) { + return util::get_vfunc< 8, user_cmd_t* >( this, slot, seq_num ); + } + + void CreateMove( int sequence_number, float input_sample_time, bool active ) { + return util::get_vfunc< 3, void >( this, sequence_number, input_sample_time, active ); + } +}; diff --git a/cheat/internal_rewrite/CUtlVector.hpp b/cheat/internal_rewrite/CUtlVector.hpp new file mode 100644 index 0000000..6e43505 --- /dev/null +++ b/cheat/internal_rewrite/CUtlVector.hpp @@ -0,0 +1,47 @@ +#pragma once + +template +class CUtlMemory { +public: + T* GetBuffer( void ) { + return m_pMemory; + } + + int GetAllocationCount( void ) { + return m_nAllocationCount; + } + + int GetGrowSize( void ) { + return m_nGrowSize; + } + + T* OffsetBufferByIndex( size_t index ) { + return m_pMemory + index; + } + +private: + T* m_pMemory; + int m_nAllocationCount; + int m_nGrowSize; +}; + +template > +class CUtlVector { +public: + Allocator GetMemory( void ) { + return m_Memory; + } + + int GetSize( void ) { + return m_Size; + } + + T* GetElements( void ) { + return m_pElements; + } + +private: + Allocator m_Memory; + int m_Size; + T* m_pElements; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/ClientClass.hpp b/cheat/internal_rewrite/ClientClass.hpp new file mode 100644 index 0000000..fc1f140 --- /dev/null +++ b/cheat/internal_rewrite/ClientClass.hpp @@ -0,0 +1,272 @@ +#pragma once +#include "Valve/dt_common.h" +#include "Valve/dt_recv.h" + +enum ClassId_t { + CAI_BaseNPC, + CAK47, + CBaseAnimating, + CBaseAnimatingOverlay, + CBaseAttributableItem, + CBaseButton, + CBaseCombatCharacter, + CBaseCombatWeapon, + CBaseCSGrenade, + CBaseCSGrenadeProjectile, + CBaseDoor, + CBaseEntity_, + CBaseFlex, + CBaseGrenade, + CBaseParticleEntity, + CBasePlayer, + CBasePropDoor, + CBaseTeamObjectiveResource, + CBaseTempEntity, + CBaseToggle, + CBaseTrigger, + CBaseViewModel, + CBaseVPhysicsTrigger, + CBaseWeaponWorldModel, + CBeam, + CBeamSpotlight, + CBoneFollower, + CBreakableProp, + CBreakableSurface, + CC4, + CCascadeLight, + CChicken, + CColorCorrection, + CColorCorrectionVolume, + CCSGameRulesProxy, + CCSPlayer, + CCSPlayerResource, + CCSRagdoll, + CCSTeam, + CDEagle, + CDecoyGrenade, + CDecoyProjectile, + CDynamicLight, + CDynamicProp, + CEconEntity, + CEconWearable, + CEmbers, + CEntityDissolve, + CEntityFlame, + CEntityFreezing, + CEntityParticleTrail, + CEnvAmbientLight, + CEnvDetailController, + CEnvDOFController, + CEnvParticleScript, + CEnvProjectedTexture, + CEnvQuadraticBeam, + CEnvScreenEffect, + CEnvScreenOverlay, + CEnvTonemapController, + CEnvWind, + CFEPlayerDecal, + CFireCrackerBlast, + CFireSmoke, + CFireTrail, + CFish, + CFlashbang, + CFogController, + CFootstepControl, + CFunc_Dust, + CFunc_LOD, + CFuncAreaPortalWindow, + CFuncBrush, + CFuncConveyor, + CFuncLadder, + CFuncMonitor, + CFuncMoveLinear, + CFuncOccluder, + CFuncReflectiveGlass, + CFuncRotating, + CFuncSmokeVolume, + CFuncTrackTrain, + CGameRulesProxy, + CHandleTest, + CHEGrenade, + CHostage, + CHostageCarriableProp, + CIncendiaryGrenade, + CInferno, + CInfoLadderDismount, + CInfoOverlayAccessor, + CItem_Healthshot, + CItemDogtags, + CKnife, + CKnifeGG, + CLightGlow, + CMaterialModifyControl, + CMolotovGrenade, + CMolotovProjectile, + CMovieDisplay, + CParticleFire, + CParticlePerformanceMonitor, + CParticleSystem, + CPhysBox, + CPhysBoxMultiplayer, + CPhysicsProp, + CPhysicsPropMultiplayer, + CPhysMagnet, + CPlantedC4, + CPlasma, + CPlayerResource, + CPointCamera, + CPointCommentaryNode, + CPointWorldText, + CPoseController, + CPostProcessController, + CPrecipitation, + CPrecipitationBlocker, + CPredictedViewModel, + CProp_Hallucination, + CPropDoorRotating, + CPropJeep, + CPropVehicleDriveable, + CRagdollManager, + CRagdollProp, + CRagdollPropAttached, + CRopeKeyframe, + CSCAR17, + CSceneEntity, + CSensorGrenade, + CSensorGrenadeProjectile, + CShadowControl, + CSlideshowDisplay, + CSmokeGrenade, + CSmokeGrenadeProjectile, + CSmokeStack, + CSpatialEntity, + CSpotlightEnd, + CSprite, + CSpriteOriented, + CSpriteTrail, + CStatueProp, + CSteamJet, + CSun, + CSunlightShadowControl, + CTeam, + CTeamplayRoundBasedRulesProxy, + CTEArmorRicochet, + CTEBaseBeam, + CTEBeamEntPoint, + CTEBeamEnts, + CTEBeamFollow, + CTEBeamLaser, + CTEBeamPoints, + CTEBeamRing, + CTEBeamRingPoint, + CTEBeamSpline, + CTEBloodSprite, + CTEBloodStream, + CTEBreakModel, + CTEBSPDecal, + CTEBubbles, + CTEBubbleTrail, + CTEClientProjectile, + CTEDecal, + CTEDust, + CTEDynamicLight, + CTEEffectDispatch, + CTEEnergySplash, + CTEExplosion, + CTEFireBullets, + CTEFizz, + CTEFootprintDecal, + CTEFoundryHelpers, + CTEGaussExplosion, + CTEGlowSprite, + CTEImpact, + CTEKillPlayerAttachments, + CTELargeFunnel, + CTEMetalSparks, + CTEMuzzleFlash, + CTEParticleSystem, + CTEPhysicsProp, + CTEPlantBomb, + CTEPlayerAnimEvent, + CTEPlayerDecal, + CTEProjectedDecal, + CTERadioIcon, + CTEShatterSurface, + CTEShowLine, + CTesla, + CTESmoke, + CTESparks, + CTESprite, + CTESpriteSpray, + CTest_ProxyToggle_Networkable, + CTestTraceline, + CTEWorldDecal, + CTriggerPlayerMovement, + CTriggerSoundOperator, + CVGuiScreen, + CVoteController, + CWaterBullet, + CWaterLODControl, + CWeaponAug, + CWeaponAWP, + CWeaponBaseItem, + CWeaponBizon, + CWeaponCSBase, + CWeaponCSBaseGun, + CWeaponCycler, + CWeaponElite, + CWeaponFamas, + CWeaponFiveSeven, + CWeaponG3SG1, + CWeaponGalil, + CWeaponGalilAR, + CWeaponGlock, + CWeaponHKP2000, + CWeaponM249, + CWeaponM3, + CWeaponM4A1, + CWeaponMAC10, + CWeaponMag7, + CWeaponMP5Navy, + CWeaponMP7, + CWeaponMP9, + CWeaponNegev, + CWeaponNOVA, + CWeaponP228, + CWeaponP250, + CWeaponP90, + CWeaponSawedoff, + CWeaponSCAR20, + CWeaponScout, + CWeaponSG550, + CWeaponSG552, + CWeaponSG556, + CWeaponSSG08, + CWeaponTaser, + CWeaponTec9, + CWeaponTMP, + CWeaponUMP45, + CWeaponUSP, + CWeaponXM1014, + CWorld, + DustTrail, + MovieExplosion, + ParticleSmokeGrenade, + RocketTrail, + SmokeTrail, + SporeExplosion, + SporeTrail, +}; + +class ClientClass { +public: + using create_fn = void*( *)( int, int ); + using event_fn = void*( *); + + create_fn m_create_fn; + event_fn m_createevent_fn; + char* m_name; + RecvTable* m_rt_table; + ClientClass* m_next; + int m_class_id; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/GlobalVars_t.hpp b/cheat/internal_rewrite/GlobalVars_t.hpp new file mode 100644 index 0000000..4cfcfb4 --- /dev/null +++ b/cheat/internal_rewrite/GlobalVars_t.hpp @@ -0,0 +1,21 @@ +#pragma once + +class global_vars_t { +public: + float m_realtime; + int m_framecount; + float m_absframetime; +private: + float m_absoluteframestarttimestddev; +public: + float m_curtime; + float m_frametime; + int m_maxclients; + int m_tickcount; + float m_interval_per_tick; + float m_interpolation_amount; + int m_sim_ticks; + int m_network_protocol; +private: + char pad00[ 14 ]; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IAppSystem.hpp b/cheat/internal_rewrite/IAppSystem.hpp new file mode 100644 index 0000000..61a6c8e --- /dev/null +++ b/cheat/internal_rewrite/IAppSystem.hpp @@ -0,0 +1,28 @@ +#pragma once + +class AppSystemInfo_t; + +enum InitReturnVal_t; + +enum AppSystemTier_t { + APP_SYSTEM_TIER0 = 0, + APP_SYSTEM_TIER1, + APP_SYSTEM_TIER2, + APP_SYSTEM_TIER3, + + APP_SYSTEM_TIER_OTHER, +}; + + +class IAppSystem { +public: + virtual bool Connect( void* factory ) = 0; + virtual void Disconnect( ) = 0; + virtual void* QueryInterface( const char* pInterfaceName ) = 0; + virtual InitReturnVal_t Init( ) = 0; + virtual void Shutdown( ) = 0; + virtual const AppSystemInfo_t* GetDependencies( ) = 0; + virtual AppSystemTier_t GetTier( ) = 0; + virtual void Reconnect( void* factory, const char* pInterfaceName ) = 0; + virtual bool IsSingleton( ) = 0; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IClientEntityList.hpp b/cheat/internal_rewrite/IClientEntityList.hpp new file mode 100644 index 0000000..d6a65e4 --- /dev/null +++ b/cheat/internal_rewrite/IClientEntityList.hpp @@ -0,0 +1,143 @@ +#pragma once +#include "util.hpp" +#include "vector.hpp" +#include "ClientClass.hpp" +#include "IVEngineClient.hpp" + +class ICollideable; +class IClientNetworkable; +class IClientRenderable; +class IClientThinkable; +class IClientEntity; +class IClientAlphaProperty; +class bf_read; +using model_t = uintptr_t; + + +class c_base_player; + +class IClientUnknown { +public: + virtual ICollideable* GetCollideable( ) = 0; + virtual IClientNetworkable* GetClientNetworkable( ) = 0; + virtual IClientRenderable* GetClientRenderable( ) = 0; + virtual IClientEntity* GetIClientEntity( ) = 0; + virtual IClientEntity* GetBaseEntity( ) = 0; + virtual IClientThinkable* GetClientThinkable( ) = 0; + //virtual IClientModelRenderable* GetClientModelRenderable() = 0; + virtual IClientAlphaProperty* GetClientAlphaProperty( ) = 0; +}; + +class IClientNetworkable { +public: + virtual IClientUnknown* GetIClientUnknown( ) = 0; + virtual void Release( ) = 0; + virtual ClientClass* GetClientClass( ) = 0; + virtual void NotifyShouldTransmit( int state ) = 0; + virtual void OnPreDataChanged( int updateType ) = 0; + virtual void OnDataChanged( int updateType ) = 0; + virtual void PreDataUpdate( int updateType ) = 0; + virtual void PostDataUpdate( int updateType ) = 0; + virtual void OnDataUnchangedInPVS( void ) = 0; + virtual bool IsDormant( void ) = 0; + virtual int EntIndex( void ) const = 0; + virtual void ReceiveMessage( int classID, bf_read& msg ) = 0; + virtual void* GetDataTableBasePtr( ) = 0; + virtual void SetDestroyedOnRecreateEntities( void ) = 0; +}; + +class IClientEntity { +public: + void* GetClientRenderable( ) { + return reinterpret_cast< void* >( this + 0x4 ); + } + + IClientNetworkable* GetClientNetworkable( ) { + return reinterpret_cast< IClientNetworkable* >( this + 0x8 ); + } + + ICollideable* GetCollideable( ) { + using fn = ICollideable* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 2 )( this ); + } + + vec3_t& GetRenderOrigin( ) { + using fn = vec3_t& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 10 )( this ); + } + + vec3_t& GetRenderAngles( ) { + using fn = vec3_t& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 11 )( this ); + } + + ClientClass* GetClientClass( ) { + if( !*( void** )( this ) ) + return nullptr; + + if( !*( void** )( GetClientNetworkable( ) ) ) + return nullptr; + + return GetClientNetworkable( )->GetClientClass( ); + } + + bool IsDormant( ) { + return GetClientNetworkable( )->IsDormant( ); + } + + int GetIndex( ) { + if( !this ) return 0; + + // no vfunc :> + return *reinterpret_cast< int* >( this + 0x64 ); + + return GetClientNetworkable( )->EntIndex( ); + } + + model_t* GetModel( ) { + using fn = model_t* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this->GetClientRenderable( ), 8 )( this->GetClientRenderable( ) ); + } + + int DrawModel( int flags, uint8_t alpha ) { + using fn = int( __thiscall* )( void*, int, uint8_t ); + return util::get_vfunc< fn >( this->GetClientRenderable( ), 9 )( this->GetClientRenderable( ), flags, alpha ); + } + + bool SetupBones( matrix3x4* bone_to_world, int max_bones, int mask, float time ) { + using fn = bool( __thiscall* )( void*, matrix3x4*, int, int, float ); + return util::get_vfunc< fn >( GetClientRenderable( ), 13 ) + ( GetClientRenderable( ), bone_to_world, max_bones, mask, time ); + } + + template < typename t > + t* as( ) { + return reinterpret_cast< t* >( this ); + } +}; + +class IClientEntityList +{ +public: + IClientNetworkable* GetClientNetworkable( int index ) { + using fn = IClientNetworkable* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 1 )( this, index ); + } + + template < typename t = c_base_player > + t* GetClientEntity( int index ) { + using fn = t* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 3 )( this, index ); + } + + template < typename t = c_base_player > + t* GetClientEntityFromHandle( uint32_t handle ) { + using fn = t* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 4 )( this, handle ); + } + + int GetHighestEntityIndex( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 6 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IClientMode.hpp b/cheat/internal_rewrite/IClientMode.hpp new file mode 100644 index 0000000..dc7d15d --- /dev/null +++ b/cheat/internal_rewrite/IClientMode.hpp @@ -0,0 +1,163 @@ +#pragma once +#include "valve/checksum_crc.h" + +#include "util.hpp" +#include "vector.hpp" + +enum player_controls_t { + IN_ATTACK = 1 << 0, + IN_JUMP = 1 << 1, + IN_DUCK = 1 << 2, + IN_FORWARD = 1 << 3, + IN_BACK = 1 << 4, + IN_USE = 1 << 5, + IN_CANCEL = 1 << 6, + IN_LEFT = 1 << 7, + IN_RIGHT = 1 << 8, + IN_MOVELEFT = 1 << 9, + IN_MOVERIGHT = 1 << 10, + IN_ATTACK2 = 1 << 11, + IN_RUN = 1 << 12, + IN_RELOAD = 1 << 13, + IN_ALT1 = 1 << 14, + IN_ALT2 = 1 << 15, + IN_SCORE = 1 << 16, + IN_SPEED = 1 << 17, + IN_WALK = 1 << 18, + IN_ZOOM = 1 << 19, + IN_WEAPON1 = 1 << 20, + IN_WEAPON2 = 1 << 21, + IN_BULLRUSH = 1 << 22, + IN_GRENADE1 = 1 << 23, + IN_GRENADE2 = 1 << 24, + IN_ATTACK3 = 1 << 25, +}; + +class user_cmd_t { +public: + virtual ~user_cmd_t( ) { }; + + int m_cmd_nr; // 0x04 For matching server and client commands for debugging + int m_tick_count; // 0x08 the tick the client created this command + vec3_t m_viewangles; // 0x0C Player instantaneous view angles. + vec3_t m_aimdirection; // 0x18 + float m_forwardmove; // 0x24 + float m_sidemove; // 0x28 + float m_upmove; // 0x2C + int m_buttons; // 0x30 Attack button states + uint8_t m_impulse; // 0x34 + int m_weaponselect; // 0x38 Current weapon id + int m_weaponsubtype; // 0x3C + int m_random_seed; // 0x40 For shared random functions + short m_mousedx; // 0x44 mouse accum in x from create move + short m_mousedy; // 0x46 mouse accum in y from create move + bool m_predicted; // 0x48 Client only, tracks whether we've predicted this command at least once + vec3_t headangles; // 0x49 + vec3_t headoffset; // 0x55 + + __forceinline user_cmd_t clamp( bool angles = true ) { + if( angles ) + m_viewangles.clamp( ); + + m_forwardmove = std::clamp( m_forwardmove, -450.f, 450.f ); + m_sidemove = std::clamp( m_sidemove, -450.f, 450.f ); + m_upmove = std::clamp( m_upmove, -450.f, 450.f ); + + return *this; + } + + CRC32_t get_check_sum( ) { + CRC32_t crc; + CRC32_Init( &crc ); + + CRC32_ProcessBuffer( &crc, &m_cmd_nr, sizeof( m_cmd_nr ) ); + CRC32_ProcessBuffer( &crc, &m_tick_count, sizeof( m_tick_count ) ); + CRC32_ProcessBuffer( &crc, &m_viewangles, sizeof( m_viewangles ) ); + CRC32_ProcessBuffer( &crc, &m_aimdirection, sizeof( m_aimdirection ) ); + CRC32_ProcessBuffer( &crc, &m_forwardmove, sizeof( m_forwardmove ) ); + CRC32_ProcessBuffer( &crc, &m_sidemove, sizeof( m_sidemove ) ); + CRC32_ProcessBuffer( &crc, &m_upmove, sizeof( m_upmove ) ); + CRC32_ProcessBuffer( &crc, &m_buttons, sizeof( m_buttons ) ); + CRC32_ProcessBuffer( &crc, &m_impulse, sizeof( m_impulse ) ); + CRC32_ProcessBuffer( &crc, &m_weaponselect, sizeof( m_weaponselect ) ); + CRC32_ProcessBuffer( &crc, &m_weaponsubtype, sizeof( m_weaponsubtype ) ); + CRC32_ProcessBuffer( &crc, &m_random_seed, sizeof( m_random_seed ) ); + CRC32_ProcessBuffer( &crc, &m_mousedx, sizeof( m_mousedx ) ); + CRC32_ProcessBuffer( &crc, &m_mousedy, sizeof( m_mousedy ) ); + + CRC32_Final( &crc ); + return crc; + } + +private: + + //char pad_0x4C[ 0x18 ]; // 0x4C Current sizeof( usercmd ) = 100 = 0x64 +}; + +class CHudChat { +public: + void ChatPrintf( int iPlayerIndex, int iFilter, const char* fmt ) { + using fn = void( __cdecl* )( void*, int, int, const char* ); + util::get_vfunc< fn >( this, 27 )( this, iPlayerIndex, iFilter, fmt ); + } +}; + +class CViewSetup { +public: + int m_x; + int m_oldX; + int m_y; + int m_oldY; + int m_width; + int m_oldWidth; + int m_height; + int m_oldHeight; + + bool m_bOrtho; + float m_OrthoLeft; + float m_OrthoTop; + float m_OrthoRight; + float m_OrthoBottom; + +private: + char pad1[ 0x7C ]; + +public: + float m_flFov; + float m_flFovViewmodel; + vec3_t m_vecOrigin; + vec3_t m_vecAngles; + + float zNear; + float zFar; + float zNearViewmodel; + float zFarViewmodel; + + float m_flAspectRatio; + float m_flNearBlurDepth; + float m_flNearFocusDepth; + float m_flFarFocusDepth; + float m_flFarBlurDepth; + float m_flNearBlurRadius; + float m_flFarBlurRadius; + int m_nDoFQuality; + int m_nMotionBlurMode; + float m_flShutterTime; + vec3_t m_vShutterOpenPosition; + vec3_t m_shutterOpenAngles; + vec3_t m_vShutterClosePosition; + vec3_t m_shutterCloseAngles; + float m_flOffCenterTop; + float m_flOffCenterBottom; + float m_flOffCenterLeft; + float m_flOffCenterRight; + int m_iEdgeBlur; +private: +}; + +class IClientMode { +public: + char _pad[ 28 ]; + + CHudChat* m_pChatElement; //0x2A +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/ICvar.hpp b/cheat/internal_rewrite/ICvar.hpp new file mode 100644 index 0000000..9e8040f --- /dev/null +++ b/cheat/internal_rewrite/ICvar.hpp @@ -0,0 +1,206 @@ +#pragma once +#include "IAppSystem.hpp" +#include "util.hpp" +#include "color.hpp" + +using CVarDLLIdentifier_t = int; +class IConVar; +using FnChangeCallback_t = void( *)( IConVar *var, const char *pOldValue, float flOldValue ); +class ConCommandBase; +class ConCommand; +class ICvarQuery; + +class IConsoleDisplayFunc { +public: + virtual void ColorPrint( const uint8_t* clr, const char *pMessage ) = 0; + virtual void Print( const char *pMessage ) = 0; + virtual void DPrint( const char *pMessage ) = 0; +}; + +#define FCVAR_NONE 0 + +// Command to ConVars and ConCommands +// ConVar Systems +#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. +#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined. +#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL +#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL +#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out. + +// ConVar only +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc +#define FCVAR_NOTIFY (1<<8) // notifies players when changed +#define FCVAR_USERINFO (1<<9) // changes the client's info string +#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats + +#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar + +// It's a ConVar that's shared between the client and the server. +// At signon, the values of all such ConVars are sent from the server to the client (skipped for local +// client, of course ) +// If a change is requested it must come from the console (i.e., no remote client changes) +// If a value is changed while a server is active, it's replicated to all connected clients +#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time +#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file +#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles +#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload +#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload + +#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server +#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread +#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox + +#define FCVAR_ACCESSIBLE_FROM_THREADS (1<<25) // used as a debugging tool necessary to check material system thread convars + +#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd. +#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue). +#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command. + + +class cvar_t { +public: + void set_value( const char* value ) { + using fn = void( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 14 )( this, value ); + } + + void set_value( float value ) { + using fn = void( __thiscall* )( void*, float ); + return util::get_vfunc< fn >( this, 15 )( this, value ); + } + + void set_value( int value ) { + using fn = void( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 16 )( this, value ); + } + + void set_value( clr_t value ) { + using fn = void( __thiscall* )( void*, clr_t ); + return util::get_vfunc< fn >( this, 17 )( this, value ); + } + + char* get_name( ) { + using fn = char*( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 5 )( this ); + } + + char* get_default( ) { + return m_default; + } + + const char* get_string( ) { + return m_string; + } + + float get_float( ) { + using fn = float( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 12 )( this ); + } + + int get_int( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 13 )( this ); + } + +private: + void* m_vft; +public: + cvar_t* m_next; //0x0004 + __int32 m_registered; //0x0008 + char* m_name; //0x000C + char* m_help_str; //0x0010 + __int32 m_flags; //0x0014 +private: + char pad_0x0018[ 0x4 ]; //0x0018 +public: + cvar_t* m_parent; //0x001C + char* m_default; //0x0020 + char* m_string; //0x0024 + __int32 m_str_len; //0x0028 + float m_flvalue; //0x002C + __int32 m_nvalue; //0x0030 + __int32 m_has_min; //0x0034 + float m_min; //0x0038 + __int32 m_hax_max; //0x003C + float m_max; //0x0040 + void* m_change_callback; //0x0044 +};//Size=0x0048 + +class ICVar : public IAppSystem +{ +public: + // Allocate a unique DLL identifier + virtual CVarDLLIdentifier_t AllocateDLLIdentifier( ) = 0; + + // Register, unregister commands + virtual void RegisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommands( CVarDLLIdentifier_t id ) = 0; + + // If there is a + on the command line, this returns the value. + // Otherwise, it returns NULL. + virtual const char* GetCommandLineValue( const char *pVariableName ) = 0; + + // Try to find the cvar pointer by name + virtual ConCommandBase* FindCommandBase( const char *name ) = 0; + virtual const ConCommandBase* FindCommandBase( const char *name ) const = 0; + virtual cvar_t *FindVar( const char *var_name ) = 0; + virtual const cvar_t *FindVar( const char *var_name ) const = 0; + virtual ConCommand *FindCommand( const char *name ) = 0; + virtual const ConCommand *FindCommand( const char *name ) const = 0; + + + + // Install a global change callback (to be called when any convar changes) + virtual void InstallGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void RemoveGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void CallGlobalChangeCallbacks( cvar_t *var, const char *pOldString, float flOldValue ) = 0; + + // Install a console printer + virtual void InstallConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void RemoveConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void ConsoleColorPrintf( const clr_t& clr, const char *pFormat, ... ) const = 0; + virtual void ConsolePrintf( const char *pFormat, ... ) const = 0; + virtual void ConsoleDPrintf( const char *pFormat, ... ) const = 0; + + // Reverts cvars which contain a specific flag + virtual void RevertFlaggedConVars( int nFlag ) = 0; + + // Method allowing the engine ICvarQuery interface to take over + // A little hacky, owing to the fact the engine is loaded + // well after ICVar, so we can't use the standard connect pattern + virtual void InstallCVarQuery( ICvarQuery *pQuery ) = 0; + + + virtual void SetMaxSplitScreenSlots( int nSlots ) = 0; + virtual int GetMaxSplitScreenSlots( ) const = 0; + + virtual void AddSplitScreenConVars( ) = 0; + virtual void RemoveSplitScreenConVars( CVarDLLIdentifier_t id ) = 0; + + virtual int GetConsoleDisplayFuncCount( ) const = 0; + virtual void GetConsoleText( int nDisplayFuncIndex, char *pchText, size_t bufSize ) const = 0; + + // Utilities for convars accessed by the material system thread + virtual bool IsMaterialThreadSetAllowed( ) const = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, const char *pValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, int nValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, float flValue ) = 0; + virtual bool HasQueuedMaterialThreadConVarSets( ) const = 0; + virtual int ProcessQueuedMaterialThreadConVarSets( ) = 0; + + class ICVarIteratorInternal + { + public: + virtual void SetFirst( ) = 0; + virtual void Next( ) = 0; + virtual bool IsValid( ) = 0; + virtual ConCommandBase *Get( ) = 0; + }; + + virtual ICVarIteratorInternal* FactoryInternalIterator( ) = 0; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IEngineTrace.hpp b/cheat/internal_rewrite/IEngineTrace.hpp new file mode 100644 index 0000000..681d64b --- /dev/null +++ b/cheat/internal_rewrite/IEngineTrace.hpp @@ -0,0 +1,384 @@ +#pragma once +#include "vector.hpp" +#include "IClientEntityList.hpp" + +enum TraceType_t { + TRACE_EVERYTHING = 0, + TRACE_WORLD_ONLY, // NOTE: This does *not* test static props!!! + TRACE_ENTITIES_ONLY, // NOTE: This version will *not* test static props + TRACE_EVERYTHING_FILTER_PROPS, // NOTE: This version will pass the IHandleEntity for props through the filter, unlike all other filters +}; + +enum SurfaceFlags_t { + DISPSURF_FLAG_SURFACE = 1 << 0, + DISPSURF_FLAG_WALKABLE = 1 << 1, + DISPSURF_FLAG_BUILDABLE = 1 << 2, + DISPSURF_FLAG_SURFPROP1 = 1 << 3, + DISPSURF_FLAG_SURFPROP2 = 1 << 4, +}; + +enum Hitgroup_t { + HITGROUP_GENERIC, + HITGROUP_HEAD, + HITGROUP_CHEST, + HITGROUP_STOMACH, + HITGROUP_LEFTARM, + HITGROUP_RIGHTARM, + HITGROUP_LEFTLEG, + HITGROUP_RIGHTLEG, + HITGROUP_GEAR +}; + +struct csurface_t { + const char* name; + short surfaceProps; + unsigned short flags; +}; + +struct cplane_t { + vec3_t normal; + float dist; + uint8_t type; + uint8_t signbits; + uint8_t pad[ 2 ]; +}; + +class ITraceFilter { +public: + virtual bool ShouldHitEntity( void* pEntity, int contentsMask ) = 0; + virtual int GetTraceType( ) const = 0; +}; + +class CTraceFilter : public ITraceFilter { +public: + CTraceFilter( ) {} + + CTraceFilter( void *ent ) + : pSkip( ent ) {} + + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == pSkip ); + } + + int GetTraceType( ) const override { + return TRACE_EVERYTHING; + } + + void* pSkip; +}; + +class CTraceFilterOneEntity : public ITraceFilter { +public: + bool ShouldHitEntity( void* entity_handle, int contents ) override { + return entity_handle == ent; + } + + int GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* ent; +}; + +class CTraceFilterWorldAndPropsOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return false; + } + + int GetTraceType( ) const override { + return TRACE_EVERYTHING; + } +}; + +class CTraceFilterEntitiesOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == pSkip ); + } + + int GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterPlayersOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + IClientEntity* hit_entity = ( IClientEntity* )pEntityHandle; + int index = hit_entity->GetIndex( ); + return !( pEntityHandle == pSkip || index < 1 || index > 64 ); + } + + int GetTraceType( ) const override { + return TRACE_ENTITIES_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterWorldOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return false; + } + + int GetTraceType( ) const override { + return TRACE_WORLD_ONLY; + } + + void* pSkip; +}; + +class CTraceFilterSkipTwoEntities : public ITraceFilter { +public: + CTraceFilterSkipTwoEntities( ) { + + } + + CTraceFilterSkipTwoEntities( void* pPassEnt1, void* pPassEnt2 ) { + passentity1 = pPassEnt1; + passentity2 = pPassEnt2; + } + + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return !( pEntityHandle == passentity1 || pEntityHandle == passentity2 ); + } + + int GetTraceType( ) const override { + return TRACE_EVERYTHING; + } + + void* passentity1; + void* passentity2; +}; + +class __declspec( align( 16 ) )VectorAligned : public vec3_t { +public: + VectorAligned( float _x, float _y, float _z ) { + x = _x; + y = _y; + z = _z; + w = 0; + } + + VectorAligned( ) { } + + void operator=( const vec3_t& vOther ) { + x = vOther.x; + y = vOther.y; + z = vOther.z; + } + + float w; +}; + +struct Ray_t +{ + VectorAligned m_Start; + VectorAligned m_Delta; + VectorAligned m_StartOffset; + VectorAligned m_Extents; + + const matrix3x4* m_pWorldAxisTransform; + + bool m_IsRay; + bool m_IsSwept; + + Ray_t( ) : m_pWorldAxisTransform( nullptr ) { } + + void Init( const vec3_t& start, const vec3_t& end ) { + m_Delta = end - start; + + m_IsSwept = m_Delta.lengthsqr( ) != 0; + + m_Extents = vec3_t( 0.f, 0.f, 0.f ); + m_pWorldAxisTransform = nullptr; + m_IsRay = true; + + m_StartOffset = vec3_t( 0.f, 0.f, 0.f ); + m_Start = start; + } + + void Init( const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs ) { + m_Delta = end - start; + + m_pWorldAxisTransform = nullptr; + m_IsSwept = m_Delta.lengthsqr( ) != 0; + + m_Extents = maxs - mins; + m_Extents *= 0.5f; + m_IsRay = m_Extents.lengthsqr( ) < 1e-6; + + m_StartOffset = mins + maxs; + m_StartOffset *= 0.5f; + m_Start = start + m_StartOffset; + m_StartOffset *= -1.0f; + } +}; + +class CBaseTrace +{ +public: + bool IsDispSurface( ) const { return ( dispFlags & DISPSURF_FLAG_SURFACE ) != 0; } + bool IsDispSurfaceWalkable( ) const { return ( dispFlags & DISPSURF_FLAG_WALKABLE ) != 0; } + bool IsDispSurfaceBuildable( ) const { return ( dispFlags & DISPSURF_FLAG_BUILDABLE ) != 0; } + bool IsDispSurfaceProp1( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP1 ) != 0; } + bool IsDispSurfaceProp2( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP2 ) != 0; } + +public: + vec3_t startpos; + vec3_t endpos; + cplane_t plane; + + float fraction; + + int contents; + unsigned short dispFlags; + + bool allsolid; + bool startsolid; + + CBaseTrace( ) {} + +private: + CBaseTrace( const CBaseTrace& vOther ); +}; + +class CGameTrace : public CBaseTrace +{ +public: + bool DidHitWorld( ) const; + + bool DidHitNonWorldEntity( ) const; + + int GetEntityIndex( ) const; + + bool DidHit( ) const + { + return fraction < 1 || allsolid || startsolid; + } + +public: + float fractionleftsolid; + csurface_t surface; + + int hitgroup; + + short physicsbone; + unsigned short worldSurfaceIndex; + + IClientEntity* m_pEnt; + int hitbox; + + CGameTrace( ) {} + CGameTrace( const CGameTrace& vOther ); +}; + +class IEngineTrace { +public: + int GetPointContents( const vec3_t& vecAbsPosition, int contentsMask = 0xffffffff ) { + using fn = int( __thiscall* )( void*, const vec3_t&, int, void* ); + return util::get_vfunc< fn >( this, 0 )( this, vecAbsPosition, contentsMask, nullptr ); + } + + void TraceRay( const Ray_t& ray, unsigned int fMask, ITraceFilter* pTraceFilter, CBaseTrace* pTrace ) { + return util::get_vfunc< 5, void >( this, ray, fMask, pTraceFilter, pTrace ); + } + + void ClipRayToEntity( const Ray_t& ray, unsigned int fMask, IClientEntity* pEnt, CBaseTrace* pTrace ) { + return util::get_vfunc< 3, void >( this, ray, fMask, pEnt, pTrace ); + } +}; + +#define CONTENTS_EMPTY 0 + +#define CONTENTS_SOLID 0x1 +#define CONTENTS_WINDOW 0x2 +#define CONTENTS_SOLID_SURF 0x3 +#define CONTENTS_AUX 0x4 +#define CONTENTS_LIGHT_SURF 0x7 +#define CONTENTS_GRATE 0x8 +#define CONTENTS_SLIME 0x10 +#define CONTENTS_WATER 0x20 +#define CONTENTS_BLOCKLOS 0x40 +#define CONTENTS_OPAQUE 0x80 +#define LAST_VISIBLE_CONTENTS CONTENTS_OPAQUE + +#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1)) + +#define CONTENTS_TESTFOGVOLUME 0x100 +#define CONTENTS_UNUSED 0x200 +#define CONTENTS_BLOCKLIGHT 0x400 +#define CONTENTS_TEAM1 0x800 +#define CONTENTS_TEAM2 0x1000 +#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 +#define CONTENTS_MOVEABLE 0x4000 +#define CONTENTS_AREAPORTAL 0x8000 +#define CONTENTS_PLAYERCLIP 0x10000 +#define CONTENTS_MONSTERCLIP 0x20000 +#define CONTENTS_CURRENT_0 0x40000 +#define CONTENTS_CURRENT_90 0x80000 +#define CONTENTS_CURRENT_180 0x100000 +#define CONTENTS_CURRENT_270 0x200000 +#define CONTENTS_CURRENT_UP 0x400000 +#define CONTENTS_CURRENT_DOWN 0x800000 + +#define CONTENTS_ORIGIN 0x1000000 + +#define CONTENTS_MONSTER 0x2000000 +#define CONTENTS_DEBRIS 0x4000000 +#define CONTENTS_DETAIL 0x8000000 +#define CONTENTS_TRANSLUCENT 0x10000000 +#define CONTENTS_LADDER 0x20000000 +#define CONTENTS_HITBOX 0x40000000 + +#define SURF_LIGHT 0x0001 +#define SURF_SKY2D 0x0002 +#define SURF_SKY 0x0004 +#define SURF_WARP 0x0008 +#define SURF_TRANS 0x0010 +#define SURF_NOPORTAL 0x0020 +#define SURF_TRIGGER 0x0040 +#define SURF_NODRAW 0x0080 + +#define SURF_HINT 0x0100 + +#define SURF_SKIP 0x0200 +#define SURF_NOLIGHT 0x0400 +#define SURF_BUMPLIGHT 0x0800 +#define SURF_NOSHADOWS 0x1000 +#define SURF_NODECALS 0x2000 +#define SURF_NOPAINT SURF_NODECALS +#define SURF_NOCHOP 0x4000 +#define SURF_HITBOX 0x8000 + +// ----------------------------------------------------- +// spatial content masks - used for spatial queries (traceline,etc.) +// ----------------------------------------------------- +#define MASK_ALL (0xFFFFFFFF) +#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) +#define MASK_NPCFLUID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER) +#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) +#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) +#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) +#define MASK_BLOCKLOS (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_BLOCKLOS) +#define MASK_BLOCKLOS_AND_NPCS (MASK_BLOCKLOS|CONTENTS_MONSTER) +#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) +#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) +#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) +#define MASK_SHOT_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_DEBRIS) +#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) +#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER) +#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) +#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) +#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) +#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) +#define MASK_NPCWORLDSTATIC_FLUID (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP) +#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) +#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN) +#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_GRATE) \ No newline at end of file diff --git a/cheat/internal_rewrite/IGameEventManager.hpp b/cheat/internal_rewrite/IGameEventManager.hpp new file mode 100644 index 0000000..ec37320 --- /dev/null +++ b/cheat/internal_rewrite/IGameEventManager.hpp @@ -0,0 +1,77 @@ +#pragma once +#include "util.hpp" + +class IGameEvent +{ +public: + const char* GetName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + int GetInt( const char* szKeyName, int nDefault = 0 ) { + return util::get_vfunc< 6, int >( this, szKeyName, nDefault ); + } + + float GetFloat( const char* name, float default_ = 0 ) { + return util::get_vfunc< 8, float >( this, name, default_ ); + } + + const char* GetString( const char* szKeyName ) { + return util::get_vfunc< 9, const char* >( this, szKeyName, 0 ); + } + + void SetString( const char* szKeyName, const char* szValue ) { + return util::get_vfunc< 16, void >( this, szKeyName, szValue ); + } +}; + +class IGameEventListener2 { +public: + virtual ~IGameEventListener2( void ) {}; + + // FireEvent is called by EventManager if event just occured + // KeyValue memory will be freed by manager if not needed anymore + virtual void FireGameEvent( IGameEvent* event ) = 0; + + virtual int GetEventDebugID( void ) = 0; +}; + +class IGameEventManager2 { +public: + virtual ~IGameEventManager2( void ) {}; + + // load game event descriptions from a file eg "resource\gameevents.res" + virtual int LoadEventsFromFile( const char* filename ) = 0; + + // removes all and anything + virtual void Reset( ) = 0; + + // adds a listener for a particular event + virtual bool AddListener( IGameEventListener2* listener, const char* name, bool bServerSide ) = 0; + + // returns true if this listener is listens to given event + virtual bool FindListener( IGameEventListener2* listener, const char* name ) = 0; + + // removes a listener + virtual void RemoveListener( IGameEventListener2* listener ) = 0; + + // create an event by name, but doesn't fire it. returns NULL is event is not + // known or no listener is registered for it. bForce forces the creation even if no listener is active + virtual IGameEvent* CreateEvent( const char* name, bool bForce = false, int* pCookie = nullptr ) = 0; + + // fires a server event created earlier, if bDontBroadcast is set, event is not send to clients + virtual bool FireEvent( IGameEvent* event, bool bDontBroadcast = false ) = 0; + + // fires an event for the local client only, should be used only by client code + virtual bool FireEventClientSide( IGameEvent* event ) = 0; + + // create a new copy of this event, must be free later + virtual IGameEvent* DuplicateEvent( IGameEvent* event ) = 0; + + // if an event was created but not fired for some reason, it has to bee freed, same UnserializeEvent + virtual void FreeEvent( IGameEvent* event ) = 0; + + // write/read event to/from bitbuffer + virtual bool SerializeEvent( IGameEvent* event, int* buf ) = 0; + virtual IGameEvent* UnserializeEvent( void* buf ) = 0; // create new KeyValues, must be deleted +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IMaterialSystem.hpp b/cheat/internal_rewrite/IMaterialSystem.hpp new file mode 100644 index 0000000..7fc1bc1 --- /dev/null +++ b/cheat/internal_rewrite/IMaterialSystem.hpp @@ -0,0 +1,281 @@ +#pragma once +#include "util.hpp" +#include "ISurface.hpp" + +using MaterialHandle_t = unsigned short; + +enum MaterialVarFlags_t { + MATERIAL_VAR_DEBUG = 1 << 0, + MATERIAL_VAR_NO_DEBUG_OVERRIDE = 1 << 1, + MATERIAL_VAR_NO_DRAW = 1 << 2, + MATERIAL_VAR_USE_IN_FILLRATE_MODE = 1 << 3, + MATERIAL_VAR_VERTEXCOLOR = 1 << 4, + MATERIAL_VAR_VERTEXALPHA = 1 << 5, + MATERIAL_VAR_SELFILLUM = 1 << 6, + MATERIAL_VAR_ADDITIVE = 1 << 7, + MATERIAL_VAR_ALPHATEST = 1 << 8, + MATERIAL_VAR_MULTIPASS = 1 << 9, + MATERIAL_VAR_ZNEARER = 1 << 10, + MATERIAL_VAR_MODEL = 1 << 11, + MATERIAL_VAR_FLAT = 1 << 12, + MATERIAL_VAR_NOCULL = 1 << 13, + MATERIAL_VAR_NOFOG = 1 << 14, + MATERIAL_VAR_IGNOREZ = 1 << 15, + MATERIAL_VAR_DECAL = 1 << 16, + MATERIAL_VAR_ENVMAPSPHERE = 1 << 17, + MATERIAL_VAR_NOALPHAMOD = 1 << 18, + MATERIAL_VAR_ENVMAPCAMERASPACE = 1 << 19, + MATERIAL_VAR_BASEALPHAENVMAPMASK = 1 << 20, + MATERIAL_VAR_TRANSLUCENT = 1 << 21, + MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK = 1 << 22, + MATERIAL_VAR_NEEDS_SOFTWARE_SKINNING = 1 << 23, + MATERIAL_VAR_OPAQUETEXTURE = 1 << 24, + MATERIAL_VAR_ENVMAPMODE = 1 << 25, + MATERIAL_VAR_SUPPRESS_DECALS = 1 << 26, + MATERIAL_VAR_HALFLAMBERT = 1 << 27, + MATERIAL_VAR_WIREFRAME = 1 << 28, +}; + +class ITexture { +public: + int GetActualWidth( ) { + return util::get_vfunc< 3, int >( this ); + } + + int GetActualHeight( ) { + return util::get_vfunc< 4, int >( this ); + } +}; + +struct MaterialVideoMode_t { + int m_width; + int m_height; + int m_format; + int m_hz; +}; + +struct IMaterialSystem_Config_t { + MaterialVideoMode_t m_vid_mode; + float m_monitor_gamma; + float m_monitor_max; + float m_monitor_min; + float m_monitor_exp; + bool m_gamma_enabled; + bool m_triple_buffer; + int m_aa_samples; + int m_force_anisotropic_level; + int m_skip_mip_levels; + int m_dx_level; + int m_flags; + bool m_edit_mode; + char m_proxy_test_mode; + bool m_compressed_textures; + bool m_filter_lightmaps; + bool m_filter_textures; + bool m_reverse_depth; + bool m_buffer_primitives; + bool m_draw_flat; + bool m_measure_fillrate; + bool m_visualize_fillrate; + bool m_no_transperacy; + bool m_software_lighting; + bool m_allow_cheats; + char m_show_mipmap; + bool m_low_res; + bool m_normal_mapping; + bool m_mipmap_textures; + char m_fullbright; + bool m_fast_nobumd; + bool m_supress_rendering; + bool m_drawgray; + bool m_show_specular; + bool m_show_diffuse; + int m_winsize_widthlimit; + int m_winsize_heightlimit; + int m_aa_quality; + bool m_shadow_depth_texture; + bool m_motion_blur; + bool m_flashlight; + bool m_paint_enabled; + char pad[ 0xC ]; +}; + +class IMaterialVar { +public: + virtual ITexture *GetTextureValue( void ) = 0; + + virtual char const * GetName( void ) const = 0; + virtual void* GetNameAsSymbol( ) const = 0; + + virtual void SetFloatValue( float val ) = 0; + + virtual void SetIntValue( int val ) = 0; + + virtual void SetStringValue( char const *val ) = 0; + virtual char const * GetStringValue( void ) const = 0; + + // Use FourCC values to pass app-defined data structures between + // the proxy and the shader. The shader should ignore the data if + // its FourCC type not correct. + virtual void SetFourCCValue( ) = 0; + virtual void GetFourCCValue( ) = 0; + + // Vec (dim 2-4) + virtual void SetVecValue( float const* val, int numcomps ) = 0; + virtual void SetVecValue( float x, float y ) = 0; + virtual void SetVecValue( float x, float y, float z ) = 0; + virtual void SetVecValue( float x, float y, float z, float w ) = 0; + virtual void GetLinearVecValue( float *val, int numcomps ) const = 0; + + // revisit: is this a good interface for textures? + virtual void SetTextureValue( ITexture * ) = 0; + + virtual IMaterial * GetMaterialValue( void ) = 0; + virtual void SetMaterialValue( IMaterial * ) = 0; + + virtual bool IsDefined( ) const = 0; + virtual void SetUndefined( ) = 0; + + // Matrix + virtual void SetMatrixValue( ) = 0; + virtual const void GetMatrixValue( ) = 0; + virtual bool MatrixIsIdentity( ) const = 0; + + // Copy.... + virtual void CopyFrom( IMaterialVar *pMaterialVar ) = 0; + + virtual void SetValueAutodetectType( char const *val ) = 0; + + virtual IMaterial * GetOwningMaterial( ) = 0; + + //set just 1 component + virtual void SetVecComponentValue( float fVal, int nComponent ) = 0; + +protected: + virtual int GetIntValueInternal( void ) const = 0; + virtual float GetFloatValueInternal( void ) const = 0; + virtual float const* GetVecValueInternal( ) const = 0; + virtual void GetVecValueInternal( float *val, int numcomps ) const = 0; + virtual int VectorSizeInternal( ) const = 0; +}; + +class IMaterial { + char pad[ 0x1C ]; +public: + int m_ref_count; + + auto GetName( ) { + return util::get_vfunc< 0, const char* >( this ); + } + + auto GetTextureGroupName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + void IncrementReferenceCount( ) { + return util::get_vfunc< 12, void >( this ); + } + + void DecrementReferenceCount( ) { + return util::get_vfunc< 13, void >( this ); + } + + void AlphaModulate( float alpha ) { + return util::get_vfunc< 27, void >( this, alpha ); + } + + void ColorModulate( float r, float g, float b ) { + return util::get_vfunc< 28, void >( this, r, g, b ); + } + + void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ) { + return util::get_vfunc< 29, void >( this, flag, on ); + } + + bool GetMaterialVarFlag( MaterialVarFlags_t flag ) { + return util::get_vfunc< 30, bool >( this, flag ); + } + + auto GetAlphaModulation( ) { + return util::get_vfunc< 44, float >( this ); + } + + void GetColorModulate( float* r, float* g, float* b ) { + return util::get_vfunc< 45, void >( this, r, g, b ); + } + + void Refresh( ) { + return util::get_vfunc< 37, void >( this ); + } +}; + +class IMaterialSystem +{ +public: + enum RenderTargetSizeMode_t { + RT_SIZE_NO_CHANGE = 0, // Only allowed for render targets that don't want a depth buffer + // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer). + RT_SIZE_DEFAULT = 1, // Don't play with the specified width and height other than making sure it fits in the framebuffer. + RT_SIZE_PICMIP = 2, // Apply picmip to the render target's width and height. + RT_SIZE_HDR = 3, // frame_buffer_width / 4 + RT_SIZE_FULL_FRAME_BUFFER = 4, // Same size as frame buffer, or next lower power of 2 if we can't do that. + RT_SIZE_OFFSCREEN = 5, // Target of specified size, don't mess with dimensions + RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP = 6 // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. + }; + + enum MaterialRenderTargetDepth_t { + MATERIAL_RT_DEPTH_SHARED = 0x0, + MATERIAL_RT_DEPTH_SEPARATE = 0x1, + MATERIAL_RT_DEPTH_NONE = 0x2, + MATERIAL_RT_DEPTH_ONLY = 0x3, + }; + + ImageFormat GetBackBufferFormat( ) { + return util::get_vfunc< 36, ImageFormat >( this ); + } + + IMaterial* CreateMaterial( const char* pMaterialName, void* pVMTKeyValues ) { + return util::get_vfunc< 83, IMaterial* >( this, pMaterialName, pVMTKeyValues ); + } + + IMaterial* FindMaterial( const char* pMaterialName, const char* pTextureGroupName = "Model textures", bool complain = true, const char* pComplainPrefix = nullptr ) { + return util::get_vfunc< 84, IMaterial* >( this, pMaterialName, pTextureGroupName, complain, pComplainPrefix ); + } + + MaterialHandle_t FirstMaterial( ) { + return util::get_vfunc< 86, MaterialHandle_t >( this ); + } + + MaterialHandle_t NextMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 87, MaterialHandle_t >( this, h ); + } + + MaterialHandle_t InvalidMaterial( ) { + return util::get_vfunc< 88, MaterialHandle_t >( this ); + } + + IMaterial* GetMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 89, IMaterial* >( this, h ); + } + + void BeginRenderTargetAllocation( ) { + return util::get_vfunc< 94, void >( this ); + } + + void EndRenderTargetAllocation( ) { + return util::get_vfunc< 95, void >( this ); + } + + ITexture* CreateNamedRenderTargetTextureEx( const char* name, int w, int h, RenderTargetSizeMode_t sizeMode, + ImageFormat format, MaterialRenderTargetDepth_t depth ) + { + const int textureFlags = 0x4 | 0x8; //TEXTUREFLAGS_CLAMPS, TEXTUREFLAGS_CLAMPT + const int renderTargetFlags = 0x1; //CREATERENDERTARGETFLAGS_HDR + return util::get_vfunc< 97, ITexture* >( this, name, w, h, sizeMode, format, depth, textureFlags, renderTargetFlags ); + } + + /*void* GetRenderContext( ) { + typedef IMatRenderContext*( __thiscall* GetRenderContextFn )( void* ); + return CallVFunction( this, 115 )( this ); + }*/ +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IMemAlloc.hpp b/cheat/internal_rewrite/IMemAlloc.hpp new file mode 100644 index 0000000..580104c --- /dev/null +++ b/cheat/internal_rewrite/IMemAlloc.hpp @@ -0,0 +1,79 @@ +#pragma once + +typedef size_t( *MemAllocFailHandler_t )( size_t ); + +class IMemAlloc { +public: + // Release versions + virtual void *Alloc( size_t nSize ) = 0; + virtual void *Realloc( void *pMem, size_t nSize ) = 0; + virtual void Free( void *pMem ) = 0; + virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize ) = 0; + + // Debug versions + virtual void *Alloc( size_t nSize, const char *pFileName, int nLine ) = 0; + virtual void *Realloc( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; + virtual void Free( void *pMem, const char *pFileName, int nLine ) = 0; + virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; + + // Returns size of a particular allocation + virtual size_t GetSize( void *pMem ) = 0; + + // Force file + line information for an allocation + virtual void PushAllocDbgInfo( const char *pFileName, int nLine ) = 0; + virtual void PopAllocDbgInfo( ) = 0; + + // FIXME: Remove when we have our own allocator + // these methods of the Crt debug code is used in our codebase currently + virtual long CrtSetBreakAlloc( long lNewBreakAlloc ) = 0; + virtual int CrtSetReportMode( int nReportType, int nReportMode ) = 0; + virtual int CrtIsValidHeapPointer( const void *pMem ) = 0; + virtual int CrtIsValidPointer( const void *pMem, unsigned int size, int access ) = 0; + virtual int CrtCheckMemory( void ) = 0; + virtual int CrtSetDbgFlag( int nNewFlag ) = 0; + virtual void CrtMemCheckpoint( void *pState ) = 0; + + // FIXME: Make a better stats interface + virtual void DumpStats( ) = 0; + virtual void DumpStatsFileBase( char const *pchFileBase ) = 0; + + // FIXME: Remove when we have our own allocator + virtual void* CrtSetReportFile( int nRptType, void* hFile ) = 0; + virtual void* CrtSetReportHook( void* pfnNewHook ) = 0; + virtual int CrtDbgReport( int nRptType, const char * szFile, + int nLine, const char * szModule, const char * pMsg ) = 0; + + virtual int heapchk( ) = 0; + + virtual bool IsDebugHeap( ) = 0; + + virtual void GetActualDbgInfo( const char *&pFileName, int &nLine ) = 0; + virtual void RegisterAllocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; + virtual void RegisterDeallocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; + + virtual int GetVersion( ) = 0; + + virtual void CompactHeap( ) = 0; + + // Function called when malloc fails or memory limits hit to attempt to free up memory (can come in any thread) + virtual MemAllocFailHandler_t SetAllocFailHandler( MemAllocFailHandler_t pfnMemAllocFailHandler ) = 0; + + virtual void DumpBlockStats( void * ) = 0; + +#if defined( _MEMTEST ) + virtual void SetStatsExtraInfo( const char *pMapName, const char *pComment ) = 0; +#endif + + // Returns 0 if no failure, otherwise the size_t of the last requested chunk + // "I'm sure this is completely thread safe!" Brian Deen 7/19/2012. + virtual size_t MemoryAllocFailed( ) = 0; + + // handles storing allocation info for coroutines + virtual unsigned GetDebugInfoSize( ) = 0; + virtual void SaveDebugInfo( void *pvDebugInfo ) = 0; + virtual void RestoreDebugInfo( const void *pvDebugInfo ) = 0; + virtual void InitDebugInfo( void *pvDebugInfo, const char *pchRootFileName, int nLine ) = 0; + + // Replacement for ::GlobalMemoryStatus which accounts for unused memory in our system + virtual void GlobalMemoryStatus( size_t *pUsedMemory, size_t *pFreeMemory ) = 0; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IPanel.hpp b/cheat/internal_rewrite/IPanel.hpp new file mode 100644 index 0000000..bbae705 --- /dev/null +++ b/cheat/internal_rewrite/IPanel.hpp @@ -0,0 +1,10 @@ +#pragma once +#include "util.hpp" + +class IPanel { +public: + const char* GetName( int panel ) { + using fn = const char* ( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 36 )( this, panel ); + } +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IPhysicsSurfaceProps.hpp b/cheat/internal_rewrite/IPhysicsSurfaceProps.hpp new file mode 100644 index 0000000..8e4f10f --- /dev/null +++ b/cheat/internal_rewrite/IPhysicsSurfaceProps.hpp @@ -0,0 +1,79 @@ +#pragma once + +struct surfacephysicsparams_t { + // vphysics physical properties + float friction; + float elasticity; // collision elasticity - used to compute coefficient of restitution + float density; // physical density (in kg / m^3) + float thickness; // material thickness if not solid (sheet materials) in inches + float dampening; +}; + +struct surfaceaudioparams_t { + float reflectivity; // like elasticity, but how much sound should be reflected by this surface + float hardnessFactor; // like elasticity, but only affects impact sound choices + float roughnessFactor; // like friction, but only affects scrape sound choices + float roughThreshold; // surface roughness > this causes "rough" scrapes, < this causes "smooth" scrapes + float hardThreshold; // surface hardness > this causes "hard" impacts, < this causes "soft" impacts + float hardVelocityThreshold; // collision velocity > this causes "hard" impacts, < this causes "soft" impacts + float highPitchOcclusion; //a value betweeen 0 and 100 where 0 is not occluded at all and 100 is silent (except for any additional reflected sound) + float midPitchOcclusion; + float lowPitchOcclusion; +}; + +struct surfacesoundnames_t { + unsigned short walkStepLeft; + unsigned short walkStepRight; + unsigned short runStepLeft; + unsigned short runStepRight; + unsigned short impactSoft; + unsigned short impactHard; + unsigned short scrapeSmooth; + unsigned short scrapeRough; + unsigned short bulletImpact; + unsigned short rolling; + unsigned short breakSound; + unsigned short strainSound; +}; + +struct surfacegameprops_t { + float maxspeedfactor; + float jumpfactor; + float penetrationmodifier; + float damagemodifier; + uint16_t material; + uint8_t climbable; +}; + +struct surfacedata_t { + surfacephysicsparams_t physics; // physics parameters + surfaceaudioparams_t audio; // audio parameters + surfacesoundnames_t sounds; // names of linked sounds + surfacegameprops_t game; // Game data / properties +}; + +class IPhysicsSurfaceProps +{ +public: + virtual ~IPhysicsSurfaceProps( void ) {} + + // parses a text file containing surface prop keys + virtual int ParseSurfaceData( const char* pFilename, const char* pTextfile ) = 0; + // current number of entries in the database + virtual int SurfacePropCount( void ) const = 0; + + virtual int GetSurfaceIndex( const char* pSurfacePropName ) const = 0; + virtual void GetPhysicsProperties( int surfaceDataIndex, float* density, float* thickness, float* friction, float* elasticity ) const = 0; + + virtual surfacedata_t* GetSurfaceData( int surfaceDataIndex ) = 0; + virtual const char* GetString( unsigned short stringTableIndex ) const = 0; + + virtual const char* GetPropName( int surfaceDataIndex ) const = 0; + + // sets the global index table for world materials + // UNDONE: Make this per-CPhysCollide + virtual void SetWorldMaterialIndexTable( int* pMapArray, int mapSize ) = 0; + + // NOTE: Same as GetPhysicsProperties, but maybe more convenient + //virtual void GetPhysicsParameters(int surfaceDataIndex, surfacephysicsparams_t* pParamsOut) const = 0; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IPrediction.hpp b/cheat/internal_rewrite/IPrediction.hpp new file mode 100644 index 0000000..35fb6b2 --- /dev/null +++ b/cheat/internal_rewrite/IPrediction.hpp @@ -0,0 +1,153 @@ +#pragma once +#include "vector.hpp" + +//forward declarations +class user_cmd_t; +class IClientEntity; + +class IMoveHelper { +private: + virtual void unk00( ) = 0; +public: + virtual void SetHost( IClientEntity* host ) = 0; +private: + virtual void unk01( ) = 0; + virtual void unk02( ) = 0; +public: + virtual void ProcessImpacts( ) = 0; +}; + +class CMoveData { +public: + bool m_bFirstRunOfFunctions : 1; + bool m_bGameCodeMovedPlayer : 1; + bool m_bNoAirControl : 1; + + unsigned long m_nPlayerHandle; + int m_nImpulseCommand; + vec3_t m_vecViewAngles; + vec3_t m_vecAbsViewAngles; + int m_nButtons; + int m_nOldButtons; + float m_flForwardMove; + float m_flSideMove; + float m_flUpMove; + + float m_flMaxSpeed; + float m_flClientMaxSpeed; + + vec3_t m_vecVelocity; + vec3_t m_vecOldVelocity; + float somefloat; + vec3_t m_vecAngles; + vec3_t m_vecOldAngles; + + float m_outStepHeight; + vec3_t m_outWishVel; + vec3_t m_outJumpVel; + + vec3_t m_vecConstraintCenter; + float m_flConstraintRadius; + float m_flConstraintWidth; + float m_flConstraintSpeedFactor; + bool m_bConstraintPastRadius; + + void SetAbsOrigin( const vec3_t& vec ); + const vec3_t& GetAbsOrigin( ) const; + +private: + vec3_t m_vecAbsOrigin; // edict::origin + uint8_t pad_ending_001[0x160]; +}; + +class ICSGameMovement { +public: + void ProcessMovement( IClientEntity* ent, void* data ) { + using fn = void( __thiscall* )( void*, IClientEntity*, void* ); + return util::get_vfunc< fn >( this, 1 )( this, ent, data ); + } + + void Reset( ) { + using fn = void( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 2 )( this ); + } + + void StartTrackPredictionErrors( IClientEntity* ent ) { + using fn = void( __thiscall* )( void*, IClientEntity* ); + return util::get_vfunc< fn >( this, 3 )( this, ent ); + } + + void FinishTrackPredictionErrors( IClientEntity* ent ) { + using fn = void( __thiscall* )( void*, IClientEntity* ); + return util::get_vfunc< fn >( this, 4 )( this, ent ); + } +}; + +class IPrediction { +public: + + // You will need these members to avoid double footsteps and other + // prediction mistakes from happening. + + char pad00 [ 8 ]; // 0x0000 + bool m_bInPrediction; // 0x0008 + char pad01 [ 1 ]; // 0x0009 + bool m_bEnginePaused; // 0x000A + char pad02 [ 13 ]; // 0x000B + bool m_bIsFirstTimePredicted; // 0x0018 + + virtual ~IPrediction( ) { }; + + virtual void Init( ) = 0; + virtual void Shutdown( ) = 0; + + // Run prediction + virtual void Update + ( + int startframe, // World update ( un-modded ) most recently received + bool validframe, // Is frame data valid + int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) + int outgoing_command // Last command (most recent) sent to server (un-modded) + ) = 0; + + // We are about to get a network update from the server. We know the update #, so we can pull any + // data purely predicted on the client side and transfer it to the new from data state. + virtual void PreEntityPacketReceived( int commands_acknowledged, int current_world_update_packet ) = 0; + virtual void PostEntityPacketReceived( ) = 0; + virtual void PostNetworkDataReceived( int commands_acknowledged ) = 0; + + virtual void OnReceivedUncompressedPacket( ) = 0; + + // The engine needs to be able to access a few predicted values + virtual void GetViewOrigin( vec3_t& org ) = 0; + virtual void SetViewOrigin( vec3_t& org ) = 0; + virtual void GetViewAngles( vec3_t& ang ) = 0; + virtual void SetViewAngles( vec3_t& ang ) = 0; + virtual void GetLocalViewAngles( vec3_t& ang ) = 0; + virtual void SetLocalViewAngles( vec3_t& ang ) = 0; + + virtual bool InPrediction( ) const = 0; + virtual bool IsFirstTimePredicted( ) const = 0; + + virtual int GetLastAcknowledgedCommandNumber( ) const = 0; + + virtual int GetIncomingPacketNumber( ) const = 0; + + virtual void CheckMovingGround( IClientEntity* player, double frametime ) = 0; + virtual void RunCommand( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *moveHelper ) = 0; + + virtual void SetupMove( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *pHelper, CMoveData *move ) = 0; + virtual void FinishMove( IClientEntity *player, user_cmd_t *ucmd, CMoveData *move ) = 0; + virtual void SetIdealPitch( int nSlot, IClientEntity *player, const vec3_t& origin, const vec3_t& angles, const vec3_t& viewheight ) = 0; + + virtual void CheckError( int nSlot, IClientEntity *player, int commands_acknowledged ) = 0; + + virtual void _Update + ( + int nSlot, + bool received_new_world_update, + bool validframe, // Is frame data valid + int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) + int outgoing_command // Last command (most recent) sent to server (un-modded) + ) = 0; +}; diff --git a/cheat/internal_rewrite/ISteamClient.hpp b/cheat/internal_rewrite/ISteamClient.hpp new file mode 100644 index 0000000..190607f --- /dev/null +++ b/cheat/internal_rewrite/ISteamClient.hpp @@ -0,0 +1,43 @@ +#include "util.hpp" +using SteamPipeHandle = uint32_t; +using SteamUserHandle = uint32_t; + +enum game_coordinator_result_t { + result_ok, + result_no_message, + result_small_buffer, + result_not_logged_on, + result_invalid, + +}; + +class ISteamFriends { +public: + bool set_rich_presence( const char* key, const char* value ) { + return util::get_vfunc< 43, bool >( this, key, value ); + } + + void clear_rich_presence( ) { + util::get_vfunc< 44, void >( this ); + } +}; + +class ISteamClient { +public: + + void* GetISteamFriends( SteamUserHandle user, SteamPipeHandle pipe, const char* name ) { + return util::get_vfunc< 8, void* >( this, user, pipe, name ); + } + + void* GetISteamGenericInterface( SteamUserHandle user, SteamPipeHandle pipe, const char* name ) { + return util::get_vfunc< 12, void* >( this, user, pipe, name ); + } + +}; + +class ISteamGameCoordinator { +public: + virtual game_coordinator_result_t send_message( uint32_t msg_type, const void* pub_data, uint32_t data ) = 0; + virtual bool IsMessageAvailable( uint32_t* msg_size ) = 0; + virtual game_coordinator_result_t RetrieveMessage( uint32_t* msg_type, void* pub_dest, uint32_t dest, uint32_t* msg_size ) = 0; +}; diff --git a/cheat/internal_rewrite/ISurface.hpp b/cheat/internal_rewrite/ISurface.hpp new file mode 100644 index 0000000..2845eaa --- /dev/null +++ b/cheat/internal_rewrite/ISurface.hpp @@ -0,0 +1,421 @@ +#pragma once +#include "IAppSystem.hpp" +#include "vector.hpp" +#include "color.hpp" + +enum FontDrawType_t { + FONT_DRAW_DEFAULT = 0, + FONT_DRAW_NONADDITIVE, + FONT_DRAW_ADDITIVE, + FONT_DRAW_TYPE_COUNT = 2, +}; + +enum FontFlags_t { + FONTFLAG_NONE, + FONTFLAG_ITALIC = 0x001, + FONTFLAG_UNDERLINE = 0x002, + FONTFLAG_STRIKEOUT = 0x004, + FONTFLAG_SYMBOL = 0x008, + FONTFLAG_ANTIALIAS = 0x010, + FONTFLAG_GAUSSIANBLUR = 0x020, + FONTFLAG_ROTARY = 0x040, + FONTFLAG_DROPSHADOW = 0x080, + FONTFLAG_ADDITIVE = 0x100, + FONTFLAG_OUTLINE = 0x200, + FONTFLAG_CUSTOM = 0x400, + FONTFLAG_BITMAP = 0x800, +}; + +enum ImageFormat { + IMAGE_FORMAT_UNKNOWN = -1, + IMAGE_FORMAT_RGBA8888 = 0, + IMAGE_FORMAT_ABGR8888, + IMAGE_FORMAT_RGB888, + IMAGE_FORMAT_BGR888, + IMAGE_FORMAT_RGB565, + IMAGE_FORMAT_I8, + IMAGE_FORMAT_IA88, + IMAGE_FORMAT_P8, + IMAGE_FORMAT_A8, + IMAGE_FORMAT_RGB888_BLUESCREEN, + IMAGE_FORMAT_BGR888_BLUESCREEN, + IMAGE_FORMAT_ARGB8888, + IMAGE_FORMAT_BGRA8888, + IMAGE_FORMAT_DXT1, + IMAGE_FORMAT_DXT3, + IMAGE_FORMAT_DXT5, + IMAGE_FORMAT_BGRX8888, + IMAGE_FORMAT_BGR565, + IMAGE_FORMAT_BGRX5551, + IMAGE_FORMAT_BGRA4444, + IMAGE_FORMAT_DXT1_ONEBITALPHA, + IMAGE_FORMAT_BGRA5551, + IMAGE_FORMAT_UV88, + IMAGE_FORMAT_UVWQ8888, + IMAGE_FORMAT_RGBA16161616F, + IMAGE_FORMAT_RGBA16161616, + IMAGE_FORMAT_UVLX8888, + IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point + IMAGE_FORMAT_RGB323232F, + IMAGE_FORMAT_RGBA32323232F, + + // Depth-stencil texture formats for shadow depth mapping + IMAGE_FORMAT_NV_DST16, // + IMAGE_FORMAT_NV_DST24, // + IMAGE_FORMAT_NV_INTZ, // Vendor-specific depth-stencil texture + IMAGE_FORMAT_NV_RAWZ, // formats for shadow depth mapping + IMAGE_FORMAT_ATI_DST16, // + IMAGE_FORMAT_ATI_DST24, // + IMAGE_FORMAT_NV_NULL, // Dummy format which takes no video memory + + // Compressed normal map formats + IMAGE_FORMAT_ATI2N, // One-surface ATI2N / DXN format + IMAGE_FORMAT_ATI1N, // Two-surface ATI1N format + + NUM_IMAGE_FORMATS +}; + +struct vertex_t { + vertex_t( ) {} + + vertex_t( const vec2_t& pos, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = pos; + m_tex_coord = coord; + } + + void init( float x, float y, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = vec2_t( x, y ); + m_tex_coord = coord; + } + + vec2_t m_position; + vec2_t m_tex_coord; +}; + +using HFont = unsigned long; +using VPANEL = unsigned long; +class IntRect; +class IHTMLEvents; +class IHTML; +using HCursor = unsigned long; +using HTexture = unsigned long; +class CharRenderInfo; +class IVguiMatInfo; +class IImage; +class DrawTexturedRectParms_t; +class IHTMLChromeController; + +class ISurface : public IAppSystem { +public: + // frame + virtual void RunFrame( ) = 0; + + // hierarchy root + virtual VPANEL GetEmbeddedPanel( ) = 0; + virtual void SetEmbeddedPanel( VPANEL pPanel ) = 0; + + // drawing context + virtual void PushMakeCurrent( VPANEL panel, bool useInsets ) = 0; + virtual void PopMakeCurrent( VPANEL panel ) = 0; //13 + + // rendering functions + virtual void DrawSetColor( ) = 0; //15 + virtual void DrawSetColor( clr_t col ) = 0; //14 + + virtual void DrawFilledRect( int x0, int y0, int x1, int y1 ) = 0; //16 + virtual void DrawFilledRectArray( IntRect *pRects, int numRects ) = 0; + virtual void DrawOutlinedRect( int x0, int y0, int x1, int y1 ) = 0; + + virtual void DrawLine( int x0, int y0, int x1, int y1 ) = 0; + virtual void DrawPolyLine( int *px, int *py, int numPoints ) = 0; + + virtual void DrawSetApparentDepth( float flDepth ) = 0; + virtual void DrawClearApparentDepth( ) = 0; + + virtual void DrawSetTextFont( HFont font ) = 0; + virtual void DrawSetTextColor( ) = 0; //25 + virtual void DrawSetTextColor( clr_t col ) = 0; //24 + virtual void DrawSetTextPos( int x, int y ) = 0; //26 + virtual void DrawGetTextPos( int& x, int& y ) = 0; + virtual void DrawPrintText( const wchar_t *text, int textLen, FontDrawType_t drawType = FONT_DRAW_DEFAULT ) = 0; + virtual void DrawUnicodeChar( wchar_t wch, FontDrawType_t drawType = FONT_DRAW_DEFAULT ) = 0; + + virtual void DrawFlushText( ) = 0; // flushes any buffered text (for rendering optimizations) + virtual IHTML *CreateHTMLWindow( IHTMLEvents *events, VPANEL context ) = 0; + virtual void PaintHTMLWindow( IHTML *htmlwin ) = 0; + virtual void DeleteHTMLWindow( IHTML *htmlwin ) = 0; + + enum ETextureFormat + { + eTextureFormat_RGBA, + eTextureFormat_BGRA, + eTextureFormat_BGRA_Opaque, // bgra format but alpha is always 255, CEF does this, we can use this fact for better perf on win32 gdi + }; + + virtual int DrawGetTextureId( char const *filename ) = 0; + virtual bool DrawGetTextureFile( int id, char *filename, int maxlen ) = 0; + virtual void DrawSetTextureFile( int id, const char *filename, int hardwareFilter, bool forceReload ) = 0; + virtual void DrawSetTextureRGBA( int id, const unsigned char *rgba, int wide, int tall ) = 0; + virtual void DrawSetTexture( int id ) = 0; //38 + virtual void DrawGetTextureSize( int id, int &wide, int &tall ) = 0; + virtual void DrawTexturedRect( int x0, int y0, int x1, int y1 ) = 0; + virtual bool IsTextureIDValid( int id ) = 0; + virtual bool DeleteTextureByID( int id ) = 0; + + virtual int CreateNewTextureID( bool procedural = false ) = 0; //43 + + virtual void GetScreenSize( int &wide, int &tall ) = 0; + virtual void SetAsTopMost( VPANEL panel, bool state ) = 0; + virtual void BringToFront( VPANEL panel ) = 0; + virtual void SetForegroundWindow( VPANEL panel ) = 0; + virtual void SetPanelVisible( VPANEL panel, bool state ) = 0; + virtual void SetMinimized( VPANEL panel, bool state ) = 0; + virtual bool IsMinimized( VPANEL panel ) = 0; + virtual void FlashWindow( VPANEL panel, bool state ) = 0; + virtual void SetTitle( VPANEL panel, const wchar_t *title ) = 0; + virtual void SetAsToolBar( VPANEL panel, bool state ) = 0; // removes the window's task bar entry (for context menu's, etc.) + + // windows stuff + virtual void CreatePopup( VPANEL panel, bool minimised, bool showTaskbarIcon = true, bool disabled = false, bool mouseInput = true, bool kbInput = true ) = 0; + virtual void SwapBuffers( VPANEL panel ) = 0; + virtual void Invalidate( VPANEL panel ) = 0; + virtual void SetCursor( HCursor cursor ) = 0; + virtual bool IsCursorVisible( ) = 0; + virtual void ApplyChanges( ) = 0; + virtual bool IsWithin( int x, int y ) = 0; + virtual bool HasFocus( ) = 0; + + // returns true if the surface supports minimize & maximize capabilities + enum SurfaceFeature_e + { + ANTIALIASED_FONTS = 1, + DROPSHADOW_FONTS = 2, + ESCAPE_KEY = 3, + OPENING_NEW_HTML_WINDOWS = 4, + FRAME_MINIMIZE_MAXIMIZE = 5, + OUTLINE_FONTS = 6, + DIRECT_HWND_RENDER = 7, + }; + virtual bool SupportsFeature( SurfaceFeature_e feature ) = 0; + + // restricts what gets drawn to one panel and it's children + // currently only works in the game + virtual void RestrictPaintToSinglePanel( VPANEL panel ) = 0; + + // these two functions obselete, use IInput::SetAppModalSurface() instead + virtual void SetModalPanel( VPANEL ) = 0; + virtual VPANEL GetModalPanel( ) = 0; + + virtual void UnlockCursor( ) = 0; + virtual void LockCursor( ) = 0; + virtual void SetTranslateExtendedKeys( bool state ) = 0; + virtual VPANEL GetTopmostPopup( ) = 0; + + // engine-only focus handling (replacing WM_FOCUS windows handling) + virtual void SetTopLevelFocus( VPANEL panel ) = 0; + + // fonts + // creates an empty handle to a vgui font. windows fonts can be add to this via SetFontGlyphSet(). + virtual HFont CreateFont( ) = 0; //71 + + // adds to the font + enum EFontFlags + { + FONTFLAG_NONE, + FONTFLAG_ITALIC = 0x001, + FONTFLAG_UNDERLINE = 0x002, + FONTFLAG_STRIKEOUT = 0x004, + FONTFLAG_SYMBOL = 0x008, + FONTFLAG_ANTIALIAS = 0x010, + FONTFLAG_GAUSSIANBLUR = 0x020, + FONTFLAG_ROTARY = 0x040, + FONTFLAG_DROPSHADOW = 0x080, + FONTFLAG_ADDITIVE = 0x100, + FONTFLAG_OUTLINE = 0x200, + FONTFLAG_CUSTOM = 0x400, // custom generated font - never fall back to asian compatibility mode + FONTFLAG_BITMAP = 0x800, // compiled bitmap font - no fallbacks + }; + + virtual bool SetFontGlyphSet( HFont font, const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags, int nRangeMin = 0, int nRangeMax = 0 ) = 0; + + // adds a custom font file (only supports true type font files (.ttf) for now) + virtual bool AddCustomFontFile( const char *fontName, const char *fontFileName ) = 0; + + // returns the details about the font + virtual int GetFontTall( HFont font ) = 0; + virtual int GetFontAscent( HFont font, wchar_t wch ) = 0; + virtual bool IsFontAdditive( HFont font ) = 0; + virtual void GetCharABCwide( HFont font, int ch, int &a, int &b, int &c ) = 0; + virtual int GetCharacterWidth( HFont font, int ch ) = 0; + virtual void GetTextSize( HFont font, const wchar_t *text, int &wide, int &tall ) = 0; + + // notify icons?!? + virtual VPANEL GetNotifyPanel( ) = 0; + virtual void SetNotifyIcon( VPANEL context, HTexture icon, VPANEL panelToReceiveMessages, const char *text ) = 0; + + // plays a sound + virtual void PlaySound( const char *fileName ) = 0; //82 + + //!! these functions should not be accessed directly, but only through other vgui items + //!! need to move these to seperate interface + virtual int GetPopupCount( ) = 0; + virtual VPANEL GetPopup( int index ) = 0; + virtual bool ShouldPaintChildPanel( VPANEL childPanel ) = 0; + virtual bool RecreateContext( VPANEL panel ) = 0; + virtual void AddPanel( VPANEL panel ) = 0; + virtual void ReleasePanel( VPANEL panel ) = 0; + virtual void MovePopupToFront( VPANEL panel ) = 0; + virtual void MovePopupToBack( VPANEL panel ) = 0; + + virtual void SolveTraverse( VPANEL panel, bool forceApplySchemeSettings = false ) = 0; + virtual void PaintTraverse( VPANEL panel ) = 0; + + virtual void EnableMouseCapture( VPANEL panel, bool state ) = 0; + + // returns the size of the workspace + virtual void GetWorkspaceBounds( int &x, int &y, int &wide, int &tall ) = 0; + + // gets the absolute coordinates of the screen (in windows space) + virtual void GetAbsoluteWindowBounds( int &x, int &y, int &wide, int &tall ) = 0; + + // gets the base resolution used in proportional mode + virtual void GetProportionalBase( int &width, int &height ) = 0; + + virtual void CalculateMouseVisible( ) = 0; + virtual bool NeedKBInput( ) = 0; + + virtual bool HasCursorPosFunctions( ) = 0; + virtual void SurfaceGetCursorPos( int &x, int &y ) = 0; + virtual void SurfaceSetCursorPos( int x, int y ) = 0; + + // SRC only functions!!! + virtual void DrawTexturedLine( const vertex_t &a, const vertex_t &b ) = 0; + virtual void DrawOutlinedCircle( int x, int y, int radius, int segments ) = 0; + virtual void DrawTexturedPolyLine( const vertex_t *p, int n ) = 0; // (Note: this connects the first and last points). + virtual void DrawTexturedSubRect( int x0, int y0, int x1, int y1, float texs0, float text0, float texs1, float text1 ) = 0; + virtual void DrawTexturedPolygon( int n, vertex_t *pVertice, bool bClipVertices = true ) = 0; //106 + virtual const wchar_t* GetTitle( VPANEL panel ) = 0; + virtual bool IsCursorLocked( ) const = 0; + virtual void SetWorkspaceInsets( int left, int top, int right, int bottom ) = 0; + + // squarish comic book word bubble with pointer, rect params specify the space inside the bubble + virtual void DrawWordBubble( int x0, int y0, int x1, int y1, int nBorderThickness, clr_t rgbaBackground, clr_t rgbaBorder, + bool bPointer = false, int nPointerX = 0, int nPointerY = 0, int nPointerBaseThickness = 16 ) = 0; + + + // Lower level char drawing code, call DrawGet then pass in info to DrawRender + virtual bool DrawGetUnicodeCharRenderInfo( wchar_t ch, CharRenderInfo& info ) = 0; + virtual void DrawRenderCharFromInfo( const CharRenderInfo& info ) = 0; + + // global alpha setting functions + // affect all subsequent draw calls - shouldn't normally be used directly, only in Panel::PaintTraverse() + virtual void DrawSetAlphaMultiplier( float alpha /* [0..1] */ ) = 0; + virtual float DrawGetAlphaMultiplier( ) = 0; + + // web browser + virtual void SetAllowHTMLJavaScript( bool state ) = 0; + + // video mode changing + virtual void OnScreenSizeChanged( int nOldWidth, int nOldHeight ) = 0; + + virtual HCursor CreateCursorFromFile( char const *curOrAniFile, char const *pPathID = nullptr ) = 0; + + // create IVguiMatInfo object ( IMaterial wrapper in VguiMatSurface, NULL in CWin32Surface ) + virtual IVguiMatInfo* DrawGetTextureMatInfoFactory( int id ) = 0; + + virtual void PaintTraverseEx( VPANEL panel, bool paintPopups = false ) = 0; + + virtual float GetZPos( ) const = 0; + + // From the Xbox + virtual void SetPanelForInput( VPANEL vpanel ) = 0; + virtual void DrawFilledRectFastFade( int x0, int y0, int x1, int y1, int fadeStartPt, int fadeEndPt, unsigned int alpha0, unsigned int alpha1, bool bHorizontal ) = 0; + virtual void DrawFilledRectFade( int x0, int y0, int x1, int y1, unsigned int alpha0, unsigned int alpha1, bool bHorizontal ) = 0; //123 + + virtual void DrawSetTextureRGBAEx( int id, const unsigned char *rgba, int wide, int tall, ImageFormat imageFormat ) = 0; + virtual void DrawSetTextScale( float sx, float sy ) = 0; + virtual bool SetBitmapFontGlyphSet( HFont font, const char *windowsFontName, float scalex, float scaley, int flags ) = 0; + // adds a bitmap font file + virtual bool AddBitmapFontFile( const char *fontFileName ) = 0; + // sets a symbol for the bitmap font + virtual void SetBitmapFontName( const char *pName, const char *pFontFilename ) = 0; + // gets the bitmap font filename + virtual const char* GetBitmapFontName( const char *pName ) = 0; + virtual void ClearTemporaryFontCache( ) = 0; + + virtual IImage* GetIconImageForFullPath( char const *pFullPath ) = 0; + virtual void DrawUnicodeString( const wchar_t *pwString, FontDrawType_t drawType = FONT_DRAW_DEFAULT ) = 0; + virtual void PrecacheFontCharacters( HFont font, const wchar_t *pCharacters ) = 0; + // Console-only. Get the string to use for the current video mode for layout files. + //virtual const char *GetResolutionKey( void ) const = 0; + + virtual const char *GetFontName( HFont font ) = 0; + //virtual const char *GetFontFamilyName( HFont font ) = 0; + + virtual bool ForceScreenSizeOverride( bool bState, int wide, int tall ) = 0; + // LocalToScreen, ParentLocalToScreen fixups for explicit PaintTraverse calls on Panels not at 0, 0 position + virtual bool ForceScreenPosOffset( bool bState, int x, int y ) = 0; + virtual void OffsetAbsPos( int &x, int &y ) = 0; + + virtual void SetAbsPosForContext( int, int, int ) = 0; + virtual void GetAbsPosForContext( int, int &, int & ) = 0; + + // Causes fonts to get reloaded, etc. + virtual void ResetFontCaches( ) = 0; + + virtual bool IsScreenSizeOverrideActive( ) = 0; + virtual bool IsScreenPosOverrideActive( ) = 0; + + virtual void DestroyTextureID( int id ) = 0; + + virtual int GetTextureNumFrames( int id ) = 0; + virtual void DrawSetTextureFrame( int id, int nFrame, unsigned int *pFrameCache ) = 0; + + virtual void GetClipRect( int &x0, int &y0, int &x1, int &y1 ) = 0; + virtual void SetClipRect( int x0, int y0, int x1, int y1 ) = 0; + + virtual void DrawTexturedRectEx( DrawTexturedRectParms_t *pDrawParms ) = 0; + + virtual void GetKernedCharWidth( HFont font, wchar_t ch, wchar_t chBefore, wchar_t chAfter, float &wide, float &abcA ) = 0; + + virtual void DrawUpdateRegionTextureRGBA( int nTextureID, int x, int y, const unsigned char *pchData, int wide, int tall, ImageFormat imageFormat ) = 0; + virtual bool BHTMLWindowNeedsPaint( IHTML *htmlwin ) = 0; + + virtual void DrawSetTextureRGBALinear( int, unsigned char const*, int, int ) = 0; + + virtual const char *GetWebkitHTMLUserAgentString( ) = 0; + + virtual IHTMLChromeController *Deprecated_AccessChromeHTMLController( ) = 0; + + /* + 154 CMatSystemSurface::SetAppDrivesInput(bool) + 155 CMatSystemSurface::EnableWindowsMessages(bool) + 156 CMatSystemSurface::Begin3DPaint(int,int,int,int,bool) + 157 CMatSystemSurface::End3DPaint(bool) + 158 CMatSystemSurface::DisableClipping(bool) + 159 CMatSystemSurface::SetMouseCallbacks(void (*)(int &,int &),void (*)(int,int)) + 160 CMatSystemSurface::InstallPlaySoundFunc(void (*)(char const*)) + 161 CMatSystemSurface::DrawColoredCircle(int,int,float,int,int,int,int) + 162 CMatSystemSurface::DrawColoredText(unsigned long,int,int,int,int,int,int,char const*,...) + 163 CMatSystemSurface::DrawColoredTextRect(unsigned long,int,int,int,int,int,int,int,int,char const*,...) + 164 CMatSystemSurface::DrawTextHeight(unsigned long,int,int &,char *,...) + 165 CMatSystemSurface::DrawTextLen(unsigned long,char const*,...) + 166 CMatSystemSurface::DrawPanelIn3DSpace(unsigned long long,VMatrix const&,int,int,float,float) + 167 CMatSystemSurface::DrawSetTextureMaterial(int,IMaterial *) + 168 CMatSystemSurface::HandleInputEvent(InputEvent_t const&) + 169 CMatSystemSurface::Set3DPaintTempRenderTarget(char const*) + 170 CMatSystemSurface::Reset3DPaintTempRenderTarget(void) + 171 CMatSystemSurface::DrawGetTextureMaterial(int) + 172 CMatSystemSurface::SetInputContext(InputContextHandle_t__ *) + 173 CMatSystemSurface::DrawSetSubTextureRGBA(int,int,int,unsigned char const*,int,int) + 174 CMatSystemSurface::DrawTexturedSubRectGradient(int,int,int,int,float,float,float,float,Color,Color,bool) + 175 CMatSystemSurface::~CMatSystemSurface() + 176 CMatSystemSurface::~CMatSystemSurface() + 177 CMatSystemSurface::SupportsFontFeature(FontFeature_t) + 178 CMatSystemSurface::InEngine(void) + 179 CMatSystemSurface::IsInThink(unsigned long long) + 180 CMatSystemSurface::SetLanguage(char const*) + 181 CMatSystemSurface::GetLanguage(void) + 182 CMatSystemSurface::ComputeTextWidth(wchar_t const*) + */ +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IVEngineClient.hpp b/cheat/internal_rewrite/IVEngineClient.hpp new file mode 100644 index 0000000..fb39e08 --- /dev/null +++ b/cheat/internal_rewrite/IVEngineClient.hpp @@ -0,0 +1,287 @@ +#pragma once +#include +#include + +#include "util.hpp" +#include "vector.hpp" +#include "CUtlVector.hpp" + +using matrix3x4 = float[ 3 ][ 4 ]; + +typedef struct player_info_s { +private: + uint32_t __pad0[ 2 ]; +public: + unsigned int m_xuidlow; + unsigned int m_xuidhigh; + char name[ 128 ];//32 + int m_userid; + char m_steamid[ 33 ];//32 + unsigned m_steam3id; + char m_friendsname[ 128 ]; + bool m_isfakeplayer; + bool m_ishltv; + uint32_t m_customfiles[ 4 ]; + uint8_t m_filesdownloaded; +private: + int __pad1; +} player_info_t; + +class INetChannelInfo { +public: + enum + { + GENERIC = 0, // must be first and is default group + LOCALPLAYER, // bytes for local player entity update + OTHERPLAYERS, // bytes for other players update + ENTITIES, // all other entity bytes + SOUNDS, // game sounds + EVENTS, // event messages + TEMPENTS, // temp entities + USERMESSAGES, // user messages + ENTMESSAGES, // entity messages + VOICE, // voice data + STRINGTABLE, // a stringtable update + MOVE, // client move cmds + STRINGCMD, // string command + SIGNON, // various signondata + TOTAL, // must be last and is not a real group + }; + + virtual const char* GetName( ) const = 0; // get channel name + virtual const char* GetAddress( ) const = 0; // get channel IP address as string + virtual float GetTime( ) const = 0; // current net time + virtual float GetTimeConnected( ) const = 0; // get connection time in seconds + virtual int GetBufferSize( ) const = 0; // netchannel packet history size + virtual int GetDataRate( ) const = 0; // send data rate in byte/sec + + virtual bool IsLoopback( ) const = 0; // true if loopback channel + virtual bool IsTimingOut( ) const = 0; // true if timing out + virtual bool IsPlayback( ) const = 0; // true if demo playback + + virtual float GetLatency( int flow ) const = 0; // current latency (RTT), more accurate but jittering + virtual float GetAvgLatency( int flow ) const = 0; // average packet latency in seconds + virtual float GetAvgLoss( int flow ) const = 0; // avg packet loss[0..1] + virtual float GetAvgChoke( int flow ) const = 0; // avg packet choke[0..1] + virtual float GetAvgData( int flow ) const = 0; // data flow in bytes/sec + virtual float GetAvgPackets( int flow ) const = 0; // avg packets/sec + virtual int GetTotalData( int flow ) const = 0; // total flow in/out in bytes + virtual int GetTotalPackets( int flow ) const = 0; + virtual int GetSequenceNr( int flow ) const = 0; // last send seq number + virtual bool IsValidPacket( int flow, int frame_number ) const = 0; // true if packet was not lost/dropped/chocked/flushed + virtual float GetPacketTime( int flow, int frame_number ) const = 0; // time when packet was send + virtual int GetPacketBytes( int flow, int frame_number, int group ) const = 0; // group size of this packet + virtual bool GetStreamProgress( int flow, int* received, int* total ) const = 0; // TCP progress if transmitting + virtual float GetTimeSinceLastReceived( ) const = 0; // get time since last recieved packet in seconds + virtual float GetCommandInterpolationAmount( int flow, int frame_number ) const = 0; + virtual void GetPacketResponseLatency( int flow, int frame_number, int* pnLatencyMsecs, int* pnChoke ) const = 0; + virtual void GetRemoteFramerate( float* pflFrameTime, float* pflFrameTimeStdDeviation ) const = 0; + + virtual float GetTimeoutSeconds( ) const = 0; +}; + +class INetChannel { +public: + char pad_0000[ 20 ]; //0x0000 + bool m_bProcessingMessages; //0x0014 + bool m_bShouldDelete; //0x0015 + char pad_0016[ 2 ]; //0x0016 + int32_t m_nOutSequenceNr; //0x0018 last send outgoing sequence number + int32_t m_nInSequenceNr; //0x001C last received incoming sequnec number + int32_t m_nOutSequenceNrAck; //0x0020 last received acknowledge outgoing sequnce number + int32_t m_nOutReliableState; //0x0024 state of outgoing reliable data (0/1) flip flop used for loss detection + int32_t m_nInReliableState; //0x0028 state of incoming reliable data + int32_t m_nChokedPackets; //0x002C number of choked packets + float m_fClearTime; + float m_TimeOut; + char m_Name[ 32 ]; + + + char pad_0030[ 1044 ]; //0x0030 + + bool transmit( bool only_reliable ) { + return util::get_vfunc< 49, bool >( this, only_reliable ); + } +}; //Size: 0x0444 + +struct INetMessage { + virtual ~INetMessage( ); +}; + +template +class CNetMessagePB : public INetMessage, public T {}; + +class CCLCMsg_Move_ { +private: + char __PAD0[ 0x8 ]; +public: + int numBackupCommands; + int numNewCommands; +}; + +using CCLCMsg_Move_t = CNetMessagePB; + +class CClientState { +public: + char pad_0000[ 0x9c ]; //0x0000 + class INetChannel* m_netchannel; //0x0094 + char pad_0098[ 16 ]; //0x0098 + unsigned int m_retrynum; //0x00A8 + char pad_00AC[ 84 ]; //0x00AC + int m_signon_state; //0x0100 + char pad_0104[ 8 ]; //0x0104 + float m_next_cmd_time; //0x010C + int m_servercount; //0x0110 + int m_current_sequence; //0x0114 + char pad_0118[ 75 ]; //0x0118 + int m_server_tick; //0x0163 + int m_client_tick; //0x0167 + int m_delta_tick; //0x016B + char pad_016F[ 4 ]; //0x016F + int m_view_entity; //0x0173 + char pad_0177[ 8 ]; //0x0177 + char m_level_name[ 260 ]; //0x017F + char m_level_name_short[ 40 ]; //0x0283 + char pad_02AB[ 18932 ]; //0x02AB + char pad_0x2DA0; //0x4CA7 + int m_lastoutgoingcommand; //0x4CA8 + int m_chokedcommands; //0x4CAC + int m_last_acknowledged_cmd; //0x4CB0 + int m_command_ack; //0x4CB4 + int m_sound_seq; //0x4CB8 + char pad_4CBC[ 8 ]; //0x4CBC + bool m_ishltv; //0x4CC4 +}; + +class CGlobalState { +public: + uintptr_t* m_manager; + CClientState *m_def_clientstate; + + __forceinline CClientState* get_client_state( ) { + return m_def_clientstate; + } +}; + +struct CSndInfo { + int guid; + void *file_handle; + int sound_source; + int channel; + int speaker_entity; + float volume; + float last_spatilized_volume; + float radius; + int pitch; + vec3_t *origin; + vec3_t *direction; + bool update_positions; + bool is_sentence; + bool disable_dsp_processing; + bool from_speaker_entity; + bool server_sound; +}; + +class IVEngineSound { +public: + void GetActiveSounds( CUtlVector< CSndInfo >& list ) { + using fn = void( __thiscall* )( void*, CUtlVector< CSndInfo >& ); + + return util::get_vfunc< fn >( this, 18 )( this, list ); + } +}; + +class IVEngineClient +{ +public: + void GetScreenSize( int& width, int& height ) { + using fn = void( __thiscall* )( void*, int&, int& ); + return util::get_vfunc< fn >( this, 5 )( this, width, height ); + } + + void ClientCmd( const char* szCommandString ) { + std::string command( szCommandString ); + std::replace( command.begin( ), command.end( ), ';', ':' ); + std::replace( command.begin( ), command.end( ), '"', '*' ); + using fn = void( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 7 )( this, command.c_str( ) ); + } + + void ClientCmd_Unrestricted( const char* szCommandString ) { + std::string command( szCommandString ); + std::replace( command.begin( ), command.end( ), ';', ':' ); + std::replace( command.begin( ), command.end( ), '"', '*' ); + using fn = void( __thiscall* )( void*, const char*, const char* ); + return util::get_vfunc< fn >( this, 114 )( this, command.c_str( ), nullptr ); + } + + bool GetPlayerInfo( int index, player_info_t* pInfo ) { + using fn = bool( __thiscall* )( void*, int, player_info_t* ); + return util::get_vfunc< fn >( this, 8 )( this, index, pInfo ); + } + + int GetPlayerForUserID( int UserID ) { + using fn = int( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 9 )( this, UserID ); + } + + int GetLocalPlayer( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 12 )( this ); + } + + float Time( ) { + using fn = float( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 14 )( this ); + } + + void GetViewAngles( vec3_t& ang ) { + using fn = void( __thiscall* )( void*, vec3_t& ); + return util::get_vfunc< fn >( this, 18 )( this, ang ); + } + + vec3_t GetViewAngles( ) { + vec3_t ret; + GetViewAngles( ret ); + return ret; + } + + void SetViewAngles( vec3_t& ang ) { + using fn = void( __thiscall* )( void*, vec3_t& ); + return util::get_vfunc< fn >( this, 19 )( this, ang ); + } + + int GetMaxClients( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 20 )( this ); + } + + bool IsInGame( ) { + using fn = bool( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 26 )( this ); + } + + bool IsConnected( ) { + using fn = bool( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 27 )( this ); + } + + bool IsPaused( ) { + return util::get_vfunc< 91, bool >( this ); + } + + const matrix3x4& WorldToScreenMatrix( ) { + using fn = const matrix3x4& ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 37 )( this ); + } + + const char* GetLevelName( ) { + using fn = const char* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 52 )( this ); + } + + INetChannelInfo* GetNetChannelInfo( ) { + using fn = INetChannelInfo* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 78 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IVModelInfoClient.hpp b/cheat/internal_rewrite/IVModelInfoClient.hpp new file mode 100644 index 0000000..3cc418b --- /dev/null +++ b/cheat/internal_rewrite/IVModelInfoClient.hpp @@ -0,0 +1,268 @@ +#pragma once +#include "IVEngineClient.hpp" +#include "IClientEntityList.hpp" + +enum BoneMask_t { + BONE_USED_MASK = 0x0007FF00, + BONE_USED_BY_ANYTHING = 0x0007FF00, + BONE_USED_BY_HITBOX = 0x00000100, // bone (or child) is used by a hit box + BONE_USED_BY_ATTACHMENT = 0x00000200, // bone (or child) is used by an attachment point + BONE_USED_BY_VERTEX_MASK = 0x0003FC00, + BONE_USED_BY_VERTEX_LOD0 = 0x00000400, // bone (or child) is used by the toplevel model via skinned vertex + BONE_USED_BY_VERTEX_LOD1 = 0x00000800, + BONE_USED_BY_VERTEX_LOD2 = 0x00001000, + BONE_USED_BY_VERTEX_LOD3 = 0x00002000, + BONE_USED_BY_VERTEX_LOD4 = 0x00004000, + BONE_USED_BY_VERTEX_LOD5 = 0x00008000, + BONE_USED_BY_VERTEX_LOD6 = 0x00010000, + BONE_USED_BY_VERTEX_LOD7 = 0x00020000, + BONE_USED_BY_BONE_MERGE = 0x00040000 // bone is available for bone merge to occur against it +}; + +struct DrawModelState_t; + +class INetworkStringTable; + +struct mstudiobbox_t { + int bone; + int group; + vec3_t bbmin; + vec3_t bbmax; + int szhitboxnameindex; + int m_iPad01[ 3 ]; + float m_flRadius; + int m_iPad02[ 4 ]; +}; + +struct mstudiohitboxset_t { + int sznameindex; + const char* pszName( ) const { return reinterpret_cast< const char* >( uintptr_t( this ) + sznameindex ); } + int numhitboxes; + int hitboxindex; + mstudiobbox_t* pHitbox( int i ) const { return reinterpret_cast< mstudiobbox_t* >( uintptr_t( this ) + hitboxindex ) + i; }; +}; + +struct mstudiobone_t { + int sznameindex; + char* GetName( ) const { return reinterpret_cast< char* >( reinterpret_cast< uintptr_t >( this ) ) + sznameindex; } + int parent; + int bonecontroller[ 6 ]; + vec3_t pos; + float quat[ 4 ]; + vec3_t rot; + vec3_t posscale; + vec3_t rotscale; + matrix3x4 poseToBone; + float qAlignment[ 4 ]; + int flags; + int proctype; + int procindex; + mutable int physicsbone; + void* GetProcedure( ) const { return procindex == 0 ? nullptr : reinterpret_cast( reinterpret_cast( this ) + procindex ); }; + int surfacepropidx; + char* GetSurfaceProps( ) const { return reinterpret_cast( reinterpret_cast( this ) ) + surfacepropidx; } + int contents; + unsigned char pad[ 32 ]; +}; + +struct mstudioseqdesc_t { + int baseptr; + int szlabelindex; + int szactivitynameindex; + int flags; // looping/non-looping flags + int activity; // initialized at loadtime to game DLL values + int actweight; + int numevents; + int eventindex; + vec3_t bbmin; // per sequence bounding box + vec3_t bbmax; + int numblends; + int animindexindex; + int movementindex; // [blend] float array for blended movement + int groupsize[ 2 ]; + int paramindex[ 2 ]; // X, Y, Z, XR, YR, ZR + float paramstart[ 2 ]; // local (0..1) starting value + float paramend[ 2 ]; // local (0..1) ending value + int paramparent; + float fadeintime; // ideal cross fate in time (0.2 default) + float fadeouttime; // ideal cross fade out time (0.2 default) + int localentrynode; // transition node at entry + int localexitnode; // transition node at exit + int nodeflags; // transition rules + float entryphase; // used to match entry gait + float exitphase; // used to match exit gait + float lastframe; // frame that should generation EndOfSequence + int nextseq; // auto advancing sequences + int pose; // index of delta animation between end and nextseq + int numikrules; + int numautolayers; // + int autolayerindex; + int weightlistindex; + int posekeyindex; + int numiklocks; + int iklockindex; + int keyvalueindex; + int keyvaluesize; + int cycleposeindex; // index of pose parameter to use as cycle index + int activitymodifierindex; + int numactivitymodifiers; + int unused[ 5 ]; // remove/add as appropriate (grow back to 8 ints on version change!) +}; + +struct studiohdr_t { + unsigned char pad00[ 12 ]; + char name[ 64 ]; + unsigned char pad01[ 80 ]; + int numbones; + int boneindex; + unsigned char pad02[ 12 ]; + int hitboxsetindex; + unsigned char pad03[ 8 ]; + int numlocalseq; + int localseqindex; + mutable int activitylistversion; + mutable int eventsindexed; + + int numtextures; + int textureindex; + + int numcdtextures; + int cdtextureindex; + unsigned char pad04[ 188 ]; + + mstudiobone_t *GetBone( int i ) const { + return reinterpret_cast( uintptr_t( this ) + boneindex ) + i; + }; + + mstudiohitboxset_t* pHitboxSet( int i ) const { + return reinterpret_cast( uintptr_t( this ) + hitboxsetindex ) + i; + }; + + mstudiobbox_t* pHitbox( int i, int set ) const { + const mstudiohitboxset_t* s = pHitboxSet( set ); + if ( !s ) + return nullptr; + + return s->pHitbox( i ); + }; + + int iHitboxCount( int set ) const { + const mstudiohitboxset_t* s = pHitboxSet( set ); + if ( !s ) + return 0; + + return s->numhitboxes; + }; +}; + +struct ModelRenderInfo_t { + vec3_t m_origin; + vec3_t m_angles; + char pad[ 0x4 ]; + void* m_renderable; + const model_t* m_model; + const matrix3x4* m_model2world; + const matrix3x4* m_light_offset; + const vec3_t* m_light_origin; + int m_flags; + int m_entity_index; + int m_skin; + int m_body; + int m_hitboxset; + uint16_t* m_instance; + + ModelRenderInfo_t( ) { + m_model2world = nullptr; + m_light_offset = nullptr; + m_light_origin = nullptr; + } +}; + +class IVModelInfoClient { +public: + model_t* GetModel( int index ) { + using fn = model_t*( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 1 )( this, index ); + } + + int GetModelIndex( const char* name ) { + using fn = int( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 2 )( this, name ); + } + + const char* GetModelName( const model_t* model ) { + using fn = const char* ( __thiscall* )( void*, const model_t* ); + return util::get_vfunc< fn >( this, 3 )( this, model ); + } + + studiohdr_t* GetStudiomodel( const model_t* mod ) { + using fn = studiohdr_t* ( __thiscall* )( void*, const model_t* ); + return util::get_vfunc< fn >( this, 32 )( this, mod ); + } + + model_t* FindOrLoadModel( const char* name ) { + using fn = model_t* ( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 43 )( this, name ); + } + + void GetModelMaterials( const model_t *model, int count, class IMaterial** ppMaterial ) { + using fn = const void( __thiscall* )( void*, const model_t*, int, IMaterial** ); + util::get_vfunc< fn >( this, 19 )( this, model, count, ppMaterial ); + } +}; + +enum OverrideType_t { + OVERRIDE_NORMAL = 0, + OVERRIDE_BUILD_SHADOWS, + OVERRIDE_DEPTH_WRITE, + OVERRIDE_SSAO_DEPTH_WRITE, +}; + +class IVModelRender { +public: + void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) { + using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int ); + return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk ); + } + + void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) { + using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + util::get_vfunc< fn >( this, 21 )( this, matctx, state, pInfo, pCustomBoneToWorld ); + } +}; + +class CStringTable { +public: + INetworkStringTable* FindTable( const char* table ) { + using fn = INetworkStringTable * ( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 3 )( this, table ); + } +}; + +class INetworkStringTable { +public: + + virtual ~INetworkStringTable( void ) {}; + + // Table Info + virtual const char *GetTableName( void ) const = 0; + virtual int GetTableId( void ) const = 0; + virtual int GetNumStrings( void ) const = 0; + virtual int GetMaxStrings( void ) const = 0; + virtual int GetEntryBits( void ) const = 0; + + // Networking + virtual void SetTick( int tick ) = 0; + virtual bool ChangedSinceTick( int tick ) const = 0; + + // Accessors (length -1 means don't change user data if string already exits) + virtual int AddString( bool bIsServer, const char *value, int length = -1, const void *userdata = 0 ) = 0; + + virtual const char *GetString( int stringNumber ) = 0; + virtual void SetStringUserData( int stringNumber, int length, const void *userdata ) = 0; + virtual const void *GetStringUserData( int stringNumber, int *length ) = 0; + virtual int FindStringIndex( char const *string ) = 0; // returns INVALID_STRING_INDEX if not found + + // Callbacks + virtual void SetStringChangedCallback( void *object, void* changeFunc ) = 0; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/IVRenderView.hpp b/cheat/internal_rewrite/IVRenderView.hpp new file mode 100644 index 0000000..a8396f5 --- /dev/null +++ b/cheat/internal_rewrite/IVRenderView.hpp @@ -0,0 +1,185 @@ +#pragma once +#include "util.hpp" + +class Beam_t; +class C_Beam; +class c_base_player; +class ITraceFilter; + + +class IVRenderView { +public: + void SetBlend( float blend ) { + return util::get_vfunc< 4, void >( this, blend ); + } + + float GetBlend( ) { + return util::get_vfunc< 5, float >( this ); + } + + void SetColorModulation( float const* blend ) { + return util::get_vfunc< 6, void >( this, blend ); + } + + void GetColorModulation( float* blend ) { + return util::get_vfunc< 7, void >( this, blend ); + } +}; + +enum beam_types { + beam_normal = 0, + beam_disk = 2, + beam_cylinder, + beam_follow, + beam_ring, + beam_spline, + beam_ring_point, + beam_laser, + beam_tesla, +}; + +enum beam_flags { + FBEAM_STARTENTITY = 0x00000001, + FBEAM_ENDENTITY = 0x00000002, + FBEAM_FADEIN = 0x00000004, + FBEAM_FADEOUT = 0x00000008, + FBEAM_SINENOISE = 0x00000010, + FBEAM_SOLID = 0x00000020, + FBEAM_SHADEIN = 0x00000040, + FBEAM_SHADEOUT = 0x00000080, + FBEAM_ONLYNOISEONCE = 0x00000100, // Only calculate our noise once + FBEAM_NOTILE = 0x00000200, + FBEAM_USE_HITBOXES = 0x00000400, // Attachment indices represent hitbox indices instead when this is set. + FBEAM_STARTVISIBLE = 0x00000800, // Has this client actually seen this beam's start entity yet? + FBEAM_ENDVISIBLE = 0x00001000, // Has this client actually seen this beam's end entity yet? + FBEAM_ISACTIVE = 0x00002000, + FBEAM_FOREVER = 0x00004000, + FBEAM_HALOBEAM = 0x00008000, // When drawing a beam with a halo, don't ignore the segments and endwidth + FBEAM_REVERSED = 0x00010000, + NUM_BEAM_FLAGS = 17 // KEEP THIS UPDATED! +}; + +struct BeamInfo_t { + beam_types m_nType; + + // Entities + c_base_player* m_pStartEnt; + int m_nStartAttachment; + c_base_player* m_pEndEnt; + int m_nEndAttachment; + + // Points + vec3_t m_vecStart; + vec3_t m_vecEnd; + + int m_nModelIndex; + const char *m_pszModelName; + + int m_nHaloIndex; + const char *m_pszHaloName; + float m_flHaloScale; + + float m_flLife; + float m_flWidth; + float m_flEndWidth; + float m_flFadeLength; + float m_flAmplitude; + + float m_flBrightness; + float m_flSpeed; + + int m_nStartFrame; + float m_flFrameRate; + + float m_flRed; + float m_flGreen; + float m_flBlue; + + bool m_bRenderable; + + int m_nSegments; + + int m_nFlags; + + // Rings + vec3_t m_vecCenter; + float m_flStartRadius; + float m_flEndRadius; + + BeamInfo_t( ) + { + m_nType = beam_normal; + m_nSegments = -1; + m_pszModelName = NULL; + m_pszHaloName = NULL; + m_nModelIndex = -1; + m_nHaloIndex = -1; + m_bRenderable = true; + m_nFlags = 0; + } +}; + +class IViewRenderBeams +{ +public: + // Construction +public: + IViewRenderBeams( void ); + virtual ~IViewRenderBeams( void ); + + // Implement IViewRenderBeams +public: + virtual void InitBeams( void ); + virtual void ShutdownBeams( void ); + virtual void ClearBeams( void ); + + // Updates the state of the temp ent beams + virtual void UpdateTempEntBeams( ); + + virtual void DrawBeam( Beam_t *pbeam ); + virtual void DrawBeam( C_Beam* pbeam, ITraceFilter*pEntityBeamTraceFilter = NULL ); + + virtual void KillDeadBeams( IClientEntity *pDeadEntity ); + + virtual void CreateBeamEnts( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b, int type = -1 ); + virtual Beam_t *CreateBeamEnts( BeamInfo_t &beamInfo ); + + virtual void CreateBeamEntPoint( int nStartEntity, const vec3_t *pStart, int nEndEntity, const vec3_t* pEnd, + int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b ); + virtual Beam_t *CreateBeamEntPoint( BeamInfo_t &beamInfo ); + + virtual void CreateBeamPoints( vec3_t& start, vec3_t& end, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b ); + virtual Beam_t *CreateBeamPoints( BeamInfo_t &beamInfo ); + + virtual void CreateBeamRing( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b, int flags ); + virtual Beam_t *CreateBeamRing( BeamInfo_t &beamInfo ); + + virtual void CreateBeamRingPoint( const vec3_t& center, float start_radius, float end_radius, int modelIndex, int haloIndex, float haloScale, + float life, float width, float m_nEndWidth, float m_nFadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b, int flags ); + virtual Beam_t *CreateBeamRingPoint( BeamInfo_t &beamInfo ); + + virtual void CreateBeamCirclePoints( int type, vec3_t& start, vec3_t& end, + int modelIndex, int haloIndex, float haloScale, float life, float width, + float endWidth, float fadeLength, float amplitude, float brightness, float speed, + int startFrame, float framerate, float r, float g, float b ); + virtual Beam_t *CreateBeamCirclePoints( BeamInfo_t &beamInfo ); + + virtual void CreateBeamFollow( int startEnt, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float r, float g, float b, + float brightness ); + virtual Beam_t *CreateBeamFollow( BeamInfo_t &beamInfo ); +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/KeyValues.cpp b/cheat/internal_rewrite/KeyValues.cpp new file mode 100644 index 0000000..300b6f1 --- /dev/null +++ b/cheat/internal_rewrite/KeyValues.cpp @@ -0,0 +1,83 @@ +#include "KeyValues.hpp" +#include "pattern.hpp" +#include "interface.hpp" + +void IKeyValuesSystem::FreeKeyValuesMemory( void* memory ) { + return util::get_vfunc< 2, void >( this, memory ); +} + +int IKeyValuesSystem::GetSymbolForString( const char* str, bool create ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 83 EC 0C 53 8B 5D 08 57" ) ); + using fn = int( __thiscall* )( void*, const char*, bool ); + + int symbol = ( ( fn )( offset ) )( this, str, create ); + return symbol; +} + +const char* IKeyValuesSystem::GetStringForSymbol( int symbol ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 8B 55 08 83 FA FF" ) ); + using fn = const char*( __thiscall* )( void*, int ); + + auto result = ( ( fn )( offset ) )( this, symbol ); + printf( "%d: %d\n", symbol, *( int* )( &result ) ); + + return result; +} + +KeyValues::KeyValues( const char* setName ) { + static void( __thiscall* keyvalues_constructor )( KeyValues*, const char* ) = 0; + + if( !keyvalues_constructor ) { + auto address = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "68 ? ? ? ? 8B C8 E8 ? ? ? ? 89 45 FC EB 07 C7 45 ? ? ? ? ? 8B 03 56" ), + 0x8 ); + + keyvalues_constructor = decltype( keyvalues_constructor )( address + *( uintptr_t* )( address ) + 4 ); + } + + keyvalues_constructor( this, setName ); +} + +KeyValues::~KeyValues( ) { + static bool( __thiscall* keyvalues_remove_everything )( KeyValues* ) = 0; + + if( !keyvalues_remove_everything ) { + auto address = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "E8 ? ? ? ? 81 23 ? ? ? ?" ), + 0x1 ); + + keyvalues_remove_everything = decltype( keyvalues_remove_everything )( address + *( uintptr_t* )( address ) + 4 ); + } + + keyvalues_remove_everything( this ); + g_csgo.m_keyvalues->FreeKeyValuesMemory( this ); + +} + + +bool KeyValues::LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem, const char *pPathID, bool( *unknown )( const char* ) ) { + static auto load_from_buffer = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 34 53 8B 5D 0C 89 4C 24 04" ) ); + return reinterpret_cast< bool( __thiscall* )( KeyValues*, const char*, const char*, void*, const char*, bool( *)( const char* ) ) >( load_from_buffer ) + ( this, resourceName, pBuffer, pFileSystem, pPathID, unknown ); +} + +const char* KeyValues::get_string( const char* name, const char* value ) { + static auto offset = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 C0 81 EC ?? ?? ?? ?? 53 8B 5D 08" ) ); + using fn = const char*( __thiscall* )( void*, const char*, const char* ); + + auto result = ( ( fn )( offset ) )( this, name, value ); + + return result; + +} + +KeyValues* KeyValues::FindKey( const char* name ) { + auto key = g_csgo.m_keyvalues->GetSymbolForString( name, false ); + for( auto dat = m_pSub; !!dat; dat = dat->m_pPeer ) { + if( dat->m_iKeyName == key ) { + return dat; + } + } + + return nullptr; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/KeyValues.hpp b/cheat/internal_rewrite/KeyValues.hpp new file mode 100644 index 0000000..94eb6ca --- /dev/null +++ b/cheat/internal_rewrite/KeyValues.hpp @@ -0,0 +1,43 @@ +#pragma once +#include "util.hpp" + +class IKeyValuesSystem { +public: + void FreeKeyValuesMemory( void* memory ); + int GetSymbolForString( const char* string, bool create ); + const char* GetStringForSymbol( int symbol ); +}; + +class KeyValues +{ +public: + KeyValues( const char *setName ); + ~KeyValues( ); + + bool LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem = nullptr, const char *pPathID = nullptr, bool( *unknown )( const char* ) = nullptr ); + + const char* get_string( const char* name, const char* value ); + + int m_iKeyName; + + char *m_sValue; + wchar_t *m_wsValue; + + // we don't delete these + union { + int m_iValue; + float m_flValue; + void *m_pValue; + unsigned char m_Color[ 4 ]; + }; + + char m_iDataType; + char m_bHasEscapeSequences; + char m_bEvaluateConditionals; + + KeyValues* FindKey( const char* key_name ); + + KeyValues *m_pPeer; // pointer to next key in list + KeyValues *m_pSub; // pointer to Start of a new sub key list + KeyValues *m_pChain;// Search here if it's not in our list +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/Source.cpp b/cheat/internal_rewrite/Source.cpp new file mode 100644 index 0000000..0b63051 --- /dev/null +++ b/cheat/internal_rewrite/Source.cpp @@ -0,0 +1,88 @@ +//this cheat was a mistake + +#include +#include + +#include "hooks.hpp" +#include "console.hpp" +#include "input_system.hpp" +#include "mem.hpp" +#include "wipe.hpp" + +HMODULE g_dll; +header_t g_header; + +void main_thread( HINSTANCE uh ) { + +#ifdef HEADER_MODULE + memcpy( &g_header, uh, sizeof( g_header ) ); + for ( size_t i = 1; i < sizeof( header_t ); ++i ) + *(uint8_t*)( uintptr_t( &g_header ) + i ) ^= g_header.xor_key; + +#endif + + g_csgo.initialize( ); + +#ifdef HEADER_MODULE + util::memset( (uint8_t*)uh, 0x90, 0x1000 ); +#endif + + ExitThread( 0 ); +} + +long __stdcall exception_handler( EXCEPTION_POINTERS* e ) { + return EXCEPTION_CONTINUE_EXECUTION; +} + +int __stdcall DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { + HANDLE thread; + + uintptr_t wanted_reason; +#ifdef _DEBUG + wanted_reason = DLL_PROCESS_ATTACH; +#else + wanted_reason = DLL_PROCESS_ATTACH; +#endif + + if ( reason == wanted_reason +#ifdef IFACE_DLLMAIN + && !!reserved +#endif + ) { +#ifdef IFACE_DLLMAIN + g_factory.init( ( uintptr_t )( reserved ) ); +#endif + g_dll = inst; + //yayo + //SetUnhandledExceptionFilter( exception_handler ); + + DisableThreadLibraryCalls( inst ); +#ifdef HEADER_MODULE + antidebug::fuck_skids( ); +#endif + + thread = CreateThread( nullptr, 0, + ( LPTHREAD_START_ROUTINE )( main_thread ), + inst, 0, nullptr ); + + if( !thread ) + return 0; + + CloseHandle( thread ); + + return 1; + } +#ifdef IFACE_DLLMAIN + else if( !reserved ) { + MessageBoxA( nullptr, "interface data nullptr (loader error?)", "error", MB_OK ); + return 1; + } +#endif + + if( reason == DLL_PROCESS_DETACH ) { + g_csgo.m_panic = true; + //SetUnhandledExceptionFilter( nullptr ); + } + + return 0; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/Valve/checksum_crc.cpp b/cheat/internal_rewrite/Valve/checksum_crc.cpp new file mode 100644 index 0000000..bc7b433 --- /dev/null +++ b/cheat/internal_rewrite/Valve/checksum_crc.cpp @@ -0,0 +1,169 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Generic CRC functions +// +//=============================================================================// + + +#include "checksum_crc.h" + +#define CRC32_INIT_VALUE 0xFFFFFFFFUL +#define CRC32_XOR_VALUE 0xFFFFFFFFUL + +#define NUM_BYTES 256 +static const CRC32_t pulCRCTable[ NUM_BYTES ] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +void CRC32_Init( CRC32_t *pulCRC ) { + *pulCRC = CRC32_INIT_VALUE; +} + +void CRC32_Final( CRC32_t *pulCRC ) { + *pulCRC ^= CRC32_XOR_VALUE; +} + +CRC32_t CRC32_GetTableEntry( unsigned int slot ) { + return pulCRCTable[ ( unsigned char )slot ]; +} + +void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *pBuffer, int nBuffer ) { + CRC32_t ulCrc = *pulCRC; + unsigned char *pb = ( unsigned char * )pBuffer; + unsigned int nFront; + int nMain; + +JustAfew: + + switch( nBuffer ) { + case 7: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 6: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 5: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 4: + ulCrc ^= *( CRC32_t * )pb; + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + *pulCRC = ulCrc; + return; + + case 3: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 2: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 1: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 0: + *pulCRC = ulCrc; + return; + } + + // We may need to do some alignment work up front, and at the end, so that + // the main loop is aligned and only has to worry about 8 byte at a time. + // + // The low-order two bits of pb and nBuffer in total control the + // upfront work. + // + nFront = ( ( unsigned int )pb ) & 3; + nBuffer -= nFront; + switch( nFront ) { + case 3: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + case 2: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + case 1: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + } + + nMain = nBuffer >> 3; + while( nMain-- ) { + ulCrc ^= *( CRC32_t * )pb ; + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc ^= *( CRC32_t * )( pb + 4 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + pb += 8; + } + + nBuffer &= 7; + goto JustAfew; +} diff --git a/cheat/internal_rewrite/Valve/checksum_crc.h b/cheat/internal_rewrite/Valve/checksum_crc.h new file mode 100644 index 0000000..356de67 --- /dev/null +++ b/cheat/internal_rewrite/Valve/checksum_crc.h @@ -0,0 +1,30 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Generic CRC functions +// +// $NoKeywords: $ +//=============================================================================// +#ifndef CHECKSUM_CRC_H +#define CHECKSUM_CRC_H +#ifdef _WIN32 +#pragma once +#endif + +typedef unsigned int CRC32_t; + +void CRC32_Init( CRC32_t *pulCRC ); +void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *p, int len ); +void CRC32_Final( CRC32_t *pulCRC ); +CRC32_t CRC32_GetTableEntry( unsigned int slot ); + +inline CRC32_t CRC32_ProcessSingleBuffer( const void *p, int len ) { + CRC32_t crc; + + CRC32_Init( &crc ); + CRC32_ProcessBuffer( &crc, p, len ); + CRC32_Final( &crc ); + + return crc; +} + +#endif // CHECKSUM_CRC_H diff --git a/cheat/internal_rewrite/Valve/dt_common.h b/cheat/internal_rewrite/Valve/dt_common.h new file mode 100644 index 0000000..ff0f7b7 --- /dev/null +++ b/cheat/internal_rewrite/Valve/dt_common.h @@ -0,0 +1,161 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#pragma warning( push, 0 ) + +#ifndef DATATABLE_COMMON_H +#define DATATABLE_COMMON_H + +#ifdef _WIN32 +#pragma once +#endif + +#include + +#ifdef LINUX +#undef offsetof +#define offsetof(s,m) (size_t)&(((s *)0)->m) +#endif + +// Max number of properties in a datatable and its children. +#define MAX_DATATABLES 1024 // must be a power of 2. +#define MAX_DATATABLE_PROPS 4096 + +#define MAX_ARRAY_ELEMENTS 2048 // a network array should have more that 1024 elements + +#define HIGH_DEFAULT -121121.121121f + +#define BITS_FULLRES -1 // Use the full resolution of the type being encoded. +#define BITS_WORLDCOORD -2 // Encode as a world coordinate. + +#define DT_MAX_STRING_BITS 9 +#define DT_MAX_STRING_BUFFERSIZE (1<varName ) + +// Gets the size of a variable in a class. +#define PROPSIZEOF(className, varName) sizeof(((className*)0)->varName) + + +// SendProp::m_Flags. +#define SPROP_UNSIGNED (1<<0) // Unsigned integer data. + +#define SPROP_COORD (1<<1) // If this is set, the float/vector is treated like a world coordinate. +// Note that the bit count is ignored in this case. + +#define SPROP_NOSCALE (1<<2) // For floating point, don't scale into range, just take value as is. + +#define SPROP_ROUNDDOWN (1<<3) // For floating point, limit high value to range minus one bit unit + +#define SPROP_ROUNDUP (1<<4) // For floating point, limit low value to range minus one bit unit + +#define SPROP_NORMAL (1<<5) // If this is set, the vector is treated like a normal (only valid for vectors) + +#define SPROP_EXCLUDE (1<<6) // This is an exclude prop (not excludED, but it points at another prop to be excluded). + +#define SPROP_XYZE (1<<7) // Use XYZ/Exponent encoding for vectors. + +#define SPROP_INSIDEARRAY (1<<8) // This tells us that the property is inside an array, so it shouldn't be put into the +// flattened property list. Its array will point at it when it needs to. + +#define SPROP_PROXY_ALWAYS_YES (1<<9) // Set for datatable props using one of the default datatable proxies like +// SendProxy_DataTableToDataTable that always send the data to all clients. + +#define SPROP_CHANGES_OFTEN (1<<10) // this is an often changed field, moved to head of sendtable so it gets a small index + +#define SPROP_IS_A_VECTOR_ELEM (1<<11) // Set automatically if SPROP_VECTORELEM is used. + +#define SPROP_COLLAPSIBLE (1<<12) // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer +// (ie: for all automatically-chained base classes). +// In this case, it can get rid of this SendPropDataTable altogether and spare the +// trouble of walking the hierarchy more than necessary. + +#define SPROP_COORD_MP (1<<13) // Like SPROP_COORD, but special handling for multiplayer games +#define SPROP_COORD_MP_LOWPRECISION (1<<14) // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 +#define SPROP_COORD_MP_INTEGRAL (1<<15) // SPROP_COORD_MP, but coordinates are rounded to integral boundaries + +#define SPROP_VARINT SPROP_NORMAL // reuse existing flag so we don't break demo. note you want to include SPROP_UNSIGNED if needed, its more efficient + +#define SPROP_NUMFLAGBITS_NETWORKED 16 + +// This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are +// m_flAnimTime and m_flSimulationTime. MODs shouldn't need to mess with this probably +#define SPROP_ENCODED_AGAINST_TICKCOUNT (1<<16) + +// See SPROP_NUMFLAGBITS_NETWORKED for the ones which are networked +#define SPROP_NUMFLAGBITS 17 + +// Used by the SendProp and RecvProp functions to disable debug checks on type sizes. +#define SIZEOF_IGNORE -1 + + +// Use this to extern send and receive datatables, and reference them. +#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} +#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} + +#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable +#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable + + +class SendProp; + +// The day we do this, we break all mods until they recompile. +//#define SUPPORTS_INT64 + +typedef enum +{ + DPT_Int = 0, + DPT_Float, + DPT_Vector, + DPT_VectorXY, // Only encodes the XY of a vector, ignores Z + DPT_String, + DPT_Array, // An array of the base types (can't be of datatables). + DPT_DataTable, +#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + DPT_Quaternion, +#endif + +#ifdef SUPPORTS_INT64 + DPT_Int64, +#endif + + DPT_NUMSendPropTypes + +} SendPropType; + + +struct DVariant { + union { + float m_Float; + long m_Int; + char* m_pString; + void* m_pData; + float m_Vector[ 3 ]; + __int64 m_Int64; + }; + + int m_Type; +}; + + +// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1. +inline int NumBitsForCount( int nMaxElements ) +{ + int nBits = 0; + while( nMaxElements > 0 ) + { + ++nBits; + nMaxElements >>= 1; + } + return nBits; +} + + +#endif // DATATABLE_COMMON_H + +#pragma warning( pop ) \ No newline at end of file diff --git a/cheat/internal_rewrite/Valve/dt_recv.h b/cheat/internal_rewrite/Valve/dt_recv.h new file mode 100644 index 0000000..6e73bdb --- /dev/null +++ b/cheat/internal_rewrite/Valve/dt_recv.h @@ -0,0 +1,590 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#pragma warning( push, 0 ) + +#ifndef DATATABLE_RECV_H +#define DATATABLE_RECV_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "dt_common.h" + +#define ADDRESSPROXY_NONE -1 + + +class RecvTable; +class RecvProp; + + +// This is passed into RecvProxy functions. +class CRecvProxyData +{ +public: + const RecvProp *m_pRecvProp; // The property it's receiving. + + DVariant m_Value; // The value given to you to store. + + int m_iElement; // Which array element you're getting. + + int m_ObjectID; // The object being referred to. +}; + + +//----------------------------------------------------------------------------- +// pStruct = the base structure of the datatable this variable is in (like C_BaseEntity) +// pOut = the variable that this this proxy represents (like C_BaseEntity::m_SomeValue). +// +// Convert the network-standard-type value in m_Value into your own format in pStruct/pOut. +//----------------------------------------------------------------------------- +typedef void( *RecvVarProxyFn )( const CRecvProxyData *pData, void *pStruct, void *pOut ); + +// ------------------------------------------------------------------------ // +// ArrayLengthRecvProxies are optionally used to get the length of the +// incoming array when it changes. +// ------------------------------------------------------------------------ // +typedef void( *ArrayLengthRecvProxyFn )( void *pStruct, int objectID, int currentArrayLength ); + + +// NOTE: DataTable receive proxies work differently than the other proxies. +// pData points at the object + the recv table's offset. +// pOut should be set to the location of the object to unpack the data table into. +// If the parent object just contains the child object, the default proxy just does *pOut = pData. +// If the parent object points at the child object, you need to dereference the pointer here. +// NOTE: don't ever return null from a DataTable receive proxy function. Bad things will happen. +typedef void( *DataTableRecvVarProxyFn )( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + + +// This is used to fork over the standard proxy functions to the engine so it can +// make some optimizations. +class CStandardRecvProxies +{ +public: + CStandardRecvProxies(); + + RecvVarProxyFn m_Int32ToInt8; + RecvVarProxyFn m_Int32ToInt16; + RecvVarProxyFn m_Int32ToInt32; + RecvVarProxyFn m_FloatToFloat; + RecvVarProxyFn m_VectorToVector; +#ifdef SUPPORTS_INT64 + RecvVarProxyFn m_Int64ToInt64; +#endif +}; +extern CStandardRecvProxies g_StandardRecvProxies; + + +class CRecvDecoder; + + +class RecvProp +{ + // This info comes from the receive data table. +public: + RecvProp(); + + void InitArray( int nElements, int elementStride ); + + int GetNumElements() const; + void SetNumElements( int nElements ); + + int GetElementStride() const; + void SetElementStride( int stride ); + + int GetFlags() const; + + const char* GetName() const; + SendPropType GetType() const; + + RecvTable* GetDataTable() const; + void SetDataTable( RecvTable *pTable ); + + RecvVarProxyFn GetProxyFn() const; + void SetProxyFn( RecvVarProxyFn fn ); + + DataTableRecvVarProxyFn GetDataTableProxyFn() const; + void SetDataTableProxyFn( DataTableRecvVarProxyFn fn ); + + int GetOffset() const; + void SetOffset( int o ); + + // Arrays only. + RecvProp* GetArrayProp() const; + void SetArrayProp( RecvProp *pProp ); + + // Arrays only. + void SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ); + ArrayLengthRecvProxyFn GetArrayLengthProxy() const; + + bool IsInsideArray() const; + void SetInsideArray(); + + // Some property types bind more data to the prop in here. + const void* GetExtraData() const; + void SetExtraData( const void *pData ); + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char* GetParentArrayPropName(); + void SetParentArrayPropName( const char *pArrayPropName ); + +public: + + const char *m_pVarName; + SendPropType m_RecvType; + int m_Flags; + int m_StringBufferSize; + + +public: + + bool m_bInsideArray; // Set to true by the engine if this property sits inside an array. + + // Extra data that certain special property types bind to the property here. + const void *m_pExtraData; + + // If this is an array (DPT_Array). + RecvProp *m_pArrayProp; + ArrayLengthRecvProxyFn m_ArrayLengthProxy; + + RecvVarProxyFn m_ProxyFn; + DataTableRecvVarProxyFn m_DataTableProxyFn; // For RDT_DataTable. + + RecvTable *m_pDataTable; // For RDT_DataTable. + int m_Offset; + + int m_ElementStride; + int m_nElements; + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char *m_pParentArrayPropName; +}; + + +class RecvTable +{ +public: + + typedef RecvProp PropType; + + RecvTable(); + RecvTable( RecvProp *pProps, int nProps, const char *pNetTableName ); + ~RecvTable(); + + void Construct( RecvProp *pProps, int nProps, const char *pNetTableName ); + + int GetNumProps(); + RecvProp* GetProp( int i ); + + const char* GetName(); + + // Used by the engine while initializing array props. + void SetInitialized( bool bInitialized ); + bool IsInitialized() const; + + // Used by the engine. + void SetInMainList( bool bInList ); + bool IsInMainList() const; + + +public: + + // Properties described in a table. + RecvProp *m_pProps; + int m_nProps; + + // The decoder. NOTE: this covers each RecvTable AND all its children (ie: its children + // will have their own decoders that include props for all their children). + CRecvDecoder *m_pDecoder; + + const char *m_pNetTableName; // The name matched between client and server. + + +private: + + bool m_bInitialized; + bool m_bInMainList; +}; + + +inline int RecvTable::GetNumProps() +{ + return m_nProps; +} + +inline RecvProp* RecvTable::GetProp( int i ) +{ + return &m_pProps[ i ]; +} + +inline const char* RecvTable::GetName() +{ + return m_pNetTableName; +} + +inline void RecvTable::SetInitialized( bool bInitialized ) +{ + m_bInitialized = bInitialized; +} + +inline bool RecvTable::IsInitialized() const +{ + return m_bInitialized; +} + +inline void RecvTable::SetInMainList( bool bInList ) +{ + m_bInMainList = bInList; +} + +inline bool RecvTable::IsInMainList() const +{ + return m_bInMainList; +} + + +// ------------------------------------------------------------------------------------------------------ // +// See notes on BEGIN_SEND_TABLE for a description. These macros work similarly. +// ------------------------------------------------------------------------------------------------------ // +#define BEGIN_RECV_TABLE(className, tableName) \ + BEGIN_RECV_TABLE_NOBASE(className, tableName) \ + RecvPropDataTable("baseclass", 0, 0, className::BaseClass::m_pClassRecvTable, DataTableRecvProxy_StaticDataTable), + +#define BEGIN_RECV_TABLE_NOBASE(className, tableName) \ + template int ClientClassInit(T *); \ + namespace tableName { \ + struct ignored; \ + } \ + template <> int ClientClassInit(tableName::ignored *); \ + namespace tableName { \ + RecvTable g_RecvTable; \ + int g_RecvTableInit = ClientClassInit((tableName::ignored *)NULL); \ + } \ + template <> int ClientClassInit(tableName::ignored *) \ + { \ + typedef className currentRecvDTClass; \ + const char *pRecvTableName = #tableName; \ + RecvTable &RecvTable = tableName::g_RecvTable; \ + static RecvProp RecvProps[] = { \ + RecvPropInt("should_never_see_this", 0, sizeof(int)), // It adds a dummy property at the start so you can define "empty" SendTables. + +#define END_RECV_TABLE() \ + }; \ + RecvTable.Construct(RecvProps+1, sizeof(RecvProps) / sizeof(RecvProp) - 1, pRecvTableName); \ + return 1; \ + } + + +#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName) +#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName)) +#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0]) + +// Just specify the name and offset. Used for strings and data tables. +#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName) +#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName) +#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName) + + +void RecvProxy_FloatToFloat( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_VectorToVector( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_VectorXYToVectorXY( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_QuaternionToQuaternion( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt8( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt16( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_StringToString( const CRecvProxyData *pData, void *pStruct, void *pOut ); +void RecvProxy_Int32ToInt32( const CRecvProxyData *pData, void *pStruct, void *pOut ); +#ifdef SUPPORTS_INT64 +void RecvProxy_Int64ToInt64( const CRecvProxyData *pData, void *pStruct, void *pOut ); +#endif + +// StaticDataTable does *pOut = pData. +void DataTableRecvProxy_StaticDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + +// PointerDataTable does *pOut = *((void**)pData) (ie: pData is a pointer to the object to decode into). +void DataTableRecvProxy_PointerDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); + + +RecvProp RecvPropFloat( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_FloatToFloat + ); + +RecvProp RecvPropVector( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_VectorToVector + ); + +RecvProp RecvPropVectorXY( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_VectorXYToVectorXY + ); + +// This is here so the RecvTable can look more like the SendTable. +#define RecvPropQAngles RecvPropVector + +#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! + +RecvProp RecvPropQuaternion( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_QuaternionToQuaternion + ); +#endif + +RecvProp RecvPropInt( + const char *pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = 0 + ); + +RecvProp RecvPropString( + const char *pVarName, + int offset, + int bufferSize, + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_StringToString + ); + +RecvProp RecvPropDataTable( + const char *pVarName, + int offset, + int flags, + RecvTable *pTable, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable + ); + +RecvProp RecvPropArray3( + const char *pVarName, + int offset, + int sizeofVar, + int elements, + RecvProp pArrayProp, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable + ); + +// Use the macro to let it automatically generate a table name. You shouldn't +// ever need to reference the table name. If you want to exclude this array, then +// reference the name of the variable in varTemplate. +RecvProp InternalRecvPropArray( + const int elementCount, + const int elementStride, + const char *pName, + ArrayLengthRecvProxyFn proxy + ); + + +// +// Use this if you want to completely manage the way the array data is stored. +// You'll need to provide a proxy inside varTemplate that looks for 'iElement' +// to figure out where to store the specified element. +// +#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \ + varTemplate, \ + InternalRecvPropArray( \ + maxArrayLength, \ + 0, \ + #propertyName, \ + arrayLengthProxy \ + ) + + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( \ + sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + #arrayName, \ + arrayLengthProxy \ + ) + + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropArray( varTemplate, arrayName ) \ + RecvPropVariableLengthArray( 0, varTemplate, arrayName ) + + +// Use this one to specify the element count and stride manually. +#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy ) + + +// ---------------------------------------------------------------------------------------- // +// Inlines. +// ---------------------------------------------------------------------------------------- // + +inline void RecvProp::InitArray( int nElements, int elementStride ) +{ + m_RecvType = DPT_Array; + m_nElements = nElements; + m_ElementStride = elementStride; +} + +inline int RecvProp::GetNumElements() const +{ + return m_nElements; +} + +inline void RecvProp::SetNumElements( int nElements ) +{ + m_nElements = nElements; +} + +inline int RecvProp::GetElementStride() const +{ + return m_ElementStride; +} + +inline void RecvProp::SetElementStride( int stride ) +{ + m_ElementStride = stride; +} + +inline int RecvProp::GetFlags() const +{ + return m_Flags; +} + +inline const char* RecvProp::GetName() const +{ + return m_pVarName; +} + +inline SendPropType RecvProp::GetType() const +{ + return m_RecvType; +} + +inline RecvTable* RecvProp::GetDataTable() const +{ + return m_pDataTable; +} + +inline void RecvProp::SetDataTable( RecvTable *pTable ) +{ + m_pDataTable = pTable; +} + +inline RecvVarProxyFn RecvProp::GetProxyFn() const +{ + return m_ProxyFn; +} + +inline void RecvProp::SetProxyFn( RecvVarProxyFn fn ) +{ + m_ProxyFn = fn; +} + +inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn() const +{ + return m_DataTableProxyFn; +} + +inline void RecvProp::SetDataTableProxyFn( DataTableRecvVarProxyFn fn ) +{ + m_DataTableProxyFn = fn; +} + +inline int RecvProp::GetOffset() const +{ + return m_Offset; +} + +inline void RecvProp::SetOffset( int o ) +{ + m_Offset = o; +} + +inline RecvProp* RecvProp::GetArrayProp() const +{ + return m_pArrayProp; +} + +inline void RecvProp::SetArrayProp( RecvProp *pProp ) +{ + m_pArrayProp = pProp; +} + +inline void RecvProp::SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ) +{ + m_ArrayLengthProxy = proxy; +} + +inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy() const +{ + return m_ArrayLengthProxy; +} + +inline bool RecvProp::IsInsideArray() const +{ + return m_bInsideArray; +} + +inline void RecvProp::SetInsideArray() +{ + m_bInsideArray = true; +} + +inline const void* RecvProp::GetExtraData() const +{ + return m_pExtraData; +} + +inline void RecvProp::SetExtraData( const void *pData ) +{ + m_pExtraData = pData; +} + +inline const char* RecvProp::GetParentArrayPropName() +{ + return m_pParentArrayPropName; +} + +inline void RecvProp::SetParentArrayPropName( const char *pArrayPropName ) +{ + m_pParentArrayPropName = pArrayPropName; +} + +inline void**& GetVTable( void* instance ) +{ + return *reinterpret_cast( ( size_t )instance ); +} + +inline const void** GetVTable( const void* instance ) +{ + return *reinterpret_cast( ( size_t )instance ); +} + +template +inline T GetMethod( const void* instance, size_t index ) +{ + return reinterpret_cast( GetVTable( instance )[ index ] ); +} + +#endif // DATATABLE_RECV_H + +#pragma warning( pop ) \ No newline at end of file diff --git a/cheat/internal_rewrite/autowall.cpp b/cheat/internal_rewrite/autowall.cpp new file mode 100644 index 0000000..603f94e --- /dev/null +++ b/cheat/internal_rewrite/autowall.cpp @@ -0,0 +1,337 @@ +#include + +#include "autowall.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "math.hpp" + + + +namespace features { + bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) { + if ( armor_value <= 0 ) return false; + + switch ( hitgroup ) { + case HITGROUP_GENERIC: + case HITGROUP_CHEST: + case HITGROUP_STOMACH: + case HITGROUP_LEFTARM: + case HITGROUP_RIGHTARM: + return true; + case HITGROUP_HEAD: + return ent->m_bHasHelmet( ); + } + + return false; + } + + void c_autowall::trace_line( const vec3_t& start, const vec3_t& end, unsigned mask, void* ignore, CGameTrace* tr ) { + CTraceFilter filter; + Ray_t ray; + + filter.pSkip = ignore; + ray.Init( start, end ); + + g_csgo.m_trace( )->TraceRay( ray, mask, &filter, tr ); + } + + void c_autowall::scale_damage( c_base_player* ent, int hitgroup, float weapon_armor_ratio, float& damage ) { + float multiplier; + float armor_ratio; + float new_damage; + int armor; + + auto get_hitgroup_mul = []( int hitgroup ) { + switch ( hitgroup ) { + case HITGROUP_HEAD: + return 4.f; + case HITGROUP_STOMACH: + return 1.25f; + case HITGROUP_LEFTLEG: + case HITGROUP_RIGHTLEG: + return 0.75f; + } + + return 1.0f; + }; + + multiplier = get_hitgroup_mul( hitgroup ); + damage *= multiplier; + armor = ent->m_ArmorValue( ); + + if ( is_armored( ent, armor, hitgroup ) ) { + armor_ratio = weapon_armor_ratio * 0.5f; + new_damage = damage * armor_ratio; + if ( hitgroup != HITGROUP_HEAD && damage - damage * armor_ratio * 0.5f > armor ) { + new_damage = damage - armor * 2.0f; + } + + damage = new_damage; + } + } + + bool c_autowall::is_breakable( IClientEntity* ent ) { + #ifdef is_breakable_ptr + static auto is_breakable_ptr = g_header.patterns.is_breakable; + #else + static auto is_breakable_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 85 F6 74 68 83 BE" ) ); + #endif + + if ( !ent || ent->GetIndex( ) == 0 ) + return false; + + auto is_breakable_fn = reinterpret_cast< bool( __thiscall* )( void* ) >( is_breakable_ptr ); + + bool breakable = is_breakable_fn( ent ); + + if ( !breakable ) { + auto ent_class = ent->GetClientClass( ); + + if ( !ent_class ) + return false; + + // s/o 2 poiak + auto nazwa = ent_class->m_name; + + // s/o 2 estrosterik + if ( *reinterpret_cast< uint32_t* >( nazwa ) == 0x65724243 && *reinterpret_cast< uint32_t* >( nazwa + 0x7 ) == 0x53656C62 ) + return true; + } + + return breakable; + } + + bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) { + float dist = 0.f; + int old_contents = 0; + + Ray_t ray; + + while ( dist <= 90.f ) { + dist += 4.0f; + + out_end = start + ( dir * dist ); + + if ( !old_contents ) + old_contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX ); + + int contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX ); + if ( contents & MASK_SHOT_HULL && ( !( contents & CONTENTS_HITBOX ) || old_contents == contents ) ) + continue; + + vec3_t end = out_end - ( dir * 4.0f ); + + ray.Init( out_end, end ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, nullptr, exit_trace ); + + if ( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) { + CTraceFilter filter; + filter.pSkip = exit_trace->m_pEnt; + + ray.Init( out_end, start ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace ); + + if ( exit_trace->DidHit( ) && !exit_trace->startsolid ) { + out_end = exit_trace->endpos; + return true; + } + + continue; + } + + // maps/cs_office/glass/urban_glass + const char* surface_name = tr.surface.name; + + if ( surface_name + && *( uint32_t* )( &surface_name[ 0 ] ) == 0x7370616d + && *( uint32_t* )( &surface_name[ 4 ] ) == 0x5f73632f + && *( uint32_t* )( &surface_name[ 8 ] ) == 0x6966666f + && *( uint32_t* )( &surface_name[ 12 ] ) == 0x672f6563 + && *( uint32_t* )( &surface_name[ 16 ] ) == 0x7373616c + && *( uint32_t* )( &surface_name[ 20 ] ) == 0x6272752f + && *( uint32_t* )( &surface_name[ 24 ] ) == 0x675f6e61 + && *( uint32_t* )( &surface_name[ 28 ] ) == 0x7373616c + ) { + *exit_trace = tr; + exit_trace->endpos = out_end + dir; + return true; + } + + if ( exit_trace->DidHit( ) && !exit_trace->startsolid ) { + if ( is_breakable( tr.m_pEnt ) && is_breakable( tr.m_pEnt ) ) + return true; + + if ( tr.surface.flags & SURF_NODRAW || !( exit_trace->surface.flags & SURF_NODRAW ) && ( exit_trace->plane.normal.dot( dir ) <= 1.f ) ) { + out_end -= dir * ( exit_trace->fraction * 4.f ); + return true; + } + + continue; + } + + if ( !exit_trace->DidHit( ) || exit_trace->startsolid ) { + if ( tr.m_pEnt && tr.m_pEnt != g_csgo.m_entlist( )->GetClientEntity< void >( 0 ) && is_breakable( exit_trace->m_pEnt ) ) { + *exit_trace = tr; + exit_trace->endpos = out_end + dir; + return true; + } + } + } + + return false; + } + + bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) { + + vec3_t pen_end; + CGameTrace exit_trace; + + + + if ( !trace_to_exit( data.enter_trace.endpos, data.direction, pen_end, data.enter_trace, &exit_trace ) ) { + // if( !( g_csgo.m_trace( )->GetPointContents( pen_end, MASK_SHOT_HULL ) & MASK_SHOT_HULL ) ) + return false; + } + + bool is_light_surf = ( data.enter_trace.contents >> 7 ) & 1; + bool is_solid_surf = ( data.enter_trace.contents >> 3 ) & 1; + + auto exit_surface = g_csgo.m_phys_props( )->GetSurfaceData( exit_trace.surface.surfaceProps ); + auto enter_surface = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps ); + + if ( !exit_surface || !enter_surface ) + return false; + + int exit_material = exit_surface->game.material, enter_material = enter_surface->game.material; + + auto damage_mod = 0.16f; + auto pen_mod = ( enter_surface->game.penetrationmodifier + exit_surface->game.penetrationmodifier ) * 0.5f; + + constexpr uint32_t grate = 71, wood = 85, plastic = 76, glass = 89, cardboard = 87; + + if ( enter_material == grate /* metal vents */ || enter_material == glass /* windows */ ) { + pen_mod = 3.0f; + damage_mod = 0.05f; + } else if ( is_light_surf || is_solid_surf ) { + pen_mod = 1.0f; + damage_mod = 0.16f; + } + + if ( enter_material == exit_material ) { + if ( exit_material == cardboard || exit_material == wood ) + pen_mod = 3.0f; + else if ( exit_material == plastic ) + pen_mod = 2.0f; + } + + float thickness = exit_trace.endpos.dist_to_sqr( data.enter_trace.endpos ); + + auto modifier = math::max( 0.f, 1.0f / pen_mod ); + + auto lost_dmg = std::fmaxf( + ( ( modifier * thickness ) / 24.f ) + + ( ( data.current_damage * damage_mod ) + + ( std::fmaxf( 3.75f / wpn_data->penetration, 0.f ) * 3.f * modifier ) ), 0.f ); + + + if ( lost_dmg > 0.f ) + data.current_damage -= lost_dmg; + + if ( data.current_damage < 1.f ) + return false; + + data.src = exit_trace.endpos; + data.penetrate_count--; + + return true; + } + + bool c_autowall::fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check, bool scale ) { + data.penetrate_count = 4; + + if ( !wep_data ) + return false; + + data.current_damage = ( float )( wep_data->damage ); + + while ( data.penetrate_count > 0 && data.current_damage >= 1.0f ) { + // this little nigga all along. + // never trust the feds. + // or even fluffy people. + data.to_travel = data.travel_range - data.traveled; + vec3_t end = data.src + data.direction * data.to_travel; + + trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace ); + util::clip_trace_to_player( target->ce( ), data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace ); + + data.traveled += data.to_travel * data.enter_trace.fraction; + data.current_damage *= std::pow( wep_data->range_modifier, data.traveled * 0.002f ); + + if ( data.enter_trace.fraction == 1.0f ) { + if ( !ent_check ) { + if ( scale ) + scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage ); + + return true; + } + break; + } + + + if ( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD + && data.enter_trace.m_pEnt == target->ce( ) ) { + auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt ); + + if ( scale ) + scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage ); + + return true; + } + + auto enter_surface = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps ); + if ( data.traveled > 3000.f || enter_surface->game.penetrationmodifier < 0.1f ) + break; + + if ( !handle_bullet_penetration( wep_data, data ) ) + break; + } + + return false; + } + + float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) { + if ( !shooter || !target ) { + return 0.f; + } + + auto wep = shooter->get_weapon( ); + if ( !wep ) { + return 0.f; + } + + fire_bullet_data_t data; + data.filter.pSkip = shooter; + + if ( shooter == g_ctx.m_local ) { + data.src = shooter->get_eye_pos( ); + } else { + data.src = shooter->m_vecOrigin( ); + data.src.z += 72.f; + } + + data.direction = end - data.src; + data.travel_range = data.direction.length( ); + data.direction.normalize_vector( ); + data.traveled = 0.f; + data.to_travel = data.travel_range; + + + if ( fire_bullet( shooter, target, wep->get_wpn_info( ), data, ent_check ) ) { + return std::max( data.current_damage, 0.f ); + } + + return 0.f; + } +} diff --git a/cheat/internal_rewrite/autowall.hpp b/cheat/internal_rewrite/autowall.hpp new file mode 100644 index 0000000..5e433e0 --- /dev/null +++ b/cheat/internal_rewrite/autowall.hpp @@ -0,0 +1,35 @@ +#pragma once +#include "sdk.hpp" +#include "pattern.hpp" +#include "interface.hpp" + +struct fire_bullet_data_t { + vec3_t src; + CGameTrace enter_trace; + vec3_t direction; + CTraceFilter filter; + float current_damage; + int penetrate_count; + + float travel_range{ }; + float traveled{ }; + float to_travel{ }; +}; + +namespace features +{ + class c_autowall { + private: + bool is_armored( c_base_player* entity, int armor_value, int hitgroup ); + void scale_damage( c_base_player* entity, int hitgroup, float weapon_armor_ratio, float& damage ); + void trace_line( const vec3_t& abs_start, const vec3_t& abs_end, unsigned mask, void* ignore, CGameTrace* trace ); + bool is_breakable( IClientEntity* ent ); + + bool trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ); + + public: + bool handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ); + bool fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check = true, bool scale_damage = true ); + float run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check = true ); + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/base_cheat.cpp b/cheat/internal_rewrite/base_cheat.cpp new file mode 100644 index 0000000..d21888d --- /dev/null +++ b/cheat/internal_rewrite/base_cheat.cpp @@ -0,0 +1,3 @@ +#include "base_cheat.hpp" + +features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/cheat/internal_rewrite/base_cheat.hpp b/cheat/internal_rewrite/base_cheat.hpp new file mode 100644 index 0000000..07d3588 --- /dev/null +++ b/cheat/internal_rewrite/base_cheat.hpp @@ -0,0 +1,39 @@ +#pragma once +#include "util.hpp" +#include "movement.hpp" +#include "prediction.hpp" +#include "legitbot.hpp" +#include "chams.hpp" +#include "autowall.hpp" +#include "ragebot.hpp" +#include "identity.hpp" +#include "lag_mgr.hpp" +#include "visual.hpp" +#include "extra.hpp" +#include "movement_recorder.hpp" +#include "player_manager.hpp" +#include "skins.hpp" + +NAMESPACE_REGION( features ) + +class c_base_cheat { +public: + //have your cheat classes in here + c_movement m_movement; + c_prediction m_prediction; + c_legitbot m_legitbot; + c_autowall m_autowall; + c_ragebot m_ragebot; + c_identity m_identity; + c_chams m_chams; + c_lagmgr m_lagmgr; + c_extra m_extra; + c_skins m_skins; + c_visuals m_visuals; + c_move_recorder m_move_rec; + c_player_manager m_player_mgr; +}; + +END_REGION + +extern features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/cheat/internal_rewrite/begin_lock.cpp b/cheat/internal_rewrite/begin_lock.cpp new file mode 100644 index 0000000..5312eec --- /dev/null +++ b/cheat/internal_rewrite/begin_lock.cpp @@ -0,0 +1,67 @@ +#include + +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::begin_lock( void* ecx, void* edx ) { // THIS IS PROLLY NOT ENDLOCK, BUT WHATEVER + // signature: + // search "CL_CallPostDataUpdates: missing ent %d" in engine.dll. + // where framestagenotify gets called + + static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_engine.dll( ), "A1 ? ? ? ? B9 ? ? ? ? 6A 00 FF 50 18 8B 15 ? ? ? ?" ); + + if( _ReturnAddress( ) == (void*)ret_addr ) { + g_ctx.m_stage = FRAME_NET_UPDATE_POSTDATAUPDATE_START; + g_cheat.m_visuals.world_modulate( ); + + static float last_time = 0.f; + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) ) { + auto state = g_ctx.m_local->get_animstate( ); + + auto& anims = g_ctx.m_local->get_animdata( ).m_animlayers; + + if( state && state->m_flLastClientSideAnimationUpdateTime != last_time ) { + for( size_t i{ }; i < 13; ++i ) { + auto& layer = g_ctx.m_local->m_AnimOverlay( ).GetElements( )[ i ]; + + if( layer.m_flWeight != anims.at( i ).m_flWeight || layer.m_flCycle != anims.at( i ).m_flCycle ) { + memcpy( &g_ctx.m_local->get_animdata( ).m_animlayers, + g_ctx.m_local->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 ); + + g_ctx.m_absyaw = state->m_flGoalFeetYaw; + + last_time = state->m_flLastClientSideAnimationUpdateTime; + break; + } + } + } + } + + + + /*if( g_settings.rage.anti_aim && g_ctx.run_frame( ) ) { + static float last_time = 0.f; + + if( last_time != g_ctx.m_local->get_animstate( )->m_flLastClientSideAnimationUpdateTime ) { + + } + }*/ + + + //g_con->game_console_print( "net postdataupdate start\n" ); + + // FRAME_NET_UPDATE_POSTDATAUPDATE_START + g_cheat.m_extra.float_ragdolls( ); + + g_cheat.m_player_mgr.frame_stage_notify( ); + g_cheat.m_prediction.frame_stage_notify( ); + g_cheat.m_ragebot.m_resolver->frame_stage_notify( ); + g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); + g_cheat.m_skins( ); + } + + begin_lock_o( ecx, edx ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/bf_write.hpp b/cheat/internal_rewrite/bf_write.hpp new file mode 100644 index 0000000..7d759b2 --- /dev/null +++ b/cheat/internal_rewrite/bf_write.hpp @@ -0,0 +1,34 @@ +#pragma once + +class bf_write { +public: + bf_write( void* data, int bytes, int max_bits = -1 ) { + m_data = ( unsigned char* )data; + m_bytes = bytes; + if( max_bits == -1 ) + m_bits = bytes * 8; + else + m_bits = max_bits; + } + + bf_write( const char* debug_name, void* data, int bytes, int max_bits = -1 ) { + m_debug_name = debug_name; + m_data = ( unsigned char* )data; + m_bytes = bytes; + if( max_bits == -1 ) + m_bits = bytes * 8; + else + m_bits = max_bits; + } + +public: + unsigned char* m_data{ }; + int m_bytes{ }; + int m_bits{ }; + int m_cur_bit{ }; + +private: + bool m_overflow{ }; + bool m_assert_on_overflow{ }; + const char* m_debug_name{ }; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/c_base_player.cpp b/cheat/internal_rewrite/c_base_player.cpp new file mode 100644 index 0000000..11882ea --- /dev/null +++ b/cheat/internal_rewrite/c_base_player.cpp @@ -0,0 +1,1144 @@ +#include "c_base_player.hpp" +#include "interface.hpp" +#include "math.hpp" +#include "mem.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +#undef max + +ent_animdata_t c_base_player::sm_animdata[ 65 ]; + +void IKContext::Init( void* hdr, vec3_t& angles, vec3_t& origin, float curtime, int framecount, int bone_mask ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 EC 08 8B 45 08 56 57 8B F9 8D 8F" ) ); + + auto fn = ( void( __thiscall* )( void*, void*, vec3_t&, vec3_t&, float, int, int ) )( fn_ptr ); + fn( this, hdr, angles, origin, curtime, framecount, bone_mask ); +} + +void IKContext::UpdateTargets( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F0 81 EC 00 00 00 00 33 D2" ) ); + + auto fn = ( void( __thiscall* )( void*, vec3_t*, void*, matrix3x4*, char* ) )( fn_ptr ); + fn( this, pos, q, bone_array, computed ); +} + +void IKContext::SolveDependencies( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F0 81 EC 00 00 00 00 8B 81" ) ); + + auto fn = ( void( __thiscall* )( void*, vec3_t*, void*, matrix3x4*, char* ) )( fn_ptr ); + fn( this, pos, q, bone_array, computed ); +} + +bool& c_base_player::s_bInvalidateBoneCache( ) { +#ifdef HEADER_MODULE + static auto fn_ptr = g_header.patterns.animstate_update; +#else + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24" ) ); +#endif + static auto var = *( bool** )( fn_ptr + 0xda + 2 ); + + return *var; +} + +void CCSGOPlayerAnimState::update( float yaw, float pitch ) { +#ifdef HEADER_MODULE + static auto fn_ptr = g_header.patterns.animstate_update; +#else + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24" ) ); +#endif + + uintptr_t alloc = ( uintptr_t )this; + if( !alloc ) + return; + + if( !this->pBaseEntity ) + return; + + //bool* b = &c_base_player::s_bInvalidateBoneCache( ); + //char backup = *b; + + //vectorcall is GAY + if( fn_ptr ) { + __asm { + push 0 + mov ecx, alloc + + movss xmm1, dword ptr[ yaw ] + movss xmm2, dword ptr[ pitch ] + + call fn_ptr + } + } + + //c_base_player::s_bInvalidateBoneCache( ) = backup; +} + +void CCSGOPlayerAnimState::setup_velocity( float a2 ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 30 56 57 8B 3D" ) ); + if( fn_ptr ) { + auto ptr_ = ( uintptr_t )this; + + __asm { + mov ecx, ptr_ + + fld a2 + call fn_ptr + } + } +} + +bool CCSGOPlayerAnimState::cache_sequences( ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 34 53 56 8B F1 57 8B 46 60" ) ); + if( fn_ptr ) { + auto fn = ( bool( __thiscall* )( void* ) )( fn_ptr ); + return fn( this ); + } + + return false; +} + +void CCSGOPlayerAnimState::update_ex( float yaw, float pitch ) { +/* static auto unk_func_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "8B 0D ? ? ? ? 8B 01 8B 80 ? ? ? ? FF D0 84 C0 75 14 8B 0D ? ? ? ? 8B 01" ) ); + auto unk_fn = ( bool( *)( ) )( unk_func_ptr ); + + auto player = ( c_base_player* )this->pBaseEntity; + + if( player && cache_sequences( ) ) { + float v7 = *( float* )( uintptr_t( player ) + 0x2e0d ) + pitch; + v7 = std::remainderf( v7, 360.f ); + + float last_update = m_flLastClientSideAnimationUpdateTime; + float cur_time = g_csgo.m_globals->m_curtime; + + if( last_update != cur_time ) { + this->m_flLastUpdateDelta = math::max( cur_time - last_update, 0.f ); + this->m_flEyeYaw = yaw; + this->m_flPitch = pitch; + + this->m_vOrigin = player->m_vecOrigin( ); + this->pActiveWeapon = player->get_weapon( ); + if( pActiveWeapon != pLastActiveWeapon ) { + for( size_t i{ }; i < 13; ++i ) { + C_AnimationLayer* layer = &player->m_AnimOverlay( ).GetElements( )[ i ]; + + layer->m_unk1 = 0; + layer->m_unk2 = layer->m_unk3 = -1; + } + } + + bool using_duck_offset = !unk_fn( ); + + if( using_duck_offset ) { + float total_duck = *( float* )( uintptr_t( player ) + 0xbe7 ) + m_fLandingDuckAdditiveSomething; + + total_duck = std::clamp( total_duck, 0.f, 1.f ); + + float duck_amt = m_fDuckAmount; + + float v28 = this->m_flLastUpdateDelta * 6.0f; + float v29 = 0.f; + + if( total_duck - duck_amt > v28 ) { + if( v28 <= total_duck - duck_amt ) + v29 = total_duck; + else + v29 = duck_amt - v28; + } + else { + v29 = duck_amt + v28; + } + + m_fDuckAmount = std::clamp( v29, 0.f, 1.f ); + } + else { + float duck_amt = m_fDuckAmount; + + float v19 = player->m_fFlags( ) & FL_WATERJUMP ? 1.0 : m_fLandingDuckAdditiveSomething; + float v21 = 0.f; + if( v19 <= duck_amt ) + v21 = 6.0f; + else + v21 = 3.1f; + + float v22 = m_flLastUpdateDelta * v21; + float new_duck = 0.f; + if( v19 - duck_amt <= v22 ) { + if( v22 <= v19 - duck_amt ) + new_duck = v19; + else + new_duck = duck_amt - v22; + } + else { + new_duck = duck_amt = v22; + } + + m_fDuckAmount = std::clamp( new_duck, 0.f, 1.f ); + } + + *( uintptr_t* )( uintptr_t( player ) + 0x286 ) = 0; + player->invalidate_physics_recursive( 8 ); + setup_velocity( v7 ); + setup_aim_matrix( ); + setup_weapon_action( ); + setup_movement( ); + setup_alive_loop( ); + + } + }*/ +} + +void CCSGOPlayerAnimState::reset( ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "56 6A 01 68 ? ? ? ? 8B F1" ) ); + if( fn_ptr ) { + auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); + fn( this ); + } +} + +void CCSGOPlayerAnimState::setup_aim_matrix( ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 81 EC ? ? ? ? 53 56 57 8B 3D" ) ); + if( fn_ptr ) { + auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); + fn( this ); + } +} + +void c_base_player::invalidate_physics_recursive( int flags ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 0C 53 8B 5D 08 8B C3" ) ); + if( fn_ptr ) { + auto fn = ( void( __thiscall* )( void*, int ) )( fn_ptr ); + fn( this, flags ); + } +} + +uintptr_t c_base_player::get_player_resource( ) { + for( int i{ 1 }; i < g_csgo.m_entlist( )->GetHighestEntityIndex( ); ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< IClientEntity >( i ); + if( !ent ) continue; + auto class_ = ent->GetClientClass( ); + if( class_ ) { + if( class_->m_class_id == CCSPlayerResource ) { + return uintptr_t( ent ); + } + } + } + + return 0; +} + +uintptr_t c_base_player::get_game_rules( ) { + static uintptr_t** game_rules = pattern::first_code_match< uintptr_t** >( g_csgo.m_chl.dll( ), xors( "A1 ? ? ? ? 85 C0 0F 84 ? ? ? ? 80 B8 ? ? ? ? ? 0F 84 ? ? ? ? 0F 10 05" ), 0x1 ); + if( !game_rules ) { + game_rules = pattern::first_code_match< uintptr_t** >( g_csgo.m_chl.dll( ), xors( "A1 ? ? ? ? 85 C0 0F 84 ? ? ? ? 80 B8 ? ? ? ? ? 0F 84 ? ? ? ? 0F 10 05" ), 0x1 ); + } + + return **game_rules; +} + +int& c_base_player::g_iModelBoneCounter( ) { + static auto offset = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "A1 ? ? ? ? 48 C7 81" ), 0x1 ); + return **( int** )( offset ); +} + +//use is_zero( ) on the vector to figure out if it returns a valid value +vec3_t c_base_player::get_hitbox_pos( int hitbox ) { + auto ce = this->ce( ); + + const auto model = ce->GetModel( ); + if( !model ) return vec3_t{ }; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !hdr ) return vec3_t{ }; + + matrix3x4 bone_matrix[ 128 ]; + memcpy( bone_matrix, + m_CachedBoneData( ).GetElements( ), + m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); + + auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); + if( !set ) return vec3_t{ }; + + auto box = set->pHitbox( hitbox ); + if( !box ) return vec3_t{ }; + + vec3_t center = ( box->bbmin + box->bbmax ) * 0.5f; + + return math::vector_transform( center, bone_matrix[ box->bone ] ); +} + +c_base_weapon* c_base_player::get_weapon( ) { + auto weap_handle = m_hActiveWeapon( ); + if( weap_handle ) + return g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weap_handle ); + + return nullptr; +} + +void c_base_player::set_needs_interpolate( bool interpolate ) { + auto varmap = get< VarMapping_t >( 0x24 ); + auto elements = varmap.m_Entries.GetElements( ); + + for( size_t i{ }; i < varmap.m_nInterpolatedEntries; ++i ) { + auto& e = elements[ i ]; + e.m_bNeedsToInterpolate = interpolate; + } +} + +bool c_base_player::is_visible( int hitbox ) { + vec3_t start = g_ctx.m_local->get_eye_pos( ); + vec3_t end = get_hitbox_pos( hitbox ); + + if( !end ) return false; + return util::trace_ray( start, end, g_ctx.m_local->ce( ), this->ce( ) ); +} + +float c_base_player::get_hitbox_radius( int hitbox ) { + auto model = ce( )->GetModel( ); + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); + + if( !model || !hdr || !set ) + return 0.f; + + auto box = set->pHitbox( hitbox ); + + if( box ) { + if( box->m_flRadius == -1 ) return box->bbmin.dist_to( box->bbmax ); + return box->m_flRadius; + } + + return 0.f; +} + +vec3_t c_base_player::get_hitbox_mins( int hitbox ) { + auto model = ce( )->GetModel( ); + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); + + if( !model || !hdr || !set ) + return vec3_t( ); + + matrix3x4 bone_matrix[ 128 ]; + memcpy( bone_matrix, + m_CachedBoneData( ).GetElements( ), + m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); + + auto box = set->pHitbox( hitbox ); + + return math::vector_transform( box->bbmin, bone_matrix[ box->bone ] ); +} + +vec3_t c_base_player::get_hitbox_maxs( int hitbox ) { + auto model = ce( )->GetModel( ); + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); + + if( !model || !hdr || !set ) + return vec3_t( ); + + matrix3x4 bone_matrix[ 128 ]; + memcpy( bone_matrix, + m_CachedBoneData( ).GetElements( ), + m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); + + auto box = set->pHitbox( hitbox ); + + vec3_t max = math::vector_transform( box->bbmax, bone_matrix[ box->bone ] ); + return max; +} + +bool c_base_player::is_fakewalking( ) { + auto walk_layer = m_AnimOverlay( ).GetElements( )[ 6 ]; + auto some_layer = m_AnimOverlay( ).GetElements( )[ 4 ]; + + auto velocity = m_vecVelocity( ).length2d( ); + bool on_ground = m_fFlags( ) & FL_ONGROUND; + if( walk_layer.m_flWeight < 0.1f + && some_layer.m_flWeight < 0.1f + && velocity > 0.1f && on_ground ) { + return true; + } + + if( velocity <= 0.1f ) + return true; + + return false; +} + +int c_base_player::get_choked_ticks( ) { + auto simtime = m_flSimulationTime( ); + + return TIME_TO_TICKS( g_csgo.m_globals->m_curtime - simtime ) + 1; +} + +int c_base_player::get_ping( ) { + auto resource = get_player_resource( ); + static auto offset = g_netvars.get_netvar( fnv( "DT_CSPlayerResource" ), fnv( "m_iPing" ) ); + int ping = *( int* )( resource + offset + ce( )->GetIndex( ) * 4 ); + + return ping; +} + +bool c_base_player::is_breaking_lc( ) { + return g_cheat.m_prediction.is_breaking_lc( this->ce( )->GetIndex( ) ); +} + +bool c_base_player::can_attack( bool ignore_rapid ) { + if( g_ctx.m_has_fired_this_frame ) return false; + if( !is_alive( ) ) return false; + + auto weapon = get_weapon( ); + if( !weapon ) return false; + + if( weapon->is_sniper( ) && g_cheat.m_lagmgr.has_fired( ) ) + return false; + + float time = g_ctx.pred_time( ); + + float next_attack = m_flNextAttack( ); + if( next_attack > time ) return false; + + float next_primary_attack = weapon->m_flNextPrimaryAttack( ); + if( next_primary_attack > time ) { + if( weapon->is_knife( ) ) { + if( weapon->m_flNextSecondaryAttack( ) > time ) + return false; + } + else { + return false; + } + } + + if( weapon->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER ) { + return g_ctx.m_revolver_shot; + } + + return true; +} + +int c_base_player::get_seq_activity( int sequence ) { + static uintptr_t fn_offset = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 7D 08 FF 56 8B F1 74 3D" ) ); + auto fn = ( int( __thiscall* )( void*, int ) )( fn_offset ); + + return fn ? fn( this, sequence ) : -2; +} + +void c_base_player::set_abs_angles( vec3_t angles ) { +#ifdef HEADER_MODULE + static uintptr_t fn_addr = g_header.patterns.set_abs_angles; +#else + static uintptr_t fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 64 53 56 57 8B F1 E8" ) ); +#endif + + auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); + + return fn( this, angles ); +} + +void c_base_player::set_abs_origin( vec3_t origin ) { +#ifdef HEADER_MODULE + static uintptr_t fn_addr = g_header.patterns.set_abs_origin; +#else + static uintptr_t fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 51 53 56 57 8B F1" ) ); +#endif + + auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); + + return fn( this, origin ); +} + +void c_base_player::create_animstate( CCSGOPlayerAnimState* state ) { + static auto fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 56 8B F1 B9 ? ? ? ? C7 46" ) ); + auto fn = ( void( __thiscall* )( CCSGOPlayerAnimState*, decltype( this ) ) )( fn_addr ); + + fn( state, this ); + state->pBaseEntity = this; +} + +void c_base_player::set_abs_velocity( vec3_t velocity ) { + static auto fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 0C 53 56 57 8B 7D 08 8B F1" ) ); + auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); + + fn( this, velocity ); +} + +void c_base_player::invalidate_bone_cache( ) { + m_flLastBoneSetupTime( ) = -FLT_MAX; + m_iMostRecentModelBoneCounter( ) = 0; +} + +void c_base_player::handle_taser_animation( ) { + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 EC 08 56 8B F1 80 BE ? ? ? ? ? 0F 84 ? ? ? ? 80 BE ? ? ? ? ? 0F 84 ? ? ? ? A1" ) ); + if( fn_ptr ) { + vec3_t eye_angles = m_angEyeAngles( ); + + __asm { + mov ecx, this + fld eye_angles.y + fld eye_angles.x + + call fn_ptr + } + } +} + +void c_base_player::calculate_duckamount( bool reset ) { + static float last_duckamt[ 65 ]{ }; + static float original_duckamt[ 65 ]{ }; + int idx = ce( )->GetIndex( ); + + if( reset ) { + original_duckamt[ idx ] = m_flDuckAmount( ); + last_duckamt[ idx ] = m_flDuckAmount( ); + return; + } + + float cur_duck = m_flDuckAmount( ); + float delta = m_flOldSimulationTime( ) - m_flSimulationTime( ) + TICK_INTERVAL( ); + + float old_duck = last_duckamt[ idx ]; + float rate = ( cur_duck - old_duck ) * delta; + + m_flDuckAmount( ) = old_duck + rate; + + if( cur_duck != original_duckamt[ idx ] ) + last_duckamt[ idx ] = cur_duck; + original_duckamt[ idx ] = cur_duck; +} + +void c_base_player::cache_anim_data( bool layers ) { + int idx = ce( )->GetIndex( ); + auto& animdata = sm_animdata[ idx ]; + + memcpy( &animdata.m_poseparams, + m_flPoseParameter( ), + sizeof( float ) * 24 ); + + if( layers ) { + memcpy( &animdata.m_animlayers, + m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 ); + } + + memcpy( animdata.m_bones, + m_CachedBoneData( ).GetElements( ), + sizeof( matrix3x4 ) * m_CachedBoneData( ).GetSize( ) ); +} + +void c_base_player::restore_anim_data( bool layers ) { + int idx = ce( )->GetIndex( ); + auto& animdata = sm_animdata[ idx ]; + + memcpy( m_flPoseParameter( ), + &animdata.m_poseparams, + sizeof( float ) * 24 ); + + if( layers ) { + memcpy( m_AnimOverlay( ).GetElements( ), + &animdata.m_animlayers, + sizeof( C_AnimationLayer ) * 13 ); + } + + memcpy( animdata.m_bones, + m_CachedBoneData( ).GetElements( ), + sizeof( matrix3x4 ) * m_CachedBoneData( ).GetSize( ) ); +} + +void c_base_player::do_ent_interpolation( bool reset ) { + auto idx = ce( )->GetIndex( ); + auto* anim_data = &sm_animdata[ idx ]; + + vec3_t origin = m_vecOrigin( ); + + if( reset ) { + anim_data->m_last_interp_origin = anim_data->m_interp_origin = origin; + anim_data->m_simtime = anim_data->m_last_simtime = g_csgo.m_globals->m_curtime; + return; + } + + if( !anim_data->m_valid ) + return; + + if( origin.dist_to_sqr( anim_data->m_interp_origin ) > FLT_EPSILON ) { + anim_data->m_last_interp_origin = anim_data->m_interp_origin; + anim_data->m_interp_origin = origin; + anim_data->m_last_simtime = anim_data->m_simtime; + anim_data->m_simtime = g_csgo.m_globals->m_curtime; + } + + float lerp = util::get_lerptime( ); + if( !lerp ) + return; + + if( anim_data->m_last_interp_origin.dist_to( anim_data->m_interp_origin ) > 64.f ) + return; + + for( size_t i{ }; i < 3; ++i ) { + if( !std::isfinite( anim_data->m_last_interp_origin[ i ] ) || !std::isfinite( anim_data->m_interp_origin[ i ] ) ) { + char error_msg[ 128 ]; + sprintf_s< 128 >( error_msg, "player origin was NaN\nreport this bug\ndetails:\n %f %f", + g_csgo.m_globals->m_curtime, + anim_data->m_simtime ); + + MessageBoxA( nullptr, error_msg, "error", MB_OK ); + exit( 0 ); + } + } + + float update_delta = anim_data->m_simtime - anim_data->m_last_simtime; + float update_lerp = std::clamp( update_delta - lerp, 0.f, 1.f ); + + if( update_delta < TICK_INTERVAL( ) ) + return; + + lerp = std::clamp( lerp, 0.f, update_delta ); + + float lerp_progress = ( anim_data->m_simtime + lerp - g_csgo.m_globals->m_curtime ) / lerp; + + vec3_t vec_lerp = math::lerp( origin, anim_data->m_last_interp_origin, std::clamp( lerp_progress, 0.f, 1.f ) ); + + for( size_t i{ }; i < 3; ++i ) + if( !isfinite( vec_lerp[ i ] ) ) + return; + + byte backup = *( byte* )( uintptr_t( this ) + 0x270 ); + *( byte* )( uintptr_t( this ) + 0x270 ) = 0; + + restore_anim_data( true ); + + //aaaaAAAAAAAA + //calc_abs_velocity( ); + set_abs_origin( vec_lerp ); + invalidate_bone_cache( ); + + ce( )->SetupBones( anim_data->m_bones, 128, BONE_USED_BY_ANYTHING, g_csgo.m_globals->m_curtime ); + this->m_iMostRecentModelBoneCounter( )++; + + *( byte* )( uintptr_t( this ) + 0x270 ) = backup; +} + +void c_base_player::validate_animation_layers( ) { + for( size_t i{ }; i < m_AnimOverlay( ).GetSize( ); ++i ) { + auto& layer = m_AnimOverlay( ).GetElements( )[ i ]; + layer.m_flCycle = std::clamp( layer.m_flCycle, 0.f, 1.f ); + layer.m_flWeight = std::clamp( layer.m_flWeight, 0.f, 1.f ); + + layer.m_player = this; + } + + for( size_t i{ }; i < 24; ++i ) { + auto& param = m_flPoseParameter( )[ i ]; + if( !isfinite( param ) ) + param = 0.f; + } +} + +void c_base_player::compute_move_cycle( bool reset, bool moving ) { + if( !moving || reset ) + return; + + float eye_yaw = m_angEyeAngles( ).y; + + float blend_ang = math::approach_angle( eye_yaw, + get_animstate( )->m_flCurrentFeetYaw, + get_animstate( )->m_flFeetYawRate * 100.f ); + + //get_animstate( )->m_flCurrentFeetYaw = blend_ang + 360.f; + m_flPoseParameter( )[ LEAN_YAW ] = ( blend_ang + 180.f ) / 360.f; + m_flPoseParameter( )[ BODY_YAW ] = ( blend_ang + 180.f ) / 360.f; +} + +void c_base_player::calc_anim_velocity( bool reset ) { + int idx = ce( )->GetIndex( ); + + auto accelerate = [ & ]( vec3_t velocity, vec3_t direction, float speed, float accel ) { + float addspeed, accelspeed, currentspeed; + + velocity.z = 0.f; + currentspeed = velocity.dot( direction ); + + addspeed = speed - currentspeed; + + if( addspeed <= 0.f ) { + return velocity; + } + + //guess how many fucks i give, this works + accelspeed = std::min( accel * 10.f * TICK_INTERVAL( ) * std::max( speed, 250.f ), currentspeed ); + + for( size_t i{ }; i < 3; ++i ) { + velocity[ i ] += accelspeed * direction[ i ]; + } + + return velocity; + }; + + auto friction = [ & ]( vec3_t velocity ) { + static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); + static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); + + float speed = velocity.length2d( ); + if( speed < 0.1f ) + return vec3_t{ }; + + float friction = sv_friction->get_float( ); + float control = ( speed < sv_stopspeed->get_float( ) ) ? sv_stopspeed->get_float( ) : speed; + float drop = control * friction * TICK_INTERVAL( ); + + float newspeed = speed - drop; + if( newspeed < 0.f ) + newspeed = 0.f; + + if( newspeed != speed ) { + newspeed /= speed; + velocity *= newspeed; + } + + return velocity; + }; + + if( reset ) { + vec3_t velocity = m_vecVelocity( ); + sm_animdata[ idx ].m_last_origin = m_vecOrigin( ); + sm_animdata[ idx ].m_last_velocity = velocity; + sm_animdata[ idx ].m_anim_velocity = velocity; + } + else { + static auto sv_accelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_accelerate" ) ); + + float delta = m_flSimulationTime( ) - m_flOldSimulationTime( ); + delta = std::max( delta, TICK_INTERVAL( ) ); + + bool on_ground = m_fFlags( ) & FL_ONGROUND; + + vec3_t origin = m_vecOrigin( ); + vec3_t origin_delta = origin - sm_animdata[ idx ].m_last_origin; + + vec3_t velocity = origin_delta / delta; + vec3_t last_velocity = sm_animdata[ idx ].m_last_velocity; + + vec3_t anim_vel; + + if( on_ground ) { + vec3_t ang = math::vector_angles( vec3_t( ), velocity ); + + float move_yaw = math::vector_angles( velocity ).y; + float move_delta = math::vector_angles( last_velocity ).y; + move_delta -= move_yaw; + move_delta = std::remainderf( move_delta, 360.f ); + + vec3_t move_dir = math::angle_vectors( vec3_t( 0.f, move_delta, 0.f ) ) * 450.f; + + vec3_t forward, right, up; + math::angle_vectors( ang, &forward, &right, &up ); + + vec3_t wishdir; + for( size_t i{ }; i < 2; ++i ) + wishdir[ i ] = forward[ i ] * move_dir.x + right[ i ] * move_dir.y; + + anim_vel = friction( last_velocity ); + if( anim_vel.length2d( ) < 1.f ) + anim_vel = vec3_t( ); + + int ticks = TIME_TO_TICKS( delta * 0.5f ); + vec3_t est_tick_vel = math::lerp( last_velocity, velocity, .5f ); + for( int i{ }; i < ticks + 1; i++ ) { + if( est_tick_vel.length2d( ) < 5.f ) + break; + + est_tick_vel = friction( est_tick_vel ); + } + + if( velocity.length2d( ) > last_velocity.length2d( ) ) + anim_vel = accelerate( anim_vel, wishdir, 250.f, sv_accelerate->get_float( ) ); + + //assume fakewalk + if( anim_vel.length2d( ) >= sm_animdata[ idx ].m_anim_velocity.length2d( ) && est_tick_vel.length2d( ) < 5.f && delta > TICK_INTERVAL( ) ) + anim_vel = vec3_t( ); + } + else { + anim_vel = math::lerp( + last_velocity, + velocity, + TICK_INTERVAL( ) / delta + ); + } + + sm_animdata[ idx ].m_anim_velocity = anim_vel; + sm_animdata[ idx ].m_last_velocity = velocity; + sm_animdata[ idx ].m_last_origin = origin; + } +} + +void c_base_player::calc_abs_velocity( ) { +#ifdef HEADER_MODULE + static auto fn_ptr = g_header.patterns.calc_abs_velocity; +#else + static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 1C 53 56 57 8B F9 F7 87" ), 0 ); +#endif + + if( fn_ptr ) { + auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); + fn( this ); + } +} + +void c_base_player::fix_jump_fall( bool reset ) { + if( reset ) + return; + + int prev_flags = get_animdata( ).m_prev_flags; + int flags = m_fFlags( ); + + if( ( prev_flags & FL_ONGROUND ) && ( flags & FL_ONGROUND ) ) { + flags |= FL_ONGROUND; + } + else { + auto layer_weight = m_AnimOverlay( ).GetElements( )[ 4 ].m_flWeight; + auto last_weight = get_animdata( ).m_last_layers.at( 4 ).m_flWeight; + + if( layer_weight != 1.f && last_weight == 1.f && + m_AnimOverlay( ).GetElements( )[ 5 ].m_flWeight != 0.f ) + flags |= FL_ONGROUND; + + if( ( flags & FL_ONGROUND ) && !( prev_flags & FL_ONGROUND ) ) + flags &= ~FL_ONGROUND; + } + + m_fFlags( ) = flags; +} + +void c_base_player::fix_animations( bool reset, bool resolver_change ) { + //todo: legs dont match up when fakelagging <- not anymore + int idx = ce( )->GetIndex( ); + sm_animdata[ idx ].m_valid = false; + + if( !get_animstate( ) ) + return; + + m_angEyeAngles( ).y = std::remainder( m_angEyeAngles( ).y, 360.f ); + + int flags = m_fFlags( ); + auto eye_angles = m_angEyeAngles( ); + auto original_duck = m_flDuckAmount( ); + + //enable animations - time to update + m_bClientSideAnimation( ) = true; + set_needs_interpolate( false ); + + //we need the player data at THIS EXACT moment, somehow + float anim_time = m_flOldSimulationTime( ) + TICK_INTERVAL( ); + + auto backup_curtime = g_csgo.m_globals->m_curtime; + auto backup_frametime = g_csgo.m_globals->m_frametime; + + g_csgo.m_globals->m_curtime = anim_time; + g_csgo.m_globals->m_frametime = TICK_INTERVAL( ); + + if( resolver_change && m_fFlags( ) & FL_ONGROUND && !reset ) { + float lby_delta = m_flLowerBodyYawTarget( ) - eye_angles.y; + lby_delta = std::remainderf( lby_delta, 360.f ); + lby_delta = std::clamp( lby_delta, -60.f, 60.f ); + + float feet_yaw = std::remainderf( eye_angles.y + lby_delta, 360.f ); + if( feet_yaw < 0.f ) + feet_yaw += 360.f; + + get_animstate( )->m_flGoalFeetYaw = get_animstate( )->m_flCurrentFeetYaw = feet_yaw; + } + + get_animstate( )->m_flFeetYawRate = 0.f; + + //why? + //because this calls pAttachmentHelper->CalcAbsVelocity + //aswell as removes EFL_DIRTY_ABSVELOCITY + //which fixes attachments etc + //normally this would be called by animstate->update + //but we prevent that + calc_abs_velocity( ); + + //calc_anim_velocity( reset ); + + set_abs_origin( m_vecOrigin( ) ); + //networked duck amount comes from the last simulation tick instead of the current one + calculate_duckamount( reset ); + fix_jump_fall( reset ); + validate_animation_layers( ); + + float old_cycle = m_AnimOverlay( ).GetElements( )[ 6 ].m_flCycle; + get_animstate( )->m_iLastClientSideAnimationUpdateFramecount -= 1; + + vec3_t velocity = m_vecVelocity( ); + int backup_eflags = get< int >( 0xe4 ); + int backup_byte = get< byte >( 0x35f8 ); + + if( !reset ) { + m_vecVelocity( ) = sm_animdata[ idx ].m_anim_velocity; + get< vec3_t >( 0x94 ) = sm_animdata[ idx ].m_anim_velocity; + get< byte >( 0x35f8 ) = 1; + get< int >( 0xe4 ) &= ~0x1000; + + get_animstate( )->m_flUnknownFraction = sm_animdata[ idx ].m_fraction; + } + + sm_animdata[ idx ].m_last_duck = m_flDuckAmount( ); + + float prev_cycle = m_AnimOverlay( ).GetElements( )[ 6 ].m_flPrevCycle; + float prev_rate = m_AnimOverlay( ).GetElements( )[ 6 ].m_flPlaybackRate; + + if( !reset ) { + auto fraction = get_animstate( )->m_flStopToFullRunningFraction; + bool stopping = sm_animdata[ idx ].m_is_stopping; + + if( fraction > 0.1f && fraction < 1.f ) { + float delta_2x = get_animstate( )->m_flLastUpdateDelta * 2.f; + + if( stopping ) + fraction -= delta_2x; + else + fraction += delta_2x; + + fraction = std::clamp( fraction, 0.f, 1.f ); + } + + auto speed = get_anim_velocity( ).length2d( ); + + if( speed > 135.2f && stopping ) { + sm_animdata[ idx ].m_is_stopping = false; + fraction = std::max( fraction, 0.0099999998f ); + } + if( speed < 135.2f && !stopping ) { + sm_animdata[ idx ].m_is_stopping = true; + fraction = std::min( fraction, 0.99000001f ); + } + + get_animstate( )->m_flStopToFullRunningFraction = fraction; + } + + sm_animdata[ idx ].m_last_animtime = get_animstate( )->m_flLastClientSideAnimationUpdateTime; + get_animstate( )->update( eye_angles.y, eye_angles.x ); + m_AnimOverlay( ).GetElements( )[ 6 ].m_flPrevCycle = m_AnimOverlay( ).GetElements( )[ 6 ].m_flCycle; + + float lerp_rate = math::lerp( + prev_rate, + m_AnimOverlay( ).GetElements( )[ 6 ].m_flPlaybackRate, + TICK_INTERVAL( ) / ( m_flSimulationTime( ) - m_flOldSimulationTime( ) ) ); + + if( !reset ) { + m_AnimOverlay( ).GetElements( )[ 6 ].m_flCycle = prev_cycle + lerp_rate; + } + + get_animdata( ).m_prev_flags = flags; + memcpy( + get_animdata( ).m_last_layers.data( ), + m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 + ); + + sm_animdata[ idx ].m_fraction = get_animstate( )->m_flUnknownFraction; + + m_vecVelocity( ) = velocity; + get< vec3_t >( 0x94 ) = velocity; + get< int >( 0xe4 ) = backup_eflags; + get< byte >( 0x35f8 ) = backup_byte; + + m_AnimOverlay( ).GetElements( )[ 6 ].m_flPrevCycle = old_cycle; + + //check for any possible mistakes + validate_animation_layers( ); + + sm_animdata[ idx ].m_adjust_rate = m_AnimOverlay( ).GetElements( )[ 3 ].m_flPlaybackRate; + sm_animdata[ idx ].m_adjust_cycle = m_AnimOverlay( ).GetElements( )[ 3 ].m_flCycle; + + if( m_flSimulationTime( ) - m_flOldSimulationTime( ) > TICK_INTERVAL( ) ) { + auto activity = get_seq_activity( m_AnimOverlay( ).GetElements( )[ 3 ].m_nSequence ); + + if( activity == 979 ) { + m_AnimOverlay( ).GetElements( )[ 3 ].m_flWeight = 0.f; + m_AnimOverlay( ).GetElements( )[ 3 ].m_flCycle = 0.f; + } + } + + bool moving = sm_animdata[ idx ].m_anim_velocity.length( ) > 0.1f; + //compute_move_cycle( reset, moving ); + + get_animdata( ).m_anim_flags = m_fFlags( ); + + if( !moving ) + m_AnimOverlay( ).GetElements( )[ 6 ].m_flWeight = 0.f; + + ce( )->GetRenderAngles( ).y = std::remainderf( ce( )->GetRenderAngles( ).y, 360.f ); + + m_flDuckAmount( ) = original_duck; + m_fFlags( ) = flags; + m_angEyeAngles( ) = eye_angles; + m_flDuckAmount( ) = original_duck; + + get_animstate( )->m_flUnknownFraction = 0.f; + + //clear occlusion for setupbones (pvs fix) + *( int* )( uintptr_t( this ) + 0xa30 ) = 0; + + byte backup = get< byte >( 0x270 ); + get< byte >( 0x270 ) = 0; + + invalidate_bone_cache( ); + ce( )->SetupBones( nullptr, -1, BONE_USED_BY_ANYTHING, anim_time ); + cache_anim_data( ); + + g_csgo.m_globals->m_curtime = backup_curtime; + g_csgo.m_globals->m_frametime = backup_frametime; + + if( !reset ) { + sm_animdata[ idx ].m_valid = true; + } + + //disable animations again + m_bClientSideAnimation( ) = false; + get< byte >( 0x270 ) = backup; +} + +player_info_t c_base_player::get_info( ) { + player_info_t info; + g_csgo.m_engine( )->GetPlayerInfo( ce( )->GetIndex( ), &info ); + + return info; +} + +bool c_base_player::is_flashed( ) { + return m_flFlashTime( ) - g_csgo.m_globals->m_curtime > m_flFlashDuration( ) * 0.5f; +} + +bool c_base_player::is_reloading( ) { + auto gun_layer = m_AnimOverlay( ).GetElements( )[ 1 ]; + float playback_rate = gun_layer.m_flPlaybackRate; + if( playback_rate < 0.55f ) { + return gun_layer.m_flCycle < 0.99f; + } + + return false; +} + +void c_base_player::get_name_safe( char* buf ) { + player_info_t info; + if( g_csgo.m_engine( )->GetPlayerInfo( this->ce( )->GetIndex( ), &info ) ) { + for( size_t i{ }; i < 32; ++i ) { + switch( info.name[ i ] ) { + case '"': + case '\\': + case ';': + case '\n': + buf[ i ] = ' '; + break; + default: + buf[ i ] = info.name[ i ]; + break; + } + } + + buf[ 31 ] = 0; + } +} + +void c_base_player::set_local_view_angles( vec3_t *angle ) { + using fn = void( __thiscall * )( void *, vec3_t * ); + util::get_vfunc< fn >( this, 363 )( this, angle ); +} + +bool c_base_player::run_physics_think( int unk01 ) { + static auto impl = reinterpret_cast< bool( __thiscall * )( void *, int ) >( + pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 EC 10 53 56 57 8B F9 8B 87 ? ? ? ? C1 E8 16" ) ) + ); + + return impl( this, unk01 ); +} + +void c_base_player::pre_think( ) { + using fn = void( __thiscall * )( void * ); + util::get_vfunc< fn >( this, 309 )( this ); +} + +void c_base_player::think( ) { + using fn = void( __thiscall * )( void * ); + util::get_vfunc< fn >( this, 137 )( this ); +} + +void c_base_player::setup_bones_ex( matrix3x4* array_out, int bone_mask, float curtime ) { +/* auto hdr = *( studiohdr_t** )( uintptr_t( ce( )->GetClientRenderable( ) ) + 0x2938 ); + auto bone_array = ( matrix3x4* )( m_dwBoneMatrix( ) ); + + auto readable_bones = *( int* )( ( uintptr_t )ce( )->GetClientRenderable( ) + 0x2694 ); + bone_mask |= readable_bones; + + //backup necessary data + matrix3x4 backup_bone_array[ 128 ]; + float backup_pose_params[ 24 ]; + + memcpy( backup_bone_array, + ( void* )( m_dwBoneMatrix( ) ), + sizeof( backup_bone_array ) ); + + memcpy( backup_pose_params, + m_flPoseParameter( ), + sizeof( backup_pose_params ) ); + + vec3_t backup_origin = ce( )->GetRenderOrigin( ); + vec3_t backup_angles = ce( )->GetRenderAngles( ); + + //setup a transform matrix + matrix3x4 transform{ }; + math::angle_imatrix( backup_angles, transform ); + math::set_matrix_position( backup_origin, transform ); + + //set render flags + *( int* )( ( uintptr_t )ce( )->GetClientRenderable( ) + 0xE0 ) |= 8; + + update_ik_locks( m_flSimulationTime( ) ); + IKContext* ik = m_IKContext( ); + + if( ik ) { + ik->ClearTargets( ); + ik->Init( hdr, backup_angles, + backup_origin, + curtime, + g_csgo.m_globals->m_framecount, + bone_mask ); + } + + vec3_t pos[ 128 ]; + float q[ 4 ][ 128 ]; + + standard_blending_rules( hdr, pos, q, curtime, bone_mask ); + + //idk but this is in ida + char computed[ 0x100 ]{ }; + + if( ik ) { + ik->UpdateTargets( pos, q, bone_array, computed ); + calculate_ik_locks( curtime ); + ik->SolveDependencies( pos, q, bone_array, computed ); + } + + build_transformations( hdr, pos, q, transform, bone_mask, computed ); + + //clear render flags + *( int* )( ( uintptr_t )ce( )->GetClientRenderable( ) + 0xE0 ) &= ~8; + + //copy new bone array into the matrix + memcpy( array_out, bone_array, 128 * sizeof( matrix3x4 ) ); + + /* + //restore data + memcpy( bone_array, + backup_bone_array, + sizeof( matrix3x4 ) ); + + memcpy( m_flPoseParameter( ), + backup_pose_params, + sizeof( backup_pose_params ) ); + + set_abs_angles( backup_angles ); + set_abs_origin( backup_origin ); + */ +} \ No newline at end of file diff --git a/cheat/internal_rewrite/c_base_player.hpp b/cheat/internal_rewrite/c_base_player.hpp new file mode 100644 index 0000000..30bafde --- /dev/null +++ b/cheat/internal_rewrite/c_base_player.hpp @@ -0,0 +1,468 @@ +#pragma once +#include + +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "netvars.hpp" +#include "pattern.hpp" +#include "c_base_weapon.hpp" +#include "CUtlVector.hpp" +#include "IPhysicsSurfaceProps.hpp" +#include "settings.hpp" +#include "IPhysicsSurfaceProps.hpp" + +enum PlayerState_t { + FL_ONGROUND = 1 << 0, + FL_DUCKING = 1 << 1, + FL_WATERJUMP = 1 << 2, + FL_ONTRAIN = 1 << 3, + FL_INRAIN = 1 << 4, + FL_FROZEN = 1 << 5, + FL_ATCONTROLS = 1 << 6, + FL_CLIENT = 1 << 7, + FL_FAKECLIENT = 1 << 8, + FL_INWATER = 1 << 9, +}; + +enum PlayerHitboxes_t { + HITBOX_HEAD, + HITBOX_NECK, + HITBOX_PELVIS, + HITBOX_BODY, + HITBOX_THORAX, + HITBOX_CHEST, + HITBOX_UPPER_CHEST, + HITBOX_RIGHT_THIGH, + HITBOX_LEFT_THIGH, + HITBOX_RIGHT_CALF, + HITBOX_LEFT_CALF, + HITBOX_RIGHT_FOOT, + HITBOX_LEFT_FOOT, + HITBOX_RIGHT_HAND, + HITBOX_LEFT_HAND, + HITBOX_RIGHT_UPPER_ARM, + HITBOX_RIGHT_FOREARM, + HITBOX_LEFT_UPPER_ARM, + HITBOX_LEFT_FOREARM, + HITBOX_MAX, +}; + +enum MoveType_t { + MOVETYPE_NONE = 0, // never moves + MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc. + MOVETYPE_WALK, // Player only - moving on the ground + MOVETYPE_STEP, // gravity, special edge handling -- monsters use this + MOVETYPE_FLY, // No gravity, but still collides with stuff + MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity + MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation + MOVETYPE_PUSH, // no clip to world, push and crush + MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity + MOVETYPE_LADDER, // Used by players only when going onto a ladder + MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode + MOVETYPE_CUSTOM, // Allows the entity to describe its own physics + MOVETYPE_LAST = MOVETYPE_CUSTOM, // should always be defined as the last item in the list + MOVETYPE_MAX_BITS = 4, +}; + +enum LifeState_t { + LIFE_ALIVE = 0, // alive + LIFE_DYING, // playing death animation or still falling off of a ledge waiting to hit ground + LIFE_DEAD, // dead. lying still. + LIFE_RESPAWNABLE, + LIFE_DISCARDBODY, +}; + +enum PoseParam_t { + STRAFE_YAW, + STAND, + LEAN_YAW, + SPEED, + LADDER_YAW, + LADDER_SPEED, + JUMP_FALL, + MOVE_YAW, + MOVE_BLEND_CROUCH, + MOVE_BLEND_WALK, + MOVE_BLEND_RUN, + BODY_YAW, + BODY_PITCH, + AIM_BLEND_STAND_IDLE, + AIM_BLEND_STAND_WALK, + AIM_BLEND_STAND_RUN, + AIM_BLEND_COURCH_IDLE, + AIM_BLEND_CROUCH_WALK, + DEATH_YAW +}; + +class IKContext { +public: + void Init( void* hdr, vec3_t& angles, vec3_t& origin, float curtime, int framecount, int boneMask ); + void UpdateTargets( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ); + void SolveDependencies( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ); + + //THANK YOU IDA + void ClearTargets( ) { + int max = *( int* )( ( uintptr_t )this + 4080 ); + int count = 0; + + if( max > 0 ) { + uintptr_t v60 = ( uintptr_t )( ( uintptr_t )this + 208 ); + do { + *( int* )( v60 ) = -9999; + v60 += 340; + ++count; + } while( count < max ); + } + } +}; + +class C_AnimationLayer { +private: + char pad_0x8_[ 0x8 ]; +public: + uint32_t m_unk1; + uint32_t m_unk2; + uint32_t m_unk3; + uint32_t m_nOrder; //0x0014 + uint32_t m_nSequence; //0x0018 + float m_flPrevCycle; //0x001C + float m_flWeight; //0x0020 + float m_flWeightDeltaRate; //0x0024 + float m_flPlaybackRate; //0x0028 + float m_flCycle; //0x2C + c_base_player* m_player; //0x30 + char pad_0x8[ 0x4 ]; //0x34 +}; //Size: 0x0038 + +struct clientanimating_t { + void* m_pAnimating; + unsigned int m_fFlags; + clientanimating_t( void* _pAnim, unsigned int _flags ) : m_pAnimating( _pAnim ), m_fFlags( _flags ) {} +}; + +struct CCSGOPlayerAnimState +{ + void update( float yaw, float pitch ); + void update_ex( float yaw, float pitch ); + void setup_velocity( float ); + void setup_aim_matrix( ); + void setup_weapon_action( ); + void setup_movement( ); + void setup_alive_loop( ); + void setup_whole_body_action( ); + void setup_flashed_reaction( ); + void setup_flinch( ); + bool cache_sequences( ); + + void reset( ); + + char pad[ 4 ]; + char bUnknown; //0x4 + char pad2[ 91 ]; + void* pBaseEntity; //0x60 + void* pActiveWeapon; //0x64 + void* pLastActiveWeapon; //0x68 + float m_flLastClientSideAnimationUpdateTime; //0x6C + int m_iLastClientSideAnimationUpdateFramecount; //0x70 + float m_flLastUpdateDelta; //0x74 //b8 + float m_flEyeYaw; //0x78 //c0 + float m_flPitch; //0x7C //b8 + float m_flGoalFeetYaw; //0x80 //c0 + float m_flCurrentFeetYaw; //0x84 //c8 + float m_flCurrentTorsoYaw; //0x88 //d0 + float m_flUnknownVelocityLean; //0x8C //changes when moving/jumping/hitting ground //d8 + float m_flLeanAmount; //0x90 //e0 + char pad4[ 4 ]; //NaN //e8 + float m_flFeetCycle; //0x98 0 to 1 //100 //f0 + float m_flFeetYawRate; //0x9C 0 to 1 //108 //f8 + char pad11[ 4 ]; + float m_fDuckAmount; //0xA4 //118 //108 + float m_fLandingDuckAdditiveSomething; //0xA8 //110 + float m_fUnknown3; //0xAC //118 + vec3_t m_vOrigin; //0xB0, 0xB4, 0xB8 //120 + vec3_t m_vLastOrigin; //0xBC, 0xC0, 0xC4 + vec3_t m_vecVelocity; + float m_flUnknownFloat1; //0xD4 Affected by movement and direction + char pad6[ 8 ]; + float m_flUnknownFloat2; //0xE0 //from -1 to 1 when moving and affected by direction + float m_flUnknownFloat3; //0xE4 //from -1 to 1 when moving and affected by direction + float m_unknown; //0xE8 + float m_velocity; //0xEC + float flUpVelocity; //0xF0 + float m_flSpeedNormalized; //0xF4 //from 0 to 1 + float m_flFeetSpeedForwardsOrSideWays; //0xF8 //from 0 to 2. something is 1 when walking, 2.something when running, 0.653 when crouch walking + float m_flFeetSpeedUnknownForwardOrSideways; //0xFC //from 0 to 3. something + float m_flTimeSinceStartedMoving; //0x100 + float m_flTimeSinceStoppedMoving; //0x104 + unsigned char m_bOnGround; //0x108 + unsigned char m_bInHitGroundAnimation; //0x109 + char pad7[ 10 ]; + float m_flLastOriginZ; //0x114 + float m_flHeadHeightOrOffsetFromHittingGroundAnimation; //0x118 from 0 to 1, is 1 when standing + float m_flStopToFullRunningFraction; //0x11C from 0 to 1, doesnt change when walking or crouching, only running + char pad8[ 4 ]; //NaN + float m_flUnknownFraction; //0x124 affected while jumping and running, or when just jumping, 0 to 1 + char pad9[ 4 ]; //NaN + float m_flUnknown3; + char pad10[ 0x210 ]; +}; + +class VarMapEntry_t { +public: + unsigned short type; + unsigned short m_bNeedsToInterpolate; // Set to false when this var doesn't + // need Interpolate() called on it anymore. + void* data; + void* watcher; +}; + +struct VarMapping_t { + CUtlVector< VarMapEntry_t > m_Entries; + int m_nInterpolatedEntries; // +0x14 + float m_lastInterpolationTime; // +0x18 +}; + +struct ent_animdata_t { + std::array< C_AnimationLayer, 13 > m_animlayers; + std::array< C_AnimationLayer, 13 > m_last_layers; + std::array< float, 24 > m_poseparams; + matrix3x4 m_bones[ 128 ]; + int m_activity; + float m_simtime; + float m_last_simtime; + vec3_t m_last_interp_origin; + float m_fraction; + vec3_t m_interp_origin; + vec3_t m_last_origin; + vec3_t m_last_velocity; + vec3_t m_anim_velocity; + bool m_valid{ }; + float m_last_duck; + int m_prev_flags; + int m_anim_flags; + float m_adjust_rate; + float m_adjust_cycle; + bool m_is_stopping; + float m_last_animtime; +}; + +class c_base_player { +private: + static ent_animdata_t sm_animdata[ 65 ]; +public: + //NETVAR( m_YourFunctionName, "Name", "Table", extra, type ) + + NETVAR( m_nMoveType, "m_nRenderMode", "DT_BaseEntity", 1, MoveType_t ); + NETVAR( m_iAccount, "m_iAccount", "DT_CSPlayer", 0, int ); + NETVAR( m_iHealth, "m_iHealth", "DT_BasePlayer", 0, int ); + NETVAR( m_lifeState, "m_lifeState", "DT_BasePlayer", 0, uint8_t ); + NETVAR( m_nTickBase, "m_nTickBase", "DT_BasePlayer", 0, int ); + NETVAR( m_fFlags, "m_fFlags", "DT_BasePlayer", 0, int ); + NETVAR( m_vecVelocity, "m_vecVelocity[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_nHitboxSet, "m_nHitboxSet", "DT_BaseAnimating", 0, int ); + NETVAR( m_vecOrigin, "m_vecOrigin", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_vecViewOffset, "m_vecViewOffset[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_hActiveWeapon, "m_hActiveWeapon", "DT_BaseCombatCharacter", 0, ulong_t ); + NETVAR( m_iTeamNum, "m_iTeamNum", "DT_BaseEntity", 0, int ); + NETVAR( m_bHasHelmet, "m_bHasHelmet", "DT_CSPlayer", 0, bool ); + NETVAR( m_bHasDefuser, "m_bHasDefuser", "DT_CSPlayer", 0, bool ); + NETVAR( m_ArmorValue, "m_ArmorValue", "DT_CSPlayer", 0, int ); + NETVAR( m_flNextAttack, "m_flNextAttack", "DT_BaseCombatCharacter", 0, float ); + NETVAR( m_flLowerBodyYawTarget, "m_flLowerBodyYawTarget", "DT_CSPlayer", 0, float ); + NETVAR( m_angEyeAngles, "m_angEyeAngles[0]", "DT_CSPlayer", 0, vec3_t ); + NETVAR( m_AnimOverlay, "m_hLightingOrigin", "DT_BaseAnimating", 0x3c, CUtlVector< C_AnimationLayer > ); + NETVAR( m_flSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0, float ); + NETVAR( m_flCycle, "m_flCycle", "DT_BaseAnimating", 0, float ); + NETVAR( m_nSequence, "m_nSequence", "DT_BaseAnimating", 0, int ); + PNETVAR( m_flPoseParameter, "m_flPoseParameter", "DT_BaseAnimating", 0, float ); + NETVAR( m_bClientSideAnimation, "m_bClientSideAnimation", "DT_BaseAnimating", 0, bool ); + NETVAR( m_flLastBoneSetupTime, "m_hLightingOrigin", "DT_BaseAnimating", -0x20, float ); + NETVAR( m_iMostRecentModelBoneCounter, "m_nForceBone", "DT_BaseAnimating", 0x4, int ); + NETVAR( m_nWriteableBones, "m_nForceBone", "DT_BaseAnimating", 0x20, int ); + NETVAR( m_vecThirdpersonAngles, "deadflag", "DT_BasePlayer", 0x4, vec3_t ); + NETVAR( m_hObserverTarget, "m_hObserverTarget", "DT_BasePlayer", 0, uint32_t ); + NETVAR( m_iObserverMode, "m_iObserverMode", "DT_BasePlayer", 0, int ); + NETVAR( m_flOldSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0x4, float ); + NETVAR( m_CoordinateFrame, "m_CollisionGroup", "DT_BaseEntity", -0x30, matrix3x4 ); + NETVAR( m_vecMins, "m_vecMins", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_vecMaxs, "m_vecMaxs", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_bIsScoped, "m_bIsScoped", "DT_CSPlayer", 0, bool ); + NETVAR( m_viewPunchAngle, "m_viewPunchAngle", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_flMaxFlashAlpha, "m_flFlashMaxAlpha", "DT_CSPlayer", 0, float ); + NETVAR( m_flFlashDuration, "m_flFlashDuration", "DT_CSPlayer", 0, float ); + NETVAR( m_flFlashTime, "m_flFlashMaxAlpha", "DT_CSPlayer", -0x10, float ); + NETVAR( m_bGunGameImmunity, "m_bGunGameImmunity", "DT_CSPlayer", 0, bool ); + NETVAR( m_hViewModel, "m_hViewModel[0]", "DT_BasePlayer", 0, uint32_t ); + NETVAR( m_bSpotted, "m_bSpotted", "DT_CSPlayer", 0, bool ); + NETVAR( m_pSurfaceData, "m_flLaggedMovementValue", "DT_CSPlayer", 0x18, surfacedata_t* ); + NETVAR( m_vecBaseVelocity, "m_vecBaseVelocity", "DT_CSPlayer", 0, vec3_t ); + NETVAR( m_vecAbsVelocity, "m_vecVelocity", "DT_CSPlayer", 0x12, vec3_t ); + NETVAR( m_flGravity, "m_iTeamNum", "DT_CSPlayer", -0x14, float ); + NETVAR( m_surfaceFriction, "m_vecLadderNormal", "DT_CSPlayer", -0x4, float ); + NETVAR( m_flDuckAmount, "m_flDuckAmount", "DT_CSPlayer", 0, float ); + NETVAR( m_flDuckSpeed, "m_flDuckSpeed", "DT_CSPlayer", 0, float ); + PNETVAR( m_hMyWearables, "m_hMyWearables", "DT_BaseCombatCharacter", 0, uint32_t ); + PNETVAR( m_hMyWeapons, "m_hMyWeapons", "DT_BaseCombatCharacter", 0, uint32_t ); + NETVAR( m_hGroundEntity, "m_hGroundEntity", "DT_CSPlayer", 0, uint32_t ); + NETVAR( m_flConstraintRadius, "m_flConstraintRadius", "DT_CSPlayer", 0, float ); + + OFFSET( m_CachedBoneData, 0x28FC + sizeof( void* ), CUtlVector< matrix3x4 > ); + OFFSET( m_flSpawnTime, 0xA2C0, float ); + OFFSET( m_IKContext, 0x265c, IKContext* ); +public: + static uintptr_t get_player_resource( ); + static uintptr_t get_game_rules( ); + static bool& s_bInvalidateBoneCache( ); + static int& g_iModelBoneCounter( ); + + /*makes it much more organized: functions from IClientEntity + dont interfere with our defined functions*/ + + __forceinline IClientEntity* ce( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + __forceinline operator IClientEntity*( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + template < typename t > + __forceinline t& get( std::ptrdiff_t offset ) { + return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); + } + + __forceinline auto& get_animdata( ) { + return sm_animdata[ ce( )->GetIndex( ) ]; + } + + __forceinline bool is_alive( ) { + return m_iHealth( ) > 0 && m_lifeState( ) == LIFE_ALIVE; + } + + __forceinline void update_ik_locks( float curtime ) { + return util::get_vfunc< 186, void >( this, curtime ); + } + + __forceinline void calculate_ik_locks( float curtime ) { + return util::get_vfunc< 187, void >( this, curtime ); + } + + __forceinline void standard_blending_rules( void* hdr, vec3_t* pos, void* q, float curtime, int bone_mask ) { + return util::get_vfunc< 200, void >( this, hdr, pos, q, curtime, bone_mask ); + } + + __forceinline void build_transformations( void* hdr, vec3_t* pos, void* q, const matrix3x4& transform, int bone_mask, char* computed ) { + return util::get_vfunc< 184, void >( this, hdr, pos, q, transform, bone_mask, computed ); + } + + __forceinline bool has_valid_anim( ) { + if( m_bClientSideAnimation( ) ) + return true; + + return sm_animdata[ ce( )->GetIndex( ) ].m_valid; + } + + bool is_flashed( ); + bool is_reloading( ); + + int get_ping( ); + + __forceinline auto& m_aimPunchAngle( bool real = false ) { + static vec3_t backup_var{ }; + static auto offset = g_netvars.get_netvar( fnv( "DT_BasePlayer" ), fnv( "m_aimPunchAngle" ) ); + if( g_settings.misc.no_recoil( ) && !real ) { + backup_var = { 0.f, 0.f, 0.f }; + return backup_var; + } + + return get< vec3_t >( offset ); + } + + void set_local_view_angles( vec3_t *angle ); + bool run_physics_think( int n ); + void pre_think( ); + void think( ); + + __forceinline vec3_t get_anim_velocity( ) { + auto index = ce( )->GetIndex( ); + return sm_animdata[ index ].m_anim_velocity; + } + + __forceinline CCSGOPlayerAnimState* get_animstate( ) { + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( "DT_CSPlayer" ), + fnv( "m_bIsScoped" ) ); + + if( !offset ) { + return nullptr; + } + + return *reinterpret_cast< CCSGOPlayerAnimState** >( uintptr_t( this ) + offset - 0xa ); + } + + __forceinline void update_clientside_animation( ) { + bool backup = m_bClientSideAnimation( ); + m_bClientSideAnimation( ) = true; + util::get_vfunc< 218, void >( this ); + m_bClientSideAnimation( ) = backup; + } + + void invalidate_bone_cache( ); + + __forceinline vec3_t get_eye_pos( ) { + vec3_t yes; + //fuck references Lol + util::get_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 277 )( this, yes ); + + //thanks senator!! !11 + return yes; + } + + __forceinline bool is_player( ) { + if( !this ) + return false; + + ClientClass* client_class = ce( )->GetClientClass( ); + return client_class && client_class->m_class_id == CCSPlayer; + } + + __forceinline bool is_valid( ) { + return !!this && is_player( ) && !ce( )->IsDormant( ) && is_alive( ); + } + + bool is_fakewalking( ); + player_info_t get_info( ); + void get_name_safe( char* buf ); + c_base_weapon* get_weapon( ); + vec3_t get_hitbox_pos( int hitbox ); + vec3_t get_hitbox_mins( int hitbox ); + vec3_t get_hitbox_maxs( int hitbox ); + bool is_visible( int hitbox ); + bool can_attack( bool ignore_rapid = false ); + int get_choked_ticks( ); + float get_hitbox_radius( int hitbox ); + + void set_abs_origin( vec3_t origin ); + void set_abs_angles( vec3_t angles ); + void set_abs_velocity( vec3_t velocity ); + void calc_abs_velocity( ); + + void set_needs_interpolate( bool interp ); + void do_ent_interpolation( bool reset ); + + void invalidate_physics_recursive( int flags ); + void create_animstate( CCSGOPlayerAnimState* state ); + void setup_bones_ex( matrix3x4* matrix_out, int bone_mask, float curtime ); + int get_seq_activity( int sequence ); + + void fix_animations( bool reset = false, bool resolver_change = false ); + void validate_animation_layers( ); + void compute_move_cycle( bool reset, bool moving ); + void calculate_duckamount( bool reset ); + void cache_anim_data( bool layers = true ); + void restore_anim_data( bool layers = false ); + void handle_taser_animation( ); + void calc_anim_velocity( bool reset ); + void fix_jump_fall( bool reset ); + + bool is_breaking_lc( ); +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/c_base_weapon.cpp b/cheat/internal_rewrite/c_base_weapon.cpp new file mode 100644 index 0000000..ec6d420 --- /dev/null +++ b/cheat/internal_rewrite/c_base_weapon.cpp @@ -0,0 +1,51 @@ +#include "c_base_weapon.hpp" + +char c_base_weapon::get_hud_icon( ) { + if( is_knife( ) ) return 'J'; + + switch( m_iItemDefinitionIndex( ) ) { + case WEAPON_DEAGLE: return 'F'; + case WEAPON_ELITE: return 'S'; + case WEAPON_FIVESEVEN: return 'U'; + case WEAPON_GLOCK: return 'C'; + case WEAPON_AK47: return 'B'; + case WEAPON_AUG: return 'E'; + case WEAPON_AWP: return 'R'; + case WEAPON_FAMAS: return 'T'; + case WEAPON_G3SG1: return 'I'; + case WEAPON_GALILAR: return 'V'; + case WEAPON_M249: return 'Z'; + case WEAPON_M4A1: + case WEAPON_M4A1_SILENCER: + return 'W'; + case WEAPON_MAC10: return 'L'; + case WEAPON_P90: return 'M'; + case WEAPON_UMP45: return 'Q'; + case WEAPON_XM1014: return ']'; + case WEAPON_BIZON: return 'D'; + case WEAPON_MAG7: return 'K'; + case WEAPON_NEGEV: return 'Z'; + case WEAPON_SAWEDOFF: return 'K'; + case WEAPON_TEC9: return 'C'; + case WEAPON_TASER: return 'Y'; + case WEAPON_HKP2000: return 'Y'; + case WEAPON_MP7: return 'X'; + case WEAPON_MP9: return 'D'; + case WEAPON_NOVA: return 'K'; + case WEAPON_P250: return 'Y'; + case WEAPON_SCAR20: return 'I'; + case WEAPON_SG556: return '['; + case WEAPON_SSG08: return 'N'; + case WEAPON_FLASHBANG: return 'G'; + case WEAPON_HEGRENADE: return 'H'; + case WEAPON_SMOKEGRENADE: return 'P'; + case WEAPON_MOLOTOV: return 'H'; + case WEAPON_DECOY: return 'G'; + case WEAPON_INCGRENADE: return 'H'; + case WEAPON_C4: return '\\'; + case WEAPON_USP_SILENCER: return 'Y'; + case WEAPON_CZ75A: return 'C'; + case WEAPON_R8REVOLVER: return 'F'; + default: return 'J'; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/c_base_weapon.hpp b/cheat/internal_rewrite/c_base_weapon.hpp new file mode 100644 index 0000000..f56770e --- /dev/null +++ b/cheat/internal_rewrite/c_base_weapon.hpp @@ -0,0 +1,324 @@ +#pragma once +#include "util.hpp" +#include "IClientEntityList.hpp" +#include "netvars.hpp" + +enum ItemDefinitionIndex_t { + WEAPON_NONE, + WEAPON_DEAGLE = 1, + WEAPON_ELITE = 2, + WEAPON_FIVESEVEN = 3, + WEAPON_GLOCK = 4, + WEAPON_AK47 = 7, + WEAPON_AUG = 8, + WEAPON_AWP = 9, + WEAPON_FAMAS = 10, + WEAPON_G3SG1 = 11, + WEAPON_GALILAR = 13, + WEAPON_M249 = 14, + WEAPON_M4A1 = 16, + WEAPON_MAC10 = 17, + WEAPON_P90 = 19, + WEAPON_UMP45 = 24, + WEAPON_XM1014 = 25, + WEAPON_BIZON = 26, + WEAPON_MAG7 = 27, + WEAPON_NEGEV = 28, + WEAPON_SAWEDOFF = 29, + WEAPON_TEC9 = 30, + WEAPON_TASER = 31, + WEAPON_HKP2000 = 32, + WEAPON_MP7 = 33, + WEAPON_MP9 = 34, + WEAPON_NOVA = 35, + WEAPON_P250 = 36, + WEAPON_SCAR20 = 38, + WEAPON_SG556 = 39, + WEAPON_SSG08 = 40, + WEAPON_KNIFEGG = 41, + WEAPON_KNIFE = 42, + WEAPON_FLASHBANG = 43, + WEAPON_HEGRENADE = 44, + WEAPON_SMOKEGRENADE = 45, + WEAPON_MOLOTOV = 46, + WEAPON_DECOY = 47, + WEAPON_INCGRENADE = 48, + WEAPON_C4 = 49, + WEAPON_KNIFE_T = 59, + WEAPON_M4A1_SILENCER = 60, + WEAPON_USP_SILENCER = 61, + WEAPON_CZ75A = 63, + WEAPON_R8REVOLVER = 64, + WEAPON_KNIFE_BAYONET = 500, + WEAPON_KNIFE_FLIP = 505, + WEAPON_KNIFE_GUT = 506, + WEAPON_KNIFE_KARAMBIT = 507, + WEAPON_KNIFE_M9_BAYONET = 508, + WEAPON_KNIFE_TACTICAL = 509, + WEAPON_KNIFE_FALCHION = 512, + WEAPON_KNIFE_BOWIE = 514, + WEAPON_KNIFE_BUTTERFLY = 515, + WEAPON_KNIFE_PUSH = 516, + GLOVE_STUDDED_BLOODHOUND = 5027, + GLOVE_T_SIDE = 5028, + GLOVE_CT_SIDE = 5029, + GLOVE_SPORTY = 5030, + GLOVE_SLICK = 5031, + GLOVE_LEATHER_WRAP = 5032, + GLOVE_MOTORCYCLE = 5033, + GLOVE_SPECIALIST = 5034, + GLOVE_HYDRA = 5035, +}; + +class weapon_info_t { +public: + char pad_0000[ 4 ]; //0x0000 + char* weapon_name; //0x0004 + char pad_0008[ 12 ]; //0x0008 + int max_clip_ammo; //0x0014 + char pad_0018[ 12 ]; //0x0018 + int max_ammo; //0x0024 + char pad_0028[ 4 ]; //0x0028 + char* world_model; //0x002C + char* view_model; //0x0030 + char* dropped_model; //0x0034 + char pad_0038[ 4 ]; //0x0038 + char* N00000010; //0x003C + char pad_0040[ 56 ]; //0x0040 + char* empty_sound; //0x0078 + char pad_007C[ 4 ]; //0x007C + char* ammo_type; //0x0080 + char pad_0084[ 4 ]; //0x0084 + char* hud_name; //0x0088 + char* weapon_name2; //0x008C + char pad_0090[ 60 ]; //0x0090 + int type; + int price; //0x00CC + int kill_reward; //0x00D0 + char* anim_prefix; + float cycle_time; + float cycle_time_alt; + float time_to_idle; + float idle_interval; + + bool full_auto; //0x00E8 + char pad_00E9[ 3 ]; //0x00E9 + int damage; //0x00EC + float armor_ratio; //0x00F0 + char pad_00F4[ 4 ]; //0x00F4 + float penetration; //0x00F8 + char pad_00FC[ 8 ]; //0x00FC + float range; //0x0104 + float range_modifier; //0x0108 + float throw_velocity; + char pad_010C[ 12 ]; //0x010C + bool has_silencer; //0x011C + char pad_011D[ 15 ]; //0x011D + float max_speed; //0x012C + float max_speed_alt; //0x0130 + float spread; //0x0134 + float spread_alt; //0x0138 + float inaccuracy_crouch; //0x013C + float inaccuracy_crouch_alt; //0x0140 + float inaccuracy_stand; //0x0144 + float inaccuracy_stand_alt; //0x0148 + float inaccuracy_jump_start; //0x014C + float inaccuracy_jump; //0x0150 + float inaccuracy_jump_alt; //0x0154 + float inaccuracy_land; //0x0158 + float inaccuracy_land_alt; //0x015C + float inaccuracy_ladder; //0x0160 + float inaccuracy_ladder_alt; //0x0164 + float inaccuracy_fire; //0x0168 + float inaccuracy_fire_alt; //0x016C + float inaccuracy_move; //0x0170 + float inaccuracy_move_alt; //0x0174 + float inaccuracy_reload; //0x0178 + int recoil_seed; //0x017C + char pad_0180[ 60 ]; //0x0180 + int zoom_levels; //0x01BC + int zoom_fov1; //0x01C0 + int zoom_fov2; //0x01C4 +}; + +enum quality_t { + Default, + Geniune, + Vintage, + Unusual, + Community = 5, + Developer, + Self_Made, + Customized, + Strange, + Completed, + Tournament = 12, +}; + +class c_base_weapon { +public: + NETVAR( m_iItemDefinitionIndex, "m_iItemDefinitionIndex", "DT_BaseAttributableItem", 0, short ); + NETVAR( m_iClip1, "m_iClip1", "DT_BaseCombatWeapon", 0, int ); + NETVAR( m_flNextPrimaryAttack, "m_flNextPrimaryAttack", "DT_BaseCombatWeapon", 0, float ); + NETVAR( m_flNextSecondaryAttack, "m_flNextPrimaryAttack", "DT_BaseCombatWeapon", 4, float ); + NETVAR( m_flPostponeFireReadyTime, "m_flPostponeFireReadyTime", "DT_WeaponCSBase", 0, float ); + NETVAR( m_fThrowTime, "m_fThrowTime", "DT_BaseCSGrenade", 0, float ); + NETVAR( m_hOwner, "m_hOwner", "DT_BaseCombatWeapon", 0, uint32_t ); + NETVAR( m_bPinPulled, "m_bPinPulled", "DT_BaseCSGrenade", 0, bool ); + NETVAR( m_flThrowStrength, "m_flThrowStrength", "DT_BaseCSGrenade", 0, float ); + NETVAR( m_nModelIndex, "m_nModelIndex", "DT_BaseEntity", 0, int ); + + NETVAR( m_iViewModelIndex, "m_iViewModelIndex", "DT_BaseCombatWeapon", 0, int ); + NETVAR( m_iWorldModelIndex, "m_iWorldModelIndex", "DT_BaseCombatWeapon", 0, int ); + NETVAR( m_iWorldDroppedModelIndex, "m_iWorldDroppedModelIndex", "DT_BaseCombatWeapon", 0, int ); + NETVAR( m_hWeaponWorldModel, "m_hWeaponWorldModel", "DT_BaseCombatWeapon", 0, uint32_t ); + + NETVAR( m_iEntityQuality, "m_iEntityQuality", "DT_BaseAttributableItem", 0, int ); + NETVAR( m_iItemIDHigh, "m_iItemIDHigh", "DT_BaseAttributableItem", 0, int ); + NETVAR( m_iItemIDLow, "m_iItemIDLow", "DT_BaseAttributableItem", 0, int ); + NETVAR( m_iAccountID, "m_iAccountID", "DT_BaseAttributableItem", 0, int ); + NETVAR( m_szCustomName, "m_szCustomName", "DT_BaseAttributableItem", 0, char* ); + NETVAR( m_OriginalOwnerXuidLow, "m_OriginalOwnerXuidLow", "DT_BaseAttributableItem", 0, int ); + NETVAR( m_OriginalOwnerXuidHigh, "m_OriginalOwnerXuidHigh", "DT_BaseAttributableItem", 0, int ); + + NETVAR( m_nFallbackPaintKit, "m_nFallbackPaintKit", "DT_BaseAttributableItem" ,0, int ); + NETVAR( m_nFallbackSeed, "m_nFallbackSeed", "DT_BaseAttributableItem", 0, int ); + NETVAR( m_flFallbackWear, "m_flFallbackWear", "DT_BaseAttributableItem", 0, float ); + NETVAR( m_nFallbackStatTrak, "m_nFallbackStatTrak", "DT_BaseAttributableItem", 0, int ); + + NETVAR( m_hOwnerEntity, "m_hOwnerEntity", "DT_BaseAttributableItem", 0, uint32_t ); + NETVAR( m_flC4Blow, "m_flC4Blow", "DT_PlantedC4", 0, float ); + NETVAR( m_bBombTicking, "m_bBombTicking", "DT_PlantedC4", 0, bool ); + NETVAR( m_hBombDefuser, "m_hBombDefuser", "DT_PlantedC4", 0, uint32_t ); + NETVAR( m_bBombDefused, "m_bBombDefused", "DT_PlantedC4", 0, bool ); + NETVAR( m_flTimerLength, "m_flTimerLength", "DT_PlantedC4", 0, float ); + NETVAR( m_flDefuseLength, "m_flDefuseLength", "DT_PlantedC4", 0, float ); + NETVAR( m_flDefuseCountDown, "m_flDefuseCountDown", "DT_PlantedC4", 0, float ); + NETVAR( m_fLastShotTime, "m_fLastShotTime", "DT_WeaponCSBaseGun", 0, float ); + + __forceinline IClientEntity* ce( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + __forceinline operator IClientEntity*( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + template < typename t > + __forceinline t& get( std::ptrdiff_t offset ) { + return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); + } + + __forceinline weapon_info_t* get_wpn_info( ) { + return util::get_vfunc< 444, weapon_info_t* >( this ); + } + + __forceinline void update_accuracy_penalty( ) { + return util::get_vfunc< 468, void >( this ); + } + + __forceinline float get_spread( ) { + return util::get_vfunc< 436, float >( this ); + } + + __forceinline float get_inaccuracy( ) { + return util::get_vfunc< 467, float >( this ); + } + + __forceinline void set_glove_model( int model_index ) { + return util::get_vfunc< 75, void >( this, model_index ); + } + + bool is_pistol( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WEAPON_DEAGLE: + case WEAPON_ELITE: + case WEAPON_FIVESEVEN: + case WEAPON_GLOCK: + case WEAPON_HKP2000: + case WEAPON_P250: + case WEAPON_TEC9: + case WEAPON_USP_SILENCER: + case WEAPON_R8REVOLVER: + return true; + default: + return false; + } + } + + bool is_sniper( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WEAPON_AWP: + case WEAPON_G3SG1: + case WEAPON_SCAR20: + case WEAPON_SSG08: + return true; + default: + return false; + } + } + + bool is_knife( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WEAPON_KNIFE: + case WEAPON_KNIFE_T: + case WEAPON_KNIFEGG: + case WEAPON_KNIFE_BAYONET: + case WEAPON_KNIFE_BUTTERFLY: + case WEAPON_KNIFE_FALCHION: + case WEAPON_KNIFE_FLIP: + case WEAPON_KNIFE_GUT: + case WEAPON_KNIFE_KARAMBIT: + case WEAPON_KNIFE_M9_BAYONET: + case WEAPON_KNIFE_PUSH: + case WEAPON_KNIFE_TACTICAL: + case WEAPON_KNIFE_BOWIE: + return true; + default: + return false; + } + } + + bool is_grenade( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + case WEAPON_SMOKEGRENADE: + case WEAPON_MOLOTOV: + case WEAPON_INCGRENADE: + case WEAPON_DECOY: + return true; + default: + return false; + } + } + + bool is_shotgun( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WEAPON_NOVA: + case WEAPON_SAWEDOFF: + case WEAPON_XM1014: + case WEAPON_MAG7: + return true; + default: + return false; + } + } + + bool is_rifle( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WEAPON_AK47: + case WEAPON_AUG: + case WEAPON_FAMAS: + case WEAPON_GALILAR: + case WEAPON_SG556: + case WEAPON_M4A1: + case WEAPON_M4A1_SILENCER: + return true; + default: + return false; + } + } + + char get_hud_icon( ); +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/chams.cpp b/cheat/internal_rewrite/chams.cpp new file mode 100644 index 0000000..1d46bb2 --- /dev/null +++ b/cheat/internal_rewrite/chams.cpp @@ -0,0 +1,341 @@ +#include "chams.hpp" +#include "interface.hpp" +#include "d3d.hpp" +#include "context.hpp" +#include "hooks.hpp" + +static auto chams_mat = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white_additive" + "$ignorez" "1" + "$nofog" "1" + "$model" "1" + "$nocull" "0" + "$selfillum" "1" + "$halflambert" "1" + "$znearer" "0" + "$flat" "1" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$envmapcontrast" "1" + "$envmapsaturation" "1.0" + "$phong" "1" + "$phongexponent" "15.0" + "$normalmapalphaenvmask" "1" + "$phongboost" "6.0" + "$phongfresnelranges" "[.5 .5 1]" + "$BasemapAlphaPhongMask" "1" +})" +) ); + +static auto chams_mat_shine = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$reflectivity" "[1.0 1.0 1.0]" + "$envmapcontrast" ".4" + "$envmapsaturation" "1.0" + "$model" "1" + "$flat" "0" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +static auto chams_mat_flat = xors_raw( ( + R"("UnlitGeneric" +{ + "$basetexture" "vgui/white" + "$model" "1" + "$flat" "1" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +namespace features +{ + void c_materials::make_cham_buffer( char* buf, int len, int type ) { + switch ( type ) { + case 1: + sprintf_s( buf, len - 1, chams_mat_flat.decrypt( ) ); + break; + case 2: + sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); + break; + default: + sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); + } + } + + void c_material::init( const char* name, const char* buf ) { + m_keyvalues = new KeyValues( name ); + m_keyvalues->LoadFromBuffer( name, buf ); + + // CreateMaterial already increments ref counter + m_mat = g_csgo.m_mat_system( )->CreateMaterial( name, m_keyvalues ); + } + + void c_material::destroy( ) { + if( m_mat ) { + m_mat->DecrementReferenceCount( ); + m_mat = nullptr; + } + + if( m_keyvalues ) { + delete m_keyvalues; + m_keyvalues = nullptr; + } + } + + void c_materials::force_material( IMaterial* mat, fclr_t clr ) { + if( !mat ) return; + + float col[ ] = { clr.r( ), clr.g( ), clr.b( ) }; + g_csgo.m_render_view( )->SetBlend( clr.a( ) ); + g_csgo.m_render_view( )->SetColorModulation( col ); + + g_csgo.m_model_render( )->ForcedMaterialOverride( mat ); + } + + void c_materials::initialize_materials( ) { + char buffer[ 1024 ]; + + make_cham_buffer( buffer, sizeof( buffer ), 0 ); + m_chams.init( xors( "chamsmat" ), buffer ); + memset( buffer, 0, 1024 ); + + make_cham_buffer( buffer, sizeof( buffer ), 1 ); + m_chams_flat.init( xors( "chamsmat_flat" ), buffer ); + memset( buffer, 0, 1024 ); + m_initialized = true; + } + + void c_materials::destroy_materials( ) { + m_initialized = false; + + m_chams.destroy( ); + m_chams_flat.destroy( ); + } + + void c_materials::update_materials( ) { + if( !m_initialized ) return; + if( m_chams.m_mat->m_ref_count <= 0 ) return; + + static float last_reflectivity{ }; + static float last_shine{ }; + static float last_luminance{ }; + static KeyValues* reflectivity; + static KeyValues* shine; + static KeyValues* luminance; + + if( !reflectivity ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_iDataType != 1 ) continue; + if( strstr( it->m_sValue, xors( "[.3 .3 .3]" ) ) ) { + reflectivity = it; + } + } + } + + if( !shine ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_flValue == 6.0f ) + shine = it; + } + } + + if( !luminance ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_flValue == 15.0f ) { + luminance = it; + } + } + } + + if( reflectivity ) { + if( last_reflectivity != g_settings.visuals.chams.reflectivity( ) ) { + char buf[ 32 ]; + sprintf_s< 32 >( buf, xors( "[%1.1f %1.1f %1.1f]" ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ) ); + + strcpy( reflectivity->m_sValue, buf ); + m_chams.m_mat->Refresh( ); + } + last_reflectivity = g_settings.visuals.chams.reflectivity( ); + } + + if( shine ) { + if( last_shine != g_settings.visuals.chams.shine( ) ) { + shine->m_flValue = g_settings.visuals.chams.shine( ) * 3.f; + m_chams.m_mat->Refresh( ); + } + last_shine = g_settings.visuals.chams.shine( ); + } + + if( luminance ) { + if( last_luminance != g_settings.visuals.chams.luminance( ) ) { + if( g_settings.visuals.chams.luminance == 0.f ) + luminance->m_flValue = 0.f; + else + luminance->m_flValue = ( 1.05f - g_settings.visuals.chams.luminance( ) ) * 10.f; + m_chams.m_mat->Refresh( ); + } + last_luminance = g_settings.visuals.chams.luminance( ); + } + } + + void c_chams::d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { + static auto d3d_draw = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); + + int team = ent->m_iTeamNum( ); + clr_t visible_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_visible_friendly( ) : g_settings.visuals.chams.color_visible_enemy( ); + clr_t hidden_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_hidden_friendly( ) : g_settings.visuals.chams.color_hidden_enemy( ); + + if( team == g_ctx.m_local->m_iTeamNum( ) && !g_settings.visuals.chams.friendlies ) + return; + + fclr_t fcol_vis = visible_col.to_fclr( ); + float value_vis[ 4 ] = { fcol_vis.r( ), fcol_vis.g( ), fcol_vis.b( ), fcol_vis.a( ) }; + + fclr_t fcol_hid = hidden_col.to_fclr( ); + float value_hid[ 4 ] = { fcol_hid.r( ), fcol_hid.g( ), fcol_hid.b( ), fcol_hid.a( ) }; + + float def[ 4 ] = { 1.f, 1.f, 1.f, 1.f }; + + IDirect3DBaseTexture9* prev_texture; + IDirect3DSurface9* prev_surface; + ulong_t z_enable; + + g_d3d.get_device( )->GetTexture( 0, &prev_texture ); + g_d3d.get_device( )->GetRenderTarget( 0, &prev_surface ); + g_d3d.get_device( )->GetRenderState( D3DRS_ZENABLE, &z_enable ); + + auto hr = g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); + + //printf( "hr: %08x\n", hr ); + + if( g_settings.visuals.chams.ignore_z ) { + g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, false ); + g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); + g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_hid, 1 ); + //g_d3d.get_device( )->SetTexture( 0, nullptr ); + d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); + } + + g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); + g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); + g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_vis, 1 ); + //g_d3d.get_device( )->SetTexture( 0, nullptr ); + + d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); + + g_d3d.get_device( )->SetPixelShaderConstantF( 0, def, 1 ); + g_d3d.get_device( )->SetPixelShaderConstantF( 1, def, 1 ); + g_d3d.get_device( )->SetRenderTarget( 0, prev_surface ); + g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); + + g_d3d.get_device( )->SetTexture( 0, prev_texture ); + + if( prev_texture ) + prev_texture->Release( ); + + if( prev_surface ) + prev_surface->Release( ); + } + + void c_chams::d3d_render_textures( ) { + if( !g_d3d.m_sil_txt ) + return; + + IDirect3DSurface9* backbuffer; + D3DSURFACE_DESC desc; + + g_d3d.get_device( )->GetRenderTarget( 0, &backbuffer ); + backbuffer->GetDesc( &desc ); + //backbuffer->Release( ); + + struct tex_vertex { + float x, y, z, r, h, w; + }; + + tex_vertex v[ ] = { + { 0.f, 0.f, 0.f, 1.0f, 0.f, 0.f }, + { ( float )desc.Width, 0.f, 0.f, 1.0f, 1.0f, 0.f }, + { 0.f, ( float )desc.Height, 0.f, 1.0f, 0.0f, 1.0f }, + { ( float )desc.Width, ( float )desc.Height, 0.f, 1.0f, 1.0f, 1.0f } + }; + + void* p; + + g_d3d.m_buffer->Lock( 0, 0, &p, 0 ); + memcpy( p, v, sizeof( v ) ); + g_d3d.m_buffer->Unlock( ); + + void* pixel_shader; + void* texture; + void* stream_src; + uint32_t stride; + uint32_t offset; + ulong_t fvf; + ulong_t dest_blend; + ulong_t alpha_blend; + + g_d3d.get_device( )->GetPixelShader( ( IDirect3DPixelShader9** )&pixel_shader ); + g_d3d.get_device( )->GetTexture( 0, ( IDirect3DBaseTexture9** )&texture ); + g_d3d.get_device( )->GetStreamSource( 0, ( IDirect3DVertexBuffer9** )&stream_src, &offset, &stride ); + g_d3d.get_device( )->GetFVF( &fvf ); + g_d3d.get_device( )->GetRenderState( D3DRS_DESTBLEND, &dest_blend ); + g_d3d.get_device( )->GetRenderState( D3DRS_ALPHABLENDENABLE, &alpha_blend ); + + g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); + g_d3d.get_device( )->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); + g_d3d.get_device( )->SetPixelShader( nullptr ); + g_d3d.get_device( )->SetTexture( 0, g_d3d.m_sil_txt ); + g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); + + g_d3d.get_device( )->SetStreamSource( 0, g_d3d.m_buffer, 0, sizeof( tex_vertex ) ); + g_d3d.get_device( )->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); + + //D3DXSaveSurfaceToFileA( "backbuffer_1.bmp", D3DXIFF_BMP, backbuffer, 0, 0 ); + //D3DXSaveSurfaceToFileA( "backbuffer_2.bmp", D3DXIFF_BMP, g_d3d.m_surface, 0, 0 ); + + + D3DRECT bar_rect{ }; + D3DCOLOR col{ }; + + bar_rect.x1 = 0; + bar_rect.y1 = 0; + bar_rect.x2 = desc.Width; + bar_rect.y2 = desc.Height; + + g_d3d.get_device( )->SetPixelShader( ( IDirect3DPixelShader9* )pixel_shader ); + g_d3d.get_device( )->SetTexture( 0, ( IDirect3DTexture9* )texture ); + g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, dest_blend ); + g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, alpha_blend ); + g_d3d.get_device( )->SetStreamSource( 0, ( IDirect3DVertexBuffer9* )stream_src, offset, stride ); + g_d3d.get_device( )->SetFVF( fvf ); + + //g_d3d.get_device( )->Clear( 1, &bar_rect, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, col, 0, 0 ); + g_d3d.get_device( )->SetRenderTarget( 0, backbuffer ); + backbuffer->Release( ); + + + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/chams.hpp b/cheat/internal_rewrite/chams.hpp new file mode 100644 index 0000000..d7eb023 --- /dev/null +++ b/cheat/internal_rewrite/chams.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "sdk.hpp" + +namespace features +{ + enum ChamBufferType_t { + TYPE_NORMAL, + TYPE_FLAT, + TYPE_SHINE + }; + + class c_material { + public: + c_material( ) = default; + + void init( const char* mat, const char* buf ); + void destroy( ); + + operator IMaterial*( ) { + return m_mat; + } + + public: + IMaterial* m_mat; + KeyValues* m_keyvalues; + }; + + class c_materials { + public: + c_material m_chams{ }; + c_material m_chams_flat{ }; + + void make_cham_buffer( char* buf, int len, int type ); //type, 0 = normal, 1 = flat, 2 = shine + public: + void initialize_materials( ); + void destroy_materials( ); + void force_material( IMaterial* material, fclr_t color ); + void update_materials( ); + bool m_initialized{ }; + }; + + class c_chams { + public: + c_materials m_materials; + void d3d_render_textures( ); + void d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ); + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/color.hpp b/cheat/internal_rewrite/color.hpp new file mode 100644 index 0000000..5ffd2a0 --- /dev/null +++ b/cheat/internal_rewrite/color.hpp @@ -0,0 +1,278 @@ +#pragma once +#include +#include + +//this is a fucking mess + +class fclr_t { + float R, G, B, A; +public: + fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } + + fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + float& r( ) { return R; } + float& g( ) { return G; } + float& b( ) { return B; } + float& a( ) { return A; } + + fclr_t& operator =( fclr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + fclr_t operator+( const fclr_t& v ) const { + return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + bool operator==( fclr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; + +class clr_t { + uint8_t R, G, B, A; +public: + clr_t( ) = default; + + clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + uint8_t& r( ) { return R; } + uint8_t& g( ) { return G; } + uint8_t& b( ) { return B; } + uint8_t& a( ) { return A; } + + clr_t& operator =( clr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + clr_t operator+( const clr_t& v ) const { + return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + clr_t operator*( float f ) { + return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + float brightness( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast( G - B ) / delta; + else if ( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.v; + } + + float saturation( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast( G - B ) / delta; + else if ( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.s; + } + + static clr_t from_hsb( float hue, float saturation, float brightness ) { + float h = hue == 1.0f ? 0 : hue * 6.0f; + float f = h - ( int )h; + float p = brightness * ( 1.0f - saturation ); + float q = brightness * ( 1.0f - saturation * f ); + float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); + + if ( h < 1 ) { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if ( h < 2 ) { + return clr_t( + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if ( h < 3 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ) + ); + } + else if ( h < 4 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else if ( h < 5 ) { + return clr_t( + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ) + ); + } + } + + static clr_t blend( clr_t first, clr_t second, float t ) { + return clr_t( + first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), + first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), + first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), + first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) + ); + } + + float hue( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + float min, max, delta; + + min = static_cast< float >( R < G ? R : G ); + min = static_cast< float >( min < B ? min : B ); + + max = static_cast< float >( R > G ? R : G ); + max = static_cast< float >( max > B ? max : B ); + + out.v = max; + delta = max - min; + if ( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if ( max > 0.0f ) { + out.s = ( delta / max ); + } + else { + out.s = 0.0f; + out.h = ( float )NAN; + return out.h; + } + if ( R >= max ) + out.h = static_cast< float >( G - B ) / delta; + else + if ( G >= max ) + out.h = 2.0f + static_cast< float >( B - R ) / delta; + else + out.h = 4.0f + static_cast< float >( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if ( out.h < 0.0f ) + out.h += 360.0f; + + return out.h; + } + + fclr_t to_fclr( ) { + return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; + } + + operator fclr_t( ) { + return this->to_fclr( ); + } + + bool operator==( clr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/con_alias.hpp b/cheat/internal_rewrite/con_alias.hpp new file mode 100644 index 0000000..62812f1 --- /dev/null +++ b/cheat/internal_rewrite/con_alias.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include +#include "simple_settings.hpp" + +template< typename var_type = bool > +class con_alias : public ISetting { +public: + con_alias( hash_t hash, con_var< var_type >* var ) : + m_var( var ), + m_value( var_type{ } ), + m_name( hash ), + m_is_var( true ) { }; + + con_alias( hash_t hash ) : + m_name( hash ), + m_value( 0 ), + m_var( nullptr ), + m_is_var( false ) { }; + + con_alias( hash_t hash, var_type&& rhs ) : + m_name( hash ), + m_value( rhs ), + m_var( nullptr ), + m_is_var( false ) { }; + + virtual std::string get_string( ) override { + if( m_is_var ) + return m_var->get_string( ); + else + return std::to_string( m_value ); + } + + virtual void set_value( int value ) override { + set_value_internal( value ); + } + + virtual void set_value( float value ) override { + set_value_internal( value ); + } + + virtual void set_value( ulong_t value ) override { + set_value_internal( value ); + } + +private: + template < typename t > + void set_value_internal( t&& val ) { + if( m_is_var ) + m_var->set( val ); + else + m_value = ( var_type )( val ); + } + +private: + bool m_is_var; + hash_t m_name; + var_type m_value; + con_var< var_type >* m_var; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/con_fn.hpp b/cheat/internal_rewrite/con_fn.hpp new file mode 100644 index 0000000..c71cc08 --- /dev/null +++ b/cheat/internal_rewrite/con_fn.hpp @@ -0,0 +1,172 @@ +#pragma once +#include + +#include "simple_settings.hpp" + +//KEEP THIS UP TO DATE!! +enum ConFnVarType_t { + TYPE_NULL = 0, + TYPE_FLOAT = 'F', + TYPE_STRING = 'S', + TYPE_INTEGER = 'D', + TYPE_HEX = 'X' +}; + +class con_fn_base { +public: + virtual bool execute( const char* str ) = 0; + virtual const char* get_syntax( ) = 0; + virtual hash_t get_hash( ) = 0; +}; + +class con_fn : public con_fn_base { +public: + con_fn( hash_t hash, std::function< void __cdecl( const char*, const char* ) > function, const char* syntax ) { + m_hash = hash; + m_function = function; + strcpy_s< 64 >( m_syntax, syntax ); + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + m_args++; + } + } + } + + static ConFnVarType_t get_var_type( size_t arg, const char* syntax ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( syntax ); ++i ) { + if( syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + template < typename t > + static t get_arg( const char* str, size_t arg_index, const char* syntax ) { + auto arg_type = get_var_type( arg_index, syntax ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + if( cur_arg++ == arg_index ) { + size_t start = i + 1; + size_t end = strlen( str ); + for( size_t i2 = start; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + break; + } + } + + std::string str( str + start, end - start ); + + char* end_ptr = ( char* )str.c_str( ) + end; + if constexpr( std::is_integral_v< t > ) { + auto radix = get_var_type( arg_index, syntax ) == TYPE_HEX ? 16 : 10; + return std::strtol( str.c_str( ), &end_ptr, radix ); + } + + if constexpr( std::is_floating_point_v< t > ) { + return std::strtof( str.c_str( ), &end_ptr ); + } + + return ( t )str.c_str( ); + } + } + } + + return t{ }; + } + + virtual const char* get_syntax( ) override { + return m_syntax; + } + + virtual hash_t get_hash( ) override { + return m_hash; + } + + ConFnVarType_t get_var_type( size_t arg ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( m_syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + //returns false on failed execution + virtual bool execute( const char* str ) override { + size_t arg_count{ }; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + arg_count++; + } + } + + if( arg_count != m_args ) { + return false; + } + + std::string pass_str( " " ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + size_t end = strlen( str ); + for( size_t i2 = i + 2; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + } + } + + char* end_ptr = ( char* )( str + i + end ); + switch( get_var_type( cur_arg ) ) { + case TYPE_FLOAT: { + pass_str += std::to_string( strtof( str + i, &end_ptr ) ); + break; + } + case TYPE_INTEGER: { + pass_str += std::to_string( strtol( str + i, &end_ptr, 10 ) ); + break; + } + case TYPE_HEX: { + char buf[ 10 ]; + sprintf_s< 10 >( buf, "%08x", strtol( str + i, &end_ptr, 16 ) ); + pass_str += buf; + break; + } + case TYPE_STRING: { + std::string add_str( str + i, end - i ); + pass_str += add_str; + break; + } + default: + return false; + } + + if( end != strlen( str ) ) { + pass_str += ' '; + } + ++cur_arg; + } + } + + m_function( pass_str.c_str( ), m_syntax ); + return true; + } + +private: + hash_t m_hash{ }; + size_t m_args{ }; + char m_syntax[ 64 ]{ }; + std::function< void( __cdecl )( const char*, const char* ) > m_function{ }; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/console.cpp b/cheat/internal_rewrite/console.cpp new file mode 100644 index 0000000..d922af3 --- /dev/null +++ b/cheat/internal_rewrite/console.cpp @@ -0,0 +1,324 @@ +#include "console.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "d3d.hpp" +#include "ui_draw.h" + +std::shared_ptr< console > g_con = std::make_shared< console >( ); + + +void console::draw_text( int x, int y, bool greyed, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, "%s", buf ); + //g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_text( int x, int y, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_rect( int x, int y, int w, int h, clr_t col ) { + g_d3d.draw_filled_rect( col, x, y, w, h ); +} + +void console::register_alias( std::shared_ptr< ISetting >& alias ) { + m_aliases.push_back( alias ); +} + +void console::capture_command( ) { + float current_time = GetTickCount( ) * 0.001f; + size_t length = strlen( m_cur_cmd ); + + for( size_t i{ }; i < 0xfe; ++i ) { + if( m_input->is_key_pressed( i ) ) { + float delta_time = current_time - m_last_key_input[ i ]; + if( fabs( delta_time ) > 0.2f ) { + if( i == KEYS_BACK ) { + m_cur_cmd[ length - 1 ] = 0; + m_last_key_input[ i ] = current_time; + continue; + } + + m_key_states[ i ] = 0xf0; + wchar_t pressed_char; + const auto scan = MapVirtualKeyA( i, 2 ); + auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); + + if( ret == 1 ) { + if( length < 200 ) { + m_cur_cmd[ length ] = ( char )( pressed_char ); + m_cur_cmd[ length + 1 ] = 0; + } + } + m_last_key_input[ i ] = current_time; + } + } + else { + m_last_key_input[ i ] = 0.f; + m_key_states[ i ] = 0; + } + } +} + +ISetting* console::find_var( hash_t var ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + if( var == setting->get_hash( ) ) { + return setting; + } + } + + return nullptr; +} + +ISetting* console::find_alias( hash_t alias ) { + for( auto& it : m_aliases ) { + if( it->get_hash( ) == alias ) + return it.get( ); + } + + return nullptr; +} + +con_fn_base* console::find_fn( hash_t name ) { + for( auto& it : m_functions ) { + if( it->get_hash( ) == name ) { + return it; + } + } + + return nullptr; +} + +std::string console::impl_alias_str( std::string str ) { + for( size_t i{ }; i < str.length( ); ++i ) { + if( str[ i ] == ' ' && str[ i + 1 ] != ' ' ) { + size_t end = 0; + for( size_t i2{ i + 1 }; i2 < str.length( ); ++i ) { + if( str[ i2 ] == ' ' ) + end = i2; + } + + if( end ) { + std::string alias_str( str.c_str( ) + i, end - i ); + auto alias = find_alias( hash::fnv1a( alias_str ) ); + if( alias ) { + str.replace( alias_str.begin( ), alias_str.end( ), alias->get_string( ) ); + } + else { + g_con->log( xors( "couldnt find alias %s" ), alias_str.c_str( ) ); + } + } + } + } + + return str; +} + +void console::execute_command( const char* cmd ) { + if( !cmd[ 0 ] ) return; + std::string first_param( cmd, strlen( cmd ) ); + + size_t end{ }; + bool one_arg = true; + for( size_t i{ }; i < strlen( cmd ); ++i ) { + if( cmd[ i ] == ' ' ) { + first_param.resize( i ); + end = i; + one_arg = false; + break; + } + } + + if( one_arg ) { + first_param.resize( first_param.length( ) - 1 ); + } + + //find a command to execute + auto fn = find_fn( hash::fnv1a( first_param ) ); + if( fn ) { + //std::string alias_cmd = impl_alias_str( cmd ); + + if( !fn->execute( cmd ) ) { + log( xors( "invalid syntax" ) ); + } + return; + } + + //command not found, we're managing vars + if( !one_arg ) { + std::string second_param = ( cmd + end + 1 ); + bool is_floating_point = second_param.find( '.' ) != std::string::npos; + auto var = find_var( hash::fnv1a( first_param ) ); + + if( var ) { + auto setting_cast = static_cast< con_var< void* >* >( var ); + if( !setting_cast->is_integral( ) && !setting_cast->is_floating_point( ) ) { + auto value = std::strtol( second_param.c_str( ), 0, 16 ); + printf( xors( "value: %08x\n" ), value ); + var->set( value ); + } + + if( is_floating_point ) { + float value = std::strtof( second_param.c_str( ), 0 ); + var->set( value ); + } + else { + int value = std::strtol( second_param.c_str( ), 0, 10 ); + var->set( value ); + } + log( xors( "%s %s\n" ), first_param.c_str( ), second_param.c_str( ) ); + return; + } + } + + + log( xors( "unknown command: %s" ), first_param.c_str( ) ); +} + +void console::input( ) { + static int drag_x, drag_y; + int cursor_x, cursor_y; + int x = m_x, y = m_y; + bool clicked = m_input->is_key_pressed( KEYS_MOUSE1 ); + static bool is_hovered{ }; + m_input->get_cursor_pos( cursor_x, cursor_y ); + + auto is_top_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + TOP_HEIGHT; + }; + + auto is_window_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + HEIGHT; + }; + + auto is_bottom_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y + HEIGHT - TOP_HEIGHT + && cursor_y < y + HEIGHT; + }; + + if( clicked ) { + //m_consuming_input = is_window_hovered( ); + } + + if( !clicked && is_top_hovered( ) ) { + drag_x = cursor_x - m_x; + drag_y = cursor_y - m_y; + } + + if( clicked && is_hovered ) { + is_hovered = true; + m_x = cursor_x - drag_x; + m_y = cursor_y - drag_y; + } + else { + is_hovered = is_top_hovered( ); + } + + if( clicked ) { + m_active = is_bottom_hovered( ); + } + + if( m_active ) { + capture_command( ); + + static bool was_held{ }; + if( m_input->is_key_pressed( KEYS_RETURN ) ) { + if( !was_held ) { + execute_command( m_cur_cmd ); + m_cur_cmd[ 0 ] = 0; + } + was_held = true; + } + else was_held = false; + } +} + +void console::draw( ) { + if( !m_open ) { + m_consuming_input = false; + m_active = false; + return; + } + + static clr_t col = clr_t( 31, 31, 31, 255 ); + + input( ); + + RECT prev_rect{ }; + RECT new_rect{ m_x - 1, m_y - 1, + m_x + WIDTH + 1, m_y + HEIGHT + 1 }; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_rect( m_x - 1, m_y - 1, WIDTH + 2, HEIGHT + 2, ui::ui_get_accent_col( ) ); + draw_rect( m_x, m_y, WIDTH, HEIGHT, col ); + draw_rect( m_x + 1, m_y, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + + draw_rect( m_x + 1, m_y + HEIGHT - TOP_HEIGHT, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + if( m_active ) { + draw_rect( m_x + 2, m_y + HEIGHT - TOP_HEIGHT + 1, WIDTH - 4, TOP_HEIGHT - 2, clr_t( 31, 31, 31 ) ); + auto fn = find_fn( hash::fnv1a( m_cur_cmd ) ); + if( fn ) { + std::string fn_str = m_cur_cmd; + fn_str += ' '; + fn_str += fn->get_syntax( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, "%s", fn_str.c_str( ) ); + } + + else { + auto var = find_var( hash::fnv1a( m_cur_cmd ) ); + if( var ) { + std::string var_str = m_cur_cmd; + var_str += ' '; + + var_str += var->get_string( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, var_str.c_str( ) ); + } + } + } + + std::string cur_cmd_str = m_cur_cmd; + if( m_active ) { + cur_cmd_str += '_'; + } + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, cur_cmd_str.c_str( ) ); + draw_text( m_x + 3, m_y + TOP_HEIGHT / 2 - 3, xors( "console" ) ); + + int cur_y = m_y + HEIGHT - TOP_HEIGHT; + for( int i = m_logs.size( ) - 1; i >= 0; --i ) { + constexpr int LINE_HEIGHT = 14; + auto& log = m_logs.at( i ); + + if( cur_y - LINE_HEIGHT < m_y + TOP_HEIGHT ) { + m_logs.erase( m_logs.begin( ) + i ); + continue; + } + + draw_text( m_x + 2, cur_y -= LINE_HEIGHT, log.m_msg ); + } + + g_d3d.get_device( )->SetScissorRect( &prev_rect ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/console.hpp b/cheat/internal_rewrite/console.hpp new file mode 100644 index 0000000..5226607 --- /dev/null +++ b/cheat/internal_rewrite/console.hpp @@ -0,0 +1,125 @@ +#pragma once +#include +#include +#include +#include + +#include "con_fn.hpp" +#include "con_alias.hpp" +#include "input_system.hpp" +#include "math.hpp" + +#pragma warning(disable: 4996) + +class console { +public: + console( ) { + m_input = std::make_shared< util::c_input_manager >( ); + } + + static constexpr size_t TOP_HEIGHT = 22; + static constexpr size_t WIDTH = 400; + static constexpr size_t HEIGHT = 450; + + bool m_consuming_input{ }; + bool m_active{ }; + bool m_open{ }; + + struct con_log { + float m_time; + char m_msg[ 128 ]; + }; + + void draw_text( int x, int y, bool greyed, const char* msg, ... ); + void draw_text( int x, int y, const char* msg, ... ); + void draw_rect( int x, int y, int w, int h, clr_t col ); + void register_fn( con_fn_base* fn ) { m_functions.push_back( fn ); } + + void input( ); + void draw( ); + + auto& get_input( ) { + return m_input; + } + + void log( const char* fmt, ... ) { + va_list args; + char buf[ 128 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 128 >( buf, fmt, args ); + __crt_va_end( args ); + + con_log log; + log.m_time = ( float )GetTickCount( ) * 0.001f; + memcpy( log.m_msg, buf, 128 ); + + print( "%s\n", buf ); + + m_logs.push_back( log ); + } + + void print( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); + } + + void create( ) { +#ifdef _DEBUG + AllocConsole( ); + freopen( xors( "CONOUT$" ), "w", stdout ); + const char* hack_names[ ] = { + xors( "dunk hack" ), + xors( "dweeb dumpster" ), + xors( "nova killER" ), + xors( "moms credit card" ), + xors( "dad hook" ), + xors( "retard remover" ), + xors( "slam hook" ), + xors( "swoosh" ), + xors( "retard remover" ), + xors( "shotgun hack" ), + }; + + SetConsoleTitleA( hack_names[ math::random_number( 0, 9 ) ] ); +#endif + game_console_print = reinterpret_cast< msg_t >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); + } + + void destroy( ) { +#ifdef _DEBUG + FreeConsole( ); + fclose( stdout ); +#endif + } + + std::vector< con_log > m_logs; + std::vector< con_fn_base* > m_functions; + std::vector< std::shared_ptr< ISetting > > m_aliases; + + void register_alias( std::shared_ptr< ISetting >& alias ); + + using msg_t = void( __cdecl* )( const char*, ... ); + msg_t game_console_print; + +private: + ISetting* find_var( hash_t name ); + ISetting* find_alias( hash_t name ); + + std::string impl_alias_str( std::string str ); + + con_fn_base* find_fn( hash_t name ); + void capture_command( ); + void execute_command( const char* cmd ); + + int m_x{ 100 }, m_y{ 100 }; + + char m_cur_cmd[ 200 ]{ }; + uint8_t m_key_states[ 256 ]{ }; + float m_last_key_input[ 256 ]{ }; + std::shared_ptr< util::c_input_manager > m_input; +}; + +extern std::shared_ptr< console > g_con; \ No newline at end of file diff --git a/cheat/internal_rewrite/context.cpp b/cheat/internal_rewrite/context.cpp new file mode 100644 index 0000000..26af64c --- /dev/null +++ b/cheat/internal_rewrite/context.cpp @@ -0,0 +1,212 @@ +#include "context.hpp" +#include "console.hpp" +#include "hooks.hpp" +#include "base_cheat.hpp" + +context::c_context g_ctx; + +NAMESPACE_REGION( context ) + +bool c_context::run_frame( ) { + m_local = g_csgo.m_entlist( )->GetClientEntity< >( + g_csgo.m_engine( )->GetLocalPlayer( ) ); + + return !!m_local; +} + +void c_context::on_cmove_end( user_cmd_t* cmd ) { + if( g_settings.menu.anti_untrusted ) + cmd->clamp( ); + + auto send = g_cheat.m_lagmgr.get_state( ); + + if( send ) { + m_last_fakeangle = cmd->m_viewangles; + + m_last_origin = m_local->m_vecOrigin( ); + } + else { + m_last_realangle = cmd->m_viewangles; + //m_last_realangle.x = m_last_fakeangle.x; + } + + if( g_cheat.m_lagmgr.get_choked( ) == 1 ) { + m_thirdperson_angle = m_last_realangle; + } + + m_thirdperson_angle.x = std::clamp( cmd->m_viewangles.x, -89.f, 89.f ); + if( g_cheat.m_lagmgr.get_sent( ) > 1 ) { + m_thirdperson_angle.y = m_last_fakeangle.y; + } + + //auto anim_state = g_cheat.m_ragebot.m_antiaim->get_animstate( ); + + + if( ( cmd->m_buttons & IN_ATTACK ) && m_local->can_attack( ) ) { + auto weap = m_local->get_weapon( ); + if( !weap->is_knife( ) && weap->m_iItemDefinitionIndex( ) != WEAPON_TASER && !weap->is_grenade( ) ) { + if( !m_has_incremented_shots && !m_has_fired_this_frame ) { + shot_data_t new_shot{ }; + new_shot.m_angle = cmd->m_viewangles; + new_shot.m_local_pos = m_local->get_eye_pos( ); + + m_last_shot++; + m_last_shot %= 128; + m_shot_data[ m_last_shot ] = new_shot; + + m_has_incremented_shots = true; + } + + m_has_fired_this_frame = true; + } + } + + auto wep = m_local->get_weapon( ); + if( wep ) { + weapon_info_t* wpn_info = m_local->get_weapon( )->get_wpn_info( ); + if( wpn_info && m_has_fired_this_frame ) + m_local->get_weapon( )->m_flNextPrimaryAttack( ) += wpn_info->cycle_time; + } + + if( g_settings.misc.log_hits( ) ) { + for( auto& it : m_shot_data ) { + if( !it.m_enemy_index ) + continue; + + if( !it.m_handled ) + break; + + if( !it.m_logged ) { + char print_str[ 100 ]{ 0 }; + memset( print_str, 0, 100 ); + + if( it.m_hit ) { + player_info_t info; + if( !g_csgo.m_engine( )->GetPlayerInfo( it.m_enemy_index, &info ) ) + continue; + + char name[ 32 ]; + auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_enemy_index ); + + ent->get_name_safe( name ); + + strenc::w_sprintf_s( print_str, 100, "[\3moneybot\1] hit %s in %s for %d\0", name, util::hitgroup_to_string( it.m_hit ).c_str( ), it.m_damage ); + } + else if( it.m_missed ) + strenc::w_sprintf_s( print_str, 100, "[\3moneybot\1] missed shot due to spread\0" ); + + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, print_str ); + g_con->game_console_print( "%s\n", print_str ); + } + + it.m_logged = true; + } + } + + static float last_shot = 0.f; + if( m_has_fired_this_frame ) + last_shot = g_csgo.m_globals->m_curtime; + else if( auto weapon = g_ctx.m_local->get_weapon( ) ) { + float fire_rate = weapon->get_wpn_info( )->cycle_time; + float tolerance = util::get_total_latency( ) * 2.f + fire_rate + TICK_INTERVAL( ); + if( std::abs( last_shot - g_csgo.m_globals->m_curtime ) > tolerance ) { + reset_shot_queue( ); + last_shot = g_csgo.m_globals->m_curtime; + } + } + + + m_has_incremented_shots = false; + if( std::abs( m_last_shot - m_last_shot_ack ) >= 10 ) + reset_shot_queue( ); + + *get_last_cmd( ) = *cmd; +} + +void c_context::reset_shot_queue( ) { + auto last_shot = m_shot_data[ m_last_shot ]; + m_last_shot = m_last_shot_ack = 0; + m_shot_data = { }; + m_shot_data[ 0 ] = last_shot; +} + +//predicted servertime of player, use this for breaking lby etc +float c_context::pred_time( ) { + calculate_tickbase( ); + + return m_tickbase * g_csgo.m_globals->m_interval_per_tick; +} + +//calculate tickbase depending on whether last ucmd was predicted +bool c_context::calculate_tickbase( ) { + if ( !m_local ) { + return false; + } + + //get current tickbase + auto player_tickbase = m_local->m_nTickBase( ); + + //disabled due to our engine pred being shit + m_tickbase = player_tickbase; + return true; + + if ( m_snapshot.empty( ) ) { + m_tickbase = player_tickbase; + return false; + } + + //if cmd wasnt predicted increment tickbase + auto snap_cmd = &m_snapshot.front( ); + if ( !snap_cmd->m_predicted ) { + if ( !m_tickbase ) { + m_tickbase = player_tickbase; + } + + m_tickbase++; + snap_cmd->m_predicted = true; + } + else { + m_tickbase = player_tickbase; + } + + return true; +} + +bool c_context::precache_model( const char* model ) { + + auto cache_table = g_csgo.m_string_table( )->FindTable( "modelprecache" ); + + if( !cache_table ) + return true; + + g_csgo.m_model_info( )->FindOrLoadModel( model ); + + int string_index = cache_table->AddString( false, model ); + + if( string_index == -1 ) + return false; + + return true; +} + +//save snapshots of usercommands +bool c_context::create_snapshot( user_cmd_t* ucmd ) { + user_cmd_t ucmd_copy; + + while ( m_snapshot.size( ) >= 64 ) { + m_snapshot.pop_back( ); + } + + if ( !ucmd ) { + return false; + } + + memcpy( &ucmd_copy, + ucmd, + sizeof( ucmd_copy ) ); + + m_snapshot.push_front( ucmd_copy ); + return true; +} + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/context.hpp b/cheat/internal_rewrite/context.hpp new file mode 100644 index 0000000..27f1a42 --- /dev/null +++ b/cheat/internal_rewrite/context.hpp @@ -0,0 +1,85 @@ +#pragma once +#include + +#include "util.hpp" +#include "sdk.hpp" + +NAMESPACE_REGION( context ) + +struct shot_data_t { + vec3_t m_local_pos; + vec3_t m_angle; + vec3_t m_enemy_pos; + int m_enemy_index; + int m_resolver_shots; + bool m_resolver_state; + bool m_missed{ false }; + struct { + vec3_t min; + vec3_t max; + float radius; + } m_hitbox; + int m_hitgroup; + bool m_handled{ }; + int m_hit{ }; + int m_damage{ }; + bool m_logged{ }; + matrix3x4 m_matrix[ 128 ]; +}; + +//replacement to the old global:: namespace +class c_context { +public: + //run localplayer check, pointer, is valid etc + bool run_frame( ); + float pred_time( ); + + void on_cmove_end( user_cmd_t* cmd ); + bool create_snapshot( user_cmd_t* ); + //calculate accurate tickbase + bool calculate_tickbase( ); + + user_cmd_t* get_last_cmd( ) { + return m_snapshot.empty( ) ? nullptr : &m_snapshot.front( ); + } + + bool precache_model( const char* model ); + +public: + c_base_player* m_local{ }; + int m_stage{ }; + //accurate tickbase + int m_tickbase{ }; + + bool m_revolver_shot{ }; + + bool m_drawing_postscreenspace{ }; + bool m_has_incremented_shots{ }; + bool m_drawing_screneend{ }; + float m_weapon_spread{ }; + float m_weapon_inaccuracy{ }; + + bool m_has_fired_this_frame{ }; + + float m_absyaw{ }; + vec3_t m_last_realangle{ }; + vec3_t m_last_fakeangle{ }; + vec3_t m_thirdperson_angle{ }; + vec3_t m_last_origin{ }; + + float m_fov{ 90.f }; +public: + void reset_shot_queue( ); + + int m_last_shot_ack; + int m_last_shot; + + std::array< shot_data_t, 128 > m_shot_data; + std::vector< int > m_cmd_numbers; +private: + std::deque< user_cmd_t > m_snapshot; +}; + +END_REGION + +extern context::c_context g_ctx; \ No newline at end of file diff --git a/cheat/internal_rewrite/create_move.cpp b/cheat/internal_rewrite/create_move.cpp new file mode 100644 index 0000000..a59930e --- /dev/null +++ b/cheat/internal_rewrite/create_move.cpp @@ -0,0 +1,137 @@ +#include + +#include "hooks.hpp" +#include "mem.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "input_system.hpp" +#include "math.hpp" + +#include "base_cheat.hpp" + +/* +void __declspec( naked ) __stdcall hooks::hl_create_move_gate( int sequence_number, float input_sample_time, bool active ) { + __asm { + push ebp + mov ebp, esp + push ebx //push ebx (sendpacket) to the top of the stack + push esp //push the stack (with sendpacket on top) + push active + push input_sample_time + push sequence_number + call hl_create_move + pop ebx + pop ebp + ret 0xc + } +} +*/ + +bool __fastcall hooks::create_move( void* ecx_, void* edx_, float input_sample_frametime, user_cmd_t* ucmd ) { + stack_t stack( get_baseptr( ) ); + byte* send_packet = stack.next( ).local< byte* >( 0x1c ); + + bool ret = create_move_o( ecx_, edx_, input_sample_frametime, ucmd ); + + if( !ucmd->m_tick_count || !ucmd->m_cmd_nr ) + return ret; + + // when switching to non automatic weapons, it will sometimes not shoot when aimbotting so we reset attack flag + bool is_switching_weapon = false; + if( g_csgo.m_input( )->m_hSelectedWeapon != -1 ) { + is_switching_weapon = true; + } + + if( ret ) + g_csgo.m_engine( )->SetViewAngles( ucmd->m_viewangles ); + + // FIX ME NAVE + // ok love + // yes thank u + + g_ctx.create_snapshot( ucmd ); + g_cheat.m_extra.update_netchannel( ); + g_cheat.m_identity( ); + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + static int last_frame = g_csgo.m_globals->m_framecount; + if( last_frame != g_csgo.m_globals->m_framecount ) + g_ctx.m_has_fired_this_frame = false; + + last_frame = g_csgo.m_globals->m_framecount; + + g_cheat.m_legitbot.sample_angle_data( ucmd->m_viewangles ); + + // u forgot to put this back in the right place after u removed + // my epic engine prediction that set seed to the player ptr + g_cheat.m_prediction.run_command(ucmd); + g_cheat.m_movement( ucmd ); + + //SUPER SECRET EXPLOIT DO NOT LEAK + if( g_settings.misc.no_crouch_cooldown ) + ucmd->m_buttons |= IN_BULLRUSH; + + g_cheat.m_extra.auto_revolver( ucmd ); + + g_cheat.m_legitbot.m_lagcomp( ucmd ); + g_cheat.m_legitbot.triggerbot( ucmd ); + + g_cheat.m_lagmgr( ucmd, send_packet ); + + g_cheat.m_visuals.update_hit_flags( ); + + g_cheat.m_ragebot( ucmd ); + + g_cheat.m_extra.no_recoil( ucmd ); + + g_cheat.m_move_rec( ucmd ); + + g_cheat.m_visuals.radar( ); + + g_cheat.m_extra.rank_reveal( ucmd ); + + if( g_cheat.m_lagmgr.get_choked( ) > 16 ) { + g_cheat.m_lagmgr.set_state( true ); + } + + vec3_t real_angle = g_ctx.m_thirdperson_angle; + + g_cheat.m_lagmgr.on_cmove_end( ); + g_ctx.on_cmove_end( ucmd ); + + auto cl = g_csgo.m_global_state->get_client_state( ); + if( g_cheat.m_lagmgr.get_state( ) ) { + g_ctx.m_cmd_numbers.push_back( ucmd->m_cmd_nr ); + } + else { + int choked = cl->m_netchannel->m_nChokedPackets; + //printf( "choked: %d\n", choked ); + + cl->m_netchannel->m_nChokedPackets = 0; + + send_datagram_o( cl->m_netchannel, 0, 0 ); + + cl->m_netchannel->m_nOutSequenceNr--; + cl->m_netchannel->m_nChokedPackets = choked; + } + + g_cheat.m_ragebot.m_antiaim->on_runcommand( ); + + + } + else { + g_ctx.reset_shot_queue( ); + } + + if( is_switching_weapon ) { + ucmd->m_buttons &= ~IN_ATTACK; + } + + //m_bIsValveDS + //if( *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ) + //g_settings.menu.anti_untrusted = true; + + ucmd->clamp( g_settings.menu.anti_untrusted ); + + return false; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/csm_shadows.cpp b/cheat/internal_rewrite/csm_shadows.cpp new file mode 100644 index 0000000..b0aa5ed --- /dev/null +++ b/cheat/internal_rewrite/csm_shadows.cpp @@ -0,0 +1,10 @@ +#include "hooks.hpp" + +int __fastcall hooks::cl_csm_shadows_get_int( void* ecx_, void* edx_ ) { + static auto old_fn = g_csgo.m_csm_shadows->get_old_function< decltype( &cl_csm_shadows_get_int ) >( 13 ); + + if( g_settings.visuals.no_cascade_shadows ) + return 0; + + return old_fn( ecx_, edx_ ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/d3d.cpp b/cheat/internal_rewrite/d3d.cpp new file mode 100644 index 0000000..e807776 --- /dev/null +++ b/cheat/internal_rewrite/d3d.cpp @@ -0,0 +1,387 @@ +#include "d3d.hpp" +#include "interface.hpp" +#include "math.hpp" +#include "d3d_sprite.hpp" + +d3d::c_renderer g_d3d; +d3d::d3d_fonts_t d3d::fonts; + + +//theres shit still left to add like drawrect etc but thats really simple +//this is the base and it works so thats ok +//love +// - nave + +// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) +// DrawPrimitiveUP for each object will slow stuff down eventually +// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else + +namespace d3d +{ + void d3d_fonts_t::release( ) { + if( f_12 ) f_12->Release( ); + if( f_esp_small ) f_esp_small->Release( ); + if( f_16 ) f_16->Release( ); + if( f_18 ) f_18->Release( ); + if( f_menu ) f_menu->Release( ); + if( f_con ) f_con->Release( ); + + f_12 = f_esp_small = f_16 = f_18 = f_menu = f_con = nullptr; + } + + void d3d_fonts_t::create( IDirect3DDevice9* device ) { + auto create_font = [ & ]( ID3DXFont** font, const char* font_name, int width, int size, int weight ) { + //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); + + auto code = D3DXCreateFontA( device, size, width, weight, 0, false, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); + + if( code < 0 ) throw xors( "fuck d3d" ); + }; + + create_font( &f_12, +#ifndef COMIC_SANS + xors( "Tahoma" ) +#else + xors( "Comic Sans MS" ) +#endif + , 0, 12, 0 ); //change this idc + create_font( &f_esp_small, xors( "Tahoma" ), 0, 11, 500 ); + create_font( &f_16, xors( "Verdana" ), 0, 16, 0 ); + create_font( &f_18, xors( "Verdana" ), 0, 24, 700 ); + create_font( &f_menu, +#ifndef COMIC_SANS + xors( "Tahoma" ) +#else + xors( "Comic Sans MS" ) +#endif + , 0, 12, +#ifndef COMIC_SANS + 300 +#else + 600 +#endif + ); + create_font( &f_con, xors( "Consolas" ), 6, 12, 300 ); + } + + + c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { + create_objects( ); + } + + bool c_renderer::run_frame( IDirect3DDevice9* device ) { + if( g_csgo.m_panic ) { + return false; + } + + if( !m_device ) { + m_device = device; + create_objects( ); + return false; + } + + return true; + } + + c_renderer::~c_renderer( ) { + if( !m_device ) + return; + + invalidate_objects( ); + } + + void c_renderer::on_device_lost( ) { + if( !m_device ) + return; + + invalidate_objects( ); + } + + void c_renderer::on_device_reset( ) { + if( !m_device ) + return; + + create_objects( ); + } + + void c_renderer::invalidate_objects( ) { + if( m_block ) m_block->Release( ); + fonts.release( ); + //m_buffer->Release( ); + //m_sil_txt->Release( ); + //m_surface->Release( ); + } + + void c_renderer::create_objects( ) { + D3DVIEWPORT9 viewport; + + if( !m_device ) return; + + if( m_device->GetViewport( &viewport ) < 0 ) { + return; + } + + if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { + return; + } + + if( !m_block ) { + return; + } + + // get display size. + m_width = viewport.Width; + m_height = viewport.Height; + + fonts.create( m_device ); + + /*IDirect3DSurface9* backbuffer; + D3DSURFACE_DESC desc; + + m_device->GetRenderTarget( 0, &backbuffer ); + backbuffer->GetDesc( &desc ); + backbuffer->Release( ); + + m_device->CreateTexture( desc.Width, desc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_sil_txt, 0 ); + m_sil_txt->GetSurfaceLevel( 0, &m_surface ); + + m_device->CreateVertexBuffer( 4 * 24, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &m_buffer, nullptr );*/ + } + + void c_renderer::begin( ) { + if( !m_device ) return; + + D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; + + m_device->SetViewport( &vp ); + + //m_sil_txt->GetSurfaceLevel( 0, &m_surface ); + + m_block->Capture( ); + + // set vertex stream declaration. + m_device->SetVertexShader( nullptr ); + m_device->SetPixelShader( nullptr ); + m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); + + m_device->SetRenderState( D3DRS_LIGHTING, false ); + m_device->SetRenderState( D3DRS_FOGENABLE, false ); + m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + + m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); + m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); + m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_STENCILENABLE, false ); + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); + + m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); + m_device->SetRenderState( D3DRS_ALPHATESTENABLE, false ); + m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); + + m_device->SetTexture( 0, nullptr ); + m_device->SetTexture( 1, nullptr ); + m_device->SetTexture( 2, nullptr ); + m_device->SetTexture( 3, nullptr ); + + m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); + m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); + m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); + m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); + + m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); + /* commented out until further notice */ + //m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + //m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + // todo - dex; if we use textures, need to set those rendering states too + } + + void c_renderer::end( ) { + //m_device->SetTexture( 0, nullptr ); + //m_device->SetTexture( 1, nullptr ); + //m_device->SetTexture( 2, nullptr ); + //m_device->SetTexture( 3, nullptr ); + m_block->Apply( ); + //m_block->Release( ); + } + + void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { + d3d_vertex_t v[ 2 ] = { + d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why + d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) + }; //edit: do we wanna use z for shit? i mean we could for like menu stuff + //so it renders above other stuff + + m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); + } + + void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 5 ] = { + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); + } + + void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 6 ] = { + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); + } + + void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { + d3d_vertex_t v[ 4 ]; + + switch( type ) { + case GRADIENT_VERTICAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + case GRADIENT_HORIZONTAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + } + + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { + constexpr float PI = 3.1415926f; + const float step = PI * 2.0f / float( res ); + + int point_x = x + r, + point_y = y - r, + point_x_o{ }, + point_y_o{ }; + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + for( int i{ }; i <= res; i++ ) { + float theta = float( i ) * step; + + point_x = x + ( int )( r * cos( theta ) ); + point_y = y - ( int )( r * sin( theta ) ); + if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); + point_x_o = point_x; + point_y_o = point_y; + } + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { + d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + + v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; + } + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_text( ID3DXFont* font, clr_t color, + int x, int y, FontAlign_t align, long font_flags, const char* msg ) { + if( !msg ) return; + if( !font ) return; + + auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); + auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); + auto buf = msg; + + if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; + if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); + RECT rect{ x, y, 1000, 100 }; + + ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; + + if( font_flags & D3DFONTFLAG_DROPSHADOW ) { + RECT r{ rect }; + r.left++; + r.top++; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + + if( font_flags & D3DFONTFLAG_OUTLINE ) { + for( int i = -1; i < 2; i++ ) { + if( !i ) continue; + RECT r{ rect }; + r.left += i; + r.top += i; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + } + + font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); + } + + int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.right - temp.left ); + } + + int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.bottom - temp.top ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/d3d.hpp b/cheat/internal_rewrite/d3d.hpp new file mode 100644 index 0000000..36babe2 --- /dev/null +++ b/cheat/internal_rewrite/d3d.hpp @@ -0,0 +1,129 @@ +#ifndef D3D_HEADER //stackoverflow my niggas +#define D3D_HEADER + +#include +#include + +#pragma comment(lib, "d3d9.lib") +#pragma comment(lib, "d3dx9.lib") +#pragma warning(disable : 4838) + +#include +#include + +#include +#pragma comment(lib, "dwmapi.lib") + +#include "util.hpp" +#include "color.hpp" +#include "renderer.hpp" + +enum D3DFontFlags_t { + D3DFONTFLAG_OUTLINE = 0x10, + D3DFONTFLAG_DROPSHADOW = 0x100, +}; + +enum GradientType_t { + GRADIENT_HORIZONTAL, + GRADIENT_VERTICAL +}; + +namespace features { class c_chams; } + +//suck my dick +namespace d3d +{ + struct d3d_vertex_t { + d3d_vertex_t( float x, float y, float z, clr_t color ) : + m_x( x ), m_y( y ), m_z( z ), + m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; + + d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), + m_clr( 0 ) { }; + + float m_x; + float m_y; + float m_z; + float m_rhw = 1.f; + D3DCOLOR m_clr; + }; + + constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); + + struct d3d_fonts_t { + void release( ); + void create( IDirect3DDevice9* device ); + + ID3DXFont* f_12; + ID3DXFont* f_esp_small; + ID3DXFont* f_16; + ID3DXFont* f_18; + ID3DXFont* f_menu; + ID3DXFont* f_con; + }; + + class c_renderer { + private: + friend class features::c_chams; + + IDirect3DDevice9* m_device; + IDirect3DStateBlock9* m_block; + IDirect3DTexture9* m_chams; + IDirect3DTexture9* m_sil_txt; + IDirect3DVertexBuffer9* m_buffer; + IDirect3DSurface9* m_surface; + public: + ulong_t m_width; + ulong_t m_height; + + c_renderer( ) { }; + c_renderer( IDirect3DDevice9* device ); + ~c_renderer( ); + + void on_device_lost( ); + void on_device_reset( ); + auto get_device( ) { + return m_device; + } + + bool run_frame( IDirect3DDevice9* device ); + void begin( ); + void end( ); + + void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); + void draw_rect( clr_t color, int x, int y, int w, int h ); + void draw_filled_rect( clr_t color, int x, int y, int w, int h ); + void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); + + void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); + + template < FontAlign_t align = ALIGN_CENTER > + void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + draw_text( font, color, x, y, align, font_flags, buffer ); + } + + int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); + int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); + + private: + void invalidate_objects( ); + void create_objects( ); + }; + + extern d3d::d3d_fonts_t fonts; +} + +extern d3d::c_renderer g_d3d; + +#endif \ No newline at end of file diff --git a/cheat/internal_rewrite/d3d_sprite.cpp b/cheat/internal_rewrite/d3d_sprite.cpp new file mode 100644 index 0000000..8c26c37 --- /dev/null +++ b/cheat/internal_rewrite/d3d_sprite.cpp @@ -0,0 +1,12 @@ +#include "d3d_sprite.hpp" + +std::vector< d3d::c_sprite* > d3d::sprites; + +namespace icons +{ + d3d::c_sprite sprite_legit; + d3d::c_sprite sprite_rage; + d3d::c_sprite sprite_visuals; + d3d::c_sprite sprite_misc; + d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/d3d_sprite.hpp b/cheat/internal_rewrite/d3d_sprite.hpp new file mode 100644 index 0000000..3cf46a6 --- /dev/null +++ b/cheat/internal_rewrite/d3d_sprite.hpp @@ -0,0 +1,158 @@ +#pragma once +#include "d3d.hpp" +#include "console.hpp" + + +namespace d3d +{ + class c_sprite; + + extern std::vector< c_sprite* > sprites; + + class c_sprite { + public: + size_t m_width{ }; + size_t m_height{ }; + + IDirect3DDevice9* m_device{ }; + ID3DXSprite* m_sprite{ }; + IDirect3DTexture9* m_texture{ }; + const byte* m_image{ }; + size_t m_image_size{ }; + + + public: + c_sprite::c_sprite( ) { + sprites.push_back( this ); + } + + c_sprite::~c_sprite( ) { + on_reset( ); + } + + void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { + m_width = width; + m_height = height; + + m_device = device; + m_image = file; + m_image_size = img_size; + } + + void begin( IDirect3DDevice9* device ) { + m_device = device; + + if( !m_device ) { + return; + } + + if( !m_sprite ) + D3DXCreateSprite( m_device, &m_sprite ); + + if( !m_texture ) { + auto hr = D3DXCreateTextureFromFileInMemoryEx( + m_device, m_image, m_image_size, + m_width, m_height, D3DX_DEFAULT, 0, D3DFMT_A8B8G8R8, + D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, + 0, 0, &m_texture ); + } + + if( m_sprite ) + m_sprite->Begin( D3DXSPRITE_DONOTMODIFY_RENDERSTATE ); + } + + void end( ) { + if( !m_device || !m_sprite || !m_texture ) return; + m_sprite->End( ); + } + + void on_reset( ) { + if( m_sprite && m_device && m_texture ) { + m_sprite->OnLostDevice( ); + m_texture->Release( ); + m_texture = nullptr; + } + } + + void on_reset_end( ) { + if( m_sprite && m_device ) + m_sprite->OnResetDevice( ); + } + + void draw( int x, int y, clr_t color ) { + if( !m_device || !m_texture || !m_sprite ) { + return; + } + + const float scale = 0.8f; + + ulong_t + fill_mode, + adaptive_tess, + dest_blend, + cull, + stencil, + vertex_blend, + alpha_test; + + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, &fill_mode ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, &adaptive_tess ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, &dest_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, &cull ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, &stencil ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, &vertex_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, &alpha_test ); + + ulong_t mag_filter; + ulong_t min_filter; + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, &mag_filter ); + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, &min_filter ); + + m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC ); + m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, D3DFILL_SOLID ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, D3DLINECAPS_ALPHACMP ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, D3DMULTISAMPLE_4_SAMPLES ); + + + ulong_t hr; + D3DXVECTOR2 center = D3DXVECTOR2( ( m_width * scale ) * 0.5f, ( m_height * scale ) * 0.5f ); + D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); + D3DXMATRIX matrix; + D3DXVECTOR2 scale_vec( scale, scale ); + D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale_vec, ¢er, 0.f, &trans ); + + hr = m_sprite->SetTransform( &matrix ); + + auto d3dcolor = D3DCOLOR_RGBA( color.r( ), + color.g( ), color.b( ), color.a( ) ); + hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, fill_mode ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, adaptive_tess ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, dest_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, cull ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, stencil ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, vertex_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, alpha_test ); + + m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, mag_filter ); + } + }; +} + +namespace icons +{ + extern d3d::c_sprite sprite_legit; + extern d3d::c_sprite sprite_rage; + extern d3d::c_sprite sprite_visuals; + extern d3d::c_sprite sprite_misc; + extern d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/debug_show_spread.cpp b/cheat/internal_rewrite/debug_show_spread.cpp new file mode 100644 index 0000000..54da769 --- /dev/null +++ b/cheat/internal_rewrite/debug_show_spread.cpp @@ -0,0 +1,17 @@ +#include "hooks.hpp" +#include "context.hpp" + +int __fastcall hooks::debug_show_spread_get_int( void* ecx_, void* edx_ ) { + static auto original_fn = g_csgo.m_debug_show_spread->get_old_function< decltype( &debug_show_spread_get_int ) >( 13 ); + + if( !g_settings.visuals.snipers_crosshair || !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) || g_ctx.m_local->m_bIsScoped( ) ) { + return original_fn( ecx_, 0 ); + } + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon || !weapon->is_sniper( ) ) { + return original_fn( ecx_, 0 ); + } + + return 3; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/detours.cpp b/cheat/internal_rewrite/detours.cpp new file mode 100644 index 0000000..a12520c --- /dev/null +++ b/cheat/internal_rewrite/detours.cpp @@ -0,0 +1,292 @@ +#include "detours.h" +#include "hde32.h" + +// very MUCH comment i APPRECIATE cool + +memory::c_detours memory::detours; + +__forceinline static bool is_code_padding( uintptr_t address, size_t size ) +{ + uint8_t* code_ptr = (uint8_t*)address; + + if ( code_ptr[0] != 0x00 && code_ptr[0] != 0x90 && code_ptr[0] != 0xCC ) + return false; + + for ( int i = 1; i < size; ++i ) + { + if ( code_ptr[i] != code_ptr[0] ) + return false; + } + + return true; +} + +bool memory::c_detours::create_trampoline( detour_hook_t* hook ) +{ + if ( !hook->allocate_trampoline( ) ) + return false; + + instructions::long_jump_t call = { + 0xE8, + 0x00000000 + }; + + instructions::long_jump_t jmp = { + 0xE9, + 0x00000000 + }; + + instructions::JCC_REL jcc = { + 0x0F, 0x80, + 0x00000000 + }; + + uint8_t old_position = 0; + uint8_t new_position = 0; + uintptr_t jmp_dest = 0; + bool finished = false; + + hook->short_patch = false; + + const int max_instruction_boundaries = 8; + int instruction_boundaries = 0; + + do + { + hde32s hs; + uint8_t copy_size; + uintptr_t copy_src; + uintptr_t old_instruction = hook->m_original + old_position; + uintptr_t new_instruction = hook->m_trampoline + new_position; + + copy_size = hde32_disasm( (void*)old_instruction, &hs ); + if ( hs.flags & F_ERROR ) + return false; + + copy_src = old_instruction; + if ( old_position >= sizeof( instructions::long_jump_t ) ) + { + // the trampoline function is long enough. + // complete the function with the jump to the target function. + + jmp.opcode = 0xE9; + jmp.operand = (uint32_t)( old_instruction - ( new_instruction + sizeof( instructions::long_jump_t ) ) ); + copy_src = uintptr_t( &jmp ); + copy_size = sizeof( jmp ); + + finished = true; + } + else if ( hs.opcode == 0xE8 ) + { + // direct relative CALL + uintptr_t dest = old_instruction + hs.len + (int32_t)hs.imm.imm32; + + call.opcode = 0xE8; + call.operand = (uint32_t)( dest - ( new_instruction + sizeof( instructions::long_jump_t ) ) ); + + copy_src = uintptr_t( &call ); + copy_size = sizeof( call ); + } + else if ( ( hs.opcode & 0xFD ) == 0xE9 ) + { + // direct relative JMP (EB or E9) + uintptr_t dest = old_instruction + hs.len; + + if ( hs.opcode == 0xEB ) // short jmp + dest += (int8_t)hs.imm.imm8; + else + dest += (int32_t)hs.imm.imm32; + + // simply copy an internal jump. + if ( hook->m_original <= dest && dest < hook->m_original + sizeof( instructions::long_jump_t ) ) + { + if ( jmp_dest < dest ) + jmp_dest = dest; + } + else + { + jmp.operand = (uint32_t)( dest - ( new_instruction + sizeof( instructions::long_jump_t ) ) ); + + copy_src = uintptr_t( &jmp ); + copy_size = sizeof( instructions::long_jump_t ); + + // exit the function if it is not in the branch + finished = ( old_instruction >= jmp_dest ); + } + } + else if ( ( hs.opcode & 0xF0 ) == 0x70 || ( hs.opcode & 0xFC ) == 0xE0 || ( hs.opcode2 & 0xF0 ) == 0x80 ) + { + // direct relative JCC + uintptr_t dest = old_instruction + hs.len; + + if ( ( hs.opcode & 0xF0 ) == 0x70 // JCC + || ( hs.opcode & 0xFC ) == 0xE0 ) // LOOPNZ/LOOPZ/LOOP/JECXZ + dest += (int8_t)hs.imm.imm8; + else + dest += (int32_t)hs.imm.imm32; + + // simply copy an internal jump. + if ( (uintptr_t)hook->m_original <= dest && dest < ( (uintptr_t)hook->m_original + sizeof( instructions::long_jump_t ) ) ) + { + if ( jmp_dest < dest ) + jmp_dest = dest; + } + else if ( ( hs.opcode & 0xFC ) == 0xE0 ) + { + // LOOPNZ/LOOPZ/LOOP/JCXZ/JECXZ to the outside are not supported. + return false; + } + else + { + uint8_t cond = ( ( hs.opcode != 0x0F ? hs.opcode : hs.opcode2 ) & 0x0F ); + + jcc.opcode1 = 0x80 | cond; + jcc.operand = (uint32_t)( dest - ( new_instruction + sizeof( jcc ) ) ); + + copy_src = uintptr_t( &jcc ); + copy_size = sizeof( jcc ); + } + } + else if ( ( hs.opcode & 0xFE ) == 0xC2 ) + { + // RET (C2 or C3) + + // complete the function if not in a branch. + finished = ( old_instruction >= jmp_dest ); + } + + // can't alter the instruction length in a branch. + if ( old_instruction < jmp_dest && copy_size != hs.len ) + return false; + + // trampoline function is too large. + if ( new_position + copy_size > MEMORY_SLOT_SIZE ) + return false; + + // trampoline function has too many instructions. + if ( instruction_boundaries >= max_instruction_boundaries ) + return false; + + instruction_boundaries++; + + memcpy( (void*)( hook->m_trampoline + new_position ), (void*)copy_src, copy_size ); + + new_position += copy_size; + old_position += hs.len; + } + while ( !finished ); + + // can we do a regular 5 byte jmp patch? + if ( old_position < sizeof( instructions::long_jump_t ) && !is_code_padding( (uintptr_t)hook->m_original + old_position, sizeof( instructions::long_jump_t ) - old_position ) ) + { + // can we put 2 byte jmp patch? + if ( old_position < sizeof( instructions::short_jump_t ) && !is_code_padding( (uintptr_t)hook->m_original + old_position, sizeof( instructions::short_jump_t ) - old_position ) ) + return false; + + // can we put a 5 byte jmp patch above it? + if ( !is_code_padding( (uintptr_t)hook->m_original - sizeof( instructions::long_jump_t ), sizeof( instructions::long_jump_t ) ) ) + return false; + + hook->short_patch = true; + } + + return true; +} + +bool memory::c_detours::set_hook( detour_hook_t* hook, bool enable ) +{ + // hook is already in place silly + if ( hook->enabled == enable ) + return true; + + if ( enable ) + { + if ( hook->short_patch ) + { + uint8_t* target = (uint8_t*)( hook->m_original - sizeof( instructions::long_jump_t ) ); + + // prepare patch + instructions::short_patch_t jmp_patch; + jmp_patch.jmp.opcode = 0xE9; + jmp_patch.jmp.operand = (uint32_t)( hook->m_custom - hook->m_original - sizeof( instructions::long_jump_t ) ); + + jmp_patch.jmp_short.opcode = 0xEB; + jmp_patch.jmp_short.operand = (uint8_t)( 0 - sizeof( instructions::short_patch_t ) ); + + // overwrite protection + DWORD original_protection; + VirtualProtect( target, sizeof( instructions::short_patch_t ), PAGE_EXECUTE_READWRITE, &original_protection ); + + // place hook + memcpy( target, &jmp_patch, sizeof( instructions::short_patch_t ) ); + + // restore protection + VirtualProtect( target, sizeof( instructions::short_patch_t ), original_protection, &original_protection ); + + // let cpu know we altered code + FlushInstructionCache( GetCurrentProcess( ), target, sizeof( instructions::short_patch_t ) ); + } + else + { + // prepare patch + instructions::long_jump_t jmp_patch; + jmp_patch.opcode = 0xE9; + jmp_patch.operand = (uint32_t)( hook->m_custom - hook->m_original - sizeof( instructions::long_jump_t ) ); + + // overwrite protection + DWORD original_protection; + VirtualProtect( (void*)hook->m_original, sizeof( instructions::long_jump_t ), PAGE_EXECUTE_READWRITE, &original_protection ); + + // place hook + memcpy( (void*)hook->m_original, &jmp_patch, sizeof( instructions::long_jump_t ) ); + + // restore protection + VirtualProtect( (void*)hook->m_original, sizeof( instructions::long_jump_t ), original_protection, &original_protection ); + + // let cpu know we altered code + FlushInstructionCache( GetCurrentProcess( ), (void*)hook->m_original, sizeof( instructions::long_jump_t ) ); + } + + + } + else + { + if ( hook->short_patch ) + { + uint8_t* target = (uint8_t*)( hook->m_original - sizeof( instructions::long_jump_t ) ); + + // overwrite protection + DWORD original_protection; + VirtualProtect( target, sizeof( instructions::short_patch_t ), PAGE_EXECUTE_READWRITE, &original_protection ); + + // restore backup + memcpy( target, hook->m_original_bytes, sizeof( instructions::short_patch_t ) ); + + // restore protection + VirtualProtect( target, sizeof( instructions::short_patch_t ), original_protection, &original_protection ); + + // let cpu know we altered code + FlushInstructionCache( GetCurrentProcess( ), target, sizeof( instructions::short_patch_t ) ); + } + else + { + uint8_t* target = (uint8_t*)hook->m_original; + + // overwrite protection + DWORD original_protection; + VirtualProtect( target, sizeof( instructions::long_jump_t ), PAGE_EXECUTE_READWRITE, &original_protection ); + + // restore backup + memcpy( target, hook->m_original_bytes, sizeof( instructions::long_jump_t ) ); + + // restore protection + VirtualProtect( target, sizeof( instructions::long_jump_t ), original_protection, &original_protection ); + + // let cpu know we altered code + FlushInstructionCache( GetCurrentProcess( ), target, sizeof( instructions::long_jump_t ) ); + } + } + + hook->enabled = enable; + return true; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/detours.h b/cheat/internal_rewrite/detours.h new file mode 100644 index 0000000..d4998b5 --- /dev/null +++ b/cheat/internal_rewrite/detours.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include + +#define MEMORY_SLOT_SIZE 64 + +namespace memory +{ + namespace instructions + { +// we're dealing with opcodes, align by 1 byte +#pragma pack(push, 1) + struct short_jump_t + { + uint8_t opcode{ }; + uint8_t operand{ }; + }; + + struct long_jump_t + { + uint8_t opcode{ }; + uint32_t operand{ }; + }; + + struct short_patch_t + { + long_jump_t jmp{ }; + short_jump_t jmp_short{ }; + }; + + struct JCC_REL + { + uint8_t opcode0{ }; + uint8_t opcode1{ }; + uint32_t operand{ }; + }; +#pragma pack(pop) + } + + struct detour_hook_t + { + bool enabled{ }; + bool short_patch{ }; + + uintptr_t m_original{ }; + uintptr_t m_custom{ }; + uintptr_t m_trampoline{ }; + + uint8_t m_original_bytes[8]{ }; + + bool allocate_trampoline( ) + { + if ( m_trampoline ) + return false; + + m_trampoline = (uintptr_t)VirtualAlloc( nullptr, MEMORY_SLOT_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE ); + memset( (void*)m_trampoline, 0, MEMORY_SLOT_SIZE ); + + return m_trampoline; + } + + void restore( ) + { + if ( m_trampoline ) + { + VirtualFree( (void*)m_trampoline, MEMORY_SLOT_SIZE, MEM_RELEASE ); + m_trampoline = 0; + } + } + }; + + class c_detours + { + std::vector m_hooks; + + static bool create_trampoline( detour_hook_t* hook ); + + detour_hook_t* find_hook( uintptr_t custom_func ) + { + detour_hook_t* hook = nullptr; + + for ( auto& m_hook : m_hooks ) + { + if ( m_hook.m_custom == custom_func ) + { + return &m_hook; + } + } + + return nullptr; + } + + bool set_hook( detour_hook_t* hook, bool enable ); + + bool set_hook( uintptr_t custom_func, bool enable ) + { + detour_hook_t* hook = find_hook( custom_func ); + + if ( hook ) + return set_hook( hook, enable ); + + return false; + } + + public: + + template < typename fn = uintptr_t > + fn create_hook( fn custom_func, void* original_func ) + { + detour_hook_t hook; + hook.m_original = uintptr_t( original_func ); + hook.m_custom = intptr_t( custom_func ); + + if ( create_trampoline( &hook ) ) + { + if ( hook.short_patch ) + memcpy( hook.m_original_bytes, (void*)( hook.m_original - sizeof( instructions::long_jump_t ) ), sizeof( instructions::short_patch_t ) ); + else + memcpy( hook.m_original_bytes, (void*)( hook.m_original ), sizeof( instructions::long_jump_t ) ); + +#ifdef _DEBUG + printf( " $> prepared hook [ original: 0x%08x ] [ custom: 0x%08x ] [ short jmp: %d ] \n", uintptr_t( original_func ), uintptr_t( custom_func ), hook.short_patch ); +#endif + + m_hooks.push_back( hook ); + return (fn)hook.m_trampoline; + } +#ifdef _DEBUG + printf( " $> FAILED TO HOOK [ original: 0x%08x ] [ custom: hook 0x%08x ] \n", uintptr_t( original_func ), uintptr_t( custom_func ) ); +#endif + return (fn)0; + } + + void enable( ) + { + for ( auto& hook : m_hooks ) + set_hook( &hook, true ); + } + + void restore( ) + { + for ( auto& hook : m_hooks ) + { + set_hook( &hook, false ); + hook.restore( ); + } + + m_hooks.clear( ); + } + + template < typename fn = uintptr_t > + fn original( void* custom_func ) + { + auto hook = find_hook( (uintptr_t)custom_func ); + + if ( hook ) + return (fn)hook->m_trampoline; + + return (fn)0; + } + }; extern c_detours detours; +} + diff --git a/cheat/internal_rewrite/directx.cpp b/cheat/internal_rewrite/directx.cpp new file mode 100644 index 0000000..fa40fb3 --- /dev/null +++ b/cheat/internal_rewrite/directx.cpp @@ -0,0 +1,256 @@ +#include +#include + +#include "settings.hpp" +#include "hooks.hpp" +#include "ui.h" +#include "base_cheat.hpp" +#include "context.hpp" +#include "mem.hpp" + +using namespace d3d; + +float ui::get_csgo_frametime( ) { + return g_csgo.m_frametime; +} + +float ui::anim_time; + +void on_d3d( IDirect3DDevice9* device ) { + constexpr float step = 1.0f / 2.f; + constexpr float fade_step = 1.0f / 7.f; + static float anim_time{ }; + static bool flip{ }; + static int anim_progress{ }; + + static bool sprites_init{ }; + if( !sprites_init ) { + ui::setup_sprites( device ); + sprites_init = true; + } + + if( g_settings.misc.hide_from_obs ) + g_cheat.m_visuals( ); + + if( g_settings.menu.open ) { + if( anim_time >= 0.95f ) { + flip = true; + } + if( anim_time <= 0.05f ) { + flip = false; + } + + if( flip ) + anim_time -= fade_step * ui::ui_get_frametime( ); + else + anim_time += fade_step * ui::ui_get_frametime( ); + + anim_time = std::clamp( anim_time, 0.f, 1.0f ); + + ui::set_animtime( anim_time ); + + anim_progress += ui::ui_get_frametime( ) * step * 255; + anim_progress = std::clamp( anim_progress, 0, 50 ); + g_d3d.draw_filled_rect( clr_t( 0, 0, 0, anim_progress ), + 0, 0, g_d3d.m_width, g_d3d.m_height ); + + ui::render( ); + } + else { + anim_progress = 0; + } +} + +long __stdcall hooks::d3d::draw( IDirect3DDevice9* device, D3DPRIMITIVETYPE type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { + return 0; + /*static auto draw_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); + + static auto ret_addr = pattern::first_code_match( GetModuleHandleA( xors( "studiorender.dll" ) ), xors( "EB 1F FF 75 F0" ), -8 ); + + std::function< void*( void** ) > find_ent; + find_ent = [ & ]( void** ebp ) -> void* { + if( !ebp ) + return nullptr; + + void** next = *( void*** )( ebp ); + if( ( uintptr_t )( ebp[ 1 ] ) == ret_addr ) + return next[ 4 ]; + + return find_ent( next ); + }; + + c_base_player* ent = ( c_base_player* )( find_ent( ( void** )( get_baseptr( ) ) ) ); + if( g_ctx.m_local && !!ent && ent->m_iHealth( ) > 0 && ent->m_iTeamNum( ) > 1 && g_settings.visuals.chams.enabled( ) && g_settings.misc.hide_from_obs ) { + g_cheat.m_chams.d3d_render_chams( ent, type, v_index, min_index, num_vert, start_index, prim_count ); + return true; + } + + auto result = draw_o( device, type, v_index, min_index, num_vert, start_index, prim_count ); + return result;*/ +} + +long __stdcall hooks::d3d::end_scene( IDirect3DDevice9* device ) { + static auto end_scene_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::end_scene ) >( 42 ); + if ( g_csgo.m_panic ) return end_scene_o( device ); + + static uintptr_t return_address = 0; + static uintptr_t gameoverlay_return_address = 0; + + g_csgo.m_d3d_thread = std::this_thread::get_id( ); + + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( !gameoverlay_return_address ) { + MEMORY_BASIC_INFORMATION info; + VirtualQuery( _ReturnAddress( ), &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + char mod[ MAX_PATH ]; + GetModuleFileNameA( ( HMODULE )info.AllocationBase, mod, MAX_PATH ); + + if( strstr( mod, xors( "gameoverlay" ) ) ) + gameoverlay_return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( return_address != ( uintptr_t )( _ReturnAddress( ) ) && !g_settings.misc.hide_from_obs ) + return end_scene_o( device ); + + if( gameoverlay_return_address != ( uintptr_t )( _ReturnAddress( ) ) && g_settings.misc.hide_from_obs ) + return end_scene_o( device ); + + if( !g_csgo.m_panic && g_d3d.run_frame( device ) ) { + for( auto& it : ::d3d::sprites ) + it->begin( device ); + g_d3d.begin( ); + + //if( g_settings.misc.hide_from_obs ) + //g_cheat.m_chams.d3d_render_textures( ); + + on_d3d( device ); + + std::chrono::high_resolution_clock timer; + static auto last = timer.now( ); + auto now = timer.now( ); + + std::chrono::duration< double > delta = now - last; + last = timer.now( ); + + g_csgo.m_frametime = delta.count( ); + + if( !g_con->m_logs.empty( ) && g_settings.menu.logs_enable ) { + auto& logs = g_con->m_logs; + float time = ( float )GetTickCount( ) * 0.001f; + + auto data = logs.data( ); + + int cur_pos = 2; + for( int i = logs.size( ) - 1; i >= 0; --i ) { + if( cur_pos > g_d3d.m_height - 200 ) { + cur_pos -= 8; + break; + } + + float delta = time - data[ i ].m_time; + if( delta >= 5.0f ) { + break; + } + + clr_t col( 255, 255, 255 ); + if( delta > 4.f ) col.a( ) *= ( 6.f - delta ); + + g_d3d.draw_text< ALIGN_RIGHT >( fonts.f_con, col, g_d3d.m_width - 5, cur_pos, D3DFONTFLAG_DROPSHADOW, data[ i ].m_msg ); + cur_pos += 10; + } + } + + if( g_settings.menu.open || g_con->m_open ) { + ui::ui_draw_cursor( ); + } + + for( auto& it : ::d3d::sprites ) + it->end( ); + g_d3d.end( ); + } + + return end_scene_o( device ); +} + +long __stdcall hooks::d3d::present( IDirect3DDevice9* device, RECT* source, RECT* dest, HWND wnd_override, RGNDATA* reg ) { + static auto present_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::present ) >( 17 ); + + static uintptr_t return_address = 0; + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( return_address && return_address != ( uintptr_t )( _ReturnAddress( ) ) ) + return present_o( device, source, dest, wnd_override, reg ); + + if( g_d3d.run_frame( device ) ) { + g_d3d.begin( ); + if( g_settings.misc.watermark ) { + static std::string date; + std::string str; + +#ifdef _DEBUG + static bool transformed = false; + if( !transformed ) { + date += __DATE__; + std::transform( date.begin( ), date.end( ), date.begin( ), + [ ]( char c ) { return ::tolower( c ); } ); + + transformed = true; + } +#endif + + str = xors( "moneybot | " ); + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + char latency_str[ 32 ]; + strenc::w_sprintf_s( latency_str, 32, xors( "lt: %1.2f + %1.2f | " ), nci->GetLatency( 0 ), nci->GetLatency( 1 ) ); + str += latency_str; + } + else { + str += xors( "unconnected | " ); + } + +#ifdef _DEBUG + str += date; +#else + str += g_header.username; +#endif + + g_d3d.draw_text< ALIGN_RIGHT >( ::d3d::fonts.f_menu, + ui::ui_get_text_col( ), g_d3d.m_width - 10, 8, + D3DFONTFLAG_DROPSHADOW, str.c_str( ) ); + } + + g_con->draw( ); + if( ( g_settings.menu.open || g_con->m_open ) && !g_settings.misc.hide_from_obs ) { + ui::ui_draw_cursor( ); + } + g_d3d.end( ); + } + + return present_o( device, source, dest, wnd_override, reg ); +} + +long __stdcall hooks::d3d::reset( IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params ) { + static auto reset_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::reset ) >( 16 ); + if ( g_csgo.m_panic ) { + return reset_o( device, params ); + } + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset( ); + + g_d3d.on_device_lost( ); + long result = reset_o( device, params ); + g_d3d.on_device_reset( ); + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset_end( ); + + return result; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/do_post_screen_space_effects.cpp b/cheat/internal_rewrite/do_post_screen_space_effects.cpp new file mode 100644 index 0000000..1cdd00c --- /dev/null +++ b/cheat/internal_rewrite/do_post_screen_space_effects.cpp @@ -0,0 +1,17 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +bool __fastcall hooks::do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ) { + static auto old_fn = do_post_screen_space_effects_o; + + g_ctx.m_drawing_postscreenspace = true; + if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.m_local ) { + g_cheat.m_visuals.update_glow( ); + } + + bool ret = old_fn( ecx_, 0, setup ); + g_ctx.m_drawing_postscreenspace = false; + + return ret; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/draw_model_execute.cpp b/cheat/internal_rewrite/draw_model_execute.cpp new file mode 100644 index 0000000..49825f6 --- /dev/null +++ b/cheat/internal_rewrite/draw_model_execute.cpp @@ -0,0 +1,140 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" +#include "util.hpp" +#include "settings.hpp" +//this is so ugly dont even look at it + +//gets called once per frame for every entity +void __fastcall hooks::draw_model_execute( IVModelRender* ecx_, void* edx_, + void* render_ctx, const DrawModelState_t& state, + const ModelRenderInfo_t& info, matrix3x4* bone_to_world ) { + static auto dme_o = draw_model_execute_o; + + if( g_csgo.m_panic || g_ctx.m_drawing_postscreenspace || g_settings.misc.hide_from_obs ) + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + + bool draw = true; + IMaterial* mat = g_settings.visuals.chams.flat( ) ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; + auto model_name = g_csgo.m_model_info( )->GetModelName( info.m_model ); + auto local_index = g_csgo.m_engine( )->GetLocalPlayer( ); + int local_team = 0; + if( g_ctx.m_local ) + local_team = g_ctx.m_local->m_iTeamNum( ); + int team = 0; + bool is_player = false; + + //printf( "model: %s\n", model_name ); + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index == local_index ) { + if( g_settings.misc.thirdperson( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) + && g_ctx.m_local->m_bIsScoped( ) ) { + float clr[ ] = { 1.0f, 1.0f, 1.0f }; + g_csgo.m_render_view( )->SetColorModulation( clr ); + g_csgo.m_render_view( )->SetBlend( 0.3f ); + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + } + } + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index ) { + auto player = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); + + if( player && player->is_valid( ) && !player->m_bGunGameImmunity( ) ) { + is_player = true; + team = player->m_iTeamNum( ); + + if( g_settings.rage.active && ( team != local_team || g_settings.rage.friendlies ) && !player->has_valid_anim( ) ) + return; + + if( is_player ) { + bool should_draw = false; + if( g_settings.rage.enabled( ) && g_settings.rage.resolver( ) && g_settings.rage.bt_visualize( ) && ( team != local_team || g_settings.rage.friendlies( ) ) ) + should_draw = true; + if( g_settings.legit.enabled( ) && g_settings.legit.backtracking_visualize( ) && ( team != local_team || g_settings.rage.friendlies( ) ) ) + should_draw = true; + + + if( should_draw ) { + matrix3x4 render_matrix[ 128 ]; + + if( g_cheat.m_ragebot.m_lagcomp->get_render_record( info.m_entity_index, render_matrix ) ) { + fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + float backup_modulation[ 3 ]{ }; + bool backup_ignorez = false; + bool wanted_ignorez = g_settings.visuals.chams.ignore_z( ); + float backup_blend = 1.0f; + + backup_blend = g_csgo.m_render_view( )->GetBlend( ); + g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); + + //BIG ROFL + if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) + && backup_blend == clr_hid.a( ) ) { + backup_ignorez = true; + } + + if( backup_ignorez == wanted_ignorez || ( !backup_ignorez && !g_settings.visuals.chams.clear_occlusion( ) ) || !g_settings.visuals.chams.enabled( ) ) { + auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); + + clr_t bt_col = g_settings.legit.enabled( ) ? g_settings.legit.backtracking_col( ) : g_settings.rage.bt_col( ); + + g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, bt_col ); + + dme_o( ecx_, edx_, render_ctx, state, info, render_matrix ); + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, backup_ignorez ); + } + + g_csgo.m_render_view( )->SetBlend( backup_blend ); + g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); + g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && + ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); + + if( draw ) { + //dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + //draw = false; + } + } + } + } + + if( g_settings.visuals.chams.enabled ) { + if( g_settings.visuals.chams.ignore_z && !g_ctx.m_drawing_screneend && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) && g_settings.visuals.chams.clear_occlusion ) + draw = false; + else if( ( !g_settings.visuals.chams.ignore_z || !g_settings.visuals.chams.clear_occlusion ) && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) { + fclr_t clr = team != local_team ? g_settings.visuals.chams.color_visible_enemy( ) : g_settings.visuals.chams.color_visible_friendly( ); + + if( g_settings.visuals.chams.ignore_z ) { + fclr_t clr = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ) : g_settings.visuals.chams.color_hidden_friendly( ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); + g_cheat.m_chams.m_materials.force_material( mat, clr ); + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + } + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + g_cheat.m_chams.m_materials.force_material( mat, clr ); + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); + g_csgo.m_render_view( )->SetBlend( 1.0f ); + draw = false; + } + } + + } + } + + if( g_settings.misc.transparent_vm && strstr( model_name, xors( "weapon" ) ) ) { + if( strstr( model_name, xors( "arms" ) ) ) { + g_csgo.m_render_view( )->SetBlend( 0.6f ); + } + } + + if( draw ) { + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + } + + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/draw_small_entities.cpp b/cheat/internal_rewrite/draw_small_entities.cpp new file mode 100644 index 0000000..2f88c74 --- /dev/null +++ b/cheat/internal_rewrite/draw_small_entities.cpp @@ -0,0 +1,31 @@ +#include + +#include "hooks.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" + +void __fastcall hooks::draw_small_entities( void* ecx, void* edx, bool state ) { + +#ifdef HEADER_MODULE + static auto ret_addr = g_header.patterns.draw_small_entities_retaddr + 6; +#else + static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_chl.dll( ), "FF 90 ? ? ? ? FF 15 ? ? ? ? 84 C0 74 28", 6 ); +#endif + + // please shoot me + // i have given up + // i want to leave + if( _ReturnAddress( ) == (void*)ret_addr ) { + g_ctx.m_stage = FRAME_RENDER_END; + g_cheat.m_visuals.world_modulate( ); + + //g_con->game_console_print( "render end\n" ); + // FRAME_RENDER_END + g_cheat.m_ragebot.m_lagcomp->store_visuals( ); + g_cheat.m_chams.m_materials.update_materials( ); + g_cheat.m_extra.no_recoil( true ); + } + + draw_small_entities_o( ecx, edx, state ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/emit_sound.cpp b/cheat/internal_rewrite/emit_sound.cpp new file mode 100644 index 0000000..13ae28a --- /dev/null +++ b/cheat/internal_rewrite/emit_sound.cpp @@ -0,0 +1,27 @@ +#include "base_cheat.hpp" +#include "hooks.hpp" +#include "settings.hpp" + +/*void __fastcall hooks::emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ) { + static auto emit_sound_o = g_csgo.m_engine_sound->get_old_function< decltype( &hooks::emit_sound ) >( 5 ); + + if( !g_csgo.m_panic && origin ) { + auto entity = g_csgo.m_entlist( )->GetClientEntity< >( ent ); + if( entity && entity->is_player( ) && entity->ce( )->IsDormant( ) && + ent >= 0 && ent <= 64 ) + g_cheat.m_visuals.update_position( ent, *origin ); + } + + if( strstr( sample, xors( "weapon" ) ) && g_settings.misc.no_sound ) + volume = 0.f; + + if( ( strstr( sample, xors( "player/footsteps" ) ) || strstr( sample, xors( "player/land" ) ) ) && origin && g_settings.visuals.sound ) { + g_cheat.m_visuals.store_sound( ent, *origin ); + } + + emit_sound_o( ecx_, 0, filter, ent, channel, sound, hash, sample, + volume, attenuation, seed, flags, pitch, origin, direction, + origins, update_pos, sound_time, speaker_entry ); +}*/ \ No newline at end of file diff --git a/cheat/internal_rewrite/end_lock.cpp b/cheat/internal_rewrite/end_lock.cpp new file mode 100644 index 0000000..ee81d7a --- /dev/null +++ b/cheat/internal_rewrite/end_lock.cpp @@ -0,0 +1,22 @@ +#include + +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::end_lock( void* ecx, void* edx ) { // THIS IS PROLLY NOT ENDLOCK, BUT WHATEVER + + + // signature: + // search "CL_CallPostDataUpdates: missing ent %d" in engine.dll. + // where framestagenotify gets called + static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_engine.dll( ), "FF 50 18 FF 75 F0", 0x27 ); + if( _ReturnAddress( ) == ret_addr ) { + g_ctx.m_stage = FRAME_NET_UPDATE_POSTDATAUPDATE_END; + g_cheat.m_visuals.world_modulate( ); + + //g_con->game_console_print( "net postdataupdate end\n" ); + } + + end_lock_o( ecx, edx ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/extra.cpp b/cheat/internal_rewrite/extra.cpp new file mode 100644 index 0000000..2408e7f --- /dev/null +++ b/cheat/internal_rewrite/extra.cpp @@ -0,0 +1,327 @@ +#include "base_cheat.hpp" +#include "context.hpp" +#include "input_system.hpp" +#include "math.hpp" +#include "hooks.hpp" +#include "interface.hpp" +#include "detours.h" +#undef min + + +namespace features +{ + void c_extra::rank_reveal( user_cmd_t* ucmd ) { + if( !( ucmd->m_buttons & IN_SCORE ) || !g_settings.misc.rank_reveal( ) ) return; + + vec3_t a{ }; //stop this + static uintptr_t show_rank_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 8B 0D ? ? ? ? 68" ) ); + //reinterpret_cast( show_rank_addr )( &a ); + + } + + void c_extra::thirdperson( ) { + if( !g_ctx.m_local ) + return; + + static bool enabled = false; + static bool toggle = true; + static bool key_held = false; + + + if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.thirdperson_key( ) ) ) { + if( !key_held ) { + toggle ^= 1; + } + key_held = true; + } + else { + key_held = false; + } + + if( !g_settings.misc.thirdperson || !toggle ) { + if( enabled ) { + g_csgo.m_input( )->m_fCameraInThirdPerson = false; + enabled = false; + } + + return; + } + + vec3_t viewangles{ }; + if( g_ctx.m_local->is_alive( ) ) { + g_csgo.m_engine( )->GetViewAngles( viewangles ); + g_csgo.m_input( )->m_fCameraInThirdPerson = true; + g_csgo.m_input( )->m_vecCameraOffset = vec3_t( viewangles.x, viewangles.y, 150.0f ); + + constexpr float cam_hull_offset{ 16.f }; + + const vec3_t cam_hull_min( -cam_hull_offset, -cam_hull_offset, -cam_hull_offset ); + const vec3_t cam_hull_max( cam_hull_offset, cam_hull_offset, cam_hull_offset ); + vec3_t cam_forward, origin = g_ctx.m_local->get_eye_pos( ); + + cam_forward = math::angle_vectors( vec3_t( viewangles.x, viewangles.y, 0.f ) ); + + CTraceFilterWorldAndPropsOnly filter; + Ray_t ray; + CGameTrace tr; + + ray.Init( origin, origin - ( cam_forward * 150.f ), cam_hull_min, cam_hull_max ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, &tr ); + g_csgo.m_input( )->m_vecCameraOffset.z = 150.f * tr.fraction; + + enabled = true; + } + else if( g_csgo.m_entlist( )->GetClientEntityFromHandle< >( g_ctx.m_local->m_hObserverTarget( ) ) ) { + g_csgo.m_input( )->m_fCameraInThirdPerson = false; + g_ctx.m_local->m_iObserverMode( ) = 5; + } + } + + void c_extra::update_netchannel( ) { + + } + + void c_extra::add_latency( INetChannel* channel ) { + if ( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + float in_latency = nci->GetLatency( 0 ); + + //arbitrary number much + float latency = 0.15f - ( in_latency + g_csgo.m_globals->m_frametime ) - TICK_INTERVAL( ); + + if( g_settings.misc.net_fakeping_active && latency > 0.f ) { + channel->m_nInSequenceNr += 2 * 64 - ( 63 * latency ); + } + } + } + + void c_extra::no_recoil( user_cmd_t* cmd ) { + if( !g_settings.misc.no_recoil( ) ) + return; + + if( g_ctx.m_local && g_ctx.m_local->is_alive( ) ) { + static auto weapon_recoil_scale = g_csgo.m_cvar( )->FindVar( xors( "weapon_recoil_scale" ) ); + cmd->m_viewangles -= g_ctx.m_local->m_aimPunchAngle( true ) * weapon_recoil_scale->get_float( ); + cmd->m_viewangles.y = std::remainderf( cmd->m_viewangles.y, 360.f ); + } + } + + void c_extra::rich_presence_flex( ) { + g_csgo.m_steam_friends( )->set_rich_presence( "game:mode", "competitive" ); + g_csgo.m_steam_friends( )->set_rich_presence( "game:mapgroupname", "mg_active" ); + g_csgo.m_steam_friends( )->set_rich_presence( "game:score", "moneybot.cc" ); + } + + void c_extra::remove_rich_presence_flex( ) { + g_csgo.m_steam_friends( )->clear_rich_presence( ); + } + + // I am so, so, so, so sorry. + void c_extra::money_talk( IGameEvent *evt ) { + static float last_time = 0.0f; + + if ( !g_csgo.m_engine( )->IsConnected( ) || !g_csgo.m_engine( )->IsInGame( ) ) { + last_time = 0.0f; + } + + if ( !g_settings.misc.money_talk( ) ) + return; + + if ( evt && !strcmp( evt->GetName( ), xors( "player_death" ) ) ) { + const int player = g_csgo.m_engine( )->GetPlayerForUserID( evt->GetInt( xors( "attacker" ) ) ); + + if ( player == g_csgo.m_engine( )->GetLocalPlayer( ) ) { + if ( last_time <= g_csgo.m_globals->m_curtime ) { + g_csgo.m_engine( )->ClientCmd( xors( "say god i wish i had moneybot" ) ); + + last_time = g_csgo.m_globals->m_curtime + 0.1f; + } + } + } + } + + void c_extra::no_recoil( bool original ) { + static bool restore = false; + static vec3_t punch{ }; + static vec3_t view_punch{ }; + + if( !g_settings.misc.no_recoil( ) || !g_ctx.m_local || !g_ctx.m_local->is_alive( ) ) + return; + + if( !original ) { + punch = g_ctx.m_local->m_aimPunchAngle( true ); + view_punch = g_ctx.m_local->m_viewPunchAngle( ); + + g_ctx.m_local->m_aimPunchAngle( true ) = vec3_t( ); + g_ctx.m_local->m_viewPunchAngle( ) = vec3_t( ); + + restore = true; + } + + if( original && restore ) { + g_ctx.m_local->m_aimPunchAngle( true ) = punch; + g_ctx.m_local->m_viewPunchAngle( ) = view_punch; + + restore = false; + } + } + + void c_extra::auto_revolver( user_cmd_t* cmd ) { + if( !g_settings.misc.auto_revolver ) return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) return; + + int def_index = weapon->m_iItemDefinitionIndex( ); + if( def_index != WEAPON_R8REVOLVER ) return; + + static float next_time = 0.f; + + auto time = g_ctx.pred_time( ); + auto primaryattack = weapon->m_flNextPrimaryAttack( ); + auto nextattack = g_ctx.m_local->m_flNextAttack( ); + + if( primaryattack < time && nextattack < time ) { + if( next_time >= time ) { + g_ctx.m_revolver_shot = false; + cmd->m_buttons |= IN_ATTACK; + } + else { + next_time = time + 0.234375f; + g_ctx.m_revolver_shot = true; + } + } + else { + g_ctx.m_revolver_shot = false; + next_time = time + 0.234375f; + } + } + + void c_extra::no_flash( ) { + static bool once = false; + + + if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { + return; + } + + if( !g_settings.misc.no_flash ) { + if( once ) { + g_ctx.m_local->m_flMaxFlashAlpha( ) = 255.f; + } + return; + } + + once = true; + + if( g_ctx.m_local->m_flFlashDuration( ) ) + g_ctx.m_local->m_flMaxFlashAlpha( ) = std::numeric_limits< float >::min( ); + } + + //this is not how it works + void c_extra::disable_post_processing( ) { + static auto var = g_csgo.m_cvar( )->FindVar( xors( "mat_postprocess_enable" ) ); + var->m_flags |= 0; + var->set_value( !g_settings.misc.disable_post_process( ) ); + } + + void c_extra::float_ragdolls( ) { + static bool once = true;; + static auto var = g_csgo.m_cvar( )->FindVar( xors( "cl_ragdoll_gravity" ) ); + + if( !g_settings.visuals.floating_ragdolls ) { + if( !once ) { + var->set_value( 600 ); + } + once = true; + return; + } + + once = false; + var->m_flags |= 0; + var->set_value( -100 ); + } + + /*void c_extra::print_overwatch_info( ) { + for( int i{}; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); + if( !ent->is_player( ) ) + continue; + + g_csgo.m_cvar( )->ConsolePrintf( "name: " ); + g_csgo.m_cvar( )->ConsolePrintf( "userid: " ); + g_csgo.m_cvar( )->ConsolePrintf( "steam3: " ); + g_csgo.m_cvar( )->ConsolePrintf( "steam64: " ); + g_csgo.m_cvar( )->ConsolePrintf( "steam community link: " ); + g_csgo.m_cvar( )->ConsolePrintf( "rank: " ); + g_csgo.m_cvar( )->ConsolePrintf( "wins: " ); + } + }*/ + + void c_extra::no_smoke( ) { + static bool set = false; + static bool last_setting = g_settings.misc.no_smoke; + if( !g_ctx.m_local || !g_csgo.m_engine( )->IsInGame( ) ) { + last_setting = !g_settings.misc.no_smoke; + return; + } + + if( g_settings.misc.no_smoke || last_setting != g_settings.misc.no_smoke ) { + if( g_ctx.m_local && g_csgo.m_engine( )->IsInGame( ) ) { + static auto v_smoke_smokegrenade = g_csgo.m_mat_system( )->FindMaterial( xors( "particle\\vistasmokev1\\vistasmokev1_smokegrenade" ) ); + bool draw = g_settings.misc.no_smoke( ); + + if( v_smoke_smokegrenade ) + v_smoke_smokegrenade->SetMaterialVarFlag( MATERIAL_VAR_NO_DRAW, draw ); + } + } + + last_setting = g_settings.misc.no_smoke; + } + + void c_extra::server_information( ) { +/* if( !g_settings.misc.server_information( ) ) + return; + + auto lobby = g_csgo.m_mm( )->GetMatchSession( ); + if( !lobby ) + return; + + auto info = lobby->GetSessionSettings( ); + if( !info ) + return; + + auto q = info->get_string( xors( "game/mmqueue" ), xors( "no queue!" ) ); + if( !q || strcmp( q, xors( "reserved" ) ) ) + return; + + auto map = info->get_string( xors( "game/map" ), xors( "no map!" ) ); + if( !map ) + return; + + auto location = info->get_string( xors( "game/loc" ), xors( "no location!" ) ); + + g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "\n-----------------------\n" ) ); + g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "map: %s\n" ), map ); + g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "location: %s" ), location ); + g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "\n-----------------------\n" ) ); + */ + } + + void c_extra::unlock_hidden_cvars( ) { + // Wouldn't this get you untrusted? + if ( g_settings.menu.anti_untrusted ) + return; + + auto it = g_csgo.m_cvar( )->FactoryInternalIterator( ); // genius code. list of cvars unlocked at https://github.com/saul/csgo-cvar-unhide/blob/master/cvarlist.md + for( it->SetFirst( ); it->IsValid( ); it->Next( ) ) { + auto cvar = ( cvar_t* )it->Get( ); + if( cvar ) { + cvar->m_flags &= ~FCVAR_HIDDEN; + cvar->m_flags &= ~FCVAR_DEVELOPMENTONLY; + } + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/extra.hpp b/cheat/internal_rewrite/extra.hpp new file mode 100644 index 0000000..7f0ac98 --- /dev/null +++ b/cheat/internal_rewrite/extra.hpp @@ -0,0 +1,41 @@ +#pragma once +#include +#include + +namespace features +{ + class c_extra { + bool m_fire_next{ }; + + public: + void rank_reveal( user_cmd_t* ucmd ); + void thirdperson( ); + + void update_netchannel( ); + void add_latency( INetChannel* channel ); + + void float_ragdolls( ); + void rich_presence_flex( ); + void remove_rich_presence_flex( ); + + void no_recoil( bool original ); + void no_recoil( user_cmd_t* cmd ); + + void no_smoke( ); + void no_flash( ); + + void disable_post_processing( ); + + void auto_revolver( user_cmd_t* ); + + void money_talk( IGameEvent *evt ); + + void server_information( ); + + void unlock_hidden_cvars( ); + + private: + using grenade_trace_t = std::vector< vec3_t >; + + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/factory.cpp b/cheat/internal_rewrite/factory.cpp new file mode 100644 index 0000000..0e7bc03 --- /dev/null +++ b/cheat/internal_rewrite/factory.cpp @@ -0,0 +1,110 @@ +#include "factory.hpp" +#ifndef IFACE_DLLMAIN +#include "fnv.hpp" + +#include + +NAMESPACE_REGION( factory ) +NAMESPACE_REGION( interfaces ) + +//iterate all exports inside of a module and find createinterface +uintptr_t c_interface_manager::find_createinterface( void* module_ ) { + IMAGE_DOS_HEADER* dos_header; + IMAGE_NT_HEADERS* nt_headers; + uintptr_t export_address; + IMAGE_EXPORT_DIRECTORY* export_dir; + const char* export_name; + uintptr_t* names; + uintptr_t* funcs; + uint16_t* ords; + uint32_t export_hash; + + dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); + nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); + + //find addresses of functions from nt headers + export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; + export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); + + if ( !export_dir->NumberOfFunctions ) + return uintptr_t{ }; + + names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); + funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); + + ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); + + if ( names && funcs && ords ) { + //iterate the exports + for ( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { + export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); + export_hash = hash::fnv1a( export_name ); + + if ( export_hash == fnv( "CreateInterface" ) ) { + return uintptr_t( module_ ) + funcs[ ords[ i ] ]; + } + } + } + + return uintptr_t{ }; +} + +c_interface_manager::c_interface_manager( ) { + auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); + auto peb = teb->ProcessEnvironmentBlock; + + auto root = &peb->Ldr->InMemoryOrderModuleList; + //iterate module list + for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { + PLDR_DATA_TABLE_ENTRY data_table; + HMODULE module_base; + uintptr_t create_interface_export; + uintptr_t create_interface_; + uintptr_t* list_iterator_ptr; + interface_iterator_t* list_iterator; + + data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); + module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); + create_interface_export = find_createinterface( module_base ); + + if ( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { + continue; + } + + //find the createinterface function + create_interface_ = follow_createinterface_export( create_interface_export ); + if ( !is_createinterface_fn( create_interface_ ) ) { + continue; + } + + //find the list iterator + list_iterator_ptr = find_list_ptr( create_interface_ ); + + //iterate the interface list + for ( list_iterator = reinterpret_cast< interface_iterator_t* >( + list_iterator_ptr ); + !!list_iterator; + list_iterator = list_iterator->m_next + ) { + std::string name( list_iterator->m_name ); + std::string module_name( util::unicode_to_ascii( + std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); + + uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); + + size_t version = [ & ]( ) { + std::string ret( name ); + ret.erase( std::remove_if( ret.begin( ), ret.end( ), + [ & ]( int i ) { return !::isdigit( i ); } + ), ret.end( ) ); + return atoi( ret.c_str( ) ); + }( ); + + m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); + } + } +} + +END_REGION +END_REGION +#endif \ No newline at end of file diff --git a/cheat/internal_rewrite/factory.hpp b/cheat/internal_rewrite/factory.hpp new file mode 100644 index 0000000..d197951 --- /dev/null +++ b/cheat/internal_rewrite/factory.hpp @@ -0,0 +1,156 @@ +#pragma once +#include +#include +#include +#include +#include "vmt.hpp" +#include "util.hpp" +#include "x86.hpp" +#include "console.hpp" + +//IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran +#ifndef _DEBUG +//#define IFACE_DLLMAIN +//#define HEADER_MODULE +#endif + +#ifdef IFACE_DLLMAIN +#include "iface_dllmain_impl.hpp" +#else + +NAMESPACE_REGION( factory ) + +namespace interfaces +{ + struct interface_iterator_t { + void* m_create_fn; + char* m_name; + + interface_iterator_t* m_next; + }; + + inline auto follow_createinterface_export( uintptr_t export_ ) { + /* + .text:006F5F00 CreateInterface proc near + .text:006F5F00 push ebp + .text:006F5F01 mov ebp, esp + .text:006F5F03 pop ebp + .text:006F5F04 jmp sub_6F5E90 + */ + uintptr_t jmp = export_ + 0x4; + uintptr_t jmp_target = jmp + *( uintptr_t* )( jmp + 0x1 ) + 0x5; + + return jmp_target; + } + + inline auto find_list_ptr( uintptr_t createinterface ) { + /* + .text:006F5E90 push ebp + .text:006F5E91 mov ebp, esp + .text:006F5E93 push esi + .text:006F5E94 mov esi, dword_2EEFDE4 + .text:006F5E9A push edi + */ + auto iterator_ptr = **( uintptr_t*** )( createinterface + 0x6 ); + + return iterator_ptr; + } + + inline bool is_createinterface_export( uintptr_t export_ ) { + return *( uint8_t* )( export_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( export_ + 4 ) == 0xe9 + && *( uint8_t* )( export_ + 9 ) == 0xcc + && *( uint8_t* )( export_ + 10 ) == 0xcc; + } + + inline bool is_createinterface_fn( uintptr_t fn_ ) { + return *( uint8_t* )( fn_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( fn_ + 4 ) == 0x8b + && *( uint8_t* )( fn_ + 10 ) == x86::encode_push_reg( x86::reg::edi ); + } + + class c_interface_manager { + public: + struct interface_data_t { + std::string m_name; + std::string m_module; + size_t m_version; + uintptr_t m_ptr; + + template < typename t > __forceinline t get( ) { + return reinterpret_cast< t >( m_ptr ); + } + }; + + c_interface_manager( ); + + //iterate the interface list to find our desired version + template < typename t = void* > + t find_interface( const std::string& module_, std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += "0"; + + for( auto& it : m_interfaces ) { + if( !it.m_module.compare( module_ ) + && !it.m_name.compare( name ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + template < typename t = void* > + t find_interface( std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + for( auto& it : m_interfaces ) { + if( strstr( it.m_name.c_str( ), name.c_str( ) ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + void dump_interface_list( ) { + for( auto& it : m_interfaces ) { + g_con->print( xors( "%s version %u in %s at 0x%08x\n" ), + it.m_name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + } + } + + private: + uintptr_t find_createinterface( void* module_ ); + + std::vector< interface_data_t > m_interfaces; + }; +} + +END_REGION +#endif + +extern HMODULE g_dll; +extern factory::interfaces::c_interface_manager g_factory; \ No newline at end of file diff --git a/cheat/internal_rewrite/fire_event_clientside.cpp b/cheat/internal_rewrite/fire_event_clientside.cpp new file mode 100644 index 0000000..10233a2 --- /dev/null +++ b/cheat/internal_rewrite/fire_event_clientside.cpp @@ -0,0 +1,14 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +bool __fastcall hooks::fire_event_clientside( void* ecx_, void* edx, IGameEvent* event_ ) { + static auto original_fn = fire_event_clientside_o; + + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) && strstr( event_->GetName( ), xors( "player_death" ) ) ) + g_cheat.m_skins.replace_deaths( event_ ); + + g_cheat.m_extra.money_talk( event_ ); + + return original_fn( ecx_, edx, event_ ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/fnv.hpp b/cheat/internal_rewrite/fnv.hpp new file mode 100644 index 0000000..08a478b --- /dev/null +++ b/cheat/internal_rewrite/fnv.hpp @@ -0,0 +1,64 @@ +#pragma once + +#pragma warning( disable : 4307 ) // '*': integral constant overflow +#pragma warning( disable : 4244 ) // possible loss of data + +#include +#include + +using hash_t = unsigned int; + +// used for compile-time FNV-1a 32bit hashes. +#define fnv( str ) \ + [&]() { \ + constexpr hash_t out = hash::fnv1a( str ); \ + \ + return out; \ + }() + +// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. +#define fnv_const( str ) Hash::fnv1a_32( str ) + +namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). +{ + // FNV-1a constants. + enum : hash_t { + FNV1A_PRIME = 0x1000193, + FNV1A_BASIS = 0x811C9DC5 + }; + + // compile-time strlen. + __forceinline constexpr size_t ct_strlen( const char *str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; + } + + // hash data. + __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { + hash_t out = FNV1A_BASIS; + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ data[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash c-style string. + __forceinline constexpr hash_t fnv1a( const char *str ) { + hash_t out = FNV1A_BASIS; + size_t len = ct_strlen( str ); + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ str[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash C++-style string ( runtime only ). + __forceinline hash_t fnv1a( const std::string &str ) { + return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/frame_stage_notify.cpp b/cheat/internal_rewrite/frame_stage_notify.cpp new file mode 100644 index 0000000..91cd7aa --- /dev/null +++ b/cheat/internal_rewrite/frame_stage_notify.cpp @@ -0,0 +1,109 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" + +#if 0 +const char* crash_str = R"(" +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +398274 entities in bone setup array.Should have been cleaned up by now +")"; +#endif + +void __fastcall hooks::frame_stage_notify( void* ecx_, void* edx_, ClientFrameStage_t stage ) { + static auto frame_stage_notify_o = g_csgo.m_chl->get_old_function< decltype( &hooks::frame_stage_notify ) >( 36 ); + + if ( g_csgo.m_panic ) + { + // unload from game thread + static bool unloaded = false; + if ( !unloaded) + { + g_csgo.uninitialize( ); + unloaded = true; + } + + return frame_stage_notify_o( ecx_, edx_, stage ); + } + g_ctx.m_stage = stage; + g_cheat.m_visuals.world_modulate( ); + + static bool rich_presence_active = false; + + switch ( stage ) { + case FRAME_NET_UPDATE_START: + g_ctx.run_frame( ); + g_cheat.m_ragebot.m_lagcomp->fsn_net_update_start( ); + + if( g_settings.misc.rich_presence( ) ) { + g_cheat.m_extra.rich_presence_flex( ); + rich_presence_active = true; + } + else if( rich_presence_active ) { + if( !g_settings.misc.rich_presence( ) ) + g_cheat.m_extra.remove_rich_presence_flex( ); + + rich_presence_active = false; + } + g_cheat.m_visuals.draw_sound( ); + g_cheat.m_visuals.draw_tracers( ); + frame_stage_notify_o( ecx_, 0, stage ); + + return; + + case FRAME_NET_UPDATE_POSTDATAUPDATE_START: + g_cheat.m_extra.float_ragdolls( ); + + g_cheat.m_player_mgr.frame_stage_notify( ); + g_cheat.m_prediction.frame_stage_notify( ); + g_cheat.m_ragebot.m_resolver->frame_stage_notify( ); + g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); + g_cheat.m_skins( ); + frame_stage_notify_o( ecx_, 0, stage ); + + return; + + case FRAME_RENDER_START: + g_cheat.m_extra.disable_post_processing( ); + g_cheat.m_extra.no_flash( ); + g_cheat.m_extra.no_recoil( false ); + util::disable_pvs( ); + g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); + //g_cheat.m_ragebot.m_lagcomp->invalidate_bone_caches( ); + if( g_csgo.m_input( )->m_fCameraInThirdPerson ) { + bool real_yaw = g_settings.rage.anti_aim( ); + if( g_ctx.get_last_cmd( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + g_ctx.m_local->m_vecThirdpersonAngles( ) = ( real_yaw ? g_ctx.m_thirdperson_angle : g_ctx.get_last_cmd( )->m_viewangles ); + } + } + + g_cheat.m_extra.no_smoke( ); + if( g_settings.misc.no_smoke ) { + static auto smoke_count = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "55 8B EC 83 EC 08 8B 15 ? ? ? ? 0F 57 C0" ) ); + **reinterpret_cast< int** >( smoke_count + 0x8 ) = 0; + } + break; + + case FRAME_RENDER_END: + //if( g_ctx.run_frame( ) ) { + // + //} + g_cheat.m_ragebot.m_lagcomp->store_visuals( ); + frame_stage_notify_o( ecx_, 0, stage ); + g_cheat.m_chams.m_materials.update_materials( ); + g_cheat.m_extra.no_recoil( true ); + return; + } + + frame_stage_notify_o( ecx_, 0, stage ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/get_player_info.cpp b/cheat/internal_rewrite/get_player_info.cpp new file mode 100644 index 0000000..0cd121a --- /dev/null +++ b/cheat/internal_rewrite/get_player_info.cpp @@ -0,0 +1,10 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" + +bool __fastcall hooks::get_player_info( void* ecx_, void* edx, int ent_num, player_info_t* info ) { + static auto original_fn = g_csgo.m_engine->get_old_function< decltype( &get_player_info ) >( 8 ); + + + + return original_fn( ecx_, edx, ent_num, info ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/get_screen_size.cpp b/cheat/internal_rewrite/get_screen_size.cpp new file mode 100644 index 0000000..be7e245 --- /dev/null +++ b/cheat/internal_rewrite/get_screen_size.cpp @@ -0,0 +1,36 @@ +#include "hooks.hpp" +#include "settings.hpp" + +#include +#include "context.hpp" +#include "mem.hpp" + +void __fastcall hooks::get_screen_size( void* ecx, void* edx, int& w, int& h ) { + static auto draw_crosshair_h = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "8B 4C 24 10 0F 57 D2 99" ) ); + + stack_t stack( get_baseptr( ) ); + auto ret = stack.next( ).return_address( ); + //call original + get_screen_size_o( ecx, edx, w, h ); + + //alter screen width and height to adjust the crosshair position on screen + if( g_settings.visuals.recoil_crosshair && g_ctx.m_local ) { + if( ret == draw_crosshair_h || ret == draw_crosshair_h - 14 /* width call is 14 bytes above height call*/ ) { + w /= 2; + h /= 2; + + vec3_t punch_angles = g_ctx.m_local->m_aimPunchAngle( ) * 2.f; + + if( punch_angles.x < -0.1f ) { + float fov = g_ctx.m_fov; + float angle_step = h / fov; + + w -= int( punch_angles.y * angle_step ); + h += int( punch_angles.x * angle_step ); + } + + w *= 2; + h *= 2; + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/get_viewmodel_fov.cpp b/cheat/internal_rewrite/get_viewmodel_fov.cpp new file mode 100644 index 0000000..be48dd3 --- /dev/null +++ b/cheat/internal_rewrite/get_viewmodel_fov.cpp @@ -0,0 +1,6 @@ +#include "hooks.hpp" +#include "settings.hpp" + +float __fastcall hooks::get_viewmodel_fov( void* ecx, void* edx ) { + return get_viewmodel_fov_o( ecx, nullptr ) + float( g_settings.misc.viewmodel_fov ); +} diff --git a/cheat/internal_rewrite/hde32.cpp b/cheat/internal_rewrite/hde32.cpp new file mode 100644 index 0000000..8569287 --- /dev/null +++ b/cheat/internal_rewrite/hde32.cpp @@ -0,0 +1,377 @@ +/* +* Hacker Disassembler Engine 32 C +* Copyright (c) 2008-2009, Vyacheslav Patkov. +* All rights reserved. +* +*/ + +#include +#include "hde32.h" +#include "table32.h" + +unsigned int hde32_disasm( const void *code, hde32s *hs ) +{ + uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0; + uint8_t *ht = hde32_table, m_mod, m_reg, m_rm, disp_size = 0; + + memset( (uint8_t*)hs, 0, sizeof( hde32s ) ); + + for ( x = 16; x; x-- ) + switch ( c = *p++ ) + { + case 0xf3: + hs->p_rep = c; + pref |= PRE_F3; + break; + case 0xf2: + hs->p_rep = c; + pref |= PRE_F2; + break; + case 0xf0: + hs->p_lock = c; + pref |= PRE_LOCK; + break; + case 0x26: case 0x2e: case 0x36: + case 0x3e: case 0x64: case 0x65: + hs->p_seg = c; + pref |= PRE_SEG; + break; + case 0x66: + hs->p_66 = c; + pref |= PRE_66; + break; + case 0x67: + hs->p_67 = c; + pref |= PRE_67; + break; + default: + goto pref_done; + } +pref_done: + + hs->flags = (uint32_t)pref << 23; + + if ( !pref ) + pref |= PRE_NONE; + + if ( ( hs->opcode = c ) == 0x0f ) + { + hs->opcode2 = c = *p++; + ht += DELTA_OPCODES; + } + else if ( c >= 0xa0 && c <= 0xa3 ) + { + if ( pref & PRE_67 ) + pref |= PRE_66; + else + pref &= ~PRE_66; + } + + opcode = c; + cflags = ht[ht[opcode / 4] + ( opcode % 4 )]; + + if ( cflags == C_ERROR ) + { + hs->flags |= F_ERROR | F_ERROR_OPCODE; + cflags = 0; + if ( ( opcode & -3 ) == 0x24 ) + cflags++; + } + + x = 0; + if ( cflags & C_GROUP ) + { + uint16_t t; + t = *(uint16_t *)( ht + ( cflags & 0x7f ) ); + cflags = (uint8_t)t; + x = (uint8_t)( t >> 8 ); + } + + if ( hs->opcode2 ) + { + ht = hde32_table + DELTA_PREFIXES; + if ( ht[ht[opcode / 4] + ( opcode % 4 )] & pref ) + hs->flags |= F_ERROR | F_ERROR_OPCODE; + } + + if ( cflags & C_MODRM ) + { + hs->flags |= F_MODRM; + hs->modrm = c = *p++; + hs->modrm_mod = m_mod = c >> 6; + hs->modrm_rm = m_rm = c & 7; + hs->modrm_reg = m_reg = ( c & 0x3f ) >> 3; + + if ( x && ( ( x << m_reg ) & 0x80 ) ) + hs->flags |= F_ERROR | F_ERROR_OPCODE; + + if ( !hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf ) + { + uint8_t t = opcode - 0xd9; + if ( m_mod == 3 ) + { + ht = hde32_table + DELTA_FPU_MODRM + t * 8; + t = ht[m_reg] << m_rm; + } + else + { + ht = hde32_table + DELTA_FPU_REG; + t = ht[t] << m_reg; + } + if ( t & 0x80 ) + hs->flags |= F_ERROR | F_ERROR_OPCODE; + } + + if ( pref & PRE_LOCK ) + { + if ( m_mod == 3 ) + { + hs->flags |= F_ERROR | F_ERROR_LOCK; + } + else + { + uint8_t *table_end, op = opcode; + if ( hs->opcode2 ) + { + ht = hde32_table + DELTA_OP2_LOCK_OK; + table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK; + } + else + { + ht = hde32_table + DELTA_OP_LOCK_OK; + table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK; + op &= -2; + } + for ( ; ht != table_end; ht++ ) + if ( *ht++ == op ) + { + if ( !( ( *ht << m_reg ) & 0x80 ) ) + goto no_lock_error; + else + break; + } + hs->flags |= F_ERROR | F_ERROR_LOCK; + no_lock_error: + ; + } + } + + if ( hs->opcode2 ) + { + switch ( opcode ) + { + case 0x20: case 0x22: + m_mod = 3; + if ( m_reg > 4 || m_reg == 1 ) + goto error_operand; + else + goto no_error_operand; + case 0x21: case 0x23: + m_mod = 3; + if ( m_reg == 4 || m_reg == 5 ) + goto error_operand; + else + goto no_error_operand; + } + } + else + { + switch ( opcode ) + { + case 0x8c: + if ( m_reg > 5 ) + goto error_operand; + else + goto no_error_operand; + case 0x8e: + if ( m_reg == 1 || m_reg > 5 ) + goto error_operand; + else + goto no_error_operand; + } + } + + if ( m_mod == 3 ) + { + uint8_t *table_end; + if ( hs->opcode2 ) + { + ht = hde32_table + DELTA_OP2_ONLY_MEM; + table_end = ht + sizeof( hde32_table ) - DELTA_OP2_ONLY_MEM; + } + else + { + ht = hde32_table + DELTA_OP_ONLY_MEM; + table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM; + } + for ( ; ht != table_end; ht += 2 ) + if ( *ht++ == opcode ) + { + if ( *ht++ & pref && !( ( *ht << m_reg ) & 0x80 ) ) + goto error_operand; + else + break; + } + goto no_error_operand; + } + else if ( hs->opcode2 ) + { + switch ( opcode ) + { + case 0x50: case 0xd7: case 0xf7: + if ( pref & ( PRE_NONE | PRE_66 ) ) + goto error_operand; + break; + case 0xd6: + if ( pref & ( PRE_F2 | PRE_F3 ) ) + goto error_operand; + break; + case 0xc5: + goto error_operand; + } + goto no_error_operand; + } + else + goto no_error_operand; + + error_operand: + hs->flags |= F_ERROR | F_ERROR_OPERAND; + no_error_operand: + + c = *p++; + if ( m_reg <= 1 ) + { + if ( opcode == 0xf6 ) + cflags |= C_IMM8; + else if ( opcode == 0xf7 ) + cflags |= C_IMM_P66; + } + + switch ( m_mod ) + { + case 0: + if ( pref & PRE_67 ) + { + if ( m_rm == 6 ) + disp_size = 2; + } + else + if ( m_rm == 5 ) + disp_size = 4; + break; + case 1: + disp_size = 1; + break; + case 2: + disp_size = 2; + if ( !( pref & PRE_67 ) ) + disp_size <<= 1; + } + + if ( m_mod != 3 && m_rm == 4 && !( pref & PRE_67 ) ) + { + hs->flags |= F_SIB; + p++; + hs->sib = c; + hs->sib_scale = c >> 6; + hs->sib_index = ( c & 0x3f ) >> 3; + if ( ( hs->sib_base = c & 7 ) == 5 && !( m_mod & 1 ) ) + disp_size = 4; + } + + p--; + switch ( disp_size ) + { + case 1: + hs->flags |= F_DISP8; + hs->disp.disp8 = *p; + break; + case 2: + hs->flags |= F_DISP16; + hs->disp.disp16 = *(uint16_t *)p; + break; + case 4: + hs->flags |= F_DISP32; + hs->disp.disp32 = *(uint32_t *)p; + } + p += disp_size; + } + else if ( pref & PRE_LOCK ) + hs->flags |= F_ERROR | F_ERROR_LOCK; + + if ( cflags & C_IMM_P66 ) + { + if ( cflags & C_REL32 ) + { + if ( pref & PRE_66 ) + { + hs->flags |= F_IMM16 | F_RELATIVE; + hs->imm.imm16 = *(uint16_t *)p; + p += 2; + goto disasm_done; + } + goto rel32_ok; + } + if ( pref & PRE_66 ) + { + hs->flags |= F_IMM16; + hs->imm.imm16 = *(uint16_t *)p; + p += 2; + } + else + { + hs->flags |= F_IMM32; + hs->imm.imm32 = *(uint32_t *)p; + p += 4; + } + } + + if ( cflags & C_IMM16 ) + { + if ( hs->flags & F_IMM32 ) + { + hs->flags |= F_IMM16; + hs->disp.disp16 = *(uint16_t *)p; + } + else if ( hs->flags & F_IMM16 ) + { + hs->flags |= F_2IMM16; + hs->disp.disp16 = *(uint16_t *)p; + } + else + { + hs->flags |= F_IMM16; + hs->imm.imm16 = *(uint16_t *)p; + } + p += 2; + } + if ( cflags & C_IMM8 ) + { + hs->flags |= F_IMM8; + hs->imm.imm8 = *p++; + } + + if ( cflags & C_REL32 ) + { + rel32_ok: + hs->flags |= F_IMM32 | F_RELATIVE; + hs->imm.imm32 = *(uint32_t *)p; + p += 4; + } + else if ( cflags & C_REL8 ) + { + hs->flags |= F_IMM8 | F_RELATIVE; + hs->imm.imm8 = *p++; + } + +disasm_done: + + if ( ( hs->len = (uint8_t)( p - (uint8_t *)code ) ) > 15 ) + { + hs->flags |= F_ERROR | F_ERROR_LENGTH; + hs->len = 15; + } + + return (unsigned int)hs->len; +} + diff --git a/cheat/internal_rewrite/hde32.h b/cheat/internal_rewrite/hde32.h new file mode 100644 index 0000000..dd2ef6d --- /dev/null +++ b/cheat/internal_rewrite/hde32.h @@ -0,0 +1,109 @@ +/* +* Hacker Disassembler Engine 32 +* Copyright (c) 2006-2009, Vyacheslav Patkov. +* All rights reserved. +* +* hde32.h: C/C++ header file +* +*/ + +#ifndef _HDE32_H_ +#define _HDE32_H_ + +/* stdint.h - C99 standard header +* http://en.wikipedia.org/wiki/stdint.h +* +* if your compiler doesn't contain "stdint.h" header (for +* example, Microsoft Visual C++), you can download file: +* http://www.azillionmonkeys.com/qed/pstdint.h +* and change next line to: +* #include "pstdint.h" +*/ + +#include + +#define F_MODRM 0x00000001 +#define F_SIB 0x00000002 +#define F_IMM8 0x00000004 +#define F_IMM16 0x00000008 +#define F_IMM32 0x00000010 +#define F_DISP8 0x00000020 +#define F_DISP16 0x00000040 +#define F_DISP32 0x00000080 +#define F_RELATIVE 0x00000100 +#define F_2IMM16 0x00000800 +#define F_ERROR 0x00001000 +#define F_ERROR_OPCODE 0x00002000 +#define F_ERROR_LENGTH 0x00004000 +#define F_ERROR_LOCK 0x00008000 +#define F_ERROR_OPERAND 0x00010000 +#define F_PREFIX_REPNZ 0x01000000 +#define F_PREFIX_REPX 0x02000000 +#define F_PREFIX_REP 0x03000000 +#define F_PREFIX_66 0x04000000 +#define F_PREFIX_67 0x08000000 +#define F_PREFIX_LOCK 0x10000000 +#define F_PREFIX_SEG 0x20000000 +#define F_PREFIX_ANY 0x3f000000 + +#define PREFIX_SEGMENT_CS 0x2e +#define PREFIX_SEGMENT_SS 0x36 +#define PREFIX_SEGMENT_DS 0x3e +#define PREFIX_SEGMENT_ES 0x26 +#define PREFIX_SEGMENT_FS 0x64 +#define PREFIX_SEGMENT_GS 0x65 +#define PREFIX_LOCK 0xf0 +#define PREFIX_REPNZ 0xf2 +#define PREFIX_REPX 0xf3 +#define PREFIX_OPERAND_SIZE 0x66 +#define PREFIX_ADDRESS_SIZE 0x67 + +#pragma pack(push,1) + +typedef struct +{ + uint8_t len; + uint8_t p_rep; + uint8_t p_lock; + uint8_t p_seg; + uint8_t p_66; + uint8_t p_67; + uint8_t opcode; + uint8_t opcode2; + uint8_t modrm; + uint8_t modrm_mod; + uint8_t modrm_reg; + uint8_t modrm_rm; + uint8_t sib; + uint8_t sib_scale; + uint8_t sib_index; + uint8_t sib_base; + union + { + uint8_t imm8; + uint16_t imm16; + uint32_t imm32; + } imm; + union + { + uint8_t disp8; + uint16_t disp16; + uint32_t disp32; + } disp; + uint32_t flags; +} hde32s; + +#pragma pack(pop) + +#ifdef __cplusplus +extern "C" { +#endif + + /* __cdecl */ + unsigned int hde32_disasm( const void *code, hde32s *hs ); + +#ifdef __cplusplus +} +#endif + +#endif /* _HDE32_H_ */ \ No newline at end of file diff --git a/cheat/internal_rewrite/hooks.cpp b/cheat/internal_rewrite/hooks.cpp new file mode 100644 index 0000000..e786a2b --- /dev/null +++ b/cheat/internal_rewrite/hooks.cpp @@ -0,0 +1,108 @@ +#include "hooks.hpp" +#include "interface.hpp" +#include "detours.h" +#include "wipe.hpp" + +//god i'm so cool +namespace hooks { + decltype( &paint_traverse ) paint_traverse_o; + decltype( &create_move ) create_move_o; + decltype( &frame_stage_notify ) fsn_o; + decltype( &suppress_lists ) suppress_lists_o; + decltype( &draw_small_entities ) draw_small_entities_o; + decltype( &begin_lock ) begin_lock_o; + decltype( &end_lock ) end_lock_o; + decltype( &simulate ) simulate_o; + decltype( &run_command ) run_command_o; + decltype( &override_mouse_input ) override_mouse_input_o; + decltype( &draw_model_execute ) draw_model_execute_o; + decltype( &scene_end ) scene_end_o; + decltype( &get_viewmodel_fov ) get_viewmodel_fov_o; + decltype( &get_screen_size ) get_screen_size_o; + decltype( &override_view ) override_view_o; + decltype( &shut_down ) shut_down_o; + decltype( &lock_cursor ) lock_cursor_o; + decltype( &is_connected ) is_connected_o; + decltype( &in_prediction ) in_prediction_o; + decltype( &update_clientside_animation ) update_clientside_animation_o; + decltype( &material_system ) material_system_o; + decltype( &fire_event_clientside ) fire_event_clientside_o; + decltype( &send_datagram ) send_datagram_o; + decltype( &do_post_screen_space_effects ) do_post_screen_space_effects_o; + decltype( &on_screen_size_changed ) on_screen_size_changed_o; + decltype( &play_sound ) play_sound_o; + decltype( &convar_getint ) convar_getint_o; + decltype( &packet_start ) packet_start_o; +} + +hooks::c_netvar_proxy hooks::lby_proxy; +hooks::c_netvar_proxy hooks::last_shot_proxy; +hooks::c_netvar_proxy hooks::simtime_proxy; + +bool hooks::commit( factory::c_csgo* instance ) { + DELETE_START( 5 ); + + while ( !( instance->m_hwnd = FindWindowA( xors( "Valve001" ), 0 ) ) ) + Sleep( 100 ); + + window_procedure_o = reinterpret_cast< decltype( window_procedure_o ) >( + SetWindowLongA( instance->m_hwnd, GWLP_WNDPROC, + ( long )window_procedure ) + ); + + lby_proxy.init( g_netvars.get_prop( fnv( "DT_CSPlayer" ), fnv( "m_flLowerBodyYawTarget" ) ), &lby_proxy_fn ); + last_shot_proxy.init( g_netvars.get_prop( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ), &last_shot_proxy_fn ); + simtime_proxy.init( g_netvars.get_prop( fnv( "DT_BaseEntity" ), fnv( "m_flSimulationTime" ) ), &simtime_proxy_fn ); + + // god i'm thriving the d + auto* d = &memory::detours; + + instance->m_d3d->hook( 42, &hooks::d3d::end_scene ); + instance->m_d3d->hook( 16, &hooks::d3d::reset ); + instance->m_d3d->hook( 17, &hooks::d3d::present ); + //instance->m_d3d->hook( 82, &hooks::d3d::draw ); + //instance->m_engine->hook( 93, &hooks::is_hltv_proxy ); + //instance->m_engine->hook( 90, &hooks::is_paused ); + //instance->m_engine->hook( 27, &hooks::is_connected ); + + instance->m_debug_show_spread->hook( 13, &hooks::debug_show_spread_get_int ); + instance->m_netshowfragments->hook( 13, &hooks::net_showfragments_get_int ); + instance->m_csm_shadows->hook( 13, &hooks::cl_csm_shadows_get_int ); + + paint_traverse_o = d->create_hook( &hooks::paint_traverse, instance->m_panel->get_old_function< void* >( 41 ) ); + create_move_o = d->create_hook( &hooks::create_move, instance->m_clientmode->get_old_function< void* >( 24 ) ); + override_mouse_input_o = d->create_hook( &hooks::override_mouse_input, instance->m_clientmode->get_old_function< void* >( 23 ) ); + get_viewmodel_fov_o = d->create_hook( &hooks::get_viewmodel_fov, instance->m_clientmode->get_old_function< void* >( 35 ) ); + do_post_screen_space_effects_o = d->create_hook( &hooks::do_post_screen_space_effects, instance->m_clientmode->get_old_function< void* >( 44 ) ); + override_view_o = d->create_hook( &hooks::override_view, instance->m_clientmode->get_old_function< void* >( 18 ) ); + lock_cursor_o = d->create_hook( &hooks::lock_cursor, instance->m_surface->get_old_function< void* >( 67 ) ); + run_command_o = d->create_hook( &hooks::run_command, instance->m_prediction->get_old_function< void* >( 19 ) ); + in_prediction_o = d->create_hook( &hooks::in_prediction, instance->m_prediction->get_old_function< void* >( 14 ) ); + draw_model_execute_o = d->create_hook( &hooks::draw_model_execute, instance->m_model_render->get_old_function< void* >( 21 ) ); + scene_end_o = d->create_hook( &hooks::scene_end, instance->m_render_view->get_old_function< void* >( 9 ) ); + get_screen_size_o = d->create_hook( &hooks::get_screen_size, instance->m_surface->get_old_function< void* >( 44 ) ); + + on_screen_size_changed_o = d->create_hook( &hooks::on_screen_size_changed, instance->m_surface->get_old_function< void* >( 116 ) ); + play_sound_o = d->create_hook( &hooks::play_sound, instance->m_surface->get_old_function< void* >( 82 ) ); + material_system_o = d->create_hook( &hooks::material_system, instance->m_mat_system->get_old_function< void* >( 21 ) ); + suppress_lists_o = d->create_hook( &hooks::suppress_lists, instance->m_partition->get_old_function< void* >( 16 ) ); + draw_small_entities_o = d->create_hook( &hooks::draw_small_entities, instance->m_clientleaf->get_old_function< void* >( 39 ) ); + simulate_o = d->create_hook( &hooks::simulate, instance->m_engine_vgui->get_old_function< void* >( 39 ) ); + begin_lock_o = d->create_hook( &hooks::begin_lock, instance->m_mdl_cache->get_old_function< void* >( 33 ) ); + end_lock_o = d->create_hook( &hooks::end_lock, instance->m_mdl_cache->get_old_function< void* >( 34 ) ); + + auto packet_start = pattern::first_code_match< void* >( instance->m_engine.dll( ), xors( "55 8B EC 8B 45 08 89 81 ? ? ? ? 8B 45 0C 89 81 ? ? ? ? 5D C2 08 00 ? ? ? ? ? ? ? 56" ) ); + packet_start_o = d->create_hook( &::hooks::packet_start, packet_start ); + + auto update_clientside_anim = pattern::first_code_match< void* >( instance->m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 80 BE ? ? ? ? ? 74 36" ) ); + update_clientside_animation_o = d->create_hook( &hooks::update_clientside_animation, update_clientside_anim ); + + auto send_datagram = pattern::first_code_match< void* >( instance->m_engine.dll( ), xors( "55 8B EC 83 E4 F0 B8 ? ? ? ? E8 ? ? ? ? 56 57 8B F9 89 7C 24 18" ) ); + send_datagram_o = d->create_hook( &hooks::send_datagram, send_datagram ); + + d->enable( ); + + return true; + + DELETE_END( 5 ); +} diff --git a/cheat/internal_rewrite/hooks.hpp b/cheat/internal_rewrite/hooks.hpp new file mode 100644 index 0000000..ab28545 --- /dev/null +++ b/cheat/internal_rewrite/hooks.hpp @@ -0,0 +1,125 @@ +#pragma once +#include + +#include "util.hpp" +#include "d3d.hpp" +#include "interface.hpp" +#include "netvar_proxy.hpp" + +namespace hooks +{ + //hook like the hooker that u are + + long __stdcall window_procedure( HWND, uint32_t, uint32_t, long ); + extern decltype( &window_procedure ) window_procedure_o; + + void __fastcall paint_traverse( void*, void*, unsigned int, bool, bool ); + extern decltype( &paint_traverse ) paint_traverse_o; + + bool __fastcall create_move( void*, void*, float, user_cmd_t* ); + extern decltype( &create_move ) create_move_o; + + //void __fastcall hl_create_move( void*, void*, int, float, bool ); + void __fastcall frame_stage_notify( void*, void*, ClientFrameStage_t ); + extern decltype( &frame_stage_notify ) fsn_o; + + void __fastcall suppress_lists( void*, void*, int, bool ); + extern decltype( &suppress_lists ) suppress_lists_o; + + void __fastcall draw_small_entities( void*, void*, bool ); + extern decltype( &draw_small_entities ) draw_small_entities_o; + + void __fastcall begin_lock( void*, void* ); + extern decltype( &begin_lock ) begin_lock_o; + + void __fastcall end_lock( void*, void* ); + extern decltype( &end_lock ) end_lock_o; + + void __fastcall simulate( void*, void* ); + extern decltype( &simulate ) simulate_o; + + void __fastcall run_command( void*, void*, IClientEntity*, user_cmd_t*, IMoveHelper* ); + extern decltype( &run_command ) run_command_o; + + void __fastcall override_mouse_input( void*, void*, float*, float* ); + extern decltype( &override_mouse_input ) override_mouse_input_o; + + void __fastcall draw_model_execute( IVModelRender*, void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + extern decltype( &draw_model_execute ) draw_model_execute_o; + + void __fastcall scene_end( void*, void* ); + extern decltype( &scene_end ) scene_end_o; + + float __fastcall get_viewmodel_fov( void*, void* ); + extern decltype( &get_viewmodel_fov ) get_viewmodel_fov_o; + + void __fastcall get_screen_size( void*, void*, int&, int& ); + extern decltype( &get_screen_size ) get_screen_size_o; + + void __fastcall override_view( void* ecx_, void* edx_, CViewSetup* setup ); + extern decltype( &override_view ) override_view_o; + + //void __fastcall emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + // const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + // const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ); + void __fastcall shut_down( void* ecx_, void* edx_ ); + extern decltype( &shut_down ) shut_down_o; + + void __fastcall lock_cursor( void* ecx_, void* edx_ ); + extern decltype( &lock_cursor ) lock_cursor_o; + + bool __fastcall is_connected( void* ecx_, void* edx_ ); + extern decltype( &is_connected ) is_connected_o; + + bool __fastcall in_prediction( void* ecx_, void* edx_ ); + extern decltype( &in_prediction ) in_prediction_o; + + void __fastcall update_clientside_animation( void* ecx_, void* edx_ ); + extern decltype( &update_clientside_animation ) update_clientside_animation_o; + + bool __fastcall material_system( void* ecx_, void* edx_, IMaterialSystem_Config_t* config, bool forceupdate ); + extern decltype( &material_system ) material_system_o; + + bool __fastcall fire_event_clientside( void* ecx_, void* edx, IGameEvent* event ); + extern decltype( &fire_event_clientside ) fire_event_clientside_o; + + void __cdecl lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); + void __cdecl last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); + void __cdecl simtime_proxy_fn( const CRecvProxyData* proxy_data_const, void* ent, void* output ); + + int __fastcall send_datagram( INetChannel* channel, void* edx, void* datagram ); + extern decltype( &send_datagram ) send_datagram_o; + + bool __fastcall do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ); + extern decltype( &do_post_screen_space_effects ) do_post_screen_space_effects_o; + + void __fastcall on_screen_size_changed( void* ecx_, void* edx_, int old_h, int old_w ); + extern decltype( &on_screen_size_changed ) on_screen_size_changed_o; + + void __fastcall play_sound( void* ecx_, void* edx_, const char* name ); + extern decltype( &play_sound ) play_sound_o; + + void __fastcall packet_start( void* ecx, void* edx, int in_seq, int out_ack ); + extern decltype( &packet_start ) packet_start_o; + + int __fastcall cl_csm_shadows_get_int( void* ecx_, void* edx_ ); + int __fastcall debug_show_spread_get_int( void* ecx_, void* edx_ ); + int __fastcall net_showfragments_get_int( void* ecx_, void* edx_ ); + + extern c_netvar_proxy lby_proxy; + extern c_netvar_proxy last_shot_proxy; + extern c_netvar_proxy simtime_proxy; + + //do we wanna only run menu in d3d or visuals too? + namespace d3d { + long __stdcall end_scene( IDirect3DDevice9* ); + long __stdcall reset( IDirect3DDevice9*, D3DPRESENT_PARAMETERS* ); + long __stdcall present( IDirect3DDevice9*, RECT*, RECT*, HWND, RGNDATA* ); + long __stdcall draw( IDirect3DDevice9*, D3DPRIMITIVETYPE, int, uint32_t, uint32_t, uint32_t, uint32_t ); + } + + int __fastcall convar_getint( void* ecx_, void* edx_ ); + extern decltype( &convar_getint ) convar_getint_o; + + extern bool commit( factory::c_csgo* ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/icons.hpp b/cheat/internal_rewrite/icons.hpp new file mode 100644 index 0000000..840a413 --- /dev/null +++ b/cheat/internal_rewrite/icons.hpp @@ -0,0 +1,5 @@ +#include "icons/legit.hpp" +#include "icons/rage.hpp" +#include "icons/visuals.hpp" +#include "icons/misc.hpp" +#include "icons/config.hpp" \ No newline at end of file diff --git a/cheat/internal_rewrite/icons/config.hpp b/cheat/internal_rewrite/icons/config.hpp new file mode 100644 index 0000000..d488e6a --- /dev/null +++ b/cheat/internal_rewrite/icons/config.hpp @@ -0,0 +1,1752 @@ +/* E:\Users\admin\Desktop\stuff\icons\config.png (4/1/2018 10:00:36 PM) + StartOffset: 00000000, EndOffset: 0000519A, Length: 0000519B */ + +namespace icons { +constexpr static size_t config_size = 20891; +namespace raw { +static unsigned char config[20891] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, + 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, + 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x66, + 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, 0x65, 0x34, + 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, 0x2D, 0x32, + 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x30, 0x36, 0x32, 0x33, + 0x62, 0x65, 0x64, 0x36, 0x2D, 0x33, 0x35, 0x62, 0x35, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x37, + 0x61, 0x32, 0x34, 0x30, 0x39, 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, + 0x2D, 0x64, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, + 0x66, 0x66, 0x39, 0x62, 0x39, 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x37, 0x61, 0x32, 0x34, 0x30, 0x39, + 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, 0x2D, 0x64, 0x39, 0x34, 0x38, + 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, 0x66, 0x66, 0x39, 0x62, 0x39, + 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, + 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x66, 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, + 0x65, 0x34, 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, + 0x2D, 0x32, 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x55, 0x32, 0xFE, 0xAE, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0B, 0xBD, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x7B, 0x90, 0x95, 0x65, 0x1D, 0xC7, + 0x3F, 0xE7, 0xEC, 0xC2, 0xDE, 0x61, 0x59, 0x59, 0x02, 0x44, 0x28, 0x58, + 0xC0, 0x58, 0x09, 0x2C, 0x15, 0x44, 0x25, 0x35, 0x75, 0x6C, 0x14, 0xBB, + 0x20, 0x3A, 0x89, 0x63, 0xD9, 0xFD, 0xDE, 0x4C, 0xC3, 0x54, 0x96, 0x8D, + 0x91, 0x35, 0x43, 0x6A, 0x37, 0x2D, 0x29, 0x13, 0xB5, 0x2C, 0x2A, 0x8B, + 0xA9, 0x94, 0xA9, 0x2C, 0xBB, 0xDF, 0x30, 0x1C, 0xE4, 0xB2, 0x54, 0xC8, + 0x2D, 0x10, 0x01, 0xB9, 0x2E, 0xEC, 0xB2, 0xF7, 0x73, 0x9E, 0xFE, 0xF8, + 0xFD, 0x8E, 0x6E, 0xDC, 0xDE, 0xE7, 0x3D, 0x97, 0xF7, 0x76, 0x9E, 0xEF, + 0xCC, 0x99, 0xDD, 0x85, 0xF7, 0x3D, 0xE7, 0x3D, 0xEF, 0xF7, 0x7D, 0x9E, + 0xE7, 0x77, 0xF9, 0xFE, 0x7E, 0x4F, 0xCA, 0x18, 0x83, 0x43, 0x72, 0x91, + 0x76, 0xB7, 0xC0, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, + 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0x19, 0xA1, + 0x32, 0x61, 0xDF, 0xA7, 0x0A, 0x38, 0x13, 0xA8, 0x05, 0x1A, 0x80, 0x61, + 0xFA, 0xB3, 0x6E, 0xD0, 0xC3, 0x9C, 0x01, 0x8E, 0x01, 0x47, 0xF5, 0xD5, + 0x01, 0x74, 0x01, 0xCF, 0xEB, 0xFF, 0x39, 0x82, 0x23, 0x86, 0x51, 0xC0, + 0x6B, 0xF4, 0xE7, 0xAB, 0x81, 0x69, 0x40, 0x35, 0x50, 0xAF, 0xC4, 0xD6, + 0xEA, 0xDF, 0x29, 0x3D, 0x3E, 0x0B, 0xF4, 0x00, 0xDD, 0x40, 0xA7, 0xBE, + 0xBA, 0x80, 0xF5, 0xC0, 0x73, 0xC0, 0x3E, 0xE0, 0x59, 0xE0, 0x48, 0x12, + 0x08, 0x4E, 0xC5, 0x34, 0x54, 0x59, 0x0D, 0xCC, 0x00, 0xCE, 0x03, 0x66, + 0x02, 0xD3, 0x81, 0x26, 0x7D, 0x35, 0x28, 0x99, 0x69, 0x7D, 0xA5, 0x4E, + 0xF1, 0x1E, 0x46, 0xC9, 0xCE, 0xEA, 0xEF, 0xED, 0xC0, 0x21, 0xE0, 0x30, + 0xF0, 0x0C, 0xB0, 0x01, 0x78, 0x1A, 0x68, 0xD3, 0x63, 0x1C, 0xC1, 0x01, + 0xA0, 0x1E, 0xB8, 0x18, 0x98, 0x0B, 0xCC, 0x02, 0xA6, 0x02, 0x8D, 0x40, + 0x4D, 0x11, 0xED, 0x89, 0xAC, 0x4E, 0xE1, 0x87, 0x80, 0x8D, 0xC0, 0xDF, + 0x81, 0xBF, 0xEA, 0xCF, 0x7E, 0x47, 0x70, 0x69, 0x30, 0x14, 0xB8, 0x0C, + 0xB8, 0x0A, 0x78, 0x3D, 0x30, 0x51, 0x47, 0x6A, 0xA9, 0x97, 0x98, 0x01, + 0x1D, 0xD1, 0x9B, 0x81, 0xA7, 0x80, 0x27, 0x81, 0x7F, 0xE8, 0x88, 0x77, + 0x04, 0x17, 0x09, 0xD3, 0x80, 0xEB, 0x81, 0x6B, 0x74, 0xC4, 0x36, 0x84, + 0x60, 0xFD, 0x67, 0x95, 0xE8, 0x36, 0xE0, 0x71, 0x60, 0x05, 0xB0, 0xC3, + 0x11, 0x5C, 0xB8, 0x01, 0x78, 0x25, 0xF0, 0x7E, 0x60, 0x36, 0x30, 0x32, + 0x02, 0x6E, 0x5D, 0x06, 0xD8, 0x03, 0xFC, 0x11, 0x78, 0x10, 0xF8, 0x93, + 0x23, 0x38, 0x3F, 0x8C, 0x04, 0xDE, 0x09, 0xDC, 0xA0, 0x16, 0xF2, 0x90, + 0x88, 0x5D, 0x5F, 0x17, 0xB0, 0x16, 0x58, 0x06, 0xFC, 0x48, 0xFF, 0x76, + 0x6E, 0x92, 0x25, 0x26, 0x01, 0x1F, 0x07, 0xAE, 0x03, 0xC6, 0x46, 0x34, + 0x18, 0x53, 0xAB, 0x46, 0xDE, 0x19, 0xC0, 0x78, 0xE0, 0x9B, 0xC0, 0x7E, + 0x37, 0x82, 0xBD, 0x71, 0x0E, 0x70, 0x3B, 0xF0, 0x46, 0x0D, 0x52, 0x14, + 0x82, 0x0E, 0xF5, 0x65, 0xBB, 0x4E, 0x12, 0xC0, 0x18, 0xA2, 0x24, 0x35, + 0xEA, 0xCF, 0x7C, 0x61, 0xD4, 0x6F, 0x5E, 0x01, 0xDC, 0x09, 0xEC, 0x75, + 0x04, 0x9F, 0xDE, 0x98, 0x5A, 0x02, 0x5C, 0xA1, 0x6E, 0x4F, 0x3E, 0xD8, + 0xA1, 0x16, 0xEF, 0x0B, 0x1A, 0xB8, 0xD8, 0xA7, 0x24, 0x67, 0x4E, 0x32, + 0x73, 0x8D, 0x00, 0x5E, 0xA1, 0xFE, 0xF4, 0x68, 0x0D, 0x92, 0x8C, 0xC9, + 0xF3, 0x73, 0x8F, 0x02, 0x8F, 0x01, 0x77, 0x00, 0xBB, 0x1D, 0xC1, 0x27, + 0x62, 0x22, 0x70, 0x8F, 0x5A, 0xCA, 0x43, 0x7D, 0x9E, 0xDB, 0xA7, 0xAE, + 0xCB, 0x7A, 0x60, 0x95, 0x12, 0xDC, 0xAE, 0x53, 0x66, 0xAF, 0xBA, 0x3A, + 0xC7, 0x7F, 0xC9, 0x94, 0x7E, 0x4E, 0xB5, 0xAE, 0xF7, 0x8D, 0xFA, 0x80, + 0x9D, 0x0F, 0x9C, 0xAB, 0x46, 0x5D, 0x3E, 0x33, 0xC6, 0x72, 0xE0, 0xB3, + 0x51, 0x9A, 0xAE, 0xA3, 0x40, 0xF0, 0x08, 0xE0, 0x6E, 0x60, 0xA1, 0xDE, + 0x70, 0x3F, 0xF8, 0x3D, 0xF0, 0x3B, 0xB5, 0x6A, 0x77, 0x68, 0x70, 0xA2, + 0x17, 0x7F, 0x91, 0xA7, 0x94, 0xBE, 0x6A, 0x74, 0x4D, 0x7D, 0x25, 0x70, + 0xB5, 0xCE, 0x24, 0xE7, 0xFB, 0xBC, 0x9E, 0x76, 0xE0, 0x3E, 0x9D, 0xAE, + 0xFB, 0x1D, 0xC1, 0x50, 0x01, 0xDC, 0x06, 0x2C, 0x02, 0x86, 0xFB, 0x38, + 0xEF, 0x3F, 0xC0, 0x4F, 0x81, 0x95, 0x3A, 0x62, 0x4F, 0x36, 0x0D, 0x17, + 0x72, 0x4D, 0x67, 0x00, 0xAD, 0xC0, 0x5B, 0x80, 0xF9, 0x6A, 0xEC, 0xD9, + 0x62, 0x17, 0xB0, 0x58, 0xDD, 0xA8, 0xB2, 0x27, 0x78, 0x3E, 0xF0, 0x15, + 0xB5, 0x44, 0x6D, 0xF1, 0x2B, 0x60, 0xA9, 0x4E, 0xC7, 0x07, 0x29, 0x5D, + 0x9C, 0xB8, 0x02, 0xC9, 0x4C, 0xCD, 0x05, 0xDE, 0x87, 0x84, 0x48, 0x6D, + 0xF1, 0x6F, 0x75, 0xF3, 0x56, 0x95, 0x33, 0xC1, 0x13, 0x75, 0xCD, 0xBA, + 0x80, 0x53, 0x27, 0x04, 0x8E, 0xB7, 0x58, 0x97, 0x02, 0x0F, 0xEB, 0x7A, + 0xDB, 0x17, 0xD0, 0x75, 0xD6, 0x00, 0xAF, 0x03, 0x3E, 0x0A, 0x2C, 0xB0, + 0x3C, 0x27, 0xAB, 0xB3, 0xCB, 0x2D, 0x84, 0x9C, 0x95, 0xAA, 0x0C, 0xF1, + 0x73, 0x3F, 0xAC, 0x37, 0xCE, 0x86, 0xDC, 0x8C, 0x8E, 0xF4, 0xA5, 0xBA, + 0xD6, 0x06, 0x99, 0xDD, 0xE9, 0x56, 0x23, 0xAE, 0x5D, 0xAD, 0xE5, 0x77, + 0x59, 0x9C, 0x93, 0x46, 0xA2, 0x70, 0x6F, 0x07, 0xEE, 0x0D, 0x93, 0xE0, + 0xB0, 0x82, 0x08, 0x17, 0x02, 0x6F, 0xF3, 0xF1, 0x80, 0xDD, 0x03, 0x7C, + 0x1D, 0xD8, 0x4E, 0x38, 0xA9, 0xBB, 0x0C, 0x92, 0x59, 0x5A, 0xE2, 0x63, + 0x6D, 0xAD, 0xD1, 0xA9, 0x7D, 0x7A, 0xB9, 0x11, 0x5C, 0x0B, 0x7C, 0x40, + 0x7D, 0x4F, 0x1B, 0x3C, 0xA8, 0x96, 0xE9, 0x0B, 0x21, 0x2F, 0x67, 0x06, + 0xD8, 0x0A, 0x7C, 0x49, 0xA7, 0x5F, 0x1B, 0x4C, 0x05, 0x6E, 0x2E, 0x30, + 0x98, 0x12, 0x2B, 0x82, 0x2B, 0x90, 0x10, 0xDF, 0xD5, 0x96, 0xC7, 0xFF, + 0x41, 0xA7, 0xE6, 0xB0, 0xC9, 0x3D, 0x19, 0xC9, 0x1B, 0x2C, 0xBF, 0xEF, + 0x0D, 0xC0, 0xAB, 0xCA, 0x85, 0xE0, 0x34, 0xF0, 0x0E, 0xF5, 0x7D, 0xBD, + 0xF0, 0xBC, 0xFA, 0xC7, 0x9B, 0x88, 0x16, 0x0C, 0xA2, 0xF4, 0xB8, 0x0B, + 0x91, 0xFB, 0x78, 0x61, 0x82, 0x0F, 0xE3, 0x2C, 0xF6, 0x04, 0x4F, 0xF1, + 0x31, 0x7A, 0x1F, 0x45, 0xD2, 0x71, 0x51, 0x94, 0xCB, 0xF4, 0xEB, 0x34, + 0xFD, 0x43, 0xCB, 0x40, 0xCA, 0x8D, 0x48, 0xC4, 0xAC, 0x22, 0xE9, 0x04, + 0xCF, 0x07, 0x9A, 0x2D, 0x8E, 0x5B, 0x45, 0xC4, 0xD3, 0x70, 0x6A, 0x55, + 0x7F, 0x57, 0x0D, 0x3F, 0x2F, 0xB4, 0x00, 0xD7, 0x86, 0xF1, 0xB0, 0x06, + 0x49, 0x70, 0x35, 0x22, 0xB9, 0xB1, 0x71, 0x8B, 0x1E, 0x8E, 0xE0, 0xD4, + 0x7C, 0x32, 0x3C, 0x6B, 0x39, 0x8A, 0x2B, 0x91, 0xF4, 0xA7, 0x49, 0x32, + 0xC1, 0xB3, 0x81, 0xC9, 0x16, 0xC7, 0xAD, 0x47, 0x62, 0xCB, 0x7D, 0x31, + 0x20, 0xB8, 0x0B, 0x91, 0xF0, 0xD8, 0x64, 0x90, 0x5A, 0x81, 0x71, 0x49, + 0x26, 0x78, 0x0E, 0x92, 0xB5, 0xF1, 0xC2, 0x13, 0xC0, 0x4E, 0xE2, 0x83, + 0x8D, 0x48, 0xF8, 0xD4, 0x0B, 0x63, 0x10, 0xC1, 0x60, 0x62, 0x09, 0x9E, + 0x84, 0xB7, 0xF4, 0xE6, 0x00, 0x92, 0x21, 0xEA, 0x89, 0x11, 0xC1, 0x9D, + 0xD8, 0x69, 0xB3, 0xEA, 0x10, 0xF9, 0x51, 0x22, 0x09, 0x1E, 0xAE, 0x4E, + 0xBF, 0xD7, 0xFA, 0xBB, 0x5A, 0x47, 0x44, 0xDC, 0xB0, 0x0E, 0x51, 0x5C, + 0x7A, 0x59, 0xD3, 0x89, 0x9D, 0xA2, 0xA7, 0x5A, 0x3A, 0xFB, 0x5B, 0x90, + 0x0C, 0x51, 0xDC, 0xB0, 0x1D, 0x11, 0xE1, 0x79, 0x11, 0x3C, 0xC9, 0xD2, + 0x8B, 0x88, 0x1D, 0xC1, 0x63, 0x90, 0xAA, 0x04, 0xAF, 0x00, 0xC2, 0x26, + 0x44, 0x81, 0x11, 0x37, 0x74, 0x5A, 0x1A, 0x5A, 0x13, 0x80, 0xB3, 0x93, + 0x48, 0x70, 0xBD, 0x85, 0x93, 0xFF, 0x22, 0x92, 0x47, 0x8D, 0x23, 0x8C, + 0xCE, 0x3E, 0x5E, 0x0F, 0x67, 0xAD, 0xA5, 0xA1, 0x19, 0x3B, 0x82, 0xEB, + 0x2C, 0x3E, 0x6B, 0x3F, 0x22, 0x92, 0x8B, 0x2B, 0xB6, 0xE3, 0x9D, 0xFB, + 0xCD, 0x69, 0xC1, 0x12, 0x47, 0xF0, 0x30, 0x8B, 0xCF, 0xEA, 0x8C, 0x99, + 0xF5, 0x7C, 0x3C, 0x8E, 0x20, 0xD1, 0x2D, 0x2F, 0x82, 0xAB, 0x92, 0x48, + 0xB0, 0xCD, 0x97, 0xEA, 0x25, 0x86, 0xD5, 0x7B, 0x83, 0xD0, 0x87, 0x88, + 0x03, 0xBC, 0x30, 0x24, 0x89, 0x04, 0x1B, 0xBC, 0xC3, 0x74, 0x71, 0x6F, + 0x27, 0x91, 0xB6, 0xFC, 0x0E, 0xA9, 0x24, 0x12, 0xDC, 0x6B, 0x41, 0x70, + 0x25, 0xF1, 0xEE, 0x38, 0x90, 0xB2, 0xB8, 0xFE, 0x6C, 0xD0, 0xCB, 0x50, + 0x50, 0x04, 0x77, 0xE0, 0x2D, 0x6B, 0xAD, 0x0F, 0xDA, 0x00, 0x29, 0x32, + 0x9A, 0x2D, 0x7D, 0xDC, 0x81, 0x24, 0x12, 0xDC, 0x65, 0x31, 0x82, 0xC7, + 0x22, 0xA2, 0xF3, 0xB8, 0x62, 0x32, 0xDE, 0xDA, 0xEE, 0x34, 0x01, 0xA7, + 0x0C, 0x83, 0x24, 0xD8, 0xCB, 0x0F, 0x6E, 0x44, 0x04, 0x01, 0x71, 0x85, + 0x4D, 0xFD, 0x72, 0x07, 0x01, 0x27, 0x52, 0x82, 0x22, 0x78, 0x0B, 0x52, + 0x21, 0xEF, 0xB5, 0x06, 0x9F, 0x19, 0x53, 0x63, 0x6B, 0x04, 0x12, 0x86, + 0xF4, 0x32, 0x34, 0xB7, 0x03, 0xDB, 0x92, 0x48, 0xF0, 0x36, 0xA4, 0xC4, + 0xC4, 0x0B, 0xE7, 0x91, 0x7F, 0x85, 0x5F, 0x98, 0x18, 0x0F, 0x5C, 0x64, + 0x71, 0xDC, 0x2E, 0x02, 0x16, 0xC2, 0x07, 0x45, 0xF0, 0x31, 0xFD, 0x72, + 0x5E, 0x78, 0xAD, 0xC5, 0x48, 0x88, 0x22, 0x5A, 0xF1, 0x2E, 0xBF, 0x31, + 0x48, 0xBC, 0x3A, 0x93, 0x44, 0x82, 0x0D, 0x12, 0x67, 0xEE, 0xF5, 0x38, + 0x6E, 0x38, 0xF0, 0x86, 0x98, 0x91, 0x5B, 0x83, 0x94, 0xBD, 0x7A, 0xD9, + 0x18, 0x9D, 0xC0, 0x9F, 0xC3, 0x70, 0xCE, 0x83, 0xC2, 0x53, 0xD8, 0x89, + 0xE8, 0xAE, 0x27, 0x44, 0x1D, 0x71, 0x1E, 0x98, 0x01, 0x5C, 0x6E, 0x71, + 0xDC, 0x51, 0x44, 0x6E, 0x9B, 0x58, 0x82, 0xDB, 0xB0, 0x53, 0x20, 0x4E, + 0x41, 0x5A, 0x38, 0xC4, 0xC1, 0xD8, 0xAA, 0x42, 0x94, 0xA2, 0xA3, 0x2C, + 0x8E, 0x5D, 0x45, 0x08, 0x85, 0xE1, 0x41, 0xDE, 0xC4, 0x2E, 0xEC, 0x15, + 0x88, 0xEF, 0x45, 0x44, 0x02, 0x51, 0xC7, 0x4C, 0x44, 0xD4, 0x6E, 0x73, + 0x1F, 0x1F, 0x23, 0x84, 0x58, 0x7B, 0xD0, 0xA3, 0xE4, 0xB7, 0xD8, 0xA5, + 0x04, 0x5B, 0x91, 0xFA, 0x5A, 0x08, 0x41, 0x2C, 0x6E, 0x89, 0x6A, 0xA4, + 0x1B, 0xD0, 0x59, 0x16, 0xC7, 0x6E, 0xC4, 0x5B, 0xF1, 0x91, 0x08, 0x82, + 0xB7, 0x22, 0xAA, 0x49, 0x9B, 0x51, 0x7C, 0x93, 0x4E, 0x7F, 0x51, 0x6B, + 0xF1, 0x9B, 0xCB, 0x06, 0xDD, 0xEA, 0x63, 0x29, 0xF9, 0x09, 0x21, 0x35, + 0x67, 0x09, 0x9A, 0xE0, 0x63, 0xC0, 0xF7, 0x2C, 0x47, 0xF1, 0x18, 0xE0, + 0x33, 0x48, 0x53, 0x94, 0x28, 0xA1, 0x1F, 0x98, 0x07, 0x7C, 0x0C, 0x69, + 0xAB, 0x68, 0x33, 0x7A, 0x7F, 0x4E, 0x48, 0x55, 0x1A, 0x41, 0x13, 0x6C, + 0x80, 0x35, 0x96, 0xA3, 0x38, 0x85, 0xC8, 0x4C, 0x17, 0x23, 0x5A, 0xA6, + 0x28, 0xAD, 0xBB, 0xB7, 0x23, 0xE5, 0x28, 0x36, 0x58, 0x81, 0xF4, 0xA1, + 0x36, 0xE5, 0x40, 0x70, 0xCE, 0x1F, 0x5C, 0x66, 0x19, 0xF8, 0xA8, 0x50, + 0xBF, 0xF8, 0x73, 0x48, 0x18, 0x33, 0x6C, 0x4C, 0x47, 0x2A, 0x1E, 0x67, + 0x5A, 0xDA, 0x06, 0x1B, 0x91, 0x66, 0x31, 0xDD, 0x61, 0x5D, 0x70, 0x58, + 0xAE, 0xC8, 0x1A, 0xE0, 0x01, 0xCB, 0x63, 0x6B, 0x75, 0x2D, 0xFE, 0x2A, + 0xD2, 0xAC, 0x2C, 0x2C, 0x5C, 0x08, 0x7C, 0x03, 0xB8, 0x04, 0xBB, 0xB4, + 0x66, 0x2F, 0xD2, 0xBE, 0xE1, 0xB9, 0x30, 0x9F, 0xC8, 0xB0, 0x08, 0xEE, + 0x45, 0x2A, 0xF3, 0x7E, 0x69, 0x79, 0x7C, 0x03, 0x12, 0x2D, 0xBA, 0xCF, + 0x32, 0xA8, 0x50, 0x6C, 0x2C, 0x00, 0xBE, 0xA6, 0x24, 0xDB, 0x6A, 0xAA, + 0x96, 0xEB, 0xF4, 0xDC, 0x1B, 0x26, 0xC1, 0x61, 0x76, 0xD9, 0x49, 0xEB, + 0xF4, 0xFB, 0x00, 0xF6, 0x79, 0xE0, 0x7E, 0xA4, 0x47, 0xD6, 0x32, 0xBD, + 0x81, 0xA5, 0x0E, 0x1C, 0x8C, 0x47, 0x9A, 0xAE, 0xDC, 0xAC, 0x76, 0x80, + 0xAD, 0xCB, 0xB6, 0x1A, 0xF8, 0x08, 0x21, 0x44, 0xAE, 0xA2, 0x44, 0x30, + 0x48, 0x1C, 0x77, 0xA1, 0x8E, 0x4C, 0xDB, 0x2E, 0x77, 0x59, 0xB5, 0xC2, + 0x9F, 0x06, 0x1E, 0x02, 0xFE, 0x82, 0x77, 0x2A, 0xD2, 0x2F, 0xC6, 0xE8, + 0x4C, 0x71, 0xAB, 0xAE, 0xB7, 0x4D, 0xD8, 0x6B, 0xA9, 0xF6, 0x22, 0x81, + 0x9A, 0x27, 0x89, 0x40, 0x85, 0x64, 0x14, 0x5A, 0x19, 0x0E, 0x57, 0x97, + 0x63, 0xB1, 0xCF, 0xF3, 0x7A, 0x90, 0x36, 0x0F, 0xFF, 0x04, 0x7E, 0xA6, + 0x81, 0x84, 0xAD, 0x05, 0x5E, 0x4B, 0x2B, 0x92, 0xB2, 0x7C, 0x13, 0x92, + 0xD9, 0x1A, 0x8B, 0x3F, 0x15, 0x64, 0xBF, 0x8E, 0xDC, 0x47, 0x89, 0x48, + 0xF1, 0x7A, 0x54, 0x9A, 0x91, 0x8E, 0x46, 0x9A, 0x78, 0x7E, 0x30, 0x0F, + 0xB7, 0xAB, 0x4B, 0x47, 0xF4, 0x66, 0xA4, 0x32, 0x71, 0x27, 0x52, 0x98, + 0xBD, 0xC3, 0xC2, 0x7A, 0xAD, 0x53, 0x52, 0xA7, 0x20, 0x69, 0xCA, 0xAB, + 0x90, 0x02, 0xB1, 0x51, 0xBA, 0xD6, 0xFA, 0x55, 0x40, 0xDE, 0x86, 0xF4, + 0xF2, 0x8A, 0xCC, 0x96, 0x3C, 0x51, 0x21, 0x38, 0xA5, 0x6B, 0xDC, 0x22, + 0xE0, 0x43, 0x79, 0xFA, 0xD7, 0xFD, 0x7A, 0x63, 0xBB, 0x95, 0xEC, 0x5C, + 0xD7, 0xD9, 0xBE, 0x53, 0x1C, 0x9F, 0x6B, 0x3E, 0x3A, 0x4D, 0x5D, 0xB0, + 0x3A, 0x44, 0x36, 0x94, 0xCE, 0x83, 0xD8, 0x2C, 0xF0, 0x45, 0xB5, 0x9A, + 0x0F, 0x44, 0x29, 0x2A, 0x13, 0xA5, 0x7E, 0xD1, 0x29, 0x44, 0x95, 0x78, + 0xAD, 0x92, 0x3C, 0x33, 0x4F, 0x2B, 0x3F, 0x47, 0x76, 0x0F, 0x12, 0xE6, + 0xCC, 0x9E, 0xC6, 0xC8, 0xAB, 0x54, 0xA2, 0x2B, 0xC8, 0x4F, 0xAF, 0x3C, + 0x00, 0xFC, 0x0D, 0xB8, 0x1F, 0x49, 0x87, 0x1E, 0x22, 0x62, 0x88, 0x92, + 0x0E, 0x39, 0xD7, 0x3D, 0xFD, 0x80, 0x92, 0x93, 0x2A, 0xE0, 0x41, 0x19, + 0x4A, 0x30, 0x12, 0xDC, 0x14, 0x12, 0x7E, 0x7D, 0x31, 0x8A, 0xE4, 0x46, + 0x69, 0x04, 0xB7, 0x20, 0xF1, 0xDD, 0x59, 0xBA, 0x16, 0xB6, 0x10, 0x70, + 0x15, 0x5E, 0x01, 0xD8, 0xAF, 0xCB, 0xC1, 0x36, 0x64, 0xF3, 0xAC, 0x5F, + 0x10, 0xA1, 0xAE, 0xEF, 0x61, 0x13, 0x3C, 0x47, 0xA7, 0xE4, 0xCB, 0x91, + 0xB4, 0x5B, 0x93, 0x5A, 0xAD, 0x69, 0x02, 0x2E, 0xF1, 0x28, 0x00, 0xB9, + 0xED, 0xF1, 0xFA, 0x91, 0xE2, 0xF5, 0x2D, 0x48, 0x5A, 0x74, 0x25, 0xD2, + 0x50, 0xA6, 0x2C, 0x09, 0x9E, 0xA6, 0x01, 0x84, 0x2B, 0xD5, 0x15, 0x69, + 0x8C, 0x19, 0xA9, 0x5E, 0xEB, 0x7F, 0xBB, 0x12, 0xFD, 0x1B, 0x0D, 0xE4, + 0xEC, 0x29, 0x17, 0x82, 0x1B, 0x94, 0xD8, 0x85, 0x48, 0x25, 0x40, 0x18, + 0xBB, 0x98, 0x05, 0x85, 0x01, 0x44, 0x87, 0xB5, 0x01, 0x78, 0x04, 0x69, + 0xEC, 0xD6, 0x93, 0x64, 0x82, 0x2F, 0x02, 0x3E, 0x89, 0xF4, 0xCB, 0x6A, + 0x22, 0xBA, 0x4A, 0x8D, 0x62, 0x23, 0xA3, 0xEB, 0xF4, 0xAF, 0x91, 0x78, + 0xF6, 0xBA, 0xA4, 0x11, 0x3C, 0x04, 0x78, 0x37, 0xD2, 0x00, 0xBC, 0x85, + 0x78, 0x17, 0x98, 0x15, 0x82, 0x4E, 0x44, 0x78, 0xF8, 0x65, 0x24, 0x85, + 0x98, 0xB3, 0xC2, 0x4D, 0x9C, 0x09, 0x6E, 0x46, 0x54, 0x19, 0x37, 0x22, + 0xD1, 0xA1, 0x62, 0x4D, 0xC7, 0xFD, 0x1A, 0xD0, 0x18, 0x1C, 0xC4, 0xC8, + 0x6D, 0x80, 0x55, 0x45, 0x7E, 0x5B, 0xF3, 0xF4, 0xEA, 0xAC, 0x52, 0x7B, + 0x9C, 0xBB, 0x55, 0x4D, 0xF1, 0x8A, 0xB6, 0x07, 0x74, 0x3D, 0xBE, 0x1F, + 0x69, 0x70, 0xDE, 0x1D, 0xE7, 0x11, 0x3C, 0x01, 0xF8, 0x3C, 0xB2, 0x73, + 0x49, 0x43, 0x81, 0xEF, 0xB5, 0x67, 0x90, 0xAF, 0xB9, 0x1A, 0x91, 0xDF, + 0x1E, 0xD6, 0x51, 0x91, 0x1D, 0xE4, 0xAE, 0xF4, 0xAB, 0xC1, 0x56, 0x8F, + 0x7D, 0x15, 0x5F, 0x5A, 0xDF, 0xA7, 0x5D, 0x89, 0x6C, 0x1E, 0xF4, 0xEF, + 0x0D, 0xBA, 0x9C, 0x4C, 0x46, 0x62, 0xD3, 0x4D, 0x48, 0x22, 0x62, 0x64, + 0x81, 0x86, 0xD8, 0x61, 0x44, 0x61, 0x7A, 0x07, 0x25, 0x6E, 0x1B, 0x55, + 0x2A, 0x82, 0x27, 0x20, 0xED, 0xEF, 0xE7, 0x21, 0x21, 0xC0, 0x7C, 0x70, + 0x48, 0xFD, 0xCA, 0xAD, 0x48, 0x63, 0xF0, 0x2D, 0x3A, 0x4A, 0x8F, 0xE8, + 0x88, 0xCB, 0x45, 0xA9, 0xCC, 0xA0, 0xB5, 0xCE, 0xE8, 0x28, 0x4C, 0xFB, + 0x98, 0xFA, 0x52, 0xFA, 0x3E, 0x19, 0xFD, 0xBD, 0x62, 0xD0, 0xBF, 0xA7, + 0xF5, 0xEF, 0x6A, 0x25, 0x7B, 0x18, 0x22, 0xE7, 0x9D, 0xAB, 0xCB, 0xCD, + 0x9C, 0x02, 0x1E, 0xDE, 0x0E, 0xE0, 0x07, 0xC0, 0xA7, 0x29, 0x7E, 0x36, + 0xAC, 0xA4, 0x04, 0x8F, 0x43, 0x3A, 0xA2, 0xBF, 0x99, 0xFC, 0x5A, 0xD9, + 0xB7, 0x21, 0x42, 0x80, 0x35, 0x48, 0xA6, 0xA8, 0x53, 0x6F, 0x46, 0x1F, + 0x76, 0xAD, 0x20, 0x4A, 0x76, 0xAF, 0x78, 0xB9, 0x89, 0x4A, 0xBD, 0xCE, + 0x14, 0xB3, 0x91, 0x8D, 0x45, 0xAE, 0xC1, 0x5E, 0xA3, 0x75, 0x3C, 0xC9, + 0xDF, 0xD7, 0x65, 0xEC, 0x70, 0x1C, 0x08, 0x1E, 0x81, 0x04, 0xDC, 0xDF, + 0x9A, 0x07, 0xB9, 0xEB, 0x80, 0x1F, 0xEB, 0x68, 0xDD, 0xA4, 0x2E, 0x45, + 0x0F, 0xD1, 0xDD, 0x6D, 0x3B, 0xB7, 0x5B, 0x5A, 0x35, 0x22, 0x0E, 0xBC, + 0x42, 0x6D, 0x0D, 0xBF, 0x44, 0x77, 0x02, 0xDF, 0xD6, 0x91, 0xDC, 0x17, + 0x65, 0x82, 0xAB, 0xF4, 0x22, 0x17, 0xF9, 0x24, 0xF7, 0x20, 0x2F, 0xCB, + 0x5B, 0xD6, 0x22, 0xB1, 0xDD, 0xB8, 0x75, 0xBB, 0x1B, 0xA2, 0x4B, 0xD1, + 0x2C, 0x25, 0xF9, 0x26, 0xFC, 0xB5, 0x4B, 0x3A, 0xAC, 0x2E, 0xE4, 0x77, + 0xA2, 0x4C, 0xF0, 0x3C, 0x44, 0x4A, 0xD3, 0xEC, 0x73, 0xD4, 0xDE, 0x85, + 0xE4, 0x71, 0x0F, 0x12, 0xEF, 0x36, 0x4A, 0xB9, 0x87, 0x7C, 0xA4, 0x4E, + 0xD9, 0x9F, 0xC0, 0x5F, 0x29, 0xEC, 0x26, 0xE0, 0x3D, 0x88, 0x42, 0xA5, + 0x78, 0x30, 0xC6, 0x14, 0xE3, 0xD5, 0x62, 0x8C, 0x59, 0x6B, 0xFC, 0xE1, + 0x21, 0x63, 0xCC, 0x0C, 0x63, 0x4C, 0x8D, 0x31, 0x26, 0x55, 0xA4, 0xEB, + 0x88, 0xC2, 0x2B, 0x65, 0x8C, 0xA9, 0x33, 0xC6, 0x5C, 0x60, 0x8C, 0x59, + 0xE9, 0xE3, 0x7E, 0x0C, 0x18, 0x63, 0x1E, 0x37, 0xC6, 0x8C, 0x2B, 0xE6, + 0xF5, 0x14, 0xC3, 0x2F, 0x1D, 0xA6, 0x4F, 0x5E, 0xAB, 0x0F, 0x5F, 0x70, + 0x89, 0xBA, 0x08, 0x6D, 0xEA, 0x0B, 0x1A, 0x92, 0x03, 0xA3, 0xCB, 0xCC, + 0x1A, 0x44, 0x8A, 0xF4, 0x88, 0xE5, 0x79, 0x15, 0x48, 0x6C, 0x7E, 0x5E, + 0xD4, 0xA6, 0xE8, 0x8B, 0x91, 0x14, 0x59, 0x93, 0x65, 0xD8, 0xEE, 0x0B, + 0xBA, 0xD6, 0xEC, 0x4E, 0x18, 0xB1, 0xA7, 0xF2, 0xB1, 0xC7, 0x23, 0x7A, + 0xB3, 0x5B, 0x2C, 0xCF, 0xF9, 0xAF, 0x1A, 0x6C, 0x5B, 0x8B, 0x75, 0x01, + 0x85, 0xA0, 0x1A, 0x51, 0x5F, 0x34, 0x59, 0x1E, 0x7F, 0x2F, 0xA2, 0x59, + 0x2A, 0x07, 0x72, 0x51, 0xFF, 0x7A, 0x27, 0x52, 0xEA, 0xB2, 0xC2, 0xF2, + 0x9C, 0xF1, 0xC8, 0x96, 0x78, 0xA9, 0x28, 0x10, 0x7C, 0x09, 0x70, 0x99, + 0xE5, 0xB1, 0x4F, 0x20, 0xBB, 0x98, 0xED, 0x2B, 0x13, 0x72, 0x07, 0x93, + 0xBC, 0x0B, 0xF8, 0x14, 0xF0, 0x8C, 0x25, 0x27, 0x0B, 0x28, 0x52, 0x97, + 0x83, 0x42, 0x09, 0xBE, 0xCE, 0xD2, 0x6A, 0xDE, 0xA9, 0xD3, 0xD4, 0xEE, + 0x32, 0x23, 0x77, 0xF0, 0xBA, 0xBC, 0x4D, 0x6D, 0x0F, 0x1B, 0xC5, 0xE5, + 0x59, 0x1A, 0x4B, 0x08, 0x95, 0xE0, 0x16, 0x1D, 0xC1, 0x36, 0xEF, 0xF1, + 0x2D, 0xA4, 0x10, 0x2B, 0x4B, 0xF9, 0x22, 0x8B, 0xA4, 0x0C, 0x97, 0x5B, + 0x1A, 0x5C, 0x97, 0x6A, 0x20, 0x25, 0x34, 0x82, 0xCF, 0xC5, 0xAE, 0x18, + 0x6C, 0x15, 0x22, 0x4C, 0xEF, 0xC1, 0xE1, 0x18, 0xB2, 0x9B, 0xAA, 0x8D, + 0x01, 0x35, 0x07, 0xD9, 0x3C, 0x3B, 0x34, 0x82, 0x5B, 0xF1, 0x56, 0x65, + 0x66, 0x90, 0xDC, 0xE7, 0x16, 0xC7, 0xED, 0x4B, 0xC8, 0x15, 0x84, 0xDB, + 0xB8, 0x9F, 0x67, 0x87, 0x45, 0x70, 0xA3, 0x9A, 0xF2, 0x5E, 0xE7, 0xB7, + 0x21, 0xB1, 0xE5, 0x01, 0xC7, 0xEB, 0x4B, 0xE8, 0x45, 0x36, 0xD2, 0xDA, + 0x6B, 0xC1, 0xCD, 0x39, 0x61, 0x11, 0x3C, 0x12, 0xBB, 0xC6, 0xA1, 0x9B, + 0x91, 0x12, 0x12, 0x87, 0xFF, 0xC7, 0xBF, 0xB0, 0xDB, 0x67, 0xE9, 0x52, + 0xEC, 0x37, 0xD2, 0x2E, 0x2A, 0xC1, 0xCD, 0x78, 0xAB, 0x26, 0x06, 0x90, + 0x0A, 0xC0, 0x76, 0xC7, 0xE7, 0x09, 0x68, 0xC7, 0x6E, 0x83, 0xE9, 0xD1, + 0x14, 0x28, 0x96, 0xC8, 0x97, 0xE0, 0xD1, 0x78, 0x8B, 0xE6, 0x0E, 0x21, + 0xBA, 0xE0, 0x8C, 0xE3, 0xF3, 0x04, 0x74, 0x23, 0x89, 0x16, 0xAF, 0xF4, + 0x60, 0xA5, 0xAE, 0xC5, 0x81, 0x13, 0x3C, 0xDC, 0xE2, 0xDC, 0xA3, 0xC4, + 0x73, 0x17, 0xB3, 0xA0, 0xB0, 0xCF, 0xC2, 0x27, 0x4E, 0x87, 0x45, 0x70, + 0x2D, 0xDE, 0xA1, 0xB4, 0x7E, 0xE2, 0xB1, 0x45, 0x6C, 0x98, 0x2E, 0x93, + 0xD7, 0xFD, 0x49, 0x91, 0x9F, 0x2A, 0xA6, 0x60, 0x82, 0xAB, 0x2D, 0x09, + 0x76, 0xD6, 0xF3, 0xE9, 0xEF, 0x8F, 0x4D, 0xE0, 0xC7, 0x84, 0x41, 0xB0, + 0x0D, 0x32, 0x94, 0x77, 0xE4, 0xCA, 0x0B, 0x7D, 0x04, 0x10, 0xB6, 0x2D, + 0x65, 0xF9, 0x68, 0x13, 0x92, 0xDB, 0x9C, 0x41, 0xC0, 0xBB, 0x7D, 0xC5, + 0x84, 0xDC, 0xE9, 0xE4, 0xAF, 0x38, 0x8D, 0x04, 0xC1, 0xE3, 0x80, 0x3B, + 0x29, 0xCF, 0xE4, 0x82, 0x0D, 0x2A, 0x08, 0xA0, 0xCA, 0xA3, 0xB2, 0xC4, + 0x5F, 0xA0, 0xC2, 0xF1, 0x18, 0x2E, 0xD2, 0xEE, 0x16, 0x38, 0x82, 0x1D, + 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0xB0, 0x43, 0x74, 0x08, 0xCE, + 0x15, 0x62, 0x39, 0x94, 0x16, 0x05, 0xDF, 0xE7, 0x7C, 0xDD, 0xA4, 0x23, + 0x48, 0x3D, 0x4D, 0x35, 0x2E, 0x5A, 0x55, 0xCA, 0xC1, 0xD7, 0x41, 0x81, + 0x45, 0xE2, 0x51, 0xEA, 0x74, 0xE7, 0xE0, 0xD6, 0x60, 0x07, 0x47, 0xB0, + 0x83, 0x23, 0xD8, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, + 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0xD9, 0xE2, + 0x7F, 0x03, 0x00, 0xFF, 0x90, 0x57, 0xA9, 0xA4, 0xD4, 0xE2, 0xD9, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* config_icon = raw::config; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/icons/legit.hpp b/cheat/internal_rewrite/icons/legit.hpp new file mode 100644 index 0000000..13a06f4 --- /dev/null +++ b/cheat/internal_rewrite/icons/legit.hpp @@ -0,0 +1,1798 @@ +/* E:\Users\admin\Desktop\stuff\icons\legit.png (4/1/2018 9:59:16 PM) + StartOffset: 00000000, EndOffset: 000053B8, Length: 000053B9 */ + +namespace icons { +constexpr static size_t legit_size = 21433; +namespace raw { +static unsigned char legit[21433] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x32, + 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, 0x39, 0x32, + 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, 0x2D, 0x35, + 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, 0x33, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x64, 0x63, 0x38, 0x34, + 0x38, 0x37, 0x30, 0x30, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x61, + 0x32, 0x66, 0x61, 0x64, 0x37, 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, + 0x2D, 0x39, 0x66, 0x34, 0x30, 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, + 0x37, 0x35, 0x61, 0x36, 0x31, 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, 0x32, 0x66, 0x61, 0x64, 0x37, + 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, 0x2D, 0x39, 0x66, 0x34, 0x30, + 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, 0x37, 0x35, 0x61, 0x36, 0x31, + 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x32, 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, + 0x39, 0x32, 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, + 0x2D, 0x35, 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, + 0x33, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x78, 0xE1, 0xB7, 0x9F, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0D, 0xDB, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x70, 0xD5, 0xD5, 0x15, 0xC7, + 0xBF, 0x2F, 0x21, 0x46, 0x88, 0x24, 0x84, 0x04, 0x15, 0xC4, 0x32, 0xE0, + 0x82, 0x88, 0x8A, 0x80, 0x48, 0x47, 0xAA, 0x8E, 0xD6, 0x05, 0x5C, 0xAA, + 0xA2, 0xD6, 0xB1, 0x08, 0x6A, 0xD5, 0x56, 0xB4, 0x75, 0x5F, 0x6A, 0xDD, + 0x82, 0x6B, 0xC5, 0xE2, 0x86, 0xB4, 0xD6, 0xDA, 0xD6, 0x8D, 0x8A, 0x75, + 0x5C, 0xC6, 0x1D, 0xB4, 0x3A, 0x50, 0xB7, 0xBA, 0x55, 0x45, 0x44, 0x91, + 0x28, 0x22, 0xAB, 0x52, 0x76, 0x49, 0x42, 0x96, 0x6F, 0xFF, 0xB8, 0xDF, + 0x37, 0xF3, 0x4C, 0x21, 0xF9, 0x9D, 0x9B, 0xDF, 0x7B, 0xEF, 0x17, 0x72, + 0xCF, 0xCC, 0x6F, 0x70, 0xCC, 0xFB, 0xBD, 0x7B, 0xDF, 0xFD, 0xFC, 0xCE, + 0xB9, 0xE7, 0xDE, 0x7B, 0xCE, 0xF9, 0xA5, 0x48, 0x22, 0xC8, 0x96, 0x2B, + 0x05, 0x61, 0x08, 0x02, 0xE0, 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, + 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, + 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, + 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, 0x20, 0x01, 0x70, 0x90, 0xF6, + 0x27, 0x9D, 0x12, 0xD2, 0x8F, 0x42, 0x00, 0x83, 0x00, 0x1C, 0x09, 0x60, + 0x00, 0x80, 0x62, 0x00, 0x5F, 0x01, 0x78, 0x0B, 0xC0, 0x8B, 0x00, 0xBE, + 0x03, 0xD0, 0x98, 0x60, 0x25, 0xD9, 0x19, 0xC0, 0xF1, 0x00, 0x06, 0x02, + 0xD8, 0x06, 0xC0, 0x22, 0x00, 0xEF, 0x02, 0x78, 0x0A, 0xC0, 0xEA, 0x8E, + 0x0E, 0xB8, 0x04, 0xC0, 0xD1, 0x00, 0x2E, 0x05, 0x30, 0xA4, 0xD9, 0xDF, + 0x96, 0x01, 0x98, 0x0A, 0xE0, 0x3E, 0x00, 0x9F, 0x01, 0x48, 0x5A, 0x7C, + 0x51, 0x31, 0x80, 0x91, 0xEA, 0xFB, 0x88, 0x66, 0x7F, 0x5B, 0x07, 0xA0, + 0x3F, 0x80, 0x5B, 0x01, 0xAC, 0xCC, 0x5B, 0x0F, 0x49, 0xE6, 0xFB, 0xDA, + 0x9D, 0xE4, 0x7B, 0xDC, 0xBC, 0x6C, 0x20, 0x79, 0x3B, 0xC9, 0x01, 0x24, + 0x53, 0x09, 0xE8, 0x6F, 0xFA, 0xEA, 0x42, 0xF2, 0xF8, 0x56, 0xFA, 0x5E, + 0x4F, 0xF2, 0x12, 0x92, 0x9D, 0xF2, 0xD5, 0xCF, 0x24, 0xCC, 0xC1, 0x7B, + 0x00, 0xD8, 0xBD, 0x85, 0xBF, 0x77, 0x06, 0x70, 0x2E, 0x80, 0x73, 0xA4, + 0x11, 0xA9, 0x04, 0xF4, 0xB9, 0x0B, 0x80, 0x23, 0x00, 0x5C, 0xB1, 0x09, + 0xAB, 0xD3, 0xDC, 0x42, 0x8E, 0x94, 0x95, 0xEA, 0xB0, 0x4E, 0x56, 0x5F, + 0x00, 0x5B, 0xB7, 0xF2, 0x99, 0x22, 0x00, 0xE3, 0x75, 0xED, 0x92, 0x10, + 0xB3, 0x7C, 0x25, 0x80, 0xA1, 0x11, 0x3E, 0xBF, 0x03, 0x80, 0xD2, 0x8E, + 0x0C, 0x38, 0xAA, 0xF3, 0x54, 0x28, 0xC0, 0xE7, 0x49, 0x93, 0xF3, 0x21, + 0x5B, 0x4B, 0x73, 0xAF, 0x06, 0xB0, 0x77, 0xC4, 0x7B, 0x9A, 0xF2, 0xE9, + 0x3B, 0x24, 0x01, 0xF0, 0xE7, 0x00, 0xD6, 0x47, 0xFC, 0x6C, 0x11, 0x80, + 0x33, 0x01, 0x5C, 0x98, 0x07, 0xC8, 0xC5, 0x00, 0x46, 0x01, 0xA8, 0x32, + 0xC0, 0x05, 0x80, 0x2F, 0x01, 0xAC, 0xED, 0xC8, 0x80, 0x3F, 0x00, 0xF0, + 0x86, 0xE1, 0x29, 0x2F, 0x06, 0x70, 0x1A, 0x80, 0x8B, 0x00, 0xEC, 0x96, + 0xA3, 0x39, 0x39, 0x6D, 0x96, 0x27, 0x00, 0xD8, 0xCB, 0x70, 0xDF, 0x72, + 0x00, 0x33, 0x00, 0xD4, 0x75, 0x64, 0xC0, 0x5F, 0x03, 0xB8, 0x01, 0xC0, + 0x6C, 0x83, 0xB9, 0x2E, 0x06, 0x70, 0x86, 0x96, 0x27, 0x03, 0x65, 0xBE, + 0xB3, 0x25, 0x5B, 0x01, 0xF8, 0x89, 0xFA, 0xB8, 0xA7, 0xE1, 0xBE, 0xD5, + 0x00, 0xEE, 0x01, 0x30, 0x0D, 0x40, 0x7D, 0x47, 0x5E, 0x26, 0xA5, 0xAF, + 0xFD, 0x49, 0xBE, 0x4F, 0xB2, 0x81, 0xD1, 0xA5, 0x9E, 0xE4, 0xBD, 0x24, + 0x07, 0x91, 0x2C, 0xCC, 0x42, 0x9F, 0x8A, 0x49, 0x9E, 0x48, 0xF2, 0x23, + 0xDA, 0x64, 0x25, 0xC9, 0xEB, 0x49, 0x6E, 0x9B, 0xEF, 0x71, 0x4D, 0x12, + 0xE0, 0x34, 0xE4, 0xF7, 0x3C, 0x20, 0xFF, 0x99, 0xE4, 0xE0, 0x98, 0x21, + 0x77, 0x26, 0x79, 0x12, 0xC9, 0x8F, 0x8D, 0x70, 0x57, 0x90, 0x9C, 0x40, + 0xB2, 0x22, 0x09, 0x63, 0x9A, 0x34, 0xC0, 0x20, 0xB9, 0x1F, 0xC9, 0x77, + 0x8D, 0x90, 0x1B, 0x05, 0x79, 0x08, 0xC9, 0xA2, 0x18, 0xFA, 0x50, 0x42, + 0x72, 0x0C, 0xC9, 0xB9, 0x46, 0xB8, 0xDF, 0x08, 0x6E, 0x59, 0x52, 0xC6, + 0x33, 0x5B, 0x5F, 0x9C, 0x22, 0x59, 0xA0, 0x2B, 0x57, 0x90, 0x99, 0x01, + 0xB9, 0x2D, 0x3B, 0x47, 0xDB, 0x90, 0x1C, 0x47, 0xF2, 0x13, 0x63, 0xDB, + 0xCB, 0x48, 0x5E, 0x4B, 0xB2, 0x7B, 0x92, 0x14, 0x26, 0x15, 0x73, 0xFA, + 0x68, 0xA1, 0x36, 0xDB, 0xCB, 0xB5, 0xDB, 0x03, 0x2D, 0x81, 0x56, 0xE9, + 0xC0, 0xA0, 0xC9, 0xF0, 0x5D, 0x23, 0x00, 0x4C, 0x02, 0xB0, 0x8F, 0xC1, + 0x89, 0x6A, 0x02, 0xF0, 0x17, 0x00, 0xF7, 0xCA, 0x3B, 0x6F, 0x30, 0xF6, + 0xBF, 0x14, 0xC0, 0x71, 0x19, 0xCE, 0x5B, 0x54, 0x59, 0x06, 0x60, 0x0A, + 0x80, 0xC9, 0x00, 0xD6, 0x18, 0xC7, 0xAB, 0x44, 0xFF, 0x52, 0xFD, 0x8F, + 0xF5, 0x60, 0x25, 0x4E, 0xC0, 0x85, 0xDA, 0x65, 0x1A, 0x07, 0xE0, 0x30, + 0x00, 0x83, 0x35, 0xC0, 0x6F, 0x03, 0x78, 0x16, 0xC0, 0x63, 0x00, 0x16, + 0x1A, 0x07, 0x7D, 0x18, 0x80, 0x3B, 0x00, 0x0C, 0x37, 0x7A, 0xCA, 0x0F, + 0x00, 0xF8, 0x03, 0x80, 0xF7, 0x0D, 0xED, 0x75, 0xD3, 0x89, 0xD0, 0x25, + 0x5A, 0x7E, 0x45, 0xF2, 0x51, 0x01, 0x2C, 0x01, 0x70, 0xB7, 0xAE, 0xF5, + 0x86, 0x3E, 0x96, 0xC8, 0x2B, 0x3F, 0x04, 0xC0, 0xF6, 0xEA, 0xE7, 0x5A, + 0x00, 0xCF, 0x68, 0x6F, 0x60, 0x4D, 0x2C, 0x1B, 0x24, 0x31, 0x9A, 0x83, + 0x3E, 0x24, 0xA7, 0xB6, 0x60, 0xC2, 0x1E, 0x22, 0x39, 0xCC, 0x63, 0x8E, + 0xDC, 0x97, 0xE4, 0xDB, 0x1E, 0xE6, 0xFA, 0xAF, 0x24, 0x87, 0x46, 0x34, + 0xD7, 0x65, 0x24, 0x7F, 0x4E, 0xF2, 0x53, 0xC3, 0xF7, 0x37, 0x91, 0x5C, + 0x4C, 0xF2, 0xB7, 0x24, 0xBB, 0x1A, 0x7F, 0x53, 0x19, 0xC9, 0xD3, 0xF5, + 0xBB, 0x9A, 0xCB, 0xDB, 0x24, 0xCF, 0x8E, 0x6B, 0x1E, 0x8F, 0xD3, 0xE3, + 0xBC, 0x3A, 0xC2, 0xA0, 0x4C, 0xF5, 0x84, 0x3C, 0x9C, 0xE4, 0x9B, 0x1E, + 0x90, 0xFF, 0x26, 0xEF, 0xBA, 0x25, 0xC8, 0xDD, 0x34, 0xD8, 0x56, 0xB8, + 0x8B, 0x04, 0x77, 0x1B, 0xE3, 0x6F, 0x29, 0x27, 0x79, 0x16, 0xC9, 0xEA, + 0x16, 0xBE, 0x7F, 0xAE, 0x56, 0x14, 0xA9, 0xA4, 0x00, 0xEE, 0x4E, 0xF2, + 0xB9, 0x88, 0x83, 0xF3, 0xA8, 0x80, 0x59, 0x1D, 0xA1, 0xA1, 0x24, 0x5F, + 0xD7, 0xB2, 0xC8, 0x22, 0x7F, 0x27, 0xB9, 0xCF, 0x66, 0xDA, 0x2B, 0xD3, + 0x60, 0xCF, 0x37, 0xC2, 0xFD, 0x5A, 0xC7, 0x80, 0x25, 0x1E, 0x70, 0xCF, + 0xD5, 0xC3, 0xD1, 0x9A, 0xDC, 0x11, 0xC7, 0x8A, 0x20, 0x2E, 0xC0, 0x95, + 0x24, 0x9F, 0x37, 0x0C, 0xD2, 0x23, 0xF2, 0x76, 0xAD, 0xEB, 0xD6, 0x7D, + 0x48, 0xBE, 0xE1, 0x01, 0x79, 0xDA, 0x26, 0xDA, 0x2B, 0x25, 0x79, 0x06, + 0xC9, 0xCF, 0x8D, 0x70, 0x97, 0x90, 0xBC, 0x4C, 0xE7, 0xC1, 0x96, 0xBE, + 0x97, 0xCA, 0xF4, 0x2E, 0x8C, 0xD8, 0xD6, 0x73, 0x24, 0xB7, 0x4A, 0x0A, + 0xE0, 0x72, 0x92, 0x4F, 0x19, 0x07, 0xFD, 0x61, 0x92, 0x7B, 0x7B, 0x40, + 0x1E, 0xE6, 0x09, 0x79, 0x6A, 0x06, 0xE4, 0x2E, 0x24, 0x4F, 0x25, 0x39, + 0xCF, 0x08, 0x77, 0x29, 0xC9, 0x2B, 0x3C, 0xE6, 0xDC, 0xF4, 0xC3, 0x54, + 0x6D, 0x68, 0xEF, 0x49, 0x92, 0x5B, 0x27, 0x05, 0x70, 0x21, 0xC9, 0x5F, + 0x91, 0xAC, 0x35, 0x0E, 0xD8, 0x63, 0x32, 0xBD, 0xD6, 0x27, 0x75, 0x08, + 0xC9, 0x59, 0x24, 0x37, 0x7A, 0x40, 0xDE, 0x83, 0xE4, 0xC9, 0x46, 0xCD, + 0x6D, 0x94, 0xE6, 0x5E, 0xE2, 0xA1, 0xB9, 0xE5, 0x46, 0xCD, 0x4D, 0xB7, + 0x77, 0x77, 0x92, 0x34, 0x18, 0x24, 0x7B, 0x92, 0x7C, 0x96, 0x64, 0x9D, + 0x71, 0xD0, 0x1F, 0x6F, 0x61, 0x8E, 0x6C, 0xE9, 0xDA, 0x9B, 0xE4, 0x4C, + 0x23, 0xE4, 0x26, 0x92, 0xCF, 0x78, 0x3A, 0x54, 0x17, 0xCB, 0x99, 0xB4, + 0x6A, 0xEE, 0x99, 0x11, 0xE7, 0xDC, 0x4C, 0xB8, 0xD5, 0x24, 0x47, 0x24, + 0xC9, 0xC9, 0xCA, 0x1C, 0xF4, 0x7F, 0x7A, 0x40, 0x9E, 0x26, 0x4D, 0xB6, + 0x3A, 0x15, 0x83, 0x3D, 0x35, 0xD9, 0x3A, 0xE7, 0xFA, 0x38, 0x54, 0x5D, + 0x49, 0x9E, 0x66, 0x34, 0xCB, 0x8D, 0xD2, 0xF4, 0x5F, 0x7B, 0x58, 0x8A, + 0x9C, 0x6D, 0x55, 0x0E, 0x22, 0x39, 0xC3, 0x13, 0xF2, 0x0F, 0x3D, 0xE6, + 0x9D, 0xC1, 0x24, 0x5F, 0xC9, 0x02, 0xE4, 0xC6, 0x0C, 0x6F, 0xD9, 0xBA, + 0x14, 0x4A, 0xAF, 0x73, 0x2D, 0xD3, 0x40, 0x03, 0xC9, 0x05, 0x9A, 0xEA, + 0x4A, 0x93, 0xBE, 0x17, 0xBD, 0x9B, 0xBC, 0xC0, 0x5A, 0xE3, 0xA0, 0x3E, + 0x4D, 0xF2, 0x40, 0x0F, 0x53, 0xB8, 0x17, 0xC9, 0x97, 0x3C, 0x1E, 0xAA, + 0x96, 0x06, 0xFB, 0x4B, 0x92, 0xE7, 0x79, 0x3C, 0x70, 0x15, 0x9E, 0x73, + 0xEE, 0x7C, 0x92, 0xBF, 0xD4, 0x11, 0x65, 0xBB, 0x38, 0x4D, 0x1A, 0xE0, + 0x09, 0xF9, 0x09, 0x4F, 0xC8, 0x83, 0x48, 0xBE, 0x1C, 0x03, 0xE4, 0x06, + 0x92, 0x5F, 0xC8, 0x4C, 0x5A, 0x07, 0xBB, 0xBB, 0x20, 0x2D, 0xF4, 0x98, + 0x73, 0xCF, 0x8D, 0x1B, 0x6E, 0x2E, 0x8E, 0x0B, 0x07, 0xC8, 0xF1, 0xAA, + 0xF1, 0x70, 0xBC, 0xF6, 0xF7, 0x98, 0x87, 0x06, 0xC9, 0x07, 0xA8, 0xCD, + 0x31, 0xDC, 0x54, 0x86, 0xE6, 0x7E, 0x65, 0x6C, 0x6F, 0xBE, 0xEE, 0xEB, + 0xC2, 0x76, 0x7A, 0x1E, 0xDC, 0x5F, 0xC0, 0x6A, 0x3C, 0xCC, 0xF5, 0xC1, + 0x1E, 0xF3, 0xDF, 0x40, 0x92, 0x2F, 0x78, 0x40, 0x6E, 0xD0, 0xBA, 0x78, + 0xBC, 0xD1, 0xD9, 0x4B, 0x29, 0x72, 0xE3, 0x02, 0xCD, 0xD9, 0x96, 0xF6, + 0xE6, 0x6A, 0xAE, 0xDE, 0x8A, 0xED, 0xFC, 0xC0, 0x7F, 0x67, 0x6D, 0x84, + 0x58, 0x21, 0x3F, 0x4B, 0xF2, 0x10, 0x0F, 0x73, 0x3D, 0x90, 0xE4, 0x74, + 0x03, 0xE4, 0x46, 0x92, 0x9F, 0x49, 0x93, 0xAC, 0x70, 0x7B, 0x90, 0xBC, + 0x50, 0xDE, 0xB6, 0xF5, 0x61, 0x3A, 0xBD, 0x0D, 0x67, 0xE6, 0x89, 0x8B, + 0xE8, 0xE8, 0xAF, 0x35, 0xA8, 0x15, 0xF2, 0x93, 0x9A, 0x93, 0xAD, 0xCE, + 0xCE, 0x1E, 0xF2, 0xE6, 0x5B, 0xF3, 0xAE, 0x9B, 0x32, 0xCC, 0xA4, 0x15, + 0x6E, 0x25, 0xC9, 0xF3, 0x75, 0xAA, 0x64, 0x85, 0x7B, 0x56, 0xB6, 0xE1, + 0xE6, 0x23, 0x64, 0x67, 0x27, 0x99, 0xEB, 0x0D, 0x1E, 0xE6, 0xFA, 0x20, + 0x0F, 0xC8, 0xBB, 0x93, 0xFC, 0x57, 0x2B, 0xDB, 0x9A, 0x8B, 0x65, 0x96, + 0x3B, 0x79, 0x98, 0xE5, 0x8B, 0x8C, 0x70, 0xEB, 0x15, 0xE3, 0x75, 0x3A, + 0x73, 0x94, 0x67, 0x95, 0x8F, 0x30, 0x92, 0x7E, 0x9E, 0xE6, 0x7A, 0x3A, + 0xC9, 0x03, 0x3C, 0xCC, 0xF5, 0x01, 0xDA, 0xBB, 0x5E, 0x2F, 0x6D, 0x6D, + 0xD2, 0xF7, 0xD5, 0xC9, 0xAC, 0x5E, 0xEE, 0xA1, 0xB9, 0xDB, 0x69, 0x67, + 0x6B, 0xB9, 0x51, 0x73, 0x3F, 0x21, 0x39, 0x76, 0x4B, 0x88, 0xC9, 0x8A, + 0x32, 0x27, 0x3F, 0xED, 0x01, 0xF9, 0x05, 0x01, 0xB3, 0x2E, 0x27, 0x06, + 0x91, 0x7C, 0x40, 0xA6, 0x78, 0x81, 0x3C, 0xDD, 0xE9, 0x3A, 0xE4, 0xB7, + 0x3A, 0x38, 0x95, 0x9A, 0x73, 0x2D, 0x70, 0x1B, 0xB5, 0x3D, 0x7A, 0x5A, + 0x7B, 0x8F, 0xC9, 0xB2, 0xC8, 0x4E, 0x8A, 0xB9, 0x3A, 0x4C, 0x19, 0x84, + 0x51, 0xE5, 0x45, 0x00, 0x37, 0x29, 0x14, 0xC8, 0x92, 0x31, 0x50, 0xA1, + 0x50, 0x9C, 0x46, 0xA5, 0xC0, 0x2C, 0x50, 0xD0, 0x3D, 0x8C, 0xDF, 0x31, + 0x16, 0xC0, 0x65, 0x00, 0x7A, 0x1A, 0x72, 0xAF, 0xAA, 0x01, 0xDC, 0x0C, + 0xE0, 0x21, 0xE4, 0x3A, 0x91, 0x3D, 0xCF, 0x51, 0x7F, 0xFD, 0xE4, 0x44, + 0x59, 0xE7, 0xE4, 0xE7, 0x3D, 0x1D, 0xAF, 0xB6, 0x44, 0x89, 0x56, 0x68, + 0x29, 0x64, 0xF5, 0x96, 0xE7, 0x4A, 0x73, 0xF3, 0x92, 0x23, 0x9C, 0x84, + 0xD0, 0xCE, 0x3E, 0xDA, 0xBD, 0xB2, 0x42, 0x9E, 0xA1, 0x25, 0x54, 0x97, + 0x1C, 0xC0, 0xDD, 0x56, 0x66, 0xF9, 0x1B, 0xA3, 0x59, 0x4E, 0xC3, 0xCD, + 0x5B, 0xE2, 0x7A, 0x52, 0xE2, 0x77, 0xFB, 0xEA, 0x6C, 0x78, 0x9D, 0x11, + 0xF2, 0xCB, 0x24, 0x0F, 0xCD, 0x22, 0xE4, 0x34, 0x5C, 0x1F, 0x87, 0x6A, + 0x2E, 0x5D, 0x7C, 0x75, 0x51, 0x3E, 0xC7, 0x36, 0x49, 0x19, 0x0D, 0xFD, + 0x14, 0xCA, 0x63, 0x85, 0xFC, 0x12, 0xC9, 0x51, 0x1E, 0x51, 0x16, 0x51, + 0xE0, 0xF6, 0xD4, 0x69, 0x92, 0xC5, 0x2C, 0xA7, 0x97, 0x42, 0x63, 0xB3, + 0xB9, 0x43, 0xD5, 0x1E, 0x01, 0x67, 0x86, 0xDE, 0x5A, 0x21, 0xCF, 0x22, + 0x39, 0x32, 0xC6, 0x79, 0xAE, 0x80, 0xE4, 0x8E, 0x74, 0x09, 0x64, 0x2B, + 0x8C, 0x70, 0x67, 0x2B, 0x62, 0xA4, 0x30, 0x09, 0x63, 0x9A, 0xC4, 0xDC, + 0xA4, 0xDE, 0x24, 0x1F, 0xF4, 0x80, 0xFC, 0x38, 0xC9, 0xED, 0x63, 0xEA, + 0x43, 0x0F, 0x92, 0x37, 0x69, 0x1E, 0xB5, 0xC0, 0xFD, 0x90, 0x2E, 0x61, + 0x2D, 0x31, 0xE3, 0x99, 0xC4, 0x42, 0x68, 0x8B, 0x54, 0xFF, 0xE2, 0x29, + 0xD8, 0x6A, 0x4C, 0x1D, 0x0B, 0x57, 0x63, 0x2B, 0x0E, 0xD9, 0x53, 0x49, + 0xE6, 0x51, 0xC7, 0x67, 0xA3, 0xF2, 0x9B, 0x6F, 0x06, 0xF0, 0x68, 0x92, + 0x06, 0x33, 0xA9, 0x95, 0xEE, 0xBE, 0x06, 0x70, 0x1D, 0x80, 0xD7, 0x0C, + 0xE9, 0x1B, 0x4D, 0xCA, 0x89, 0x8A, 0x43, 0xB6, 0x37, 0xAC, 0x73, 0x1B, + 0x00, 0x7C, 0xA4, 0x04, 0xF1, 0x69, 0x49, 0x1B, 0xC8, 0xA4, 0x02, 0x2E, + 0x03, 0xD0, 0x4B, 0x1B, 0x19, 0x51, 0x01, 0xA7, 0x94, 0xBF, 0x14, 0x47, + 0x49, 0x87, 0x72, 0x43, 0xBB, 0x0D, 0x00, 0x66, 0x01, 0x78, 0x39, 0x89, + 0x03, 0x99, 0x44, 0xC0, 0x25, 0x4A, 0xC8, 0xBA, 0x45, 0xC9, 0x60, 0x51, + 0xFB, 0xB8, 0x0C, 0xC0, 0x17, 0x31, 0x55, 0xB4, 0x59, 0x21, 0xB3, 0x1B, + 0x35, 0xE9, 0xEE, 0x47, 0x00, 0xC6, 0x00, 0xD8, 0x36, 0x69, 0x83, 0xD9, + 0x29, 0x81, 0x70, 0x0F, 0x56, 0x81, 0x95, 0xE1, 0x86, 0xFB, 0x6A, 0x00, + 0x3C, 0x01, 0x60, 0x71, 0x4C, 0xFD, 0xF8, 0x1C, 0xC0, 0x5C, 0x44, 0xAB, + 0xA6, 0x53, 0x04, 0x60, 0x5F, 0x00, 0xBD, 0x95, 0x32, 0xFB, 0x20, 0x80, + 0x6F, 0x83, 0x06, 0xFF, 0xBF, 0x74, 0x05, 0x70, 0x28, 0x5C, 0xF5, 0xB8, + 0xFD, 0x0C, 0xF7, 0xAD, 0x07, 0x30, 0x1D, 0xC0, 0x44, 0x55, 0xB5, 0x89, + 0x43, 0xE6, 0x2B, 0xCF, 0x78, 0xA9, 0xC1, 0x22, 0xF4, 0xD2, 0x83, 0x39, + 0x0E, 0x40, 0x0F, 0x24, 0xA3, 0x22, 0x5F, 0x62, 0x96, 0x49, 0x5D, 0x49, + 0x8E, 0x66, 0xCB, 0x75, 0x1F, 0x37, 0x25, 0x6B, 0x48, 0xDE, 0x4F, 0xB2, + 0x57, 0x16, 0xFA, 0x54, 0xA4, 0xBD, 0xE7, 0x6A, 0xDA, 0xB2, 0x1A, 0x97, + 0x90, 0xBC, 0x54, 0x3B, 0x60, 0xA9, 0xB0, 0x0E, 0x76, 0x31, 0x57, 0xC7, + 0x91, 0x7C, 0xC7, 0x08, 0x77, 0x35, 0xC9, 0xFB, 0xB4, 0x66, 0xCD, 0xE6, + 0x3E, 0xF4, 0x38, 0x92, 0x73, 0x8C, 0x90, 0x17, 0xD3, 0x25, 0xA8, 0xF5, + 0xCC, 0x37, 0xE4, 0x7C, 0x82, 0x4D, 0x29, 0x40, 0x7C, 0x34, 0xC9, 0x7F, + 0x1B, 0xE1, 0xAE, 0x24, 0x79, 0x8F, 0xCE, 0x66, 0x73, 0xD1, 0xD7, 0xB1, + 0xDA, 0x7E, 0xB4, 0x42, 0xBE, 0x5C, 0x1B, 0x37, 0x1D, 0xEE, 0xB0, 0x21, + 0xA5, 0x18, 0xE2, 0x31, 0x74, 0xC5, 0x56, 0x2C, 0xF2, 0x5F, 0xBA, 0xDC, + 0xD9, 0x6E, 0x6D, 0x68, 0xDB, 0xE7, 0xBE, 0x93, 0x49, 0x7E, 0xE0, 0x61, + 0xAE, 0xAF, 0xD4, 0xB6, 0x67, 0x5E, 0x20, 0xE7, 0xCB, 0x8B, 0x2E, 0x87, + 0xAB, 0xFB, 0x78, 0x11, 0x5A, 0x2E, 0xC7, 0xDB, 0x5C, 0x56, 0xC2, 0x15, + 0x08, 0x9F, 0x60, 0xD8, 0xE5, 0x4A, 0xC1, 0x55, 0xAB, 0xEB, 0xAC, 0x02, + 0x31, 0x05, 0x00, 0x36, 0xE8, 0xAA, 0x31, 0x38, 0x51, 0x8F, 0xE8, 0xDF, + 0xCB, 0xB4, 0xD3, 0x15, 0xA5, 0x66, 0x48, 0x4F, 0xB8, 0x52, 0xC8, 0x94, + 0x77, 0xBD, 0xC4, 0x58, 0x88, 0xA6, 0xDD, 0x2D, 0x93, 0x52, 0x2A, 0x76, + 0x32, 0x12, 0xC0, 0xF9, 0x9E, 0x70, 0xAB, 0xE0, 0xAA, 0xF6, 0x44, 0x6D, + 0xAF, 0x52, 0xCB, 0x9D, 0xBD, 0x00, 0xF4, 0x13, 0xEC, 0xC5, 0x00, 0x3E, + 0x01, 0xF0, 0x8E, 0x0A, 0xC3, 0x44, 0x8D, 0xB2, 0x78, 0x54, 0xB0, 0x2E, + 0x37, 0x42, 0x1E, 0xAF, 0xFF, 0x7E, 0x58, 0xBB, 0x74, 0xDC, 0x12, 0xBD, + 0xE8, 0x74, 0x98, 0xE9, 0x29, 0x74, 0x25, 0x0B, 0x2D, 0xB2, 0x9C, 0xE4, + 0xEF, 0x3D, 0xCC, 0x72, 0x05, 0xC9, 0x5F, 0xC8, 0xB4, 0x6E, 0xEA, 0x3B, + 0x27, 0x29, 0x3E, 0xCC, 0x7A, 0xF2, 0x73, 0x92, 0x7E, 0x83, 0x25, 0x09, + 0x7D, 0x29, 0xC9, 0x6B, 0x72, 0x6D, 0xAE, 0x73, 0x09, 0xB8, 0x92, 0x2E, + 0xAB, 0xFE, 0x03, 0x8F, 0x39, 0xF7, 0x56, 0xDA, 0xAB, 0xCE, 0x74, 0x57, + 0x34, 0x45, 0x4B, 0xB9, 0xC0, 0x75, 0x24, 0x27, 0xEA, 0x2C, 0xBA, 0xC0, + 0x13, 0x72, 0x83, 0x11, 0xF2, 0x95, 0x24, 0x77, 0xD8, 0xD2, 0xC2, 0x66, + 0xCB, 0xE4, 0x89, 0xBE, 0xE7, 0x01, 0x77, 0x92, 0x51, 0x73, 0x53, 0xFA, + 0x7C, 0x54, 0x4B, 0xB1, 0x5A, 0xE7, 0xBE, 0x7D, 0x3C, 0x06, 0xFD, 0x44, + 0x0F, 0xC7, 0x6B, 0x19, 0x5D, 0x45, 0xA2, 0x9C, 0x40, 0xCE, 0x15, 0xDC, + 0x9F, 0x91, 0xFC, 0x8F, 0x11, 0xEE, 0x0A, 0x92, 0xB7, 0x19, 0x23, 0x35, + 0xD2, 0xC1, 0x71, 0x63, 0x75, 0x36, 0x6B, 0x79, 0x90, 0x6E, 0xF0, 0x84, + 0x7C, 0xBC, 0x7E, 0x9B, 0x05, 0xF2, 0xB7, 0x24, 0xAB, 0x72, 0xB1, 0x84, + 0xCA, 0x36, 0xDC, 0x6E, 0xDA, 0x28, 0xF8, 0xD0, 0x03, 0xEE, 0x24, 0xDA, + 0x13, 0xA1, 0x2B, 0x34, 0x0D, 0xCC, 0xF6, 0xC8, 0x2C, 0x5C, 0x25, 0x4D, + 0xF6, 0x99, 0x23, 0x4F, 0xF0, 0x84, 0x7C, 0xAD, 0x76, 0xE1, 0x52, 0xED, + 0x11, 0x70, 0x99, 0xD6, 0xB9, 0x1F, 0xE7, 0x40, 0x73, 0xD3, 0xED, 0x9D, + 0xE2, 0x61, 0x29, 0x36, 0x65, 0xAE, 0x7D, 0x21, 0x5B, 0xE7, 0xE4, 0x15, + 0x72, 0xBC, 0xB2, 0x66, 0xAE, 0xB3, 0x6D, 0x96, 0x3F, 0xF6, 0xD4, 0xDC, + 0x7C, 0xC0, 0x4D, 0xCB, 0x3A, 0x99, 0x6B, 0x1F, 0xC8, 0xC7, 0xCA, 0xCF, + 0xA8, 0x37, 0x4E, 0x0F, 0xD7, 0x65, 0xCB, 0xBB, 0xCE, 0x96, 0x59, 0x1E, + 0x43, 0x7B, 0x95, 0xF4, 0x6F, 0x3D, 0xE1, 0xA6, 0xDB, 0x9B, 0xCD, 0xF8, + 0x64, 0x4D, 0x1B, 0x20, 0x8F, 0xF6, 0x80, 0xBC, 0x8A, 0xAE, 0xCE, 0xF4, + 0x0F, 0xE2, 0x86, 0x1C, 0x37, 0xDC, 0x72, 0x2D, 0x4D, 0xE6, 0x78, 0xC0, + 0x9D, 0x48, 0x7B, 0xB2, 0x77, 0xDA, 0x5B, 0x9E, 0xC3, 0xF8, 0x65, 0x9D, + 0x02, 0xEF, 0xFA, 0x78, 0x42, 0x7E, 0xC7, 0x53, 0x93, 0x63, 0x85, 0x1C, + 0xF7, 0xF1, 0xDA, 0x4F, 0x69, 0xAB, 0x41, 0x45, 0x65, 0x0B, 0xFC, 0x8E, + 0xF6, 0x32, 0x45, 0x69, 0xB8, 0x16, 0xCD, 0x6D, 0x32, 0x46, 0x4A, 0xAE, + 0x25, 0x79, 0x8B, 0xD6, 0xC9, 0xD6, 0x41, 0x3F, 0x86, 0xE4, 0x5B, 0xB4, + 0x55, 0xFF, 0x59, 0x21, 0xCB, 0xD1, 0x97, 0x31, 0xE5, 0x0E, 0xC7, 0x05, + 0xB7, 0x80, 0xAE, 0x98, 0xD9, 0xEB, 0x46, 0xB8, 0x4B, 0x49, 0xDE, 0x6C, + 0xCC, 0x4C, 0x48, 0x65, 0x6C, 0x62, 0x58, 0xCD, 0xF2, 0x42, 0xF9, 0x05, + 0x35, 0x46, 0x4D, 0x4E, 0x6F, 0x86, 0x58, 0x77, 0xBC, 0x8E, 0xA6, 0x4B, + 0x5D, 0xDD, 0x68, 0xD4, 0xE4, 0x1B, 0xE9, 0x52, 0x54, 0x13, 0x03, 0xB8, + 0x84, 0xE4, 0x9D, 0x1E, 0x70, 0x6F, 0xF0, 0x30, 0xCB, 0x95, 0x74, 0xD5, + 0xE3, 0xE6, 0x7A, 0xB4, 0xF7, 0x1B, 0x79, 0xBB, 0xAF, 0xD2, 0x56, 0x8D, + 0x67, 0xAD, 0x20, 0xEF, 0xEA, 0x01, 0xF9, 0x18, 0x41, 0xAE, 0x33, 0x5A, + 0xB5, 0xD1, 0x4C, 0x50, 0xA5, 0xBB, 0x4A, 0xBA, 0xEA, 0x36, 0x96, 0xC1, + 0xAE, 0xA2, 0x3D, 0x99, 0xBB, 0x52, 0x7B, 0xCB, 0x9F, 0x7A, 0xC0, 0xBD, + 0x2E, 0x23, 0xF3, 0x61, 0x24, 0x5D, 0xE6, 0x7F, 0x9D, 0x51, 0x93, 0x6F, + 0xA7, 0xAB, 0x1C, 0x64, 0x85, 0x7C, 0x14, 0xC9, 0xD7, 0x8C, 0xED, 0xDD, + 0xCF, 0x04, 0x95, 0x13, 0xAE, 0xA0, 0x4B, 0xCE, 0xB6, 0xC0, 0xB5, 0x9A, + 0xE5, 0x4A, 0xBA, 0x1A, 0x54, 0x56, 0xCD, 0x5D, 0xA2, 0xF6, 0x9A, 0xA7, + 0x9A, 0x1E, 0xE1, 0x31, 0xE8, 0x6B, 0x75, 0x16, 0xDD, 0xDF, 0x63, 0x8E, + 0x4C, 0xB7, 0x17, 0xD5, 0xF1, 0x9A, 0xCE, 0x18, 0xEA, 0x66, 0xC5, 0x05, + 0xB8, 0x94, 0xAE, 0xBA, 0x7A, 0x94, 0xC1, 0x9E, 0x60, 0xD4, 0xDC, 0x14, + 0x5D, 0x4A, 0xCA, 0xD9, 0x74, 0x95, 0x70, 0x2C, 0xB2, 0x58, 0x1B, 0x09, + 0x9B, 0x7B, 0x98, 0x8E, 0xF4, 0x84, 0xEC, 0x7B, 0x0A, 0x75, 0x94, 0x1C, + 0xAF, 0x28, 0x90, 0xFF, 0xC1, 0x84, 0x95, 0x13, 0x3E, 0x91, 0x9B, 0x4F, + 0xB1, 0x4C, 0x17, 0xF5, 0xBC, 0xC6, 0xC3, 0x2C, 0x6F, 0x47, 0x57, 0x24, + 0x65, 0x9E, 0x87, 0xE6, 0x5E, 0x15, 0xA1, 0xBD, 0x51, 0x74, 0xC9, 0x6B, + 0x56, 0x73, 0x7D, 0x9B, 0xA7, 0x26, 0x1F, 0xC9, 0xD6, 0x2B, 0xD7, 0xD7, + 0x6A, 0xAC, 0x0A, 0x99, 0xA0, 0x65, 0x52, 0x67, 0x2D, 0x77, 0x16, 0xA9, + 0x83, 0x0D, 0xFA, 0x11, 0x35, 0x74, 0xD5, 0xE3, 0xAE, 0xA2, 0x5F, 0xDD, + 0xC7, 0x73, 0x3C, 0x34, 0x37, 0x0D, 0x37, 0x6A, 0xFA, 0xE6, 0xE1, 0x6C, + 0xBD, 0x1A, 0x4F, 0x73, 0xF9, 0x4E, 0x8E, 0xE5, 0x2E, 0x1E, 0xCE, 0x50, + 0xBA, 0xBD, 0xDA, 0xCD, 0xC0, 0x7D, 0x95, 0xAE, 0x42, 0x50, 0x9B, 0x9D, + 0xAC, 0xC2, 0xAA, 0xAA, 0xAA, 0xB8, 0x62, 0x07, 0x1A, 0x00, 0x7C, 0xA8, + 0x8C, 0x80, 0x0D, 0xCA, 0x0E, 0x58, 0x00, 0xF7, 0xFE, 0xA2, 0xA9, 0x70, + 0xAF, 0xB9, 0xA9, 0x35, 0xD6, 0xC3, 0x38, 0x01, 0xC0, 0x05, 0xB0, 0xBD, + 0x4A, 0x76, 0x29, 0xDC, 0x4B, 0x21, 0x27, 0x1A, 0xB2, 0x13, 0xAA, 0x15, + 0x53, 0xBD, 0x8B, 0xF2, 0x92, 0xA2, 0xC4, 0x8B, 0x17, 0x29, 0xAA, 0xA3, + 0x40, 0x81, 0xF2, 0x96, 0x44, 0xB9, 0x6A, 0x25, 0xD9, 0x55, 0x2A, 0x94, + 0x68, 0x23, 0xDC, 0xFB, 0x92, 0x56, 0x01, 0x78, 0x1D, 0xEE, 0x55, 0x42, + 0x6F, 0xC6, 0x12, 0x42, 0xC3, 0xEC, 0x14, 0x61, 0xE9, 0xAD, 0xCE, 0x37, + 0x29, 0xCA, 0x7F, 0xA9, 0xF1, 0xFE, 0x4A, 0xA5, 0xAD, 0x5C, 0x0C, 0xDB, + 0x1B, 0xBF, 0x33, 0xE1, 0xD6, 0x7A, 0xF4, 0x7B, 0x14, 0xDC, 0xCB, 0x9F, + 0x87, 0x2A, 0xB4, 0x27, 0x8A, 0x6C, 0x80, 0x7B, 0x11, 0xD7, 0x64, 0xB8, + 0x77, 0x05, 0x5B, 0x06, 0x74, 0x37, 0x7C, 0xFF, 0xBD, 0x49, 0x6B, 0x00, + 0x3C, 0x07, 0x60, 0x9E, 0x1E, 0x9C, 0xA6, 0xF6, 0x14, 0xB2, 0x63, 0x89, + 0xC4, 0x18, 0x4F, 0x5B, 0x21, 0xED, 0xB4, 0x59, 0xBE, 0x9A, 0x6D, 0xCF, + 0xAA, 0x3F, 0x54, 0x73, 0xB2, 0xC5, 0x5C, 0xD7, 0x91, 0xBC, 0xCB, 0xD3, + 0x5C, 0x77, 0xA8, 0x04, 0xF0, 0xEE, 0x5A, 0xE7, 0x5A, 0x1D, 0xAA, 0x74, + 0xBC, 0x53, 0x5C, 0xE5, 0x78, 0x0F, 0xA7, 0xFD, 0x15, 0x3E, 0x75, 0x24, + 0x27, 0x27, 0x0D, 0x72, 0x92, 0xE0, 0xF6, 0xD0, 0x3A, 0xD7, 0xEA, 0x50, + 0x2D, 0x92, 0xE6, 0xC6, 0x5D, 0x6B, 0x79, 0xA4, 0x20, 0x5B, 0xB6, 0x19, + 0x6B, 0x32, 0x1C, 0xAF, 0x82, 0x00, 0xF8, 0xFB, 0x4B, 0xA1, 0xF3, 0xE4, + 0x6D, 0x5B, 0xE1, 0x5E, 0xC1, 0xEC, 0xD5, 0xA0, 0xFA, 0xB1, 0x3C, 0x5A, + 0x4B, 0x69, 0xE2, 0x5A, 0x92, 0x53, 0xE4, 0x05, 0x77, 0x0A, 0x80, 0xDD, + 0xA9, 0x90, 0x15, 0x6E, 0xE6, 0xAB, 0xE5, 0xB2, 0x5D, 0xC9, 0xE6, 0x20, + 0xDA, 0x8B, 0x8C, 0xD7, 0x92, 0xFC, 0x23, 0x5D, 0x59, 0xE3, 0xBC, 0x42, + 0xCE, 0x77, 0xFA, 0x68, 0x01, 0x80, 0xFD, 0x15, 0x04, 0xDF, 0x37, 0xAA, + 0x5F, 0xA8, 0x60, 0xF5, 0x29, 0x70, 0xA5, 0x10, 0x37, 0x66, 0xB9, 0x8F, + 0xAF, 0x02, 0xB8, 0x51, 0xE5, 0x24, 0xA2, 0x96, 0x4E, 0x2C, 0x06, 0x70, + 0x2A, 0x80, 0x33, 0xB5, 0xDC, 0xEB, 0xB0, 0xF9, 0xC1, 0x65, 0x70, 0xB5, + 0x1F, 0xFB, 0x19, 0xEE, 0x59, 0x08, 0xE0, 0x4E, 0x00, 0xB7, 0xC2, 0x56, + 0xAB, 0xB2, 0x2D, 0xF2, 0x0A, 0x80, 0xEB, 0x55, 0xAA, 0x61, 0x43, 0xC4, + 0x7B, 0x3A, 0xEB, 0xB7, 0xF5, 0xED, 0xC8, 0x80, 0x7B, 0xC1, 0xBD, 0x00, + 0x3A, 0xAA, 0xE6, 0x7E, 0x05, 0xE0, 0x2E, 0x5D, 0x0D, 0x39, 0xEE, 0xEB, + 0x4C, 0x69, 0xF2, 0x2C, 0xC3, 0x83, 0x55, 0x01, 0x57, 0x74, 0xB5, 0xC3, + 0x96, 0x70, 0xE8, 0xA4, 0x1D, 0xA1, 0xA8, 0x70, 0x27, 0x0B, 0x6E, 0x63, + 0x9E, 0xFA, 0x3B, 0x33, 0x43, 0x31, 0x0E, 0x94, 0x29, 0x8E, 0x02, 0x39, + 0x9E, 0x4D, 0x8B, 0x76, 0x08, 0xF8, 0x3B, 0xED, 0x74, 0xF5, 0x6E, 0xE5, + 0x73, 0x0B, 0xB4, 0x7D, 0x37, 0x25, 0x8F, 0x70, 0x33, 0x21, 0x33, 0xC3, + 0x7F, 0x28, 0x6E, 0x65, 0xFB, 0x76, 0x49, 0x47, 0x36, 0xD1, 0xCB, 0x35, + 0xBF, 0xD5, 0xB7, 0xA2, 0xB9, 0xB7, 0x27, 0x04, 0x6E, 0x5A, 0x66, 0x69, + 0x4E, 0x9E, 0xD9, 0x82, 0xB9, 0x26, 0x80, 0x4F, 0x01, 0xCC, 0xC9, 0x69, + 0x36, 0x61, 0xC2, 0x34, 0x78, 0x1D, 0x5C, 0x91, 0xEC, 0x61, 0x00, 0x06, + 0xC3, 0x55, 0xD9, 0x49, 0x9B, 0xB3, 0x7A, 0x69, 0xEE, 0xBD, 0x3A, 0xA8, + 0x48, 0x0A, 0xDC, 0x4C, 0xC8, 0x54, 0x5F, 0x47, 0xC0, 0x55, 0xD8, 0x29, + 0xD4, 0xFF, 0xAB, 0x57, 0x8A, 0xEA, 0x9F, 0xE4, 0x14, 0xE6, 0x0D, 0x70, + 0x3E, 0x2B, 0xBE, 0x67, 0xCA, 0x21, 0x3A, 0x5C, 0x18, 0xA2, 0x8D, 0xF7, + 0x95, 0x70, 0x65, 0x8C, 0x66, 0x28, 0xA7, 0xB6, 0x01, 0xC9, 0x95, 0xE1, + 0x00, 0x4E, 0x51, 0xDF, 0x77, 0xD4, 0x81, 0xC1, 0x3C, 0xB8, 0xC2, 0x68, + 0x0F, 0xEB, 0x21, 0x46, 0x47, 0x07, 0x0C, 0xB8, 0xC4, 0xF0, 0xA1, 0x00, + 0x76, 0xD5, 0x51, 0xDA, 0xFB, 0x88, 0xAF, 0xEE, 0x55, 0xB6, 0xA5, 0x14, + 0x2E, 0xC9, 0x7C, 0x4F, 0x4D, 0x3B, 0xEF, 0xCA, 0xFA, 0xE4, 0x5D, 0x92, + 0x04, 0x38, 0xC8, 0x16, 0xE8, 0x64, 0x05, 0x09, 0x80, 0x83, 0x04, 0xC0, + 0x41, 0x02, 0xE0, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, + 0x00, 0x07, 0x09, 0x80, 0x83, 0x04, 0xC0, 0x41, 0x02, 0xE0, 0x20, 0x01, + 0x70, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x83, + 0x64, 0x47, 0xFE, 0x37, 0x00, 0x03, 0xCE, 0x9A, 0x67, 0x1F, 0xCC, 0x4A, + 0xE6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, + 0x82 +}; +} +static unsigned char* legit_icon = raw::legit; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/icons/misc.hpp b/cheat/internal_rewrite/icons/misc.hpp new file mode 100644 index 0000000..a955fe0 --- /dev/null +++ b/cheat/internal_rewrite/icons/misc.hpp @@ -0,0 +1,1721 @@ +/* E:\Users\admin\Desktop\stuff\icons\misc.png (4/1/2018 10:00:14 PM) + StartOffset: 00000000, EndOffset: 00005025, Length: 00005026 */ + +namespace icons { +constexpr static size_t misc_size = 20518; +namespace raw { +static unsigned char misc[20518] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, + 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, + 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, + 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, 0x35, 0x37, + 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, 0x2D, 0x63, + 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, 0x64, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x66, 0x37, 0x34, + 0x35, 0x33, 0x62, 0x38, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, + 0x34, 0x35, 0x36, 0x39, 0x37, 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, + 0x2D, 0x37, 0x37, 0x34, 0x33, 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, + 0x65, 0x38, 0x65, 0x34, 0x36, 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x34, 0x35, 0x36, 0x39, 0x37, + 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, 0x2D, 0x37, 0x37, 0x34, 0x33, + 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, 0x65, 0x38, 0x65, 0x34, 0x36, + 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, + 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x61, 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, + 0x35, 0x37, 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, + 0x2D, 0x63, 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xCB, 0xA4, 0xEC, 0x39, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0A, 0x48, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x8C, 0x5D, 0x55, 0x15, 0xC7, + 0x7F, 0xF7, 0xDE, 0x79, 0xF7, 0xE1, 0xB4, 0xB4, 0xA5, 0x6F, 0x3A, 0xA5, + 0x28, 0x32, 0xA5, 0x9D, 0x92, 0x52, 0x04, 0x15, 0x94, 0x8A, 0x90, 0x5A, + 0x2D, 0x11, 0xA2, 0x35, 0x4A, 0x04, 0xF1, 0x91, 0xF8, 0xC2, 0x10, 0xEB, + 0x2B, 0xD1, 0xF8, 0x41, 0xE1, 0x83, 0xD1, 0x84, 0x48, 0x22, 0x31, 0x8A, + 0x04, 0x11, 0xD4, 0x08, 0x0D, 0x6D, 0xAC, 0x96, 0x48, 0x85, 0xAA, 0xA1, + 0x45, 0x91, 0x42, 0x5B, 0xEB, 0x4C, 0x87, 0x16, 0x28, 0xED, 0x40, 0xA7, + 0xD3, 0x4E, 0x3B, 0x73, 0x67, 0xDA, 0x79, 0xDC, 0xED, 0x87, 0xB5, 0x4E, + 0xE8, 0x87, 0xCA, 0xD9, 0x67, 0xEE, 0xB9, 0xF7, 0xEC, 0x73, 0xCF, 0xFE, + 0x27, 0x27, 0x43, 0xE1, 0xD0, 0x39, 0xF7, 0xFE, 0xCE, 0xDE, 0x7B, 0xAD, + 0xFF, 0x5E, 0x7B, 0xEF, 0x9C, 0x31, 0x06, 0xAF, 0xDA, 0x55, 0xDE, 0x7F, + 0x05, 0x1E, 0xB0, 0x97, 0x07, 0xEC, 0xE5, 0x01, 0x7B, 0x79, 0xC0, 0x5E, + 0xF1, 0xAB, 0xCE, 0xC1, 0x67, 0xCA, 0x01, 0x05, 0x7D, 0xF9, 0xEA, 0x80, + 0x7A, 0xFD, 0x73, 0xCE, 0x91, 0xE7, 0x2B, 0x01, 0x63, 0x7A, 0x8D, 0x9F, + 0x75, 0x79, 0xC0, 0x21, 0x6A, 0x01, 0x26, 0x01, 0x8B, 0x81, 0x99, 0xFA, + 0xCF, 0xD3, 0x80, 0xA9, 0xFA, 0xDF, 0x1A, 0x1C, 0xE8, 0x71, 0x4A, 0xC0, + 0x19, 0xA0, 0x08, 0x9C, 0x04, 0x4E, 0xE9, 0xCF, 0xFD, 0xC0, 0x09, 0xE0, + 0x34, 0x30, 0xE4, 0x01, 0xBF, 0xA9, 0x06, 0x60, 0x06, 0xB0, 0x10, 0xB8, + 0x4C, 0x7F, 0xAE, 0x02, 0xCE, 0x07, 0x9A, 0x80, 0x29, 0x0A, 0xBA, 0xC1, + 0xA1, 0x97, 0x71, 0x54, 0x41, 0x16, 0x15, 0x66, 0x11, 0xF8, 0x2F, 0xD0, + 0x09, 0xBC, 0x06, 0xFC, 0x13, 0x38, 0x02, 0xF4, 0xE9, 0xBD, 0xC9, 0x76, + 0x87, 0x09, 0x19, 0x1D, 0x8D, 0xC0, 0x3C, 0xE0, 0x72, 0xE0, 0x6A, 0xA0, + 0x1D, 0xB8, 0x44, 0x5B, 0x6E, 0x5A, 0x35, 0x0E, 0x1C, 0x05, 0xF6, 0x02, + 0xBB, 0x81, 0xED, 0xC0, 0xBF, 0x81, 0xD7, 0x81, 0x91, 0xAC, 0x00, 0xAE, + 0xD7, 0xD6, 0x79, 0x35, 0x70, 0x3D, 0x70, 0x15, 0xB0, 0xA4, 0x46, 0xE3, + 0x9B, 0x7D, 0xC0, 0x53, 0xC0, 0x36, 0xE0, 0xEF, 0xC0, 0x31, 0x1D, 0xB7, + 0x6B, 0x16, 0x70, 0x8B, 0x82, 0x5D, 0x03, 0xAC, 0x05, 0xDA, 0x32, 0x12, + 0xC8, 0x76, 0x02, 0x9B, 0x80, 0xAD, 0xC0, 0x3F, 0xB4, 0x7B, 0xAF, 0x39, + 0xC0, 0x0B, 0x80, 0x1B, 0x80, 0xDB, 0x75, 0x8C, 0xCD, 0x91, 0x2D, 0x8D, + 0x6A, 0x97, 0xFD, 0x00, 0xB0, 0x59, 0x03, 0xB3, 0x9A, 0x08, 0xB2, 0x72, + 0xC0, 0x3B, 0x81, 0xCF, 0x00, 0xEB, 0x75, 0xDC, 0xCD, 0xA2, 0xEA, 0x81, + 0xD5, 0xC0, 0x05, 0xC0, 0x6C, 0xE0, 0x31, 0xE0, 0x40, 0xDA, 0x5B, 0x70, + 0x0E, 0xE8, 0x00, 0xEE, 0x04, 0x6E, 0x02, 0x9A, 0xBD, 0xED, 0x00, 0x9A, + 0x4E, 0xFD, 0x06, 0xF8, 0x29, 0xD0, 0x95, 0x66, 0xC0, 0xCB, 0x81, 0xEF, + 0x2A, 0xDC, 0x38, 0x64, 0x34, 0x0F, 0x4D, 0xCA, 0x54, 0x28, 0xE8, 0x65, + 0x62, 0x18, 0x62, 0x86, 0x81, 0x07, 0x81, 0x9F, 0x54, 0x1A, 0x72, 0x5D, + 0x85, 0x5A, 0xEE, 0xDB, 0x81, 0x0D, 0x65, 0xC0, 0x1D, 0x51, 0x13, 0xE1, + 0x18, 0x30, 0x70, 0x56, 0x9A, 0x31, 0x08, 0xF4, 0x27, 0x60, 0x78, 0x94, + 0x80, 0x56, 0x60, 0xB2, 0xFE, 0xB9, 0x59, 0x73, 0xF4, 0xF3, 0xF4, 0xDF, + 0x35, 0x44, 0xFC, 0xFB, 0x9A, 0x81, 0x4F, 0xEB, 0xD8, 0xFC, 0x63, 0xE0, + 0xE5, 0x34, 0x01, 0x6E, 0x03, 0xEE, 0xD0, 0x31, 0x37, 0x6A, 0x0B, 0xED, + 0x07, 0x5E, 0xD2, 0xB7, 0xFA, 0x45, 0xFD, 0xD9, 0x8F, 0xB8, 0x47, 0x39, + 0x35, 0x15, 0x8A, 0x09, 0xB5, 0xE0, 0x49, 0x9A, 0x09, 0xE4, 0xD4, 0x84, + 0x99, 0x0E, 0xBC, 0x03, 0x58, 0x06, 0x2C, 0xD5, 0xF8, 0x62, 0x6A, 0x84, + 0xBF, 0xAF, 0x09, 0xB8, 0x4D, 0x3F, 0xCF, 0x5D, 0xFA, 0x42, 0x3B, 0x0F, + 0xB8, 0x19, 0xB8, 0x05, 0xB8, 0x55, 0xBB, 0x33, 0x5B, 0x0D, 0x02, 0xCF, + 0x01, 0x4F, 0x03, 0x7F, 0x05, 0x5E, 0x01, 0x5E, 0xC5, 0x61, 0x8F, 0x57, + 0xD5, 0x00, 0x2C, 0xD2, 0x58, 0x63, 0x25, 0xF0, 0x7E, 0x35, 0x6C, 0x5A, + 0x22, 0xBC, 0x34, 0x9F, 0x47, 0x9C, 0xB0, 0x87, 0x2A, 0x91, 0x27, 0xC7, + 0x39, 0x06, 0xE7, 0x81, 0x0F, 0x03, 0xF7, 0x02, 0xF3, 0x2D, 0xFF, 0x9F, + 0x31, 0x85, 0xF9, 0x47, 0xE0, 0x11, 0xC4, 0x01, 0x2A, 0x92, 0x4E, 0xB5, + 0x2A, 0xE8, 0xF5, 0x9A, 0xEB, 0xCF, 0x8F, 0x30, 0x56, 0xEF, 0x56, 0xD0, + 0x3B, 0x5C, 0x6E, 0xC1, 0x41, 0xD7, 0x6C, 0x0B, 0x77, 0x58, 0x73, 0xC3, + 0x5F, 0x03, 0x4F, 0x00, 0xBD, 0x29, 0x8F, 0x8E, 0xFB, 0x11, 0xE7, 0xAA, + 0x0B, 0x78, 0x5E, 0xC7, 0xD8, 0x95, 0x9A, 0x22, 0x85, 0xE9, 0x52, 0xE0, + 0x73, 0x3A, 0x3C, 0xC5, 0xFB, 0x3D, 0x18, 0x63, 0xE2, 0xB8, 0xEA, 0x8C, + 0x31, 0x5F, 0x37, 0xC6, 0x8C, 0x19, 0x3B, 0x0D, 0x18, 0x63, 0x1E, 0x36, + 0xC6, 0xAC, 0x8A, 0xE9, 0xF7, 0xBB, 0x78, 0xAD, 0x36, 0xC6, 0x6C, 0x31, + 0xC6, 0x8C, 0x58, 0x7E, 0x27, 0xC7, 0x8D, 0x31, 0xB7, 0x1A, 0x63, 0x0A, + 0x71, 0x3E, 0x47, 0x5C, 0x2D, 0xF8, 0x22, 0xE0, 0x13, 0x96, 0xE3, 0xEE, + 0x88, 0x5A, 0x77, 0x77, 0x03, 0x7B, 0x6A, 0x38, 0xDF, 0x7D, 0x52, 0x87, + 0x9B, 0x3C, 0x70, 0x9D, 0x45, 0xE4, 0x3F, 0x0D, 0xF8, 0x24, 0xF0, 0x37, + 0x6D, 0xC9, 0xB1, 0x8D, 0x9B, 0x71, 0x04, 0x56, 0x6B, 0x35, 0xEF, 0xB5, + 0xD1, 0x36, 0xE0, 0x47, 0x35, 0x0E, 0x37, 0xD0, 0x0E, 0x8D, 0x90, 0x9F, + 0xB7, 0xBC, 0xFF, 0x5D, 0xC0, 0x35, 0xC4, 0x68, 0xE5, 0xC6, 0x01, 0xF8, + 0x02, 0xE0, 0x66, 0xCB, 0xD6, 0xDB, 0xA5, 0x2D, 0x77, 0x57, 0x86, 0x9C, + 0xAB, 0xED, 0xC0, 0x3D, 0xC0, 0x1B, 0x16, 0xF7, 0x4E, 0x46, 0x3C, 0xFB, + 0x69, 0xAE, 0x00, 0xCE, 0x6B, 0x80, 0xD0, 0x61, 0x71, 0xEF, 0x10, 0xF0, + 0x0B, 0xFD, 0xC0, 0x59, 0xD3, 0x63, 0x9A, 0x06, 0xD9, 0xA4, 0x7D, 0xD7, + 0x68, 0x7E, 0xED, 0x04, 0xE0, 0xC9, 0x9A, 0xFB, 0xD9, 0x38, 0x39, 0x3B, + 0xF5, 0x43, 0x66, 0x51, 0x45, 0xE0, 0x3E, 0x64, 0x8E, 0x38, 0x4C, 0xB3, + 0x90, 0x79, 0xF2, 0x7A, 0x17, 0x00, 0xB7, 0x02, 0xD7, 0x5A, 0x06, 0x56, + 0xBF, 0x05, 0x7A, 0xC8, 0xAE, 0xBA, 0x35, 0xD7, 0xB7, 0xD1, 0x07, 0x22, + 0xBA, 0x62, 0x15, 0x03, 0x3C, 0x0B, 0xBB, 0x29, 0xC0, 0xBD, 0xC8, 0x84, + 0x77, 0xD6, 0xB5, 0x11, 0xA9, 0xD7, 0x0A, 0xD3, 0xF2, 0xB8, 0xC6, 0xE1, + 0x72, 0x01, 0x2F, 0x43, 0xEA, 0xAB, 0xC2, 0xF4, 0x27, 0xA4, 0x20, 0x2D, + 0x97, 0x61, 0xB8, 0x39, 0xA4, 0xFA, 0xF2, 0x2F, 0x16, 0xF7, 0x4E, 0x05, + 0xE6, 0xBA, 0x00, 0xF8, 0x0A, 0x8B, 0xB1, 0x62, 0x14, 0x78, 0x46, 0x03, + 0x8C, 0x2C, 0x2F, 0x65, 0x34, 0x88, 0x35, 0xFB, 0xB4, 0xC5, 0xBD, 0x4D, + 0xC0, 0x8A, 0xA4, 0x01, 0xD7, 0x21, 0xD5, 0x09, 0x61, 0x3A, 0x40, 0x05, + 0xA7, 0xC3, 0x52, 0xA8, 0x43, 0x84, 0xFB, 0xED, 0x05, 0xED, 0x1D, 0x13, + 0x05, 0xDC, 0x64, 0x19, 0xE9, 0xED, 0xB5, 0x1C, 0x77, 0xDE, 0xAA, 0x6B, + 0x73, 0xB1, 0xBB, 0x2D, 0x07, 0xB0, 0x4D, 0xB9, 0xCE, 0x14, 0xA2, 0xCD, + 0xC8, 0xFD, 0xDF, 0x56, 0x38, 0x51, 0xD5, 0x63, 0x57, 0x86, 0xD3, 0x8B, + 0xCC, 0xE7, 0x46, 0x4D, 0xBF, 0xDA, 0x78, 0xB3, 0x00, 0xBE, 0xE4, 0x18, + 0xE0, 0xBC, 0xE6, 0xF5, 0x3D, 0xC0, 0x41, 0xA2, 0x55, 0x4A, 0x1E, 0x45, + 0xA6, 0x42, 0x2F, 0xB5, 0xB8, 0xB7, 0x40, 0x99, 0x53, 0xA6, 0xE5, 0x00, + 0x2E, 0x58, 0xE6, 0xBF, 0x51, 0xAB, 0xFB, 0xE7, 0x00, 0x1F, 0xD3, 0x54, + 0x61, 0x81, 0x02, 0x36, 0x0E, 0xB6, 0xE0, 0x21, 0x6D, 0x89, 0x9B, 0x80, + 0x47, 0xB1, 0x9F, 0xE6, 0x34, 0xC8, 0x4C, 0x9A, 0x0D, 0x9B, 0x7C, 0x92, + 0x2D, 0x38, 0x6F, 0xF9, 0x00, 0x51, 0x82, 0xAB, 0xA0, 0x94, 0xE5, 0x6B, + 0xDA, 0x7A, 0x5D, 0xD7, 0x0A, 0xC4, 0xC5, 0x1B, 0x57, 0xC8, 0xA7, 0x2D, + 0x5F, 0x8E, 0xAA, 0x0D, 0x4D, 0xF9, 0x18, 0xDE, 0xE4, 0x38, 0x75, 0x31, + 0x32, 0xF1, 0x9D, 0x06, 0xB8, 0x81, 0x2E, 0x04, 0xBE, 0x8A, 0x78, 0xF2, + 0x71, 0x47, 0xDD, 0x89, 0x03, 0x8E, 0x5B, 0x1D, 0x48, 0x09, 0x4C, 0xDA, + 0xB4, 0x14, 0xFB, 0x25, 0x38, 0xB9, 0x6A, 0x06, 0x8E, 0xAE, 0x01, 0x6E, + 0x75, 0x30, 0xA0, 0xB2, 0xD1, 0x98, 0x46, 0xBD, 0xCE, 0xC9, 0x35, 0xC0, + 0xBD, 0xB8, 0x5F, 0x68, 0x77, 0x2E, 0x8D, 0x00, 0xC7, 0x3D, 0xE0, 0x70, + 0xED, 0x43, 0x4C, 0xF9, 0xB4, 0x69, 0x0F, 0x55, 0x58, 0xA5, 0x50, 0x0B, + 0x80, 0x5F, 0x42, 0x16, 0x68, 0x1D, 0x4A, 0x49, 0x4B, 0x1E, 0xD3, 0x3C, + 0xF8, 0x7E, 0xC4, 0x6B, 0x77, 0x4E, 0xAE, 0xED, 0xD1, 0xD1, 0x0F, 0xFC, + 0x0A, 0x31, 0x46, 0xDE, 0x8B, 0xAC, 0xFA, 0xAF, 0x77, 0xF0, 0x7B, 0xCB, + 0x21, 0xAB, 0x2E, 0xFE, 0x83, 0xD4, 0x50, 0x6D, 0x24, 0x81, 0xB5, 0xBF, + 0x69, 0x04, 0x8C, 0x7E, 0x71, 0x3F, 0x07, 0xB6, 0x00, 0x57, 0x22, 0xC5, + 0xE1, 0x2E, 0x02, 0xEE, 0xD2, 0x1E, 0xA7, 0x87, 0xE8, 0x4E, 0x5D, 0xA6, + 0x01, 0xA3, 0x86, 0x41, 0xB7, 0x5E, 0x05, 0x47, 0x9F, 0x31, 0x15, 0xC1, + 0x60, 0x5D, 0x0A, 0x9E, 0x31, 0x8D, 0x51, 0xB5, 0x0F, 0xB2, 0xBC, 0x3C, + 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x80, 0xBD, 0x3C, 0x60, 0x2F, + 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x4A, 0x40, 0x69, 0x30, 0x3A, 0x5C, 0xAD, + 0xAA, 0x2C, 0x79, 0xC0, 0x13, 0xD7, 0x64, 0x64, 0x51, 0xF9, 0x6C, 0xC4, + 0x8B, 0xCE, 0xE1, 0x4E, 0xE1, 0x5D, 0x00, 0xF7, 0x14, 0xB2, 0x93, 0xEC, + 0x7E, 0xAA, 0xBC, 0xFF, 0x64, 0xDA, 0x01, 0xCF, 0x45, 0xAA, 0x2A, 0x3F, + 0x88, 0x54, 0x55, 0x36, 0x3B, 0x0A, 0x78, 0x10, 0x29, 0x7F, 0xDD, 0x08, + 0xFC, 0x1E, 0xC7, 0x36, 0x02, 0x77, 0x15, 0x70, 0x13, 0x52, 0x55, 0x79, + 0x07, 0xE9, 0x28, 0xBC, 0xEB, 0x40, 0xEA, 0x9B, 0x47, 0x81, 0x3F, 0xE0, + 0xE0, 0xAC, 0x92, 0x6B, 0x41, 0x56, 0xB0, 0x71, 0x69, 0x9A, 0xAA, 0x2A, + 0xDB, 0x80, 0x2F, 0xE1, 0x68, 0xB1, 0xA0, 0x8B, 0x55, 0x95, 0x69, 0xDC, + 0x47, 0xBA, 0x1D, 0x29, 0x9F, 0xF5, 0x80, 0x43, 0xD4, 0x9A, 0xE2, 0x8C, + 0xC4, 0x57, 0x55, 0x5A, 0xA8, 0x17, 0x47, 0x4B, 0x5F, 0x42, 0x34, 0x82, + 0x6C, 0x13, 0xEC, 0x01, 0x87, 0x68, 0x2F, 0xB2, 0x6F, 0x63, 0xDA, 0xB4, + 0x0B, 0xBB, 0xFD, 0x37, 0x32, 0x0F, 0xB8, 0x1B, 0x29, 0xBA, 0x7B, 0x85, + 0x74, 0x54, 0x72, 0x8C, 0x6A, 0x1E, 0x7C, 0x3F, 0x70, 0xD8, 0xA7, 0x49, + 0xE1, 0x1A, 0x40, 0xF6, 0xAE, 0x3C, 0x83, 0xEC, 0xDE, 0x73, 0x19, 0xD1, + 0xF7, 0x62, 0xAE, 0x96, 0x86, 0x91, 0x9D, 0x83, 0x9E, 0x42, 0x56, 0x18, + 0x96, 0x3C, 0x60, 0x3B, 0x1D, 0x47, 0x6A, 0xA3, 0x9F, 0x44, 0x36, 0xF3, + 0x6C, 0x71, 0x14, 0xF0, 0x00, 0x72, 0x08, 0xD6, 0x61, 0x12, 0x3C, 0x17, + 0x29, 0x8D, 0x80, 0x41, 0xAC, 0xBF, 0xFD, 0x7A, 0xF9, 0xAA, 0xCA, 0x1A, + 0x04, 0x9C, 0xBA, 0x2F, 0xD2, 0x55, 0xF9, 0xE9, 0x42, 0x0F, 0xD8, 0xCB, + 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x3C, 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, + 0xF6, 0xF2, 0x80, 0xB3, 0xA4, 0x34, 0x18, 0x1D, 0x2E, 0x3A, 0x59, 0xC1, + 0x41, 0x99, 0x1E, 0xF0, 0x04, 0x35, 0x05, 0x39, 0xB7, 0x60, 0x0E, 0x6E, + 0xAE, 0xF0, 0x37, 0x88, 0x17, 0xDD, 0x83, 0x4C, 0x6F, 0x0E, 0x7B, 0xC0, + 0xF6, 0x9A, 0x07, 0x7C, 0x1C, 0xB8, 0x5E, 0x01, 0x37, 0x39, 0xFA, 0xDD, + 0x0D, 0x22, 0xBB, 0xE8, 0x3E, 0x8E, 0x9C, 0x07, 0xEC, 0xAB, 0x2A, 0x2D, + 0xD4, 0x88, 0x1C, 0x6C, 0xF9, 0x65, 0xEC, 0xF6, 0xA2, 0x4E, 0x5A, 0x2B, + 0x90, 0x7A, 0xAC, 0x21, 0xEC, 0xF7, 0xAA, 0xCC, 0x74, 0x90, 0x75, 0x09, + 0x52, 0x36, 0x9B, 0x06, 0xB8, 0x81, 0x16, 0xE1, 0xAB, 0x2A, 0xAD, 0xD5, + 0x81, 0xA3, 0xD5, 0x89, 0x21, 0x6A, 0x07, 0x16, 0x7B, 0xC0, 0xE1, 0x6A, + 0x25, 0x9D, 0x07, 0x77, 0xE4, 0x88, 0xE9, 0x18, 0x9C, 0x5A, 0x07, 0xDC, + 0x8B, 0xC3, 0xD5, 0x11, 0x6F, 0xA1, 0x33, 0xF8, 0xBD, 0x2A, 0xAD, 0xB4, + 0x0F, 0xE8, 0x4C, 0x21, 0xE0, 0x5D, 0xD4, 0x68, 0x55, 0x65, 0xDC, 0x0B, + 0xC2, 0xBA, 0x90, 0x0A, 0xC5, 0x83, 0x29, 0x31, 0x12, 0xC6, 0x34, 0x0F, + 0x8E, 0x5A, 0x55, 0x59, 0xB5, 0x85, 0x74, 0xE5, 0xA4, 0x49, 0x25, 0xEC, + 0x8A, 0xD4, 0xA3, 0xBC, 0x44, 0x41, 0x55, 0xE5, 0x10, 0xB0, 0x1A, 0x29, + 0xBA, 0x73, 0xB9, 0x6E, 0xEC, 0x59, 0xE4, 0xA0, 0xAB, 0xCD, 0x11, 0x5E, + 0x48, 0xDB, 0x23, 0x0E, 0x4C, 0xD2, 0x80, 0xC7, 0xB1, 0x3B, 0x70, 0x23, + 0xAA, 0x51, 0x71, 0x5C, 0x21, 0x6F, 0xD7, 0xA8, 0xBA, 0x11, 0x37, 0x0F, + 0xE5, 0x28, 0x22, 0xE7, 0x02, 0x1F, 0x26, 0xDA, 0xAA, 0xC2, 0x46, 0xEC, + 0xDC, 0xB9, 0x52, 0x1C, 0x9F, 0xBB, 0x1C, 0xC0, 0xA3, 0xD8, 0xB9, 0x37, + 0xE7, 0x23, 0xD6, 0xE3, 0x50, 0xC4, 0xD6, 0xD1, 0xA9, 0x5D, 0x76, 0xDE, + 0x51, 0xC0, 0x13, 0x2D, 0x06, 0x9C, 0x83, 0xDD, 0x02, 0x3B, 0x43, 0x0C, + 0xCB, 0x78, 0xCA, 0x01, 0x7C, 0xDA, 0xF2, 0xCD, 0x6D, 0x07, 0x16, 0x62, + 0x77, 0x40, 0xF2, 0xB9, 0x3E, 0x64, 0xAD, 0x55, 0x55, 0xCE, 0xB3, 0xCC, + 0x99, 0x8F, 0xC5, 0xF1, 0xD9, 0xCB, 0x09, 0xB2, 0xC6, 0xB1, 0x5B, 0x70, + 0xB5, 0x48, 0x01, 0x7B, 0x89, 0x16, 0x10, 0x7E, 0xA0, 0x67, 0x89, 0x98, + 0x4E, 0x49, 0x2F, 0x07, 0xB0, 0x01, 0x9E, 0xB3, 0xE8, 0x46, 0x0A, 0xD8, + 0x9D, 0x10, 0x9E, 0x05, 0x35, 0x03, 0xEF, 0xB1, 0xB8, 0x6F, 0x18, 0x39, + 0x26, 0x20, 0xF1, 0x34, 0x69, 0x27, 0x32, 0xAB, 0x12, 0xA6, 0xB5, 0xA4, + 0x6B, 0xD5, 0x7E, 0xA5, 0xB4, 0x54, 0xB3, 0x83, 0x30, 0xF5, 0x11, 0xD3, + 0x61, 0xDA, 0xE5, 0x02, 0x3E, 0x8C, 0xAC, 0x04, 0x0C, 0xD3, 0x32, 0xE0, + 0x43, 0x19, 0x87, 0x9B, 0x07, 0x6E, 0xC2, 0x6E, 0x22, 0xE5, 0x05, 0x85, + 0x9C, 0x38, 0xE0, 0x53, 0xC8, 0xEA, 0x3A, 0x9B, 0xDF, 0x73, 0x1B, 0x30, + 0x3D, 0xC3, 0x80, 0x57, 0x00, 0xEB, 0x2C, 0xEF, 0x7D, 0xC2, 0xB2, 0x67, + 0xAC, 0x38, 0xE0, 0xD3, 0xFA, 0x30, 0x36, 0x15, 0x0D, 0x57, 0x20, 0x73, + 0xBD, 0x0D, 0x19, 0x84, 0xDB, 0x02, 0xDC, 0x8E, 0xEC, 0xFD, 0x15, 0xA6, + 0x5E, 0xE4, 0xA0, 0x8F, 0x92, 0x0B, 0x80, 0x8D, 0x76, 0x27, 0xCF, 0x58, + 0xDC, 0x5B, 0x8F, 0x4C, 0xE4, 0xAF, 0xC9, 0x18, 0xDC, 0x7A, 0x64, 0xDF, + 0xAF, 0x9B, 0xB1, 0xAB, 0x2F, 0xDB, 0x42, 0x8C, 0x67, 0x47, 0xC5, 0x31, + 0xD9, 0xF0, 0x3A, 0xF0, 0x3B, 0x4B, 0x33, 0xA2, 0x0D, 0xF8, 0x06, 0x70, + 0x79, 0x46, 0xE0, 0x16, 0x90, 0xD2, 0xA3, 0x3B, 0x81, 0x99, 0x96, 0x43, + 0xDE, 0xE3, 0xD8, 0x1F, 0x55, 0x5B, 0x15, 0xC0, 0xE3, 0xC0, 0x9F, 0x91, + 0xC5, 0xD0, 0x36, 0xBA, 0x12, 0xF8, 0x26, 0xB2, 0x27, 0x56, 0xAD, 0xC3, + 0xBD, 0x0E, 0xD8, 0x80, 0xDD, 0x61, 0xD0, 0x00, 0xDB, 0x80, 0x1D, 0x71, + 0x47, 0x76, 0x71, 0xE8, 0x55, 0xE4, 0xAC, 0x23, 0x5B, 0x4F, 0x76, 0x1D, + 0xF0, 0x43, 0xE0, 0x06, 0xDC, 0x3C, 0xF8, 0x2A, 0x8E, 0x31, 0xF7, 0x46, + 0xE0, 0xDB, 0xC8, 0x01, 0x5F, 0x36, 0x3A, 0x01, 0x3C, 0x18, 0x57, 0x7A, + 0x14, 0x28, 0xCE, 0x99, 0x9A, 0x4D, 0xFA, 0xA1, 0xD6, 0x5A, 0xFE, 0xDE, + 0x1B, 0x35, 0x37, 0x9E, 0x05, 0x6C, 0x65, 0x62, 0x56, 0xA6, 0x8B, 0x9A, + 0xAF, 0x2F, 0xF0, 0x67, 0x89, 0x66, 0xF0, 0x3C, 0xAA, 0x2D, 0x18, 0x57, + 0x01, 0xF7, 0x02, 0xF7, 0x21, 0x1B, 0xA7, 0xCC, 0xB5, 0xB8, 0x3F, 0x07, + 0x5C, 0x05, 0xCC, 0xD0, 0x3C, 0x79, 0x0B, 0xF0, 0x22, 0xE2, 0xC1, 0xA6, + 0x51, 0xB3, 0x81, 0xE5, 0xFA, 0xE2, 0xAE, 0x21, 0x9A, 0x3D, 0xBB, 0x0B, + 0xF8, 0x19, 0x70, 0x32, 0xEE, 0x87, 0xCA, 0x19, 0x13, 0xEB, 0x44, 0xCD, + 0x24, 0xE0, 0x2B, 0xC0, 0x77, 0x88, 0xB6, 0xF3, 0xDB, 0x00, 0xB0, 0x1B, + 0x99, 0x22, 0xDC, 0x89, 0xD8, 0x74, 0x47, 0x90, 0xF2, 0x1D, 0x57, 0x37, + 0x46, 0xAB, 0x43, 0xAC, 0xC7, 0x79, 0x3A, 0xC6, 0xBE, 0x1B, 0xB1, 0x21, + 0xDB, 0x89, 0x36, 0x45, 0xFA, 0x06, 0xF0, 0x2D, 0x64, 0xE3, 0x19, 0x5C, + 0x07, 0x0C, 0x70, 0x1E, 0xF0, 0x3D, 0xE0, 0x8B, 0x13, 0xE8, 0x21, 0x4E, + 0xEA, 0x78, 0xBE, 0x07, 0xF1, 0xB9, 0x4F, 0x00, 0x47, 0x75, 0x5C, 0x72, + 0xA1, 0x56, 0x2B, 0xAF, 0x31, 0xC3, 0x5C, 0x1D, 0x5A, 0x66, 0x6A, 0x8F, + 0xB5, 0x14, 0x99, 0x44, 0x88, 0xBA, 0x0A, 0x63, 0x10, 0xB8, 0x1B, 0xB8, + 0x57, 0x23, 0xE8, 0x54, 0x00, 0x06, 0x39, 0xCF, 0xFE, 0x2E, 0x60, 0xFD, + 0x04, 0x03, 0xB9, 0x31, 0x85, 0x3B, 0x84, 0x9C, 0x48, 0x1A, 0x00, 0x36, + 0x0E, 0x01, 0x6E, 0xD5, 0x60, 0x6A, 0xFA, 0x04, 0x3F, 0xE3, 0x19, 0x1D, + 0xD2, 0x7E, 0x50, 0xC9, 0x61, 0xA9, 0x52, 0x80, 0x01, 0x2E, 0x06, 0xBE, + 0x0F, 0x7C, 0x34, 0xA6, 0x48, 0xD9, 0xA5, 0x0D, 0xC1, 0xCB, 0x55, 0x11, + 0x78, 0x48, 0x33, 0x89, 0x43, 0x15, 0x7D, 0xD8, 0x0A, 0x02, 0x06, 0x59, + 0xA9, 0xB0, 0x01, 0x31, 0xD9, 0x9D, 0xDC, 0x8D, 0x35, 0x01, 0x1D, 0x05, + 0x1E, 0x06, 0xEE, 0x01, 0x5E, 0xAE, 0xF8, 0xDB, 0x58, 0x61, 0xC0, 0x00, + 0x4B, 0x80, 0x2F, 0x20, 0x0B, 0xCA, 0x16, 0x64, 0x1C, 0x6E, 0x37, 0xF0, + 0x4B, 0xCD, 0x77, 0x8F, 0x54, 0xA5, 0xBB, 0xA9, 0x02, 0xE0, 0x20, 0x85, + 0x58, 0x07, 0xDC, 0x82, 0xD8, 0x94, 0x59, 0x9B, 0x70, 0x28, 0x22, 0x13, + 0x08, 0x8F, 0xA8, 0x5F, 0xD0, 0x5F, 0xB5, 0xF1, 0xA4, 0x4A, 0x80, 0x03, + 0x77, 0x67, 0x25, 0xF0, 0x29, 0xE0, 0x7D, 0xC8, 0x1A, 0xA4, 0x5A, 0xDF, + 0x61, 0x60, 0x54, 0x5B, 0xED, 0x56, 0x85, 0xFB, 0x02, 0x55, 0x3E, 0xD7, + 0xA1, 0x9A, 0x80, 0x03, 0x2D, 0x56, 0xD0, 0x1F, 0xD1, 0xD6, 0x1C, 0x9C, + 0xAC, 0x52, 0x6B, 0x2D, 0xF6, 0x00, 0xE2, 0xCF, 0x6F, 0x06, 0xFE, 0x05, + 0xBC, 0x96, 0x48, 0x44, 0x98, 0x00, 0x60, 0x10, 0x23, 0xFE, 0x42, 0xCD, + 0x21, 0x57, 0x29, 0xE8, 0x85, 0x88, 0x75, 0xD9, 0x98, 0x52, 0xA8, 0x43, + 0x1A, 0x40, 0x05, 0x60, 0x9F, 0x45, 0x1C, 0xAA, 0x83, 0x49, 0x66, 0x00, + 0x49, 0x01, 0x0E, 0x54, 0xA7, 0x79, 0xE4, 0x45, 0x7A, 0xAD, 0x54, 0xF0, + 0x6F, 0x53, 0xC3, 0x64, 0x0A, 0x30, 0xCD, 0x51, 0xA0, 0x7D, 0x88, 0x03, + 0xD7, 0xA7, 0x39, 0x7B, 0x27, 0x52, 0x08, 0xDF, 0xAD, 0xD7, 0x49, 0x1C, + 0x70, 0xE1, 0x92, 0x06, 0x7C, 0xB6, 0x1A, 0x10, 0x77, 0x68, 0x86, 0x9A, + 0x08, 0x33, 0x35, 0x38, 0x5B, 0x82, 0x7B, 0x4B, 0x4A, 0x8D, 0x02, 0xED, + 0x51, 0x93, 0x22, 0x38, 0x05, 0xAD, 0x0F, 0xC7, 0xAC, 0x55, 0x97, 0x00, + 0x9F, 0xAB, 0x1B, 0x6F, 0xD2, 0xD6, 0xEC, 0xE2, 0xCA, 0x86, 0x7E, 0xA4, + 0x64, 0xC9, 0xE9, 0x45, 0x72, 0x2E, 0x03, 0xF6, 0x8A, 0x41, 0x7E, 0x23, + 0x34, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x92, 0xD1, 0xFF, + 0x06, 0x00, 0x3D, 0x67, 0xD1, 0x66, 0xCA, 0xCF, 0x19, 0x9B, 0x00, 0x00, + 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* misc_icon = raw::misc; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/icons/rage.hpp b/cheat/internal_rewrite/icons/rage.hpp new file mode 100644 index 0000000..0bc349b --- /dev/null +++ b/cheat/internal_rewrite/icons/rage.hpp @@ -0,0 +1,1630 @@ +/* E:\Users\admin\Desktop\stuff\icons\rage.png (4/1/2018 9:59:32 PM) + StartOffset: 00000000, EndOffset: 00004BD9, Length: 00004BDA */ + +namespace icons { +constexpr static size_t rage_size = 19418; +namespace raw { +static unsigned char rage[19418] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x65, + 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, 0x61, 0x36, + 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, 0x2D, 0x63, + 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, 0x39, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x65, 0x31, 0x37, 0x35, + 0x35, 0x65, 0x39, 0x63, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, + 0x31, 0x36, 0x37, 0x34, 0x65, 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, + 0x2D, 0x63, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, + 0x66, 0x31, 0x35, 0x61, 0x38, 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x31, 0x36, 0x37, 0x34, 0x65, + 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, 0x2D, 0x63, 0x39, 0x34, 0x38, + 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, 0x66, 0x31, 0x35, 0x61, 0x38, + 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x65, 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, + 0x61, 0x36, 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, + 0x2D, 0x63, 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, + 0x39, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xB3, 0x93, 0x52, 0x50, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x05, 0xFC, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x88, 0x94, 0x55, 0x18, 0xC7, + 0x7F, 0xB3, 0xAB, 0x6B, 0xA9, 0xD9, 0x62, 0xBA, 0x56, 0xBB, 0x62, 0x94, + 0x90, 0xD9, 0x05, 0xB5, 0x48, 0x4B, 0x14, 0xBB, 0x80, 0x5D, 0xB4, 0xD8, + 0xAF, 0xF5, 0xA1, 0x02, 0x23, 0xB0, 0x08, 0xA2, 0x0F, 0x51, 0x51, 0x1F, + 0xBA, 0x10, 0xA5, 0x11, 0x14, 0x51, 0x54, 0xC2, 0x16, 0x11, 0x44, 0xD1, + 0xE5, 0x43, 0x45, 0x37, 0x37, 0x8C, 0xCC, 0xB2, 0x02, 0xD3, 0xC8, 0x56, + 0xB0, 0xA2, 0xD6, 0x75, 0x6D, 0xD5, 0x35, 0x37, 0xDB, 0xD5, 0xD9, 0x99, + 0x3E, 0x3C, 0xCF, 0xA0, 0x81, 0xF3, 0x9E, 0x33, 0x7B, 0x19, 0xDF, 0x77, + 0xF6, 0xFF, 0x83, 0x61, 0x84, 0x79, 0x77, 0xDE, 0x71, 0x7E, 0xEF, 0x39, + 0xE7, 0x39, 0xCF, 0x7B, 0xCE, 0x33, 0xB9, 0x62, 0xB1, 0x88, 0xA8, 0x5D, + 0xEA, 0xF4, 0x15, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, + 0x04, 0x0B, 0x09, 0x16, 0x12, 0x2C, 0xC1, 0x42, 0x82, 0x85, 0x04, 0x0B, + 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, 0x16, + 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, + 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, + 0x0B, 0x09, 0x96, 0x60, 0x51, 0x4B, 0x8C, 0xAB, 0xF0, 0xF8, 0x1C, 0x30, + 0x03, 0xC8, 0x03, 0x3D, 0xC3, 0x38, 0xEF, 0x49, 0xC0, 0xE9, 0xC0, 0x78, + 0xA0, 0x50, 0xE3, 0xDF, 0xF1, 0x61, 0xE0, 0x90, 0x3F, 0xFA, 0x81, 0x62, + 0x5A, 0x05, 0xCF, 0x05, 0x2E, 0x02, 0x16, 0xFA, 0x07, 0xDD, 0x08, 0x7C, + 0x07, 0x74, 0x55, 0x78, 0xCE, 0x8B, 0x81, 0x45, 0xC0, 0x7C, 0xA0, 0xA1, + 0x86, 0x05, 0xE7, 0x5C, 0xE6, 0xBF, 0xC0, 0x3E, 0xA0, 0x13, 0xD8, 0x0D, + 0xF4, 0xF9, 0xF3, 0x4E, 0x97, 0x3E, 0xAA, 0xFF, 0xFF, 0x5C, 0xE4, 0x0E, + 0xFF, 0xF9, 0xC0, 0x83, 0xC0, 0x02, 0x6F, 0x79, 0x83, 0xC0, 0x1F, 0xC0, + 0x27, 0xC0, 0x5A, 0xE0, 0xCF, 0xC8, 0xF3, 0x2D, 0x01, 0x1E, 0x00, 0xE6, + 0x01, 0xD3, 0xFC, 0x4B, 0xA8, 0x75, 0x06, 0x81, 0x01, 0xE0, 0x1F, 0xE0, + 0x6F, 0x17, 0xFE, 0x3B, 0xB0, 0xC9, 0x25, 0xFF, 0xEC, 0xCF, 0x7D, 0x27, + 0x4A, 0x70, 0x33, 0xF0, 0x1C, 0xD0, 0x7A, 0x9C, 0xD7, 0xFA, 0x81, 0x67, + 0x81, 0xFB, 0x22, 0xCE, 0x35, 0x0B, 0x68, 0x03, 0x96, 0x69, 0x64, 0x04, + 0x97, 0xBD, 0x17, 0xF8, 0xD1, 0x65, 0x6F, 0x06, 0xBE, 0x07, 0x7A, 0xAB, + 0x2D, 0xB8, 0x15, 0x78, 0x0B, 0xA8, 0x2F, 0xF3, 0xFA, 0x5E, 0xE0, 0x72, + 0xA0, 0x23, 0xF0, 0x3E, 0xB7, 0x03, 0x2F, 0xC9, 0xEB, 0x71, 0xE9, 0x05, + 0xB6, 0x03, 0x1F, 0x03, 0x9F, 0xBB, 0xE8, 0x43, 0xD5, 0x8A, 0xA2, 0xCF, + 0x4D, 0x90, 0x0B, 0x70, 0x1A, 0xB0, 0x32, 0xE2, 0x3C, 0x0B, 0xE5, 0xB1, + 0x2C, 0x8D, 0x1E, 0x97, 0xDC, 0x03, 0x3C, 0x06, 0xAC, 0x02, 0x66, 0x56, + 0x2B, 0xC8, 0x9A, 0x18, 0x78, 0xBD, 0xE8, 0x01, 0x58, 0x48, 0xF0, 0x14, + 0x3F, 0x36, 0x27, 0x9F, 0x65, 0x99, 0x02, 0x2C, 0x05, 0xE6, 0xF8, 0x77, + 0xBA, 0xCE, 0x5B, 0x73, 0x61, 0x34, 0x5B, 0xF0, 0x60, 0xE0, 0xF5, 0x82, + 0x4F, 0x05, 0x42, 0x1C, 0x91, 0xBF, 0x68, 0x9A, 0x80, 0xDB, 0x80, 0x47, + 0x81, 0x1B, 0x80, 0x09, 0xA3, 0xD5, 0x82, 0x73, 0x91, 0x57, 0xCF, 0x40, + 0xC4, 0x31, 0x05, 0x79, 0xAB, 0x88, 0x06, 0x60, 0xB9, 0x07, 0xB9, 0x53, + 0x81, 0x37, 0x3C, 0xA8, 0x1D, 0xD5, 0x44, 0x47, 0xD2, 0x85, 0x10, 0xEA, + 0xC6, 0x89, 0xE8, 0xA2, 0x4B, 0x53, 0x89, 0x5A, 0xE8, 0xC6, 0x8B, 0x1E, + 0xBB, 0x34, 0x78, 0x4F, 0x39, 0x61, 0x88, 0x2D, 0xF1, 0x02, 0xE0, 0x61, + 0x6F, 0x20, 0xAF, 0x63, 0x49, 0xA6, 0xAA, 0x0B, 0x1E, 0x29, 0x36, 0x00, + 0x1F, 0xF8, 0xE7, 0xCA, 0xD5, 0x80, 0xE0, 0x06, 0xE0, 0x14, 0x7F, 0x6E, + 0x04, 0xCE, 0x07, 0xCE, 0xF4, 0x5C, 0xC2, 0xC4, 0x0A, 0xDE, 0x6B, 0x96, + 0xE7, 0x21, 0x7A, 0x81, 0xF7, 0xB2, 0x2C, 0x78, 0x23, 0xF0, 0x8A, 0x5F, + 0xF9, 0xB5, 0x20, 0xB8, 0x0E, 0x4B, 0xC7, 0xD6, 0x7B, 0xEB, 0x3D, 0x07, + 0x38, 0x1B, 0x4B, 0xF4, 0x2C, 0x72, 0xE1, 0x93, 0x23, 0xDF, 0x6F, 0x36, + 0xF0, 0x10, 0x96, 0x11, 0xDB, 0x9C, 0x55, 0xC1, 0xF9, 0xC8, 0xF1, 0x3C, + 0xAB, 0x74, 0xFA, 0x45, 0xFC, 0xA1, 0xCB, 0xBD, 0x16, 0xB8, 0xCE, 0x23, + 0xE6, 0x98, 0x0B, 0x7A, 0x01, 0x96, 0x09, 0x5C, 0x4D, 0x64, 0x8A, 0x38, + 0x6D, 0x82, 0x27, 0x8D, 0x81, 0xE0, 0x29, 0x0F, 0xEC, 0xF1, 0xC7, 0x56, + 0x2C, 0x8B, 0x75, 0x93, 0x8B, 0x3E, 0x39, 0xE2, 0xEF, 0x57, 0x60, 0xF7, + 0x00, 0x9E, 0x8C, 0x19, 0x8F, 0x75, 0xBB, 0xF0, 0xC4, 0xD2, 0x03, 0xBC, + 0xE3, 0xE3, 0x6B, 0x1B, 0x71, 0xF9, 0xE8, 0x71, 0xC0, 0x1D, 0xC0, 0xA5, + 0x23, 0x35, 0x0F, 0xAE, 0xF6, 0xB8, 0x35, 0x16, 0xF9, 0x05, 0xCB, 0x60, + 0xBD, 0x10, 0x29, 0x79, 0x26, 0x70, 0x67, 0x4C, 0xA0, 0xA6, 0x16, 0x9C, + 0x1E, 0x76, 0x01, 0x6B, 0x3C, 0xC8, 0x8C, 0x49, 0x0A, 0xDD, 0x88, 0xDD, + 0x03, 0x90, 0xE0, 0x0C, 0xF1, 0x17, 0xF0, 0x94, 0x4F, 0x15, 0x63, 0xE2, + 0x95, 0x5B, 0x7D, 0x0A, 0x26, 0xC1, 0x19, 0xA2, 0x0B, 0x78, 0x02, 0xF8, + 0x2D, 0xE2, 0xD8, 0x95, 0xC0, 0x79, 0x12, 0x9C, 0x3D, 0xBE, 0xF5, 0xAE, + 0x3A, 0x14, 0x93, 0x4C, 0x01, 0xAE, 0x4F, 0x9A, 0x0D, 0x49, 0x70, 0x7A, + 0x69, 0x03, 0x76, 0x44, 0x1C, 0xB7, 0x3C, 0x69, 0x7A, 0x25, 0xC1, 0xE9, + 0xA5, 0x13, 0x78, 0x33, 0x62, 0xAE, 0x3B, 0x17, 0x4B, 0x65, 0x4A, 0x70, + 0x06, 0x79, 0x9B, 0xF0, 0x12, 0x9E, 0xA9, 0x58, 0x86, 0x2B, 0x27, 0xC1, + 0xD9, 0x63, 0x07, 0xB6, 0x94, 0x27, 0x14, 0x47, 0xCD, 0xA6, 0xCC, 0xAA, + 0x1B, 0x09, 0x4E, 0x37, 0x87, 0xB1, 0x3B, 0x6C, 0x21, 0x9A, 0xCA, 0xB9, + 0x94, 0xE0, 0x74, 0x53, 0x00, 0xBE, 0x21, 0xBC, 0x58, 0xA2, 0x89, 0x32, + 0xF7, 0x9A, 0x25, 0x38, 0xDD, 0x14, 0x81, 0x6E, 0xC2, 0x99, 0xAD, 0xE9, + 0x94, 0x49, 0x5B, 0x4A, 0x70, 0x36, 0x5A, 0x71, 0x28, 0x92, 0x9E, 0x84, + 0xDD, 0x77, 0x96, 0xE0, 0x0C, 0x52, 0xDA, 0x02, 0x93, 0x44, 0xBD, 0xC6, + 0xE0, 0xEC, 0x92, 0x27, 0x79, 0x5D, 0x3A, 0xDE, 0x85, 0x17, 0x24, 0x38, + 0x9B, 0x4C, 0x20, 0xBC, 0x30, 0x63, 0x3F, 0x65, 0x76, 0x42, 0x48, 0x70, + 0xBA, 0xA9, 0xC3, 0x32, 0x55, 0x21, 0xC1, 0xDD, 0xD8, 0xA6, 0x36, 0x09, + 0xCE, 0x20, 0x57, 0x11, 0x5E, 0xAF, 0xB5, 0xAF, 0x5C, 0x20, 0x26, 0xC1, + 0xE9, 0xA6, 0x11, 0xB8, 0x24, 0xE2, 0xB8, 0x4E, 0x8D, 0xC1, 0xD9, 0x64, + 0x29, 0xB6, 0xB3, 0x21, 0x89, 0x7E, 0x60, 0x8B, 0x04, 0x67, 0x8F, 0x71, + 0xD8, 0x6A, 0xCB, 0xD0, 0xBA, 0xAB, 0x2E, 0x60, 0x5B, 0xB9, 0xA9, 0x94, + 0x04, 0xA7, 0x97, 0x25, 0xC0, 0x95, 0x11, 0xC7, 0x7D, 0x4D, 0x42, 0xBD, + 0x14, 0x09, 0x4E, 0xEF, 0xD8, 0x7B, 0x37, 0xB6, 0xF7, 0x3A, 0xC4, 0xBB, + 0x24, 0x6C, 0x16, 0x90, 0xE0, 0x74, 0x72, 0x0B, 0x70, 0x4D, 0xC4, 0x71, + 0x5B, 0x81, 0xAF, 0x48, 0xC8, 0x74, 0x49, 0x70, 0xFA, 0xB8, 0x1A, 0xB8, + 0x0B, 0x2B, 0x35, 0x15, 0xE2, 0x35, 0x9F, 0x03, 0x23, 0xC1, 0xD9, 0x60, + 0x19, 0xF0, 0x08, 0x76, 0x03, 0x3F, 0xC4, 0x4F, 0xDE, 0x3D, 0x17, 0x42, + 0x91, 0x9A, 0x38, 0xF1, 0x34, 0x78, 0xCB, 0xBD, 0x1F, 0xB8, 0x2C, 0xE2, + 0xF8, 0x22, 0xF0, 0x22, 0xF0, 0x6B, 0x4C, 0x28, 0x9E, 0x26, 0xEA, 0xC7, + 0xA0, 0xDC, 0x66, 0x6C, 0x43, 0xD9, 0x2A, 0xE2, 0x92, 0x1A, 0x00, 0xEB, + 0xB1, 0xCA, 0x47, 0x85, 0xAC, 0x09, 0x1E, 0x4B, 0x75, 0x3C, 0xA6, 0xBB, + 0xD0, 0x56, 0x6C, 0x1B, 0x69, 0x4B, 0xE4, 0xDF, 0x75, 0x62, 0xBB, 0x1F, + 0xBA, 0x63, 0x27, 0xD3, 0x69, 0x62, 0x7F, 0x8D, 0x4B, 0x9D, 0xEA, 0x53, + 0xA0, 0x79, 0xC0, 0x62, 0xE0, 0x0A, 0xEC, 0x66, 0x42, 0x6C, 0x69, 0x87, + 0x3E, 0xE0, 0x69, 0xA0, 0x3D, 0xF6, 0x84, 0x69, 0x13, 0xDC, 0x02, 0x5C, + 0xE8, 0xFF, 0xAE, 0x95, 0x72, 0x4B, 0x75, 0x1E, 0x11, 0xB7, 0xB8, 0xD8, + 0xB3, 0xFC, 0x79, 0x16, 0xF1, 0xBB, 0xFB, 0xC1, 0xAA, 0x1D, 0xAD, 0xF3, + 0xC7, 0x91, 0xAC, 0x0A, 0x5E, 0x41, 0x60, 0xAF, 0x4D, 0x06, 0xA9, 0x77, + 0xC1, 0x33, 0xB0, 0xFA, 0x1C, 0x13, 0x29, 0xB3, 0xBC, 0x26, 0x81, 0x02, + 0xB6, 0x08, 0x7E, 0x2D, 0x56, 0xA4, 0x86, 0xAC, 0x0A, 0x9E, 0xE3, 0x0F, + 0x71, 0x94, 0x7E, 0x6C, 0x01, 0xFC, 0xE3, 0xC4, 0x17, 0x7D, 0x8D, 0x16, + 0x3C, 0x52, 0xDD, 0x64, 0xEE, 0x98, 0x87, 0x88, 0xA7, 0x07, 0xAB, 0x8F, + 0xF5, 0x3C, 0xE1, 0x5A, 0xA0, 0x43, 0x6E, 0xC1, 0xA1, 0xEE, 0xA4, 0x9E, + 0xB8, 0xDA, 0x1A, 0xE3, 0xE5, 0xAB, 0x22, 0x3A, 0x80, 0x97, 0x5D, 0xF0, + 0xAE, 0xA1, 0xBE, 0x49, 0x48, 0x70, 0x91, 0xF0, 0x92, 0xCD, 0x41, 0xC2, + 0x65, 0x07, 0x0A, 0x84, 0x4B, 0x22, 0x8A, 0xA3, 0x33, 0x89, 0x0D, 0xC0, + 0xAB, 0xC0, 0xA7, 0x0C, 0xB3, 0x8E, 0x74, 0x8C, 0xE0, 0xDD, 0x11, 0x82, + 0x3F, 0x8B, 0x10, 0xBC, 0x53, 0x5D, 0x74, 0x70, 0x0A, 0xB4, 0x15, 0x78, + 0x1F, 0xF8, 0x08, 0xBB, 0xC7, 0x3B, 0xEC, 0xF2, 0x8F, 0x31, 0x5D, 0xF4, + 0x36, 0xEC, 0xA6, 0xF2, 0x19, 0x09, 0xAF, 0x7F, 0x11, 0xF1, 0x3E, 0xED, + 0x58, 0x12, 0xFD, 0x54, 0xB9, 0xFC, 0xDF, 0x85, 0xBF, 0x07, 0xDB, 0x60, + 0xB6, 0xDE, 0x5B, 0xEE, 0x0F, 0xC0, 0xC1, 0x91, 0x3A, 0x41, 0xAC, 0xE0, + 0x67, 0x80, 0x7B, 0xB1, 0x32, 0xFC, 0xA5, 0x74, 0xE2, 0x11, 0xAC, 0x34, + 0xFD, 0x9A, 0xC8, 0x6E, 0x64, 0x13, 0x56, 0x39, 0x7E, 0xB5, 0x4F, 0xF8, + 0xC7, 0x22, 0xA5, 0xF2, 0xFE, 0x3D, 0x3E, 0xAE, 0x6E, 0x07, 0xBE, 0xC4, + 0xAA, 0xBE, 0x77, 0x54, 0x3A, 0x05, 0x8A, 0x8A, 0x6E, 0x23, 0x7F, 0xB3, + 0xA1, 0x11, 0xB8, 0x19, 0xFB, 0xED, 0x86, 0x19, 0xC7, 0x7C, 0xC8, 0x76, + 0xAC, 0x76, 0x62, 0x6C, 0x75, 0xBA, 0x69, 0x58, 0xE1, 0x90, 0xC5, 0x3E, + 0xE1, 0xAF, 0xE5, 0x1F, 0xE5, 0x28, 0x71, 0x18, 0x38, 0x80, 0x55, 0xC6, + 0x3F, 0xE0, 0x63, 0xEC, 0x16, 0x1F, 0xB2, 0xBA, 0xB0, 0xDF, 0xBE, 0xC8, + 0x8F, 0xD6, 0xC9, 0x63, 0x05, 0x83, 0x95, 0x09, 0x68, 0xC2, 0xEA, 0x42, + 0x94, 0x02, 0xAB, 0xCE, 0x21, 0x04, 0x4F, 0x93, 0xB1, 0x2C, 0x4E, 0xF3, + 0x18, 0x11, 0x3C, 0xE0, 0x5D, 0xEE, 0x41, 0x6C, 0x71, 0x7A, 0xE9, 0x57, + 0x58, 0xF2, 0xD5, 0x38, 0x79, 0x25, 0x82, 0x45, 0x06, 0xD1, 0x0D, 0x7F, + 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, + 0x42, 0x82, 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, + 0x85, 0x04, 0x0B, 0x09, 0x96, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, + 0x0B, 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, + 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x12, + 0x2C, 0x6A, 0x8A, 0xFF, 0x06, 0x00, 0x0E, 0x16, 0x36, 0x06, 0x65, 0x03, + 0x35, 0x24, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, + 0x60, 0x82 +}; +} +static unsigned char* rage_icon = raw::rage; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/icons/visuals.hpp b/cheat/internal_rewrite/icons/visuals.hpp new file mode 100644 index 0000000..3bd8c7b --- /dev/null +++ b/cheat/internal_rewrite/icons/visuals.hpp @@ -0,0 +1,1837 @@ +/* E:\Users\admin\Desktop\stuff\icons\visuals.png (4/1/2018 10:00:00 PM) + StartOffset: 00000000, EndOffset: 00005593, Length: 00005594 */ + +namespace icons { +constexpr static size_t visuals_size = 21908; +namespace raw { +static unsigned char visuals[21908] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, + 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, + 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, + 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, + 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, + 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, + 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, + 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, + 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, + 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, + 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, + 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, + 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, + 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, + 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, + 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, + 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, + 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, + 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, + 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, + 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, + 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, + 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, + 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, + 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, + 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, + 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, + 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, + 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, + 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, + 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, + 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, + 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, + 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, + 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, + 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, + 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, + 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, + 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, + 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, + 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, + 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, + 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, + 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, + 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, + 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, + 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, + 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, + 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, + 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, + 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, + 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, + 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, + 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, + 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, + 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, + 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, + 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, + 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, + 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, + 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, + 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, + 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, + 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, + 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, + 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, + 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, + 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, + 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, + 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, + 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, + 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, + 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, + 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, + 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, + 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, + 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, + 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, + 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, + 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, + 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, + 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, + 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, + 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, + 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, + 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, + 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, + 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, + 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, + 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, + 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, + 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, + 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, + 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, + 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, + 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, + 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, + 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, + 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, + 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, + 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, + 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, + 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, + 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, + 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, + 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, + 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, + 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, + 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, + 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, + 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, + 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, + 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, + 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, + 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, + 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, + 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, + 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, + 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, + 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, + 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, + 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, + 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, + 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, + 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, + 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, + 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, + 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, + 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, + 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, + 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, + 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, + 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, + 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, + 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, + 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, + 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, + 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, + 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, + 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, + 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, + 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, + 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, + 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, + 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, + 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, + 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, + 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, + 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, + 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, + 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, + 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, + 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, + 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, + 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, + 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, + 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, + 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, + 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, + 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, + 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, + 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, + 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, + 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, + 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, + 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, + 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, + 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, + 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, + 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, + 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, + 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, + 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, + 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, + 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, + 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, + 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, + 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, + 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, + 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, + 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, + 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, + 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, + 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, + 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, + 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, + 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, + 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, + 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, + 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, + 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, + 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, + 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, + 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, + 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, + 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, + 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, + 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, + 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, + 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, + 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, + 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, + 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, + 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, + 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, + 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, + 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, + 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, + 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, + 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, + 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, + 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, + 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, + 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, + 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, + 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, + 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, + 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, + 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, + 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, + 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, + 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, + 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, + 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, + 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, + 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, + 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, + 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, + 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, + 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, + 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, + 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, + 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, + 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, + 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, + 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, + 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, + 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, + 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, + 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, + 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, + 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, + 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, + 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, + 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, + 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, + 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, + 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, + 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, + 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, + 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, + 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, + 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, + 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, + 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, + 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, + 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, + 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, + 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, + 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, + 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, + 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, + 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, 0x31, 0x61, + 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, 0x2D, 0x39, + 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, 0x34, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, + 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, + 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x36, 0x38, 0x37, + 0x35, 0x30, 0x30, 0x66, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, + 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, + 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, + 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x30, + 0x33, 0x31, 0x65, 0x39, 0x31, 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, + 0x2D, 0x30, 0x65, 0x34, 0x61, 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, + 0x32, 0x31, 0x36, 0x34, 0x33, 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, + 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, + 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, + 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, + 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, 0x33, 0x31, 0x65, 0x39, 0x31, + 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, 0x2D, 0x30, 0x65, 0x34, 0x61, + 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, 0x32, 0x31, 0x36, 0x34, 0x33, + 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, + 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, + 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, + 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, + 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, + 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, + 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, + 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, + 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, + 0x3A, 0x30, 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, + 0x31, 0x61, 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, + 0x2D, 0x39, 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, + 0x34, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, + 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, + 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, + 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, + 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, + 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, + 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, + 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, + 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, + 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, + 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, + 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, + 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, + 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, + 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, + 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, + 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, + 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, + 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, + 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, + 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, + 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, + 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, + 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, + 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, + 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, + 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, + 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, + 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, + 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, + 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, + 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, + 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, + 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, + 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, + 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, + 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, + 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x52, 0x1E, 0x40, 0x1C, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, + 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, + 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, + 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0F, 0xB6, 0x49, 0x44, + 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x94, 0x1C, 0x55, 0x15, 0xC6, + 0x7F, 0x3D, 0x7B, 0xB6, 0x21, 0x99, 0x6C, 0x10, 0x82, 0xC3, 0x12, 0x96, + 0x84, 0x18, 0x59, 0x13, 0x20, 0x91, 0x7D, 0x09, 0x04, 0x10, 0x34, 0x78, + 0x3C, 0x08, 0x02, 0xC1, 0x13, 0x8E, 0xE2, 0x71, 0x41, 0x51, 0x96, 0x28, + 0x22, 0xCA, 0x2E, 0x02, 0x46, 0x59, 0xC4, 0x05, 0x3D, 0x0A, 0x82, 0xEC, + 0x08, 0x42, 0x02, 0xB2, 0xC8, 0x2E, 0xA0, 0x01, 0x02, 0x21, 0x81, 0x24, + 0x98, 0x90, 0x90, 0x6D, 0x92, 0xC9, 0x4C, 0x66, 0xA6, 0x33, 0x33, 0xD7, + 0x3F, 0xEE, 0xED, 0x33, 0xCD, 0xD0, 0x5D, 0xFD, 0xAA, 0xA7, 0xAA, 0xBA, + 0x66, 0xA6, 0xEE, 0x39, 0x75, 0xD2, 0x67, 0x52, 0x5D, 0xFD, 0xDE, 0xFB, + 0xEA, 0xDD, 0x77, 0xEF, 0x7D, 0xDF, 0xBD, 0x2F, 0x25, 0x22, 0x24, 0xD2, + 0x77, 0xA5, 0x2C, 0x19, 0x82, 0x04, 0xE0, 0x44, 0x12, 0x80, 0x13, 0x89, + 0xAB, 0x54, 0xF4, 0x93, 0x7E, 0x6E, 0x03, 0x0C, 0x06, 0x52, 0x40, 0x03, + 0xD0, 0x9C, 0x00, 0xDC, 0x37, 0x64, 0x30, 0x30, 0x1D, 0x38, 0x1A, 0xA8, + 0x05, 0x04, 0xD8, 0x08, 0x3C, 0x08, 0x3C, 0xD3, 0x1F, 0x80, 0x4E, 0xF5, + 0x61, 0x2B, 0xBA, 0x12, 0xF8, 0x16, 0x70, 0x26, 0x50, 0x0F, 0x94, 0xDB, + 0xDF, 0xDB, 0x81, 0x45, 0xC0, 0x6D, 0x76, 0x75, 0x24, 0x00, 0xF7, 0x4E, + 0xDB, 0xE2, 0x18, 0x60, 0x2E, 0xB0, 0x93, 0xA9, 0xE6, 0x6C, 0xE9, 0x04, + 0xDE, 0x04, 0xCE, 0x05, 0x9E, 0xB3, 0x99, 0x9D, 0x18, 0x59, 0xBD, 0x48, + 0xAA, 0x80, 0x19, 0x79, 0xC0, 0xCD, 0xF4, 0x7B, 0x82, 0xA9, 0xEF, 0x3E, + 0xBD, 0x4C, 0xF5, 0x55, 0x80, 0x2B, 0x81, 0x1D, 0xF3, 0x80, 0x9B, 0x6D, + 0x7F, 0x8C, 0x49, 0x00, 0xEE, 0xBD, 0xFD, 0x72, 0x01, 0xAE, 0x3C, 0xF1, + 0x83, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x91, 0x04, 0xE0, 0x44, + 0x12, 0x80, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x01, 0xB8, 0x8F, + 0x48, 0x2A, 0x81, 0x37, 0xBC, 0x28, 0xCE, 0xA7, 0xD0, 0x30, 0x21, 0xC0, + 0x1B, 0xC0, 0x86, 0x64, 0xA8, 0x3F, 0x26, 0x93, 0x80, 0xA1, 0xF6, 0x79, + 0x31, 0xB0, 0xAA, 0xB7, 0x00, 0x3C, 0x08, 0xDD, 0xBD, 0x39, 0x06, 0xD8, + 0xD6, 0xFE, 0xB6, 0x04, 0x78, 0x1A, 0x78, 0x18, 0x58, 0x19, 0xD1, 0x00, + 0x0A, 0xBA, 0x6B, 0x54, 0x48, 0xCA, 0x89, 0x76, 0xA3, 0xA1, 0x1E, 0x98, + 0x89, 0x6E, 0x5F, 0x0E, 0xB3, 0xBF, 0x7D, 0x60, 0x63, 0x73, 0x27, 0xD0, + 0x1A, 0x67, 0x80, 0x6B, 0x81, 0x0B, 0x81, 0xD3, 0x81, 0x91, 0x59, 0xCF, + 0x9E, 0x08, 0x4C, 0xB5, 0xCE, 0xDD, 0x6C, 0x1D, 0x0A, 0x5B, 0xD2, 0xC0, + 0x6A, 0x87, 0xFB, 0x3E, 0x8C, 0x10, 0xE0, 0x5D, 0xD1, 0xED, 0xCB, 0x93, + 0x81, 0x11, 0x59, 0xE3, 0x33, 0x09, 0xD8, 0x1B, 0xD8, 0x0E, 0xB8, 0x0E, + 0x68, 0x0B, 0xF6, 0x55, 0x17, 0x09, 0xE2, 0xAA, 0x12, 0x91, 0xD9, 0x22, + 0xB2, 0x46, 0x72, 0x4B, 0xA7, 0x88, 0xAC, 0x12, 0x91, 0xAB, 0x45, 0xA4, + 0x3E, 0xA0, 0xDF, 0xF4, 0xBA, 0xCA, 0x45, 0x64, 0xBA, 0xFD, 0x66, 0x3E, + 0x59, 0x24, 0x22, 0x53, 0x45, 0xA4, 0x2C, 0x82, 0xF6, 0xEC, 0x26, 0x22, + 0xB7, 0x88, 0xC8, 0x3A, 0x8F, 0xF1, 0x59, 0x6A, 0xED, 0x09, 0xF4, 0xB7, + 0x83, 0x32, 0xB2, 0x06, 0x02, 0x87, 0xD8, 0xCC, 0xCD, 0x67, 0xF0, 0x8C, + 0xB6, 0xD9, 0x7D, 0x2E, 0xB0, 0x43, 0xC8, 0xB3, 0xA5, 0x03, 0x78, 0x01, + 0xB8, 0x01, 0x58, 0x9E, 0xE3, 0xFF, 0x17, 0x01, 0xBF, 0x32, 0xFB, 0xA0, + 0x33, 0xE4, 0xB6, 0xEC, 0x02, 0x7C, 0xD7, 0x54, 0xF3, 0x70, 0x8F, 0xF1, + 0xA9, 0xB7, 0xD9, 0x3D, 0x20, 0x8E, 0x2A, 0xBA, 0x3C, 0x6B, 0x4D, 0xA1, + 0x00, 0xC8, 0x67, 0xDA, 0xE7, 0x1B, 0x80, 0x15, 0x21, 0x0E, 0x6C, 0x23, + 0xF0, 0x5B, 0x60, 0x21, 0x70, 0x7C, 0xD6, 0xE0, 0x7E, 0x68, 0x6B, 0xDE, + 0xAB, 0xC0, 0xE6, 0x90, 0xC1, 0xDD, 0x19, 0xF8, 0x01, 0xF0, 0x05, 0xA0, + 0xCE, 0x61, 0x7C, 0x76, 0x01, 0x6A, 0x80, 0x96, 0xB8, 0x01, 0xDC, 0xE9, + 0x38, 0x13, 0x52, 0x36, 0xCB, 0xBF, 0x62, 0x9F, 0xAF, 0x0F, 0x11, 0x64, + 0x01, 0xD6, 0x02, 0xF3, 0x80, 0xFF, 0x02, 0xD5, 0xF6, 0xF7, 0x16, 0xE0, + 0x23, 0x5B, 0xA7, 0xC3, 0x06, 0xF7, 0x42, 0x03, 0x77, 0x98, 0xE3, 0x77, + 0x36, 0x38, 0x1A, 0x87, 0x91, 0x03, 0xBC, 0x05, 0x78, 0x05, 0x65, 0x51, + 0xB8, 0xC8, 0xA8, 0x2C, 0x90, 0xAF, 0x0B, 0xD9, 0xBA, 0x6E, 0xC9, 0x61, + 0xD8, 0x49, 0x44, 0xE0, 0xCE, 0xCC, 0x72, 0x87, 0x5C, 0xE4, 0x31, 0x1B, + 0xCB, 0xD8, 0x05, 0x3A, 0xDA, 0x80, 0xBF, 0x02, 0x2F, 0xFA, 0xF8, 0x4E, + 0x66, 0x26, 0x9F, 0x1F, 0xC1, 0x9A, 0x2C, 0xDD, 0xAE, 0xB0, 0xD7, 0xDC, + 0x39, 0xC0, 0x29, 0x3E, 0xC1, 0x7D, 0xC8, 0xEC, 0x86, 0x8E, 0x38, 0x02, + 0x9C, 0xF1, 0x77, 0x7F, 0x02, 0xBC, 0xEE, 0xE3, 0x3B, 0x23, 0x80, 0x2F, + 0x03, 0xDF, 0xF6, 0x30, 0xD0, 0x7A, 0x93, 0x8C, 0x06, 0x2E, 0x02, 0x3E, + 0x8F, 0x72, 0xB1, 0x5D, 0x65, 0x3E, 0x70, 0xB5, 0xA3, 0x6B, 0x57, 0x32, + 0x80, 0xDB, 0x81, 0xA7, 0xEC, 0xED, 0x7D, 0xCD, 0x27, 0xC8, 0xA7, 0x03, + 0x27, 0xA1, 0x64, 0xB9, 0xDE, 0x2A, 0xD5, 0xC0, 0x19, 0x45, 0x80, 0x3B, + 0x0F, 0xB8, 0xCC, 0x96, 0xB8, 0xAD, 0x71, 0x8F, 0x64, 0xB5, 0x00, 0x4F, + 0x9A, 0x9A, 0xF9, 0x29, 0xB0, 0x9F, 0x0F, 0x75, 0x7D, 0x22, 0xF0, 0x68, + 0xC0, 0x46, 0xD7, 0x00, 0xB3, 0x4A, 0xB7, 0xCD, 0x8A, 0xAC, 0xAD, 0xB6, + 0xD0, 0xE0, 0x96, 0x80, 0x0D, 0xAD, 0xED, 0x81, 0x13, 0x8A, 0x58, 0x73, + 0x33, 0xE0, 0x86, 0x62, 0xF4, 0x85, 0x11, 0x8B, 0x6E, 0x45, 0x43, 0x93, + 0x73, 0x80, 0x9F, 0x01, 0xFB, 0xFA, 0x50, 0x6F, 0x83, 0x7A, 0xF0, 0xBB, + 0xDB, 0x00, 0x7B, 0x02, 0x7B, 0xD9, 0x20, 0x6F, 0x6B, 0xCF, 0xAC, 0xB2, + 0xFF, 0xAB, 0xCD, 0x72, 0x9F, 0x36, 0xA1, 0x59, 0x0D, 0x6B, 0xCD, 0x6D, + 0x6A, 0x34, 0xAD, 0xB3, 0x90, 0xE2, 0xB3, 0x1D, 0x86, 0xD9, 0xEF, 0xB9, + 0xCA, 0xE3, 0x36, 0x09, 0x42, 0x03, 0x37, 0x2C, 0x80, 0xB3, 0x41, 0xBE, + 0xD8, 0xDE, 0xD0, 0xFD, 0x43, 0x6A, 0x4B, 0x2D, 0x30, 0x05, 0x38, 0x0A, + 0xDD, 0xDC, 0xA8, 0x37, 0x60, 0xAB, 0xED, 0xAA, 0xB2, 0x65, 0xA8, 0x2C, + 0x6B, 0x39, 0xEA, 0xCC, 0xBA, 0xDA, 0xAC, 0xAD, 0x6D, 0x36, 0xAB, 0x97, + 0x01, 0x0B, 0x6C, 0xF0, 0x17, 0x01, 0x4D, 0x3E, 0x0D, 0x39, 0xD7, 0x1D, + 0xAC, 0x47, 0x81, 0xCB, 0x81, 0x97, 0xC3, 0x76, 0xD7, 0xC2, 0xCE, 0x6C, + 0xA8, 0x01, 0xA6, 0x01, 0x97, 0xD8, 0xBF, 0x5E, 0x72, 0x37, 0x1A, 0xE5, + 0x5A, 0xEB, 0xF0, 0xDC, 0x09, 0xC0, 0x64, 0xE0, 0x38, 0xFB, 0x3C, 0xC6, + 0xD4, 0x71, 0xA5, 0x01, 0xE9, 0x77, 0xAB, 0x50, 0x0C, 0xF0, 0xB4, 0x05, + 0x3F, 0x56, 0x00, 0x6F, 0x03, 0xF7, 0x03, 0xFF, 0x04, 0xD6, 0x3B, 0x3C, + 0x63, 0x2C, 0xF0, 0x47, 0xE0, 0xB0, 0x02, 0xF7, 0xDD, 0x6F, 0x06, 0xD5, + 0xAB, 0x11, 0xF8, 0xE2, 0x10, 0x41, 0x1C, 0xB6, 0x5A, 0x44, 0x0E, 0x17, + 0x91, 0xE7, 0x3C, 0xE2, 0xC2, 0x2B, 0x44, 0xE4, 0x04, 0x8B, 0x21, 0x7B, + 0x3D, 0xAB, 0x4E, 0x44, 0x4E, 0x15, 0x91, 0x47, 0x45, 0x64, 0xB9, 0x88, + 0x34, 0x5B, 0x1C, 0x37, 0x68, 0x69, 0x17, 0x91, 0x26, 0x11, 0x79, 0x4F, + 0x44, 0xEE, 0x11, 0x91, 0x13, 0x45, 0xA4, 0xB6, 0x40, 0xDB, 0x2A, 0x45, + 0xE4, 0x0C, 0x11, 0xD9, 0xE0, 0xF1, 0xDC, 0x07, 0x44, 0x64, 0x8A, 0xC5, + 0xEE, 0xA3, 0x18, 0xFB, 0x48, 0x00, 0xCE, 0x80, 0x7C, 0xA4, 0x0D, 0x56, + 0x73, 0xB7, 0x81, 0x7C, 0x43, 0x44, 0xCE, 0x15, 0x91, 0x11, 0x1E, 0xDF, + 0x1F, 0x28, 0x22, 0x07, 0x8B, 0xC8, 0x1D, 0x16, 0x94, 0x6F, 0x09, 0x09, + 0xD8, 0x5C, 0x9B, 0x00, 0x2D, 0x22, 0xB2, 0xD8, 0x36, 0x0B, 0xF6, 0x2E, + 0xD0, 0xCF, 0x51, 0x22, 0x72, 0x81, 0x88, 0xBC, 0xDF, 0xED, 0x39, 0x8D, + 0x22, 0xF2, 0x7B, 0x11, 0x99, 0x16, 0x25, 0xB8, 0x22, 0x12, 0x69, 0xF2, + 0x59, 0x0D, 0xBA, 0x25, 0x36, 0xDD, 0x54, 0x6A, 0x95, 0xA9, 0xBE, 0x97, + 0x2C, 0x94, 0xD8, 0x98, 0x27, 0xDC, 0x39, 0x1A, 0x98, 0x05, 0x9C, 0x86, + 0xA6, 0xA3, 0x0C, 0x20, 0x7A, 0xB6, 0x86, 0xD8, 0x7A, 0xFC, 0x0E, 0xF0, + 0x6B, 0xE0, 0x01, 0x34, 0xCF, 0x38, 0x57, 0x28, 0xB6, 0xCE, 0x0C, 0xCB, + 0xC9, 0x66, 0x23, 0xB4, 0x00, 0x4B, 0xCD, 0xD7, 0x5D, 0x13, 0x89, 0x5A, + 0x8E, 0x70, 0x0D, 0xCE, 0x35, 0x00, 0x43, 0xCC, 0x00, 0x4A, 0x99, 0xDF, + 0xD7, 0xEC, 0xD1, 0xE9, 0x4F, 0x99, 0x35, 0xFE, 0x39, 0x73, 0xA5, 0x4A, + 0x4D, 0xC3, 0xE9, 0x30, 0x63, 0xEC, 0x2F, 0x16, 0x62, 0xFD, 0x28, 0xCF, + 0x7D, 0x55, 0xD6, 0xCF, 0x72, 0x7B, 0x69, 0x5B, 0xAD, 0x9F, 0x91, 0x67, + 0x31, 0xC6, 0x35, 0x7D, 0x34, 0x05, 0x7C, 0xC6, 0xC0, 0x3D, 0xD2, 0x67, + 0xE0, 0x20, 0x8A, 0xD9, 0xDC, 0x60, 0xB3, 0xF8, 0x12, 0xE0, 0x7F, 0x71, + 0x8E, 0xBE, 0xC4, 0x15, 0xE0, 0xC3, 0xCD, 0xC5, 0x3A, 0x90, 0x80, 0xF7, + 0x47, 0x03, 0x94, 0xCD, 0xC0, 0xDF, 0x81, 0xEF, 0xC7, 0x19, 0xE4, 0x38, + 0x02, 0x3C, 0x05, 0xB8, 0x02, 0xA5, 0xF9, 0x14, 0x1B, 0xBA, 0x6C, 0x44, + 0x37, 0xF3, 0xD7, 0x98, 0x8F, 0xBB, 0xD2, 0xAE, 0x32, 0x8B, 0x38, 0x8D, + 0x31, 0x9B, 0x60, 0x14, 0xB0, 0x0F, 0x5D, 0x5B, 0x89, 0x7E, 0x65, 0x8B, + 0xCD, 0xE4, 0xF3, 0xC2, 0x88, 0x23, 0xC7, 0x39, 0xD0, 0x51, 0xAC, 0x8C, + 0x02, 0xBE, 0x07, 0x1C, 0x54, 0x04, 0xB8, 0x9D, 0x16, 0x38, 0xF8, 0x17, + 0xBA, 0xF1, 0xF1, 0x1A, 0x5D, 0xFB, 0xAB, 0x2D, 0x74, 0x71, 0x9D, 0xAA, + 0xB3, 0x7C, 0xE6, 0xE1, 0x16, 0x84, 0xD9, 0x15, 0x38, 0x14, 0xE5, 0x47, + 0xF9, 0x91, 0x81, 0x16, 0x9E, 0xDC, 0x00, 0x5C, 0xE0, 0x33, 0x30, 0xD2, + 0xEF, 0x66, 0xF0, 0x60, 0xE0, 0xC7, 0xC0, 0x39, 0xF6, 0xD9, 0x8F, 0xE1, + 0xF3, 0x92, 0x05, 0x4A, 0x5E, 0x04, 0xDE, 0x33, 0xA3, 0xAD, 0x29, 0xCB, + 0x2A, 0x97, 0x1C, 0x6B, 0x3C, 0x66, 0x04, 0x0D, 0xB2, 0xD9, 0xBC, 0x87, + 0xBD, 0x58, 0x33, 0x6D, 0x56, 0xFB, 0x91, 0x8D, 0x16, 0x76, 0xFC, 0x79, + 0x02, 0x70, 0x7E, 0x99, 0x6D, 0xAA, 0xB9, 0xCE, 0xC7, 0x77, 0x96, 0xA1, + 0x4C, 0xCD, 0x79, 0x06, 0x6C, 0x33, 0xC5, 0x33, 0x22, 0xAA, 0x6C, 0x66, + 0xEF, 0x81, 0x12, 0x17, 0xCE, 0x31, 0x8D, 0xE2, 0x2A, 0xCB, 0x81, 0xAF, + 0x03, 0x8F, 0xC4, 0x0A, 0xE1, 0x28, 0x9D, 0x6E, 0x8F, 0x6B, 0x3F, 0x11, + 0x79, 0xC5, 0x67, 0x10, 0xE2, 0x31, 0x11, 0x99, 0x21, 0x22, 0x43, 0x1D, + 0x22, 0x60, 0x7E, 0xAE, 0x0A, 0x0B, 0xBA, 0x9C, 0x2E, 0x22, 0xAF, 0xFA, + 0x68, 0x4F, 0x87, 0xB5, 0x69, 0xE7, 0x98, 0x8C, 0x69, 0xA0, 0xAC, 0xCA, + 0x9E, 0x48, 0x1D, 0xF0, 0x55, 0x73, 0x8B, 0x5C, 0xE5, 0xCF, 0x28, 0xC7, + 0xF8, 0x09, 0x53, 0x8F, 0x41, 0xB2, 0x20, 0xDA, 0x81, 0x75, 0xC0, 0x7D, + 0xC0, 0x0F, 0xED, 0x37, 0x5C, 0xA4, 0xCC, 0xE2, 0xED, 0x27, 0x13, 0xA3, + 0xB4, 0x99, 0x38, 0x00, 0x7C, 0x98, 0xA9, 0xC4, 0x4A, 0xC7, 0xFB, 0x7F, + 0x63, 0x06, 0xCD, 0xBB, 0x84, 0x90, 0x09, 0x90, 0x25, 0x4D, 0xE8, 0x46, + 0xC3, 0x37, 0xD1, 0x0D, 0x02, 0x57, 0xA3, 0x6B, 0x16, 0x4A, 0x64, 0x4F, + 0x00, 0x36, 0x77, 0xE5, 0x44, 0x34, 0x84, 0xE9, 0x22, 0x77, 0x02, 0x97, + 0x9A, 0xCB, 0xD3, 0x19, 0x41, 0xFB, 0x5A, 0xD0, 0xF0, 0xE4, 0xB5, 0xC0, + 0xB3, 0x8E, 0xDF, 0xD9, 0x0D, 0x65, 0x52, 0x56, 0x25, 0x00, 0x6B, 0x20, + 0xE3, 0x68, 0xDC, 0xAA, 0xDD, 0xBC, 0x82, 0x6E, 0xB3, 0x45, 0x99, 0x6E, + 0x92, 0x71, 0xBF, 0xFE, 0x0D, 0x5C, 0x69, 0x86, 0x9C, 0x8B, 0xEB, 0x79, + 0x02, 0x9A, 0xB2, 0xD3, 0xAF, 0x01, 0x1E, 0x08, 0x1C, 0xE0, 0x68, 0xA9, + 0xAE, 0x32, 0x0B, 0x7B, 0x21, 0xA5, 0xA9, 0x4A, 0xD7, 0x86, 0x52, 0x91, + 0xAE, 0xC2, 0x8D, 0x2C, 0xBF, 0x87, 0x45, 0xE3, 0xCA, 0xFB, 0x33, 0xC0, + 0xE3, 0xD0, 0x0D, 0xFB, 0x42, 0x6D, 0x68, 0xB7, 0x35, 0xF0, 0x31, 0x82, + 0x4E, 0xCC, 0xF2, 0x27, 0xAD, 0xB6, 0x44, 0xCC, 0x77, 0xB8, 0xB7, 0xD2, + 0x6C, 0x8B, 0xD1, 0xFD, 0x19, 0xE0, 0x09, 0xB6, 0x5E, 0xB9, 0xF8, 0x97, + 0x7F, 0x20, 0x60, 0x42, 0x78, 0x91, 0xB2, 0x19, 0xB8, 0x05, 0xB7, 0x7C, + 0xE7, 0x43, 0x2D, 0x42, 0xD6, 0x2F, 0x01, 0xAE, 0x03, 0x8E, 0xC0, 0x2D, + 0x54, 0xFA, 0x28, 0xFE, 0xB8, 0xD6, 0x61, 0xCB, 0x53, 0x68, 0x29, 0x62, + 0x97, 0x25, 0x68, 0x9F, 0x52, 0x1B, 0x5B, 0xA5, 0x02, 0xB8, 0x16, 0xB7, + 0x70, 0x60, 0x0B, 0x70, 0x2F, 0x01, 0xE7, 0xEB, 0x04, 0xB0, 0x1E, 0xDF, + 0xE1, 0xE8, 0x7B, 0x1F, 0x89, 0xBF, 0xC8, 0x5C, 0x9F, 0x01, 0x78, 0x88, + 0x63, 0xC7, 0x5F, 0x44, 0xC9, 0x69, 0x71, 0xDB, 0xF2, 0x7A, 0x0D, 0xB7, + 0x44, 0xF6, 0x1D, 0xE9, 0x19, 0x15, 0xB8, 0xC7, 0x92, 0x4F, 0x45, 0x0E, + 0x46, 0xB7, 0xEB, 0x46, 0xE3, 0x56, 0xE6, 0x20, 0x65, 0xEE, 0x44, 0x33, + 0x4A, 0xBF, 0x59, 0x5C, 0xE0, 0xFE, 0x51, 0x74, 0x11, 0xD1, 0xBD, 0x64, + 0x3E, 0xBA, 0xF5, 0x17, 0x37, 0xF9, 0xD0, 0x82, 0x20, 0x3B, 0x39, 0xBC, + 0xC8, 0x43, 0x1D, 0xED, 0x91, 0x89, 0xB8, 0xD1, 0x91, 0x52, 0x74, 0xB1, + 0x40, 0x57, 0xA0, 0xF9, 0x4C, 0x2D, 0x7E, 0x00, 0x1E, 0x0F, 0x7C, 0xCD, + 0xFC, 0xD3, 0x81, 0x3E, 0x67, 0x79, 0x1A, 0xA5, 0x9B, 0x5E, 0xE5, 0xB1, + 0x4E, 0x55, 0xA0, 0x04, 0xF5, 0x1A, 0x87, 0xE7, 0x2D, 0x23, 0x9E, 0xB2, + 0x05, 0xDD, 0x9A, 0x9C, 0x55, 0xE0, 0xBE, 0x11, 0x78, 0xA7, 0x8E, 0xD6, + 0xA2, 0x74, 0xA4, 0x59, 0x36, 0xDB, 0x2B, 0x7D, 0xB4, 0xA1, 0x13, 0xE5, + 0xB4, 0x3D, 0x62, 0x46, 0xE8, 0x62, 0x17, 0x80, 0xEB, 0xD0, 0x6C, 0xBF, + 0x99, 0xA6, 0x5A, 0x8A, 0xE1, 0x17, 0x8F, 0x41, 0xF9, 0x53, 0xDF, 0xB0, + 0x41, 0xC8, 0xF5, 0x9B, 0xE3, 0x1D, 0x9E, 0xD5, 0x88, 0x46, 0x91, 0xE2, + 0x2A, 0x9B, 0x1C, 0xEE, 0x19, 0x60, 0xDA, 0x2A, 0x95, 0x43, 0x0B, 0x96, + 0xA3, 0xC5, 0x6A, 0x2E, 0x41, 0xB9, 0x67, 0xE5, 0x45, 0x8C, 0xF7, 0x18, + 0x94, 0xEC, 0x5F, 0x85, 0x6E, 0x57, 0x6E, 0x2A, 0xB4, 0x06, 0xCF, 0x30, + 0x70, 0x87, 0xD0, 0x45, 0x20, 0xF7, 0x73, 0x95, 0xA1, 0x1B, 0xEA, 0x7B, + 0xA3, 0x89, 0x58, 0x43, 0xF2, 0x34, 0xCC, 0x85, 0x41, 0xB1, 0x94, 0xDC, + 0xE5, 0x17, 0xE2, 0x22, 0x6B, 0x71, 0x4B, 0x73, 0xC9, 0x37, 0x51, 0x76, + 0x04, 0xCE, 0x32, 0x35, 0x5F, 0x59, 0xE4, 0x78, 0x67, 0x2A, 0x2B, 0x9C, + 0x46, 0x1E, 0xC2, 0x7D, 0x77, 0x80, 0x27, 0x7B, 0x80, 0xE2, 0x77, 0x6D, + 0x3F, 0xCC, 0x82, 0x19, 0xB9, 0xD6, 0x10, 0x17, 0xF7, 0x68, 0x23, 0xD1, + 0xC4, 0x9B, 0x8B, 0x95, 0x77, 0x71, 0xCB, 0x78, 0xC8, 0xB7, 0xAE, 0x8E, + 0x45, 0xF3, 0xA8, 0x82, 0x30, 0x74, 0x47, 0x03, 0x9F, 0x76, 0x01, 0x78, + 0x48, 0x80, 0x03, 0x30, 0xCC, 0xC3, 0x82, 0x74, 0x51, 0x45, 0x5B, 0x63, + 0x0E, 0x70, 0x13, 0x6E, 0x1C, 0xE7, 0x7C, 0x06, 0x6A, 0x15, 0xC1, 0x51, + 0xA6, 0x52, 0xE4, 0x21, 0x27, 0x76, 0x07, 0x38, 0xC8, 0x8A, 0x74, 0xAB, + 0xC8, 0x4D, 0x0E, 0x17, 0x47, 0x1F, 0x32, 0xEE, 0xE5, 0xF6, 0x47, 0x3A, + 0xBA, 0x40, 0xE2, 0xE1, 0x4F, 0x07, 0x49, 0x82, 0x6F, 0x71, 0x01, 0x78, + 0x81, 0xA9, 0xC6, 0x20, 0xE4, 0x31, 0x53, 0x63, 0x7E, 0x3A, 0xDD, 0xDD, + 0x02, 0x8D, 0x73, 0x42, 0xF8, 0xEE, 0xE4, 0x2F, 0x8B, 0xD4, 0x5D, 0x13, + 0xE5, 0xEA, 0xEF, 0x62, 0xE0, 0xF9, 0x80, 0xDA, 0xB2, 0x0C, 0x8D, 0xB0, + 0x15, 0x04, 0xF8, 0x49, 0xB4, 0xF4, 0x50, 0x4F, 0xCB, 0xF8, 0x3C, 0x87, + 0xD6, 0x9C, 0xD8, 0x9A, 0xC7, 0xBC, 0x77, 0x61, 0x1F, 0xEE, 0x82, 0x5B, + 0xAC, 0xBA, 0x54, 0x52, 0xED, 0xF0, 0x02, 0x8A, 0x79, 0x03, 0xB9, 0x00, + 0x5E, 0x03, 0xDC, 0x6A, 0x71, 0x83, 0x9E, 0xC8, 0x06, 0x94, 0x04, 0xF1, + 0xB2, 0x8B, 0x9B, 0xB4, 0x12, 0x2D, 0x10, 0xD6, 0x66, 0x7E, 0xF0, 0x10, + 0xC7, 0x59, 0x24, 0x59, 0xC0, 0xBD, 0x02, 0xFC, 0x0E, 0x3D, 0x78, 0x2A, + 0x97, 0x7B, 0xB0, 0x15, 0xF8, 0x8F, 0xC3, 0x33, 0x07, 0x9A, 0xFB, 0xF0, + 0x7C, 0x0C, 0x23, 0x59, 0x65, 0xB8, 0xD5, 0x14, 0x69, 0x36, 0x43, 0x2C, + 0x57, 0xFB, 0x33, 0xC5, 0xDA, 0xBE, 0x63, 0x7E, 0xF0, 0x5E, 0x16, 0x1B, + 0x70, 0x5D, 0x9A, 0xDA, 0x50, 0x2E, 0xF6, 0x9D, 0x28, 0x37, 0x3B, 0xED, + 0x02, 0x70, 0x87, 0xB9, 0x26, 0xD7, 0xA2, 0x34, 0xD4, 0xC1, 0x8E, 0xCE, + 0x77, 0xCA, 0xBE, 0xDB, 0x6C, 0xEE, 0xCD, 0x46, 0x8F, 0x75, 0x56, 0x4C, + 0x3D, 0x35, 0x51, 0x98, 0x1E, 0xBB, 0xBB, 0x0D, 0x66, 0xDC, 0x8E, 0x9F, + 0xDB, 0x06, 0xAD, 0xEC, 0xE7, 0xE2, 0x09, 0xAC, 0x2D, 0xF0, 0x02, 0x3C, + 0x63, 0xC1, 0xA1, 0x7A, 0xFC, 0x25, 0xD6, 0xA5, 0xED, 0xD9, 0xCB, 0xBC, + 0xD6, 0xF2, 0x8A, 0x3C, 0x2A, 0xB4, 0x81, 0xE2, 0x43, 0x84, 0x2E, 0x60, + 0x34, 0x98, 0x6A, 0x29, 0x04, 0xF0, 0x74, 0xE0, 0x97, 0x76, 0x6F, 0x9C, + 0x66, 0xF1, 0x48, 0x0A, 0x27, 0xB4, 0x67, 0x82, 0x21, 0x8D, 0x0E, 0xE3, + 0xB5, 0x1A, 0xB7, 0xC4, 0x77, 0xDF, 0xE3, 0x5D, 0x56, 0xE0, 0x8B, 0xC5, + 0x5C, 0x2E, 0xD2, 0xE8, 0xD8, 0xA1, 0x3D, 0xD1, 0x54, 0x96, 0xB8, 0xA9, + 0xE8, 0xA9, 0xB8, 0x31, 0x51, 0xDE, 0x72, 0x8C, 0x78, 0x85, 0x36, 0xDE, + 0xA5, 0xDA, 0x4D, 0x5A, 0x8F, 0x06, 0xEB, 0x5D, 0xA2, 0x40, 0xA7, 0x50, + 0xE2, 0x1D, 0x99, 0x6E, 0x52, 0x0B, 0x7C, 0xC9, 0x71, 0xE9, 0x9A, 0x4F, + 0x89, 0x8B, 0xA1, 0x97, 0x0A, 0xE0, 0x26, 0x33, 0x30, 0x5C, 0x76, 0xA9, + 0x0E, 0x45, 0xC9, 0x79, 0x71, 0x91, 0x63, 0xD1, 0x88, 0x9F, 0x8B, 0x96, + 0x5A, 0x5A, 0xEA, 0x60, 0x4D, 0x29, 0x29, 0x3B, 0x0B, 0x51, 0xB6, 0x62, + 0x21, 0x19, 0x0B, 0x9C, 0x6A, 0x56, 0x75, 0xA9, 0x65, 0x04, 0x1A, 0x63, + 0x1F, 0xEA, 0x70, 0xEF, 0xB3, 0xC4, 0x60, 0x37, 0xAC, 0x94, 0x00, 0xBF, + 0x6F, 0xC1, 0x90, 0x42, 0x52, 0x81, 0x72, 0xA7, 0xCF, 0xC2, 0xDF, 0x76, + 0x5A, 0xD0, 0x52, 0x85, 0x56, 0x01, 0x3A, 0xD8, 0xF1, 0xFE, 0x7F, 0x58, + 0x1F, 0xFB, 0x2D, 0xC0, 0x69, 0xBA, 0x52, 0x3D, 0x0B, 0xC9, 0x70, 0x34, + 0xB1, 0xAB, 0x94, 0xAA, 0xFA, 0x38, 0x7B, 0xC9, 0x5C, 0xEC, 0x81, 0x97, + 0x6C, 0xFD, 0xED, 0xEC, 0xCF, 0x00, 0x63, 0xD1, 0x97, 0x27, 0x1C, 0xAD, + 0xE4, 0xF1, 0x68, 0xA1, 0xCF, 0x09, 0x25, 0x68, 0xE7, 0x01, 0x68, 0x39, + 0x89, 0x7A, 0xC7, 0xFB, 0x9F, 0x26, 0x9A, 0xB3, 0x29, 0x62, 0x0F, 0x70, + 0x03, 0x70, 0x8F, 0xE3, 0x60, 0xA4, 0x50, 0x12, 0xDB, 0x15, 0x44, 0x97, + 0x35, 0x90, 0x32, 0x37, 0xED, 0x7A, 0xDC, 0x4B, 0x32, 0xBE, 0x00, 0xDC, + 0x45, 0x3C, 0x68, 0xBE, 0xB1, 0x48, 0x3E, 0x7B, 0x0E, 0xF8, 0x1B, 0xEE, + 0xC7, 0xE0, 0xCC, 0x40, 0x13, 0xAD, 0xA7, 0x52, 0x7C, 0xE9, 0x05, 0x17, + 0xA9, 0xB6, 0x40, 0xCB, 0x5C, 0x03, 0xD9, 0x45, 0x5A, 0x81, 0x3F, 0xA1, + 0x44, 0xC1, 0x58, 0x48, 0x5C, 0x12, 0xC0, 0x77, 0x45, 0x03, 0xE6, 0x87, + 0x38, 0xDE, 0xDF, 0x81, 0x86, 0xF7, 0x6E, 0x45, 0x29, 0xAC, 0xEB, 0x02, + 0x6E, 0xCF, 0x76, 0x68, 0xB1, 0xF2, 0xD9, 0x68, 0xF5, 0x76, 0x57, 0xB9, + 0x0F, 0x4D, 0x1C, 0x5F, 0x9B, 0x00, 0xFC, 0x49, 0x39, 0x19, 0x0D, 0x4B, + 0x6E, 0xEF, 0xE3, 0x3B, 0x1B, 0xD1, 0x60, 0xFB, 0xFD, 0xB6, 0x9E, 0x37, + 0x04, 0xE0, 0x06, 0x4D, 0x45, 0xB3, 0x03, 0x67, 0xE2, 0xAF, 0xC2, 0xCF, + 0x22, 0x94, 0x87, 0x36, 0x9F, 0x18, 0x49, 0x9C, 0x00, 0xAE, 0x46, 0x09, + 0x7F, 0x17, 0xE1, 0xBF, 0x74, 0xD2, 0x5B, 0x68, 0x64, 0xEC, 0x61, 0xFB, + 0xBC, 0x12, 0xF7, 0xF0, 0x66, 0x39, 0xBA, 0x6B, 0x35, 0xC9, 0xD4, 0xFF, + 0x11, 0x3E, 0x67, 0x6D, 0xE6, 0x45, 0x3B, 0xCF, 0xD4, 0x73, 0x7B, 0x02, + 0x70, 0x7E, 0x19, 0x83, 0xB2, 0x03, 0x4F, 0x2B, 0xC2, 0xE7, 0x15, 0x94, + 0x60, 0xF0, 0x8E, 0x59, 0xE6, 0xEF, 0xA2, 0x61, 0xC2, 0x15, 0xE8, 0xFE, + 0x76, 0x47, 0x96, 0xDD, 0xB1, 0x3D, 0xBA, 0x23, 0x34, 0xD4, 0x0C, 0xB6, + 0x23, 0xD1, 0xBD, 0xE7, 0x1D, 0x8B, 0x68, 0x73, 0x0B, 0x9A, 0x5A, 0x7A, + 0x15, 0xA5, 0x4D, 0x8E, 0xEB, 0x15, 0x00, 0x63, 0x6E, 0xD0, 0x1C, 0x34, + 0xDE, 0x5B, 0x6C, 0x29, 0x84, 0xCC, 0x2E, 0x4E, 0x93, 0x01, 0x9D, 0x39, + 0x46, 0x27, 0x65, 0x9A, 0x62, 0x77, 0x5B, 0x67, 0xAB, 0x51, 0xEE, 0xD8, + 0xE0, 0x1E, 0xB4, 0xF7, 0x66, 0xB4, 0x18, 0xDA, 0x66, 0x62, 0x28, 0x71, + 0xAD, 0x74, 0x37, 0xC9, 0x54, 0xF5, 0xC9, 0x04, 0x43, 0xDB, 0xC9, 0x14, + 0x00, 0xCF, 0x50, 0x7B, 0x83, 0xA8, 0xA1, 0x91, 0x06, 0x6E, 0x37, 0x8B, + 0x7E, 0x11, 0x31, 0x95, 0x38, 0xD7, 0xAA, 0x9C, 0x48, 0xD7, 0x91, 0x70, + 0x83, 0x62, 0xD6, 0xBE, 0xF5, 0xC0, 0x4D, 0xE8, 0xE9, 0x6D, 0x0D, 0xC4, + 0x8F, 0x90, 0x50, 0x52, 0x80, 0x33, 0x2C, 0x91, 0x32, 0x9B, 0x05, 0x69, + 0x8F, 0xB5, 0x6B, 0x9C, 0xA9, 0xEA, 0xD9, 0x84, 0x7F, 0xB6, 0x92, 0xAB, + 0x7B, 0xB6, 0xC4, 0xD4, 0xF2, 0x4D, 0x1E, 0xED, 0xAE, 0x44, 0x37, 0x47, + 0xAA, 0x50, 0x8A, 0x52, 0x3B, 0x25, 0xAA, 0x82, 0x17, 0x25, 0xC0, 0x83, + 0xD0, 0xD2, 0x06, 0xA7, 0xD2, 0xC5, 0xE6, 0x6F, 0x40, 0xCF, 0x47, 0x98, + 0x67, 0xBE, 0x63, 0xAE, 0xD8, 0x6D, 0x15, 0xBA, 0x27, 0x3C, 0xCB, 0xFC, + 0xE4, 0x52, 0xD1, 0x69, 0x5B, 0xAC, 0x9D, 0xB7, 0x03, 0x0F, 0xE6, 0xB1, + 0x96, 0x53, 0x68, 0x52, 0xDD, 0xF1, 0x28, 0xF1, 0xBF, 0xD6, 0x5E, 0xE0, + 0x85, 0x28, 0x05, 0x6A, 0x09, 0xC5, 0x1F, 0xFA, 0x51, 0x9C, 0x44, 0x58, + 0xF1, 0xFD, 0x14, 0x2B, 0xEB, 0x9F, 0xEE, 0x56, 0x40, 0xEC, 0x03, 0x11, + 0xB9, 0x52, 0x44, 0xB6, 0xF3, 0xF8, 0x7E, 0x99, 0x88, 0x8C, 0x17, 0x91, + 0xEB, 0xAD, 0xE2, 0x7B, 0x5A, 0xA2, 0x93, 0x56, 0x11, 0x59, 0x28, 0x22, + 0x97, 0x89, 0xC8, 0x4E, 0x05, 0x8E, 0xA3, 0x1D, 0x2B, 0x22, 0x73, 0x45, + 0x64, 0x7D, 0xB7, 0x67, 0x6C, 0x16, 0x91, 0xF9, 0x56, 0xB8, 0xAD, 0x3A, + 0xCA, 0x42, 0x68, 0x51, 0x82, 0xFB, 0xBA, 0xC7, 0x20, 0xAE, 0x11, 0x91, + 0xB3, 0x1D, 0xCE, 0xF2, 0x1D, 0x64, 0xE7, 0x27, 0xDC, 0x6A, 0xE7, 0x29, + 0xB4, 0xDA, 0xB1, 0x00, 0x61, 0x9C, 0xD9, 0xD0, 0x2C, 0x22, 0x6F, 0x8B, + 0xC8, 0x8D, 0x22, 0x72, 0x8C, 0x1D, 0x2B, 0x40, 0x81, 0x97, 0xF0, 0xFC, + 0x6E, 0x47, 0x16, 0x74, 0x97, 0x67, 0x44, 0xE4, 0x58, 0x11, 0xA9, 0x89, + 0x0A, 0xE0, 0xB0, 0xAB, 0xCD, 0x0E, 0xB0, 0xA8, 0xD0, 0x45, 0x78, 0x67, + 0x14, 0x8E, 0x34, 0x35, 0xFC, 0x38, 0xDE, 0xB5, 0x97, 0x9B, 0x4D, 0x3D, + 0x3E, 0x85, 0x16, 0x0E, 0x3D, 0xCC, 0xFE, 0xDD, 0xDD, 0x96, 0x80, 0xEA, + 0x22, 0x55, 0x78, 0x86, 0xF6, 0xDB, 0x6A, 0x6B, 0xE5, 0x02, 0x8B, 0x8C, + 0x3D, 0x89, 0xD2, 0x80, 0x5D, 0x5C, 0xA0, 0x9D, 0xAD, 0xAF, 0x5E, 0xC4, + 0x84, 0xCF, 0x5A, 0x1B, 0x2B, 0x89, 0xA8, 0xA8, 0x4C, 0x98, 0x00, 0xD7, + 0x58, 0x87, 0xE7, 0x18, 0x00, 0x85, 0xA4, 0x0E, 0x77, 0xD6, 0x46, 0x23, + 0xBA, 0xA1, 0xFE, 0x84, 0xAD, 0xEB, 0x93, 0x51, 0x82, 0xDE, 0x34, 0x0B, + 0x37, 0xD6, 0xD0, 0x55, 0x45, 0xB6, 0xDC, 0xC3, 0x60, 0xDA, 0x62, 0x57, + 0xE6, 0xC8, 0xD9, 0x67, 0x2D, 0x12, 0xF6, 0x32, 0x5A, 0x13, 0xCB, 0x4F, + 0x54, 0x2A, 0x13, 0x38, 0x29, 0x24, 0x93, 0xD1, 0x12, 0x89, 0x62, 0x20, + 0xA7, 0x7B, 0x23, 0xC0, 0x35, 0xE8, 0x19, 0x7E, 0x17, 0x3B, 0x82, 0x4B, + 0x91, 0xBE, 0xE9, 0x56, 0xB4, 0xF0, 0xF7, 0x1B, 0x66, 0x8C, 0x4D, 0xB0, + 0x41, 0x1E, 0x63, 0xE1, 0xC7, 0xDD, 0xD0, 0xCC, 0xBB, 0x4E, 0xBA, 0x76, + 0xCE, 0x3A, 0xEC, 0xF3, 0x6A, 0xF3, 0x5F, 0x97, 0xD3, 0x75, 0xFA, 0xD9, + 0xC2, 0x1E, 0x86, 0x1A, 0x5D, 0xFB, 0xB0, 0x5F, 0x37, 0x90, 0xB7, 0xF6, + 0x26, 0x80, 0x33, 0x6A, 0xF9, 0x47, 0xB8, 0x97, 0x11, 0x12, 0x94, 0xA0, + 0xD6, 0x13, 0x06, 0x62, 0x9A, 0x4F, 0x66, 0x4C, 0xD4, 0x9A, 0x5B, 0xD6, + 0x91, 0x35, 0x93, 0x33, 0x00, 0x6F, 0x0E, 0xD8, 0x75, 0x59, 0x83, 0x72, + 0xB0, 0x5C, 0xD3, 0x6D, 0xF6, 0x47, 0xEB, 0x63, 0x57, 0xA1, 0x59, 0xFA, + 0xAD, 0xBD, 0x01, 0xE0, 0x01, 0xC0, 0x17, 0x4D, 0x2D, 0x8F, 0xF3, 0xF1, + 0xBD, 0x95, 0xE8, 0x49, 0x26, 0xEB, 0x03, 0x6E, 0x4F, 0x23, 0xD1, 0xD5, + 0xF8, 0x58, 0x81, 0xEE, 0x6C, 0x4D, 0xC1, 0xFD, 0x10, 0x91, 0x7D, 0x6D, + 0xAC, 0x52, 0xE8, 0xF9, 0x0F, 0x81, 0x83, 0x5C, 0x16, 0xF0, 0xCB, 0x32, + 0xB3, 0x08, 0x70, 0x3F, 0x42, 0xF3, 0xA1, 0xE6, 0x11, 0xEF, 0x7C, 0x60, + 0x17, 0x2D, 0x74, 0x2F, 0x70, 0x1B, 0xFE, 0xD8, 0x1C, 0x7B, 0x9B, 0x11, + 0x3A, 0x9D, 0x30, 0x98, 0xA3, 0x01, 0x9A, 0xE4, 0x07, 0x99, 0xBF, 0xE8, + 0xE7, 0x54, 0xB1, 0x95, 0x76, 0x52, 0x58, 0x6D, 0x9C, 0x8A, 0x68, 0xF7, + 0xF0, 0xAA, 0x13, 0x91, 0x6B, 0xEC, 0xB4, 0x33, 0x3F, 0xF2, 0xBC, 0x88, + 0x8C, 0x8B, 0x6B, 0x41, 0xF0, 0xC1, 0xE6, 0xE6, 0x8C, 0xF7, 0xF1, 0xB6, + 0x7F, 0x08, 0xDC, 0x68, 0xB3, 0x37, 0x0A, 0x35, 0x5A, 0x1E, 0x51, 0x14, + 0x6C, 0x03, 0x7A, 0xB2, 0xE8, 0x2D, 0xF8, 0xDB, 0x61, 0x3A, 0x10, 0xDD, + 0x8B, 0x2E, 0x8B, 0xA3, 0x8A, 0xAE, 0xF2, 0x61, 0x2D, 0x67, 0x83, 0x7B, + 0x33, 0xE1, 0x6E, 0xB3, 0x95, 0x9B, 0x45, 0x3F, 0x1A, 0xAD, 0xAC, 0xB7, + 0x17, 0x4A, 0xC1, 0x0D, 0x3B, 0xB1, 0xBC, 0x01, 0xDD, 0x23, 0xBE, 0xD9, + 0xA7, 0x21, 0x37, 0x8D, 0x80, 0x37, 0x56, 0x82, 0xAC, 0x11, 0xE1, 0xE2, + 0x5E, 0x74, 0x1A, 0xB8, 0x37, 0xD8, 0x5A, 0xB5, 0x29, 0xC4, 0x41, 0xAE, + 0xB0, 0x98, 0xF7, 0xA1, 0x68, 0xAE, 0xF3, 0x78, 0x7B, 0xB9, 0x16, 0xA0, + 0xDC, 0xA9, 0xC7, 0x43, 0xD6, 0x1C, 0xEB, 0x51, 0x06, 0x68, 0x07, 0x5A, + 0x77, 0xCC, 0xC5, 0xF0, 0xAA, 0x0E, 0xDA, 0xF0, 0x0D, 0xEA, 0x61, 0x69, + 0xEB, 0x50, 0xA7, 0x87, 0x56, 0xC8, 0x54, 0x66, 0x9B, 0x6B, 0xE0, 0x6E, + 0x0C, 0x79, 0x16, 0x0D, 0x43, 0xCB, 0xF1, 0x9F, 0xCD, 0xC7, 0x29, 0x40, + 0x13, 0xD1, 0xFC, 0xA2, 0x4B, 0xAD, 0x1D, 0xCD, 0x21, 0xCF, 0xE4, 0x6B, + 0xEC, 0xC5, 0x9A, 0x8D, 0x77, 0xC9, 0x87, 0x0E, 0x34, 0xDB, 0x3F, 0xD8, + 0xF6, 0x04, 0xB4, 0x98, 0x97, 0x89, 0xC8, 0x49, 0x76, 0x0E, 0x70, 0x67, + 0x9E, 0x13, 0x49, 0x96, 0x8A, 0xC8, 0x79, 0x22, 0xB2, 0x4D, 0x04, 0x86, + 0x4E, 0xCA, 0xCE, 0xF2, 0xF5, 0x32, 0x74, 0x96, 0x59, 0x9B, 0x53, 0x11, + 0x19, 0x5E, 0x97, 0x8B, 0xC8, 0x3A, 0x8F, 0xF1, 0x79, 0x53, 0x44, 0x26, + 0xC5, 0xD5, 0xC8, 0xEA, 0xB4, 0xF8, 0xF0, 0x6D, 0x36, 0x4B, 0x5B, 0x2D, + 0x3A, 0xB3, 0xD5, 0x3E, 0x2F, 0x41, 0xC9, 0xE3, 0x61, 0xAB, 0xE5, 0x6C, + 0x7F, 0xFC, 0x28, 0xBC, 0xCB, 0x42, 0xD5, 0xA3, 0x5C, 0xAC, 0x28, 0xF2, + 0x9D, 0x36, 0xD8, 0x4C, 0x9E, 0x8B, 0xC6, 0xDA, 0xBB, 0x8F, 0xCF, 0xFB, + 0x28, 0x17, 0x6D, 0x41, 0x9C, 0x03, 0x1D, 0x9B, 0x50, 0xDA, 0xEB, 0x5B, + 0x68, 0xB2, 0xD8, 0xF0, 0x2C, 0x3F, 0xF7, 0x2E, 0x34, 0x0F, 0x29, 0x2A, + 0xDE, 0x52, 0x05, 0x6E, 0xD5, 0x6C, 0x6B, 0x89, 0x8E, 0xFC, 0xDF, 0x80, + 0x1E, 0x49, 0xBB, 0xC0, 0xE2, 0x05, 0x43, 0xCD, 0x76, 0x59, 0x8D, 0x72, + 0xBB, 0x1F, 0x8F, 0x7B, 0x24, 0x4B, 0x6C, 0x1D, 0xBE, 0xDB, 0x82, 0x16, + 0x99, 0x7A, 0x13, 0x4D, 0x44, 0x5F, 0x31, 0x36, 0xE5, 0xA3, 0x6F, 0x51, + 0x9E, 0x71, 0xD4, 0x68, 0xC1, 0x90, 0x27, 0x2D, 0xA8, 0x21, 0x16, 0x14, + 0xD9, 0x14, 0xE6, 0x9B, 0x1E, 0x86, 0x6C, 0x8C, 0xC0, 0x88, 0x72, 0x79, + 0xE1, 0xE2, 0x2A, 0x91, 0x8D, 0x4F, 0x19, 0x7D, 0x57, 0xA4, 0x97, 0xBF, + 0x04, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x27, 0x00, 0x27, 0x43, 0x90, 0x00, + 0x9C, 0x48, 0x02, 0x70, 0x22, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x07, 0x2C, + 0xA9, 0x80, 0xEE, 0x49, 0x00, 0x8E, 0xA1, 0x74, 0xE2, 0x56, 0xF3, 0x3A, + 0x9D, 0x00, 0xDC, 0x3B, 0x25, 0x8D, 0xD2, 0x61, 0xBD, 0xF6, 0xA8, 0xDB, + 0xF0, 0xCF, 0x7D, 0x4E, 0x00, 0x8E, 0x89, 0xB4, 0xA3, 0xB5, 0x32, 0xDE, + 0xCE, 0x03, 0x60, 0x1A, 0xCD, 0x58, 0xB8, 0xAF, 0xAF, 0x03, 0x5C, 0xD1, + 0x47, 0xFB, 0xD5, 0x81, 0x12, 0xCA, 0x87, 0xA1, 0xB5, 0x33, 0x76, 0xA0, + 0x8B, 0x8F, 0x95, 0x21, 0xCB, 0xFF, 0x02, 0x25, 0xBE, 0xF7, 0xE9, 0x70, + 0x65, 0x5C, 0x13, 0xC0, 0x83, 0xD4, 0x50, 0x87, 0xA3, 0x95, 0xEA, 0x86, + 0xD3, 0xC5, 0x07, 0x7B, 0x88, 0x18, 0x67, 0xE5, 0x27, 0x00, 0xF7, 0xCC, + 0xAA, 0xEE, 0x37, 0x1D, 0xEE, 0xCB, 0x2A, 0x3A, 0x97, 0xF4, 0x2B, 0x60, + 0xFB, 0x83, 0x1F, 0x9C, 0x48, 0x02, 0x70, 0xDF, 0x97, 0xFF, 0x0F, 0x00, + 0xAE, 0x7B, 0xCD, 0x15, 0x78, 0xF2, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static unsigned char* visuals_icon = raw::visuals; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/identity.cpp b/cheat/internal_rewrite/identity.cpp new file mode 100644 index 0000000..b58e75b --- /dev/null +++ b/cheat/internal_rewrite/identity.cpp @@ -0,0 +1,110 @@ +#include "identity.hpp" +#include "settings.hpp" +#include "interface.hpp" +#include "pattern.hpp" + +#include "context.hpp" + +namespace features +{ + void c_identity::clantag_changer( ) { + static auto fn_offset = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "53 56 57 8B DA 8B F9 FF 15" ) ); + static auto fn = reinterpret_cast< void( __fastcall* )( const char*, const char* ) >( fn_offset ); + static bool was_enabled = false; + + if ( !g_settings.misc.clantag_changer( ) ) { + if ( was_enabled ) { + fn( "", " " ); + static cvar_t* cl_clanid = g_csgo.m_cvar( )->FindVar( xors( "cl_clanid" ) ); + auto backup_val = cl_clanid->get_int( ); + cl_clanid->set_value( 0 ); + cl_clanid->set_value( backup_val ); + was_enabled = false; + } + + return; + } + + static const std::string moneybot_string = xors( "dmt hook " ); + static std::string clantag_str = moneybot_string; + + static auto next_settime = g_csgo.m_globals->m_curtime; + auto curtime = g_csgo.m_globals->m_curtime; + + if( !was_enabled || std::abs( curtime - next_settime ) > 1.f ) { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + + if( nci ) { + auto tick = TIME_TO_TICKS( g_ctx.pred_time( ) + nci->GetLatency( 0 ) ); + clantag_str = moneybot_string; + if( tick % 15 ) + return; + + next_settime = curtime; + } + } + + was_enabled = true; + + if ( curtime > next_settime ) { + const int length = clantag_str.length( ); + clantag_str.insert( 0, 1, clantag_str[ length - 2 ] ); + clantag_str.erase( length - 1, 1 ); + + std::string set = clantag_str; + set.resize( 15 ); + set[ 14 ] = '$'; + + auto is_full = set.find( xors( "moneybot" ) ) != std::string::npos; + + next_settime = curtime + ( is_full ? 0.85f : 0.4f ); + fn( set.c_str( ), set.c_str( ) ); + } + } + + void c_identity::name_changer( ) { + static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "name" ) ); + auto set_name = [ ]( const char* name ) { + *( int* )( uintptr_t( &cvar->m_change_callback ) + 0xc ) = 0; + cvar->set_value( name ); + }; + + static bool activated = false; + static char original_name[ 100 ]{ }; + + if( !g_settings.misc.name_changer ) { + if( activated ) { + set_name( original_name ); + } + + activated = false; + return; + } + + if( !activated ) { + strcpy( original_name, cvar->get_string( ) ); + if( g_settings.misc.name_changer == 1 ) { + char new_name[ 128 ]; + memset( new_name, '$', sizeof( new_name ) ); + set_name( new_name ); + } + if( g_settings.misc.name_changer == 2 ) { + set_name( xors( "moneybot.cc" ) ); + } + if( g_settings.misc.name_changer == 101 ) { + set_name( "­­­\n\xAD\xAD\xAD" ); + } + } + else if( g_settings.misc.name_changer == 101 ) { + char new_name[ 15 ]; + for( size_t i{ }; i < 15; ++i ) { + auto is_upper = !( math::random_number( 0, 256 ) & 1 ); + new_name[ i ] = is_upper ? math::random_number( 65, 90 ) : math::random_number( 97, 122 ); + } + + set_name( new_name ); + } + + activated = true; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/identity.hpp b/cheat/internal_rewrite/identity.hpp new file mode 100644 index 0000000..aecba35 --- /dev/null +++ b/cheat/internal_rewrite/identity.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "sdk.hpp" + +namespace features +{ + class c_identity { + private: + void clantag_changer( ); + void name_changer( ); + public: + void operator()( ) { + clantag_changer( ); + name_changer( ); + } + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/iface_dllmain_impl.hpp b/cheat/internal_rewrite/iface_dllmain_impl.hpp new file mode 100644 index 0000000..f8209ec --- /dev/null +++ b/cheat/internal_rewrite/iface_dllmain_impl.hpp @@ -0,0 +1,82 @@ +#pragma once + +namespace factory +{ + namespace interfaces + { + class c_interface_manager { + struct reg { + char m_key; + uintptr_t m_ptr; + uintptr_t m_module; + char m_module_name[ 64 ]; + char m_name[ 64 ]; + }; + + size_t m_count; + reg* m_regs; + + void decrypt_str( char* buf, size_t size, char key ) { + for( size_t i{ }; i < size; ++i ) { + buf[ i ] ^= key; + } + } + + public: + void init( uintptr_t iface_addr ) { + m_count = *( size_t* )( iface_addr ); + m_regs = ( reg* )( iface_addr + 4 ); + } + + template < typename t = void* > + t find_interface( const std::string& module_, std::string name ) { + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + char name_buf[ 64 ]; + char module_buf[ 64 ]; + + for( size_t i{ }; i < m_count; ++i ) { + auto& reg = m_regs[ i ]; + + memcpy( name_buf, reg.m_name, 64 ); + memcpy( module_buf, reg.m_module_name, 64 ); + + decrypt_str( name_buf, 64, reg.m_key ); + decrypt_str( module_buf, 64, reg.m_key ); + + if( !module_.compare( module_buf ) && strstr( name_buf, name.c_str( ) ) ) { + return ( t )( reg.m_ptr ); + } + } + + return t{ }; + } + + template < typename t = void* > + t find_interface( std::string name ) { + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + char name_buf[ 64 ]; + char module_buf[ 64 ]; + + for( size_t i{ }; i < m_count; ++i ) { + auto& reg = m_regs[ i ]; + + memcpy( name_buf, reg.m_name, 64 ); + memcpy( module_buf, reg.m_module_name, 64 ); + + decrypt_str( name_buf, 64, reg.m_key ); + decrypt_str( module_buf, 64, reg.m_key ); + + if( strstr( name_buf, name.c_str( ) ) ) { + return ( t )( reg.m_ptr ); + } + } + + return t{ }; + } + }; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/in_prediction.cpp b/cheat/internal_rewrite/in_prediction.cpp new file mode 100644 index 0000000..3123d06 --- /dev/null +++ b/cheat/internal_rewrite/in_prediction.cpp @@ -0,0 +1,36 @@ +#include "mem.hpp" +#include "hooks.hpp" +#include "context.hpp" + +#undef max + +bool __fastcall hooks::in_prediction( void* ecx_, void* edx_ ) { +#ifdef HEADER_MODULE + static auto ret_address = g_header.patterns.in_prediction_retaddr; +#else + static auto ret_address = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "84 C0 75 08 57 8B CE E8 ? ? ? ? 8B 06" ) ); +#endif + + if( g_ctx.m_local && ret_address && g_settings.rage.enabled( ) ) { + stack_t stack( get_baseptr( ) ); + int local_team = g_ctx.m_local->m_iTeamNum( ); + + if( stack.return_address( ) == ret_address ) { + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_valid( ) || ent == g_ctx.m_local || !ent->has_valid_anim( ) ) + continue; + + if( ent->m_iTeamNum( ) != local_team || g_settings.rage.friendlies ) { + //printf( "model bone counter: %d %d\n", ent->m_iMostRecentModelBoneCounter( ), c_base_player::g_iModelBoneCounter( ) ); + ent->m_iMostRecentModelBoneCounter( ) = c_base_player::g_iModelBoneCounter( ); + ent->m_flLastBoneSetupTime( ) = g_csgo.m_globals->m_curtime; + } + } + } + } + + return in_prediction_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/input_system.cpp b/cheat/internal_rewrite/input_system.cpp new file mode 100644 index 0000000..6040cca --- /dev/null +++ b/cheat/internal_rewrite/input_system.cpp @@ -0,0 +1,527 @@ +#include + +#include "input_system.hpp" +#include "util.hpp" + +util::c_input_manager g_input; + +NAMESPACE_REGION( util ) + +const char* const key_names_short[] = { + "unk", + "m1", + "m2", + "can", + "m3", + "m4", + "m5", + "unk", + "back", + "tab", + "unk", + "unk", + "clr", + "ret", + "unk", + "unk", + "shift", + "ctrl", + "alt", + "pause", + "caps", + "kana", + "unk", + "junja", + "final", + "kanji", + "unk", + "esc", + "convert", + "nonconvert", + "accept", + "modechange", + " ", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "slct", + "prnt", + "execute", + "snapshot", + "ins", + "del", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unk", + "unk", + "num0", + "num1", + "num2", + "num3", + "num4", + "num5", + "num6", + "num7", + "num8", + "num9", + "*", + "+", + "sep", + "-", + ",", + "/", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "lshift", + "rshift", + "lctrl", + "rctrl", + "lalt", + "ralt", +}; + +const char* const key_names[] = { + "unknown", + "mouse_1", + "mouse_2", + "cancel", + "mouse_3", + "mouse_4", + "mouse_5", + "unknown", + "back", + "tab", + "unknown", + "unknown", + "clear", + "return", + "unknown", + "unknown", + "shift", + "control", + "alt", + "pause", + "capital", + "kana", + "unknown", + "junja", + "final", + "kanji", + "unknown", + "escape", + "convert", + "nonconvert", + "accept", + "modechange", + "space", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "select", + "print", + "execute", + "snapshot", + "insert", + "delete", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unknown", + "unknown", + "numpad0", + "numpad1", + "numpad2", + "numpad3", + "numpad4", + "numpad5", + "numpad6", + "numpad7", + "numpad8", + "numpad9", + "multiply", + "add", + "separator", + "subtract", + "decimal", + "divide", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "lshift", + "rshift", + "lcontrol", + "rcontrol", + "lmenu", + "rmenu", +}; + +void c_input_manager::capture_mouse_move( ulong_t lparam ) { + m_mouse_pos[ 0 ] = LOWORD( lparam ); + m_mouse_pos[ 1 ] = HIWORD( lparam ); +} + +void c_input_manager::clear_keys( ) { + memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) ); +} + +bool c_input_manager::register_key_press( int key_event, int key ) +{ + switch ( key_event ) { + case KEYDOWN: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = true; + return true; + } + case KEYUP: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = false; + return true; + } + case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = true; + break; + } + case SYSKEYUP: { + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = false; + break; + } + case LBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE1 ] = true; + return true; + case LBUTTONUP: + m_pressed_keys[ KEYS_MOUSE1 ] = false; + return true; + case RBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE2 ] = true; + return true; + case RBUTTONUP: + m_pressed_keys[ KEYS_MOUSE2 ] = false; + return true; + case MBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE3 ] = true; + return true; + case MBUTTONUP: + m_pressed_keys[ KEYS_MOUSE3 ] = false; + return true; + case XBUTTONDOWN: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; + return true; + } + case XBUTTONUP: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; + return true; + } + case MOUSEWHEEL: { + short scroll_input = ( short )HIWORD( key ); + m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; + return true; + } + } + + return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK +} + +bool c_input_manager::is_key_pressed( int key ) { + auto k = key; + return is_valid_key( k ) && m_pressed_keys[ k ]; +} + +const char* c_input_manager::get_key_name( int key ) { + if ( !is_valid_key( key ) || key > KEYS_MAX ) + return key_names[ KEYS_NONE ]; + + return key_names[ key ]; +} + +const char* c_input_manager::get_short_name( int key ) { + return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; +} + +VirtualKeys_t c_input_manager::is_any_key_pressed( ) { + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( m_pressed_keys[ i ] ) { + return VirtualKeys_t( i ); + } + } + + return KEYS_NONE; +} + +int c_input_manager::get_scroll_state( ) { + int current_state = m_scroll_wheel_state; + m_scroll_wheel_state = 0; + return current_state; +} + +char c_input_manager::get_pressed_char( int* out ) { + size_t pressed_character{ }; + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( is_key_pressed( VirtualKeys_t( i ) ) ) { + if ( ( i >= KEYS_A && i <= KEYS_Z ) + || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { + pressed_character = i; + } + } + } + + if ( pressed_character ) { + if ( out ) { + *out = int( pressed_character ); + } + + if ( is_key_pressed( KEYS_SHIFT ) ) { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( pressed_character ); + + //gay way to shift it to symbols + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) { + switch ( pressed_character ) { + case KEYS_N0: + return ')'; + case KEYS_N1: + return '!'; + case KEYS_N2: + return '@'; + case KEYS_N3: + return '#'; + case KEYS_N4: + return '$'; + case KEYS_N5: + return '%'; + case KEYS_N6: + return '^'; + case KEYS_N7: + return '&'; + case KEYS_N8: + return '*'; + case KEYS_N9: + return '('; + } + } + } + else { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( ::tolower( pressed_character ) ); + + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) + return char( pressed_character ); + } + } + else if ( is_key_pressed( KEYS_SPACE ) ) { + if ( out ) + *out = KEYS_SPACE; + + return ' '; + } + else if ( is_key_pressed( KEYS_BACK ) ) { + if ( out ) + *out = KEYS_BACK; + + return 0; + } + + if ( out ) + *out = KEYS_NONE; + + return 0; +} + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/input_system.hpp b/cheat/internal_rewrite/input_system.hpp new file mode 100644 index 0000000..338c493 --- /dev/null +++ b/cheat/internal_rewrite/input_system.hpp @@ -0,0 +1,186 @@ +#pragma once +#include "util.hpp" + +enum VirtualKeyEvents_t { + KEYDOWN = 0x0100, + KEYUP = 0x0101, + SYSKEYDOWN = 0x104, + SYSKEYUP = 0x105, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, +}; + +enum VirtualKeys_t { + KEYS_NONE = 0, + KEYS_MOUSE1 = 0X01, + KEYS_MOUSE2 = 0X02, + KEYS_CANCEL = 0X03, + KEYS_MOUSE3 = 0X04, + KEYS_MOUSE4 = 0X05, + KEYS_MOUSE5 = 0X06, + KEYS_BACK = 0X08, + KEYS_TAB = 0X09, + KEYS_CLEAR = 0X0C, + KEYS_RETURN = 0X0D, + KEYS_SHIFT = 0X10, + KEYS_CONTROL = 0X11, + KEYS_ALT = 0X12, + KEYS_PAUSE = 0X13, + KEYS_CAPSLOCK = 0X14, + KEYS_ESCAPE = 0X1B, + KEYS_CONVERT = 0X1C, + KEYS_NONCONVERT = 0X1D, + KEYS_ACCEPT = 0X1E, + KEYS_MODECHANGE = 0X1F, + KEYS_SPACE = 0X20, + KEYS_PRIOR = 0X21, + KEYS_NEXT = 0X22, + KEYS_END = 0X23, + KEYS_HOME = 0X24, + KEYS_LEFT = 0X25, + KEYS_UP = 0X26, + KEYS_RIGHT = 0X27, + KEYS_DOWN = 0X28, + KEYS_SELECT = 0X29, + KEYS_PRINT = 0X2A, + KEYS_EXECUTE = 0X2B, + KEYS_SNAPSHOT = 0X2C, + KEYS_INSERT = 0X2D, + KEYS_DELETE = 0X2E, + KEYS_HELP = 0X2F, + KEYS_N0 = 0X30, + KEYS_N1 = 0X31, + KEYS_N2 = 0X32, + KEYS_N3 = 0X33, + KEYS_N4 = 0X34, + KEYS_N5 = 0X35, + KEYS_N6 = 0X36, + KEYS_N7 = 0X37, + KEYS_N8 = 0X38, + KEYS_N9 = 0X39, + KEYS_A = 0X41, + KEYS_B = 0X42, + KEYS_C = 0X43, + KEYS_D = 0X44, + KEYS_E = 0X45, + KEYS_F = 0X46, + KEYS_G = 0X47, + KEYS_H = 0X48, + KEYS_I = 0X49, + KEYS_J = 0X4A, + KEYS_K = 0X4B, + KEYS_L = 0X4C, + KEYS_M = 0X4D, + KEYS_N = 0X4E, + KEYS_O = 0X4F, + KEYS_P = 0X50, + KEYS_Q = 0X51, + KEYS_R = 0X52, + KEYS_S = 0X53, + KEYS_T = 0X54, + KEYS_U = 0X55, + KEYS_V = 0X56, + KEYS_W = 0X57, + KEYS_X = 0X58, + KEYS_Y = 0X59, + KEYS_Z = 0X5A, + KEYS_LEFTWINDOWS = 0X5B, + KEYS_RIGHTWINDOWS = 0X5C, + KEYS_APPLICATION = 0X5D, + KEYS_NUMPAD0 = 0X60, + KEYS_NUMPAD1 = 0X61, + KEYS_NUMPAD2 = 0X62, + KEYS_NUMPAD3 = 0X63, + KEYS_NUMPAD4 = 0X64, + KEYS_NUMPAD5 = 0X65, + KEYS_NUMPAD6 = 0X66, + KEYS_NUMPAD7 = 0X67, + KEYS_NUMPAD8 = 0X68, + KEYS_NUMPAD9 = 0X69, + KEYS_MULTIPLY = 0X6A, + KEYS_ADD = 0X6B, + KEYS_SEPARATOR = 0X6C, + KEYS_SUBTRACT = 0X6D, + KEYS_DECIMAL = 0X6E, + KEYS_DIVIDE = 0X6F, + KEYS_F1 = 0X70, + KEYS_F2 = 0X71, + KEYS_F3 = 0X72, + KEYS_F4 = 0X73, + KEYS_F5 = 0X74, + KEYS_F6 = 0X75, + KEYS_F7 = 0X76, + KEYS_F8 = 0X77, + KEYS_F9 = 0X78, + KEYS_F10 = 0X79, + KEYS_F11 = 0X7A, + KEYS_F12 = 0X7B, + KEYS_NUMLOCK = 0X90, + KEYS_SCROLLLOCK = 0X91, + KEYS_LEFTSHIFT = 0XA0, + KEYS_RIGHTSHIFT = 0XA1, + KEYS_LEFTCONTROL = 0XA2, + KEYS_RIGHTCONTROL = 0XA3, + KEYS_LEFTMENU = 0XA4, + KEYS_RIGHTMENU = 0XA5, + KEYS_PERIOD = 0xBE, + KEYS_MAX = 0XA6, + KEYS_LAST = 0xfe +}; + +namespace util +{ + class c_input_manager { + public: + bool m_pressed_keys[ KEYS_LAST ]{ }; + int m_mouse_pos[ 2 ]{ }; + int m_scroll_wheel_state{ }; + + + c_input_manager( ) { + memset( m_pressed_keys, 0, KEYS_LAST ); + } + + void capture_mouse_move( ulong_t lparam ); + + //resets all keys so unpressed + void clear_keys( ); + + //registers a key press from wndproc + bool register_key_press( int key_event, int key ); + + //checks if the key is pressed + bool is_key_pressed( int key ); + + //returns the first found key pressed, or KEY_NONE if none are + VirtualKeys_t is_any_key_pressed( ); + + //returns the last scroll state and resets it to 0 + int get_scroll_state( ); + + //returns the key's name + const char* get_key_name( int key ); + const char* get_short_name( int key ); + + //returns the first found currently pressed key + char get_pressed_char( int* pressed_key = nullptr ); + + //check if a key is valid + inline bool is_valid_key( int key ) { return key > KEYS_NONE && key < KEYS_LAST; } + + //get cursor pos + inline void get_cursor_pos( int& x, int& y ) { + x = m_mouse_pos[ 0 ]; + y = m_mouse_pos[ 1 ]; + } + }; +} + +extern util::c_input_manager g_input; \ No newline at end of file diff --git a/cheat/internal_rewrite/interface.cpp b/cheat/internal_rewrite/interface.cpp new file mode 100644 index 0000000..e424c0f --- /dev/null +++ b/cheat/internal_rewrite/interface.cpp @@ -0,0 +1,271 @@ +#include + +#include "interface.hpp" +#include "console.hpp" +#include "hooks.hpp" +#include "renderer.hpp" +#include "pattern.hpp" +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "modules.hpp" +#include "wipe.hpp" + +using namespace factory; + +interfaces::c_interface_manager g_factory; +factory::c_csgo g_csgo; + +bool factory::create_interfaces( c_csgo* instance, header_t* header ) { + DELETE_START( 0 ); + + +#ifndef HEADER_MODULE + header->client_panorama = ( uintptr_t )GetModuleHandleA( "client_panorama.dll" ); + header->vguimatsurface = ( uintptr_t )GetModuleHandleA( "vguimatsurface.dll" ); + header->shaderapidx9 = ( uintptr_t )GetModuleHandleA( "shaderapidx9.dll" ); + header->vstdlib = ( uintptr_t )GetModuleHandleA( "vstdlib.dll" ); + header->steam_api = ( uintptr_t )GetModuleHandleA( "steam_api.dll" ); +#endif + + instance->create( &instance->m_chl, xors( "VClient" ) ); + instance->create( &instance->m_surface, xors( "VGUI_Surface" ) ); + instance->create( &instance->m_panel, xors( "VGUI_Panel" ) ); + instance->create( &instance->m_engine, xors( "VEngineClient" ) ); + instance->create( &instance->m_entlist, xors( "VClientEntityList" ) ); + instance->create( &instance->m_prediction, xors( "VClientPrediction" ) ); + instance->create( &instance->m_cvar, xors( "VEngineCvar" ) ); + instance->create( &instance->m_game_movement, xors( "GameMovement" ) ); + instance->create( &instance->m_model_info, xors( "VModelInfoClient" ) ); + instance->create( &instance->m_trace, xors( "EngineTraceClient" ) ); + instance->create( &instance->m_model_render, xors( "VEngineModel" ) ); + instance->create( &instance->m_mat_system, xors( "VMaterialSystem" ) ); + instance->create( &instance->m_render_view, xors( "VEngineRenderView" ) ); + instance->create( &instance->m_phys_props, xors( "VPhysicsSurfaceProps" ) ); + instance->create( &instance->m_engine_sound, xors( "IEngineSoundClient" ) ); + instance->create( &instance->m_event_mgr, xors( "GAMEEVENTSMANAGER002" ) ); + instance->create( &instance->m_string_table, xors( "VEngineClientStringTable" ) ); + instance->create( &instance->m_partition, xors( "SpatialPartition" ) ); + instance->create( &instance->m_clientleaf, xors( "ClientLeafSystem002" ) ); + instance->create( &instance->m_mdl_cache, xors( "MDLCache" ) ); + instance->create( &instance->m_engine_vgui, xors( "VEngineVGui" ) ); + instance->create( &instance->m_input_sys, xors( "InputSystemVersion" ) ); + + auto d3d_device = pattern::first_code_match( (HMODULE)header->shaderapidx9, + xors( "A1 ?? ?? ?? ?? 50 8B 08 FF 51 0C" ) ) + 0x1; + +#ifdef HEADER_MODULE + auto move_helper = header->patterns.move_helper + 0x2; +#else + auto move_helper = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "8B 0D ?? ?? ?? ?? 8B 46 08 68" ) ) + 0x2; +#endif + +#ifdef HEADER_MODULE + auto beam_ptr = header->patterns.beam_ptr + 0x1; +#else + auto beam_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "B9 ? ? ? ? A1 ? ? ? ? FF 10 A1 ? ? ? ? B9" ), 0x1 ); +#endif + + auto mm_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "89 4C 24 10 8B 0D ? ? ? ? 53" ), 0x6 ); + + instance->create( &instance->m_d3d, **reinterpret_cast< uintptr_t** >( d3d_device ) ); + instance->create( &instance->m_move_helper, **reinterpret_cast< uintptr_t** >( move_helper ) ); + instance->create( &instance->m_beams, *reinterpret_cast< uintptr_t* >( beam_ptr ) ); + //instance->create( &instance->m_mm, **reinterpret_cast< uintptr_t** >( mm_ptr ) ); + + instance->m_steam_pipe_handle = ( ( SteamPipeHandle( __cdecl* )( ) )GetProcAddress( ( HMODULE )header->steam_api, xors( "SteamAPI_GetHSteamPipe" ) ) )( ); + instance->m_steam_user_handle = ( ( SteamUserHandle( __cdecl* )( ) )GetProcAddress( ( HMODULE )header->steam_api, xors( "SteamAPI_GetHSteamUser" ) ) )( ); + + uintptr_t steam_client_ptr = ( ( uintptr_t ( __cdecl* )( void ) )GetProcAddress( ( HMODULE )header->steam_api, xors( "SteamClient" ) ) )( ); + instance->create( &instance->m_steam_client, steam_client_ptr ); + + uintptr_t steam_friends_ptr = ( uintptr_t )instance->m_steam_client( )->GetISteamFriends( instance->m_steam_user_handle, instance->m_steam_pipe_handle, "SteamFriends015" ); + instance->create( &instance->m_steam_friends, steam_friends_ptr ); + + + auto kv_fn = ( void*( __cdecl* )( ) )( GetProcAddress( + ( HMODULE )header->vstdlib, + xors( "KeyValuesSystem" ) ) ); + + instance->m_keyvalues = ( IKeyValuesSystem* )kv_fn( ); + + uintptr_t* globals = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 0 ) + 0x1b ); + instance->m_globals = reinterpret_cast< global_vars_t* >( globals ); + + uintptr_t* client_mode = **reinterpret_cast< uintptr_t*** >( + instance->m_chl->get_old_function( 10 ) + 0x5 ); + instance->create( &instance->m_clientmode, uintptr_t( client_mode ) ); + + uintptr_t input = *reinterpret_cast< uintptr_t* >( + instance->m_chl->get_old_function( 16 ) + 0x1 ); + instance->create( &instance->m_input, input ); + + uintptr_t** global_state = pattern::first_code_match< uintptr_t** >( instance->m_engine.dll( ), + xors( "B9 ? ? ? ? 56 FF 50 14 8B 34 85" ), 0x1 ); + instance->m_global_state = reinterpret_cast< CGlobalState* >( *global_state ); + + auto clientstate = instance->m_global_state->get_client_state( ); + if( clientstate && clientstate->m_netchannel ) + instance->create( &instance->m_net_channel, ( uintptr_t )clientstate->m_netchannel ); + + uintptr_t var_ptr = ( uintptr_t )instance->m_cvar( )->FindVar( xors( "weapon_debug_spread_show" ) ); + instance->create( &instance->m_debug_show_spread, var_ptr ); + + uintptr_t cl_interpolate = ( uintptr_t )( instance->m_cvar( )->FindVar( xors( "cl_interpolate" ) ) ); + instance->create( &instance->m_interpolate, cl_interpolate ); + + uintptr_t net_showfragments = ( uintptr_t )( instance->m_cvar( )->FindVar( xors( "net_showfragments" ) ) ); + instance->create( &instance->m_netshowfragments, net_showfragments ); + + uintptr_t cl_csm_shadows = ( uintptr_t )( instance->m_cvar( )->FindVar( xors( "cl_csm_shadows" ) ) ); + instance->create( &instance->m_csm_shadows, cl_csm_shadows ); + + instance->listeners.bullet_impact.init( ); + instance->listeners.player_hurt.init( ); + instance->listeners.round_start.init( ); + instance->listeners.molotov_detonate.init( ); + instance->listeners.weapon_fire.init( ); + instance->listeners.player_death.init( ); + + DELETE_END( 0 ); + return true; +} + + +con_fn clear_fn{ fnv( "clear" ), [ ]( const char*, const char* ) { g_con->m_logs.clear( ); }, "" }; +con_fn enable_logs_fn{ fnv( "log_enable" ), + [ ]( const char* a, const char* ) { + g_settings.menu.logs_enable ^= 1; + g_con->log( g_settings.menu.logs_enable ? xors( "logs enabled" ) : xors( "logs disabled" ) ); + }, + "" +}; + +con_fn fnv_fn{ fnv( "fnv" ), + [ ]( const char* a, const char* ) { + auto print = hash::fnv1a( a ); + g_con->log( "%08x", print ); + }, + "%S" +}; + +con_fn sum_fn{ fnv( "sum" ), + [ ]( const char* a, const char* syntax ) { + auto arg_1 = con_fn::get_arg< int >( a, 0, syntax ); + auto arg_2 = con_fn::get_arg< int >( a, 1, syntax ); + g_con->log( "%d + %d = %d", arg_1, arg_2, arg_1 + arg_2 ); + }, + "%D %D" +}; + +con_fn dump_cfg{ fnv( "dump_cfg" ), + [ ]( const char* , const char* ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + g_con->log( "%08x: %s", setting->get_hash( ), setting->get_string( ).c_str( ) ); + } + }, + "" +}; + +con_fn retard_fn{ fnv( "retard" ), + [ ]( const char*, const char* ) { + g_con->log( "snuze" ); + }, + "" +}; + +con_fn unload_fn{ fnv( "unload" ), + [ ]( const char*, const char* ) { + g_csgo.m_panic = true; + ExitProcess( 0 ); + }, + "" +}; + + +/*con_fn alias_fn{ fnv( "alias" ), + [ ]( const char* a, const char* b ) { + auto var_type = std::string( b ); + if( var_type.length( ) > 1 ) { + g_con->log( xors( "unknown var type: %s" ), var_type.c_str( ) ); + return; + } + + switch( b[ 0 ] ) { + case TYPE_STRING: { + std::shared_ptr< con_alias< const char* > >( fnv( ) ) + } + } + }, + "%S %S" +};*/ + +void factory::c_csgo::initialize( ) { + DELETE_START( 0 ) + + m_panic = false; + + g_con->create( ); + auto now = std::chrono::high_resolution_clock::now( ); + g_con->print( xors( "hello\n" ) ); + + factory::create_interfaces( &g_csgo, &g_header ); + + g_fonts.initialize( ); + + g_netvars.init( ); + + g_settings.load( ); + + g_con->register_fn( &clear_fn ); + g_con->register_fn( &enable_logs_fn ); + g_con->register_fn( &fnv_fn ); + g_con->register_fn( &sum_fn ); + g_con->register_fn( &dump_cfg ); + g_con->register_fn( &retard_fn ); + g_con->register_fn( &unload_fn ); + + hooks::commit( &g_csgo ); + + g_cheat.m_chams.m_materials.initialize_materials( ); + + util::calculate_spread_runtime( ); + + auto after = std::chrono::high_resolution_clock::now( ); + std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); + + std::chrono::duration< float > delta = after - now; + + g_con->log( xors( "cheat initialized\n" ) ); + g_con->log( xors( "time taken: %f\n" ), delta.count( ) ); + + // open the menu so people actually know when the cheat loaded + g_settings.menu.open = true; + + DELETE_END( 0 ); +} + +void factory::c_csgo::uninitialize( ) { + m_panic = true; + g_con->destroy( ); + + //restore wndproc + if ( hooks::window_procedure_o ) { + SetWindowLongA( m_hwnd, GWLP_WNDPROC, ( long )hooks::window_procedure_o ); + } + + //unreference materials + g_cheat.m_chams.m_materials.destroy_materials( ); + + //restore all interfaces + restore( ); + + Sleep( 100 ); + + //free the library + FreeLibraryAndExitThread( g_dll, 0 ); +} diff --git a/cheat/internal_rewrite/interface.hpp b/cheat/internal_rewrite/interface.hpp new file mode 100644 index 0000000..332971a --- /dev/null +++ b/cheat/internal_rewrite/interface.hpp @@ -0,0 +1,185 @@ +#pragma once +#include + +#include "factory.hpp" +#include "sdk.hpp" +#include "listener.hpp" +#include "modules.hpp" + +NAMESPACE_REGION( factory ) + +struct IDirect3DDevice9; + +//interface holder +template < typename t > +class c_interface_base { + friend class c_csgo; +public: + t* operator( )( ) { + return m_interface; + } + + //calls a virtual + template< size_t index, typename ret = void, + class... Args > + ret call( Args... args ) { + return util::get_vfunc< ret( __thiscall* )( void*, Args... ) > + ( m_interface, index )( m_interface, args... ); + } + + //also calls a virtual but you supply the typedef instead of return type + template< typename def, size_t index, class... Args > + auto call( Args... args ) { + return util::get_vfunc< def > + ( m_interface, index )( m_interface, args... ); + } + + //allows you to cast the interface + template< typename t0 = t* > + t0 get( ) { + return ( t0 )m_interface; + } + + void operator( )( t* ptr ) { + m_interface = ptr; + m_hook.reset( ); + m_hook = std::make_shared< hooks::c_vmt >( static_cast< void* >( ptr ) ); + + /*find the module the interface is located in + i know i could just pass the pointer but traps are gay*/ + MEMORY_BASIC_INFORMATION info; + VirtualQuery( ptr, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + m_dll = static_cast< HMODULE >( info.AllocationBase ); + } + + void operator( )( void* ptr ) { + operator( )( static_cast< t* >( ptr ) ); + } + + decltype( auto ) operator->( ) { + return m_hook; + } + + template< typename t2 = decltype( m_dll ) > + t2 dll( ) { + return ( t2 )m_dll; + } + +protected: + t* m_interface; + HMODULE m_dll; + std::shared_ptr< hooks::c_vmt > m_hook; +}; + +//declare your interfaces here +class c_csgo { +public: + c_interface_base< IBaseClientDLL > m_chl; + c_interface_base< ISurface > m_surface; + c_interface_base< IPanel > m_panel; + c_interface_base< IClientMode > m_clientmode; + c_interface_base< IVEngineClient > m_engine; + c_interface_base< IClientEntityList > m_entlist; + c_interface_base< IDirect3DDevice9 > m_d3d; + c_interface_base< IPrediction > m_prediction; + c_interface_base< ICSGameMovement > m_game_movement; + c_interface_base< IMoveHelper > m_move_helper; + c_interface_base< IVModelInfoClient > m_model_info; + c_interface_base< IVModelRender > m_model_render; + c_interface_base< IMaterialSystem > m_mat_system; + c_interface_base< IEngineTrace > m_trace; + c_interface_base< IPhysicsSurfaceProps > m_phys_props; + c_interface_base< IVRenderView > m_render_view; + c_interface_base< ICVar > m_cvar; + c_interface_base< IGameEventManager2 > m_event_mgr; + c_interface_base< CHudChat > m_hud_chat; + c_interface_base< IVEngineSound > m_engine_sound; + c_interface_base< INetChannel > m_net_channel; + c_interface_base< cvar_t > m_debug_show_spread; + c_interface_base< cvar_t > m_interpolate; + c_interface_base< cvar_t > m_netshowfragments; + c_interface_base< cvar_t > m_csm_shadows; + c_interface_base< ISteamClient > m_steam_client; + c_interface_base< ISteamFriends > m_steam_friends; + c_interface_base< IViewRenderBeams > m_beams; + //c_interface_base< CMatchFramework > m_mm; + c_interface_base< uintptr_t > m_input_sys; + c_interface_base< CStringTable > m_string_table; + c_interface_base< CInput > m_input; + c_interface_base< uintptr_t > m_partition; + c_interface_base< uintptr_t > m_clientleaf; + c_interface_base< uintptr_t > m_mdl_cache; + c_interface_base< uintptr_t > m_engine_vgui; + c_interface_base< c_base_player > m_local; + SteamUserHandle m_steam_user_handle; + SteamPipeHandle m_steam_pipe_handle; + IKeyValuesSystem* m_keyvalues; + global_vars_t* m_globals; + CGlobalState* m_global_state; + float m_frametime; + std::thread::id m_main_thread; + std::thread::id m_d3d_thread; + + + HWND m_hwnd{ }; + bool m_panic{ }; + + struct { + generic_listener_t player_death { xors( "player_death" ), &listeners::player_death }; + generic_listener_t bullet_impact{ xors( "bullet_impact" ), &listeners::bullet_impact }; + generic_listener_t player_hurt{ xors( "player_hurt" ), &listeners::player_hurt }; + generic_listener_t round_start{ xors( "round_start" ), &listeners::round_start }; + generic_listener_t molotov_detonate{ xors( "molotov_detonate" ), &listeners::molotov_detonate }; + generic_listener_t weapon_fire{ xors( "weapon_fire" ), &listeners::weapon_fire }; + } listeners; +public: + //find the interface inside of the module + void create( void* iface, const std::string& name, const std::string& mod ) { + auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( mod, name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void create( void* iface, uintptr_t pointer ) { + auto interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + + //msvc is retarded + ( *interface_ )( ( void* )pointer ); + m_container.push_back( interface_ ); + } + + void create( void* iface, const std::string& name ) { + auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void __cdecl initialize( ); + void __cdecl uninitialize( ); + +private: + //restore the vmts to their original + void restore( ) { + for ( const auto& it : m_container ) { + it->m_hook->restore( ); + } + } + +private: + std::vector< c_interface_base< uintptr_t >* > m_container; +}; + +bool create_interfaces( c_csgo* instance, header_t* ); + +END_REGION + +extern factory::c_csgo g_csgo; \ No newline at end of file diff --git a/cheat/internal_rewrite/internal_rewrite.vcxproj b/cheat/internal_rewrite/internal_rewrite.vcxproj new file mode 100644 index 0000000..a531095 --- /dev/null +++ b/cheat/internal_rewrite/internal_rewrite.vcxproj @@ -0,0 +1,572 @@ + + + + + Debug + Win32 + + + Online + Win32 + + + Online + x64 + + + optimize_test + Win32 + + + optimize_test + x64 + + + pHit + Win32 + + + pHit + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {140DEC51-B0E7-4289-BB6F-79686422318E} + internal_rewrite + 10.0.17763.0 + csgo + + + + DynamicLibrary + true + v141 + MultiByte + + + DynamicLibrary + true + v141 + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + false + + + DynamicLibrary + true + v141 + MultiByte + + + DynamicLibrary + true + v141 + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(ProjectDir)\protobuf_src;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)\bin + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)\bin + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)\online + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)\pHit + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + $(SolutionDir)\bin + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + + Level2 + Disabled + true + /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) + _DEBUG;_WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS;_SCL_SECURE_NO_WARNINGS + true + false + EnableFastChecks + NotUsing + precompiled.hpp + + + false + /FAs %(AdditionalOptions) + DebugFastLink + false + false + + + + + Level2 + Full + true + /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG;_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS + true + false + Default + AnySuitable + true + StreamingSIMDExtensions2 + Fast + true + MultiThreadedDLL + _DEBUG + NotUsing + precompiled.hpp + + + false + /FAs %(AdditionalOptions) + DebugFastLink + false + false + + + + + Level3 + Disabled + true + /std:c++latest %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG + + + + + Level3 + Disabled + true + /std:c++latest %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG + + + + + Level3 + Full + true + true + true + /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + true + StreamingSIMDExtensions2 + Precise + CompileAsCpp + false + AnySuitable + Neither + NotUsing + precompiled.hpp + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + /std:c++latest %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + NotUsing + precompiled.hpp + false + true + + + true + true + false + + + + + Level3 + MaxSpeed + false + true + false + /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + NotUsing + precompiled.hpp + true + false + false + false + false + false + StreamingSIMDExtensions2 + false + false + false + stdcpplatest + None + MultiThreadedDLL + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + /std:c++latest %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + /std:c++latest %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + /std:c++latest %(AdditionalOptions) + _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cheat/internal_rewrite/internal_rewrite.vcxproj.filters b/cheat/internal_rewrite/internal_rewrite.vcxproj.filters new file mode 100644 index 0000000..a871845 --- /dev/null +++ b/cheat/internal_rewrite/internal_rewrite.vcxproj.filters @@ -0,0 +1,571 @@ + + + + + {111ce6db-2b60-4a90-b3a8-f418abb6e441} + + + {46408dc1-0b1f-43a7-b32d-4b3f1a4e3393} + + + {e3e56c63-e162-43dc-af43-e40c4b463299} + + + {037f8374-e510-46a1-b5e3-f418537a7e61} + + + {c1fd811f-a868-4a60-9bf4-1c81c22c61ce} + + + {de79d40e-dbca-46ba-ac40-4adcd316d638} + + + {5b0550fa-f13e-4b35-83a2-2b8ae64dc7ee} + + + {1e1c2f2b-1cb9-4040-8a0f-f03ecfb56522} + + + {3a5a53ed-6526-48c1-ade4-05eaefe13c86} + + + {8bc3e769-d369-4e50-ad7d-20b9c4d6680b} + + + {37890891-fcc3-4432-9cdf-e586bded2aa1} + + + + + + factory + + + context + + + hooks + + + hooks + + + utility + + + factory + + + factory + + + hooks + + + utility + + + utility + + + hooks + + + context + + + hooks + + + features + + + hooks + + + features + + + features + + + hooks + + + features + + + sdk + + + sdk + + + features + + + sdk + + + hooks + + + hooks + + + utility + + + features + + + features + + + features + + + features + + + hooks + + + hooks + + + features + + + features + + + features + + + features + + + hooks + + + hooks + + + features + + + hooks + + + hooks\hookers + + + features + + + features + + + features + + + features + + + utility + + + hooks + + + utility + + + features + + + hooks + + + hooks + + + hooks + + + utility + + + hooks + + + hooks + + + hooks + + + features + + + hooks + + + hooks + + + sdk\valve + + + features + + + ui + + + ui + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks\hookers + + + hooks\hookers + + + hooks + + + hooks + + + + + factory + + + factory + + + sdk + + + sdk + + + utility + + + utility + + + context + + + sdk + + + sdk + + + features + + + utility + + + hooks + + + sdk + + + sdk + + + utility + + + sdk + + + utility + + + sdk + + + sdk + + + sdk + + + sdk + + + factory + + + sdk + + + sdk\valve + + + sdk\valve + + + sdk + + + utility + + + ui + + + utility + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + context + + + context + + + protection + + + protection + + + sdk + + + features + + + hooks\hookers + + + hooks\hookers + + + features + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + ui + + + features + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + features + + + features + + + sdk + + + sdk + + + ui + + + utility + + + features + + + features + + + sdk + + + sdk + + + features + + + features + + + sdk + + + features + + + sdk + + + sdk + + + hooks\hookers + + + features + + + ui + + + features + + + utility + + + resource + + + resource + + + resource + + + resource + + + resource + + + resource + + + utility + + + utility + + + utility + + + sdk + + + features + + + factory + + + sdk + + + sdk\valve + + + ui + + + sdk + + + hooks\hookers + + + hooks\hookers + + + hooks\hookers + + + factory + + + utility + + + \ No newline at end of file diff --git a/cheat/internal_rewrite/is_connected.cpp b/cheat/internal_rewrite/is_connected.cpp new file mode 100644 index 0000000..159d036 --- /dev/null +++ b/cheat/internal_rewrite/is_connected.cpp @@ -0,0 +1,14 @@ +#include "mem.hpp" +#include "hooks.hpp" + +bool __fastcall hooks::is_connected( void* ecx_, void* edx_ ) { + static auto inventory = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 75 04 B0 01 5F" ) ); + static auto is_connected_o = g_csgo.m_engine->get_old_function< decltype( &is_connected ) >( 27 ); + stack_t stack( get_baseptr( ) ); + + if( stack.return_address( ) == inventory && g_settings.misc.unlock_inventory( ) ) + return false; + + + return is_connected_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/lag_mgr.cpp b/cheat/internal_rewrite/lag_mgr.cpp new file mode 100644 index 0000000..0233e4a --- /dev/null +++ b/cheat/internal_rewrite/lag_mgr.cpp @@ -0,0 +1,219 @@ +#include "lag_mgr.hpp" +#include "c_base_player.hpp" +#include "context.hpp" +#include "interface.hpp" +#include "base_cheat.hpp" + +namespace features +{ + void c_lagmgr::on_antiaim( ) { + if( m_sent_ticks ) { + *m_sendpacket = false; + } + } + + bool c_lagmgr::predict_position( float dist ) { + vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); + + auto i = util::get_closest_player( ); + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_valid( ) ) + return true; + + auto wep = ent->get_weapon( ); + if( !wep ) { + return true; + } + + float dmg_begin = g_cheat.m_autowall.run( ent, g_ctx.m_local, local_pos, false ); + bool is_visible = dmg_begin > 10.f; + + if( !is_visible ) { + vec3_t position = local_pos; + + vec3_t velocity_ang = math::vector_angles( vec3_t( ), g_ctx.m_local->m_vecVelocity( ) ); + vec3_t velocity_dir = math::angle_vectors( velocity_ang ); + + //fuck getting pulled back on peek + position += velocity_dir * 20.f; + + float dmg = g_cheat.m_autowall.run( ent, g_ctx.m_local, position, false ); + + if( dmg > 25.f ) + return false; + } + + return true; + } + + void c_lagmgr::fakelag( ) { + //2017 sucked + //i hope 2018 goes better + + if( !g_settings.rage.fakelag.mode( ) || + !g_settings.rage.fakelag.ticks( ) ) { + m_breaking_lc = false; + return; + } + + static float last_rand = 0.f; + + auto& settings = g_settings.rage.fakelag; + + auto weapon = g_ctx.m_local->get_weapon( ); + + if( g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) { + return; + } + + bool moving = g_ctx.m_local->m_vecVelocity( ).length2d( ) > 0.f; + + vec3_t delta = g_ctx.m_last_origin - g_ctx.m_local->m_vecOrigin( ); + int max_ticks = g_settings.rage.fakelag.ticks( ); + if( settings.fluctuate ) + max_ticks *= last_rand; + + static bool changed = false; + static auto cl_sendmove = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "55 8B EC A1 ? ? ? ? 81 EC ? ? ? ? B9 ? ? ? ? 53 8B 98" ), 0 ); + + if( !changed ) { + ulong_t old; + VirtualProtect( ( void* )( cl_sendmove + 0xbd ), 1, PAGE_EXECUTE_READWRITE, &old ); + *( uint8_t* )( cl_sendmove + 0xbd ) = 50; + VirtualProtect( ( void* )( cl_sendmove + 0xbd ), 1, old, nullptr ); + } + + changed = true; + + max_ticks = math::min( max_ticks, 16 ); + + bool force_send = m_held_ticks >= max_ticks; + if( settings.mode == 1 ) { + if( delta.length2dsqr( ) > 4096.f ) { + force_send = get_choked( ) > 3; + } + } + + if( settings.mode == 2 ) { + static bool broken_lc = false; + bool should_send = false; + + if( broken_lc ) { + should_send = math::random_number( 0, 100 ) % 2; + if( get_choked( ) > 1 ) + broken_lc = false; + } + + if( should_send ) + force_send = true; + else if( delta.length2dsqr( ) > 4096.f ) { + force_send = get_choked( ) > 3; + broken_lc = true; + } + } + + bool send = true; + static bool was_onground{ }; + + if( settings.in_move && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) && moving ) { + send = false; + } + + if( settings.on_peek && moving ) { + static int choke_ticks = 0; + + bool peeking = predict_position( 20.f + g_ctx.m_local->m_vecVelocity( ) * TICK_INTERVAL( ) * 2.f ); + bool predicted = predict_position( 20.f ); + + if( !peeking && predicted ) { + choke_ticks = 0; + send = true; + } + else if( !predicted ) + choke_ticks = settings.ticks; + + if( choke_ticks ) { + send = !choke_ticks--; + } + } + + if( settings.in_air && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + send = false; + } + + if( settings.avoid_ground ) { + static int choked = 0; + + if( !was_onground && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + choked = settings.ticks; + } + + if( choked ) + send = !--choked; + } + + if( settings.jump_reset ) { + if( settings.avoid_ground ) { + if( was_onground && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + send = get_choked( ) > 0; + } + } + else { + if( !was_onground && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + send = get_choked( ) > 0; + } + } + } + + was_onground = ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ); + + if( settings.on_duck && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + float amt = g_ctx.m_local->m_flDuckAmount( ); + if( m_cmd->m_buttons & IN_DUCK ) { + if( amt < 1.0f ) + send = false; + } else if( amt > 0.f ) + send = false; + } + + static int wep_choke = 0; + if( wep_choke ) + send = !--wep_choke; + + if( m_cmd->m_weaponselect && settings.on_select ) { + wep_choke = max_ticks; + } + + if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) && + !settings.in_attack ) { + if( !weapon->is_grenade( ) || ( weapon->is_grenade( ) && weapon->m_fThrowTime( ) < TICK_INTERVAL( ) ) ) { + send = get_choked( ) > 0; + } + } + + *m_sendpacket = ( send || force_send ) && !get_sent( ); + if( *m_sendpacket ) { + m_breaking_lc = delta.length2d( ) > 64.f; + last_rand = ( 1.f + math::random_number( -settings.fluctuate, settings.fluctuate( ) ) * 0.01f ); + } + } + + void c_lagmgr::on_cmove_end( ) { + if( !m_sendpacket ) return; + + if( *m_sendpacket ) { + ++m_sent_ticks; + m_held_ticks = 0; + m_has_fired = false; + } + else { + ++m_held_ticks; + m_sent_ticks = 0; + + if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) ) { + m_has_fired = true; + } + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/lag_mgr.hpp b/cheat/internal_rewrite/lag_mgr.hpp new file mode 100644 index 0000000..d495210 --- /dev/null +++ b/cheat/internal_rewrite/lag_mgr.hpp @@ -0,0 +1,65 @@ +#pragma once +#include "sdk.hpp" +#include "settings.hpp" +#include "console.hpp" + +namespace features +{ + class c_lagmgr { + public: + void operator()( user_cmd_t* cmd, byte* sendpacket ) { + if( !sendpacket ) return; + if( !cmd ) return; + + m_cmd = cmd; + m_sendpacket = sendpacket; + + if( g_settings.rage.anti_aim( ) ) { + on_antiaim( ); + } + + //let fakelag override whatever happened in antiaim + //this also means we will call stuff like fakewalk etc + //after this + fakelag( ); + } + + void on_cmove_end( ); + + void set_state( bool state ) { + *m_sendpacket = state; + } + + int get_choked( ) const { + return m_held_ticks; + } + + bool has_fired( ) const { + return m_has_fired; + } + + int get_sent( ) const { + return m_sent_ticks; + } + + bool get_state( ) const { + return m_sendpacket ? !!*m_sendpacket : true; + } + + bool is_breaking_lc( ) const { + return m_breaking_lc; + } + + private: + void on_antiaim( ); + bool predict_position( float dist ); + void fakelag( ); + + user_cmd_t* m_cmd{ }; + byte* m_sendpacket{ }; + int m_sent_ticks{ }; + int m_held_ticks{ }; + bool m_breaking_lc{ }; + bool m_has_fired{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/legitbot.cpp b/cheat/internal_rewrite/legitbot.cpp new file mode 100644 index 0000000..c3c0010 --- /dev/null +++ b/cheat/internal_rewrite/legitbot.cpp @@ -0,0 +1,331 @@ +#include "interface.hpp" +#include "input_system.hpp" +#include "context.hpp" +#include "legitbot.hpp" +#include "settings.hpp" +#include "math.hpp" + +namespace features +{ + int c_legitbot::get_aim_target( float fov ) { + float best_fov = fov ? fov : g_settings.legit.active->m_fov; + int target{ -1 }; + vec3_t aim_angle{ }; + vec3_t cur_angle{ }; + vec3_t local_pos{ }; + vec3_t aim_pos{ }; + + g_csgo.m_engine( )->GetViewAngles( cur_angle ); + local_pos = g_ctx.m_local->get_eye_pos( ); + + for ( int i{ 1 }; i <= g_csgo.m_globals->m_maxclients; ++i ) { + auto entity = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if ( !entity ) continue; + if ( entity == g_ctx.m_local ) continue; + if ( !entity->is_valid( ) ) continue; + int team = entity->m_iTeamNum( ); + if ( team == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.legit.friendlies( ) ) { + continue; + } + + bool visible = entity->is_visible( 0 ); + if( !visible && g_settings.legit.backtracking_target( ) ) { + auto record = m_lagcomp.find_best_record( i ); + if( record ) { + visible = util::trace_ray( local_pos, record->m_position, + g_ctx.m_local->ce( ), entity->ce( ) ); + } + } + + if ( !visible ) { + continue; + } + + aim_angle = math::vector_angles( local_pos, entity->get_hitbox_pos( 0 ) ); + aim_angle.clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if( fov < best_fov ) { + best_fov = fov; + target = i; + } + } + + return target; + } + + void c_legitbot::assist( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t move_ang; + vec3_t view_ang; + vec3_t enemy_pos; + vec3_t local_pos; + vec3_t view_delta; + vec3_t delta; + vec2_t pixels; + + local_pos = g_ctx.m_local->get_eye_pos( ); + enemy_pos = target->get_hitbox_pos( 0 ); + + aim_ang = math::vector_angles( local_pos, enemy_pos ); + aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * g_settings.legit.active->m_rcs; + + move_ang = pixels_to_angle( vec2_t( *x, *y ) ); + g_csgo.m_engine( )->GetViewAngles( view_ang ); + + view_delta = ( aim_ang - view_ang ).clamp( ); + + move_ang *= g_settings.legit.active->m_assist_strength; + float delta_y = std::abs( move_ang.y ); + float delta_x = std::abs( move_ang.x ); + + delta.x = std::clamp( view_delta.x, -delta_x, delta_x ); + delta.y = std::clamp( view_delta.y, -delta_y, delta_y ); + + pixels = angle_to_pixels( delta ); + *x += pixels.x; *y += pixels.y; + } + + void c_legitbot::triggerbot( user_cmd_t* cmd ) { + static float time_at = 0.f; + + if( !g_settings.legit.triggerbot( ) ) + return; + + if( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.trigger_key( ) ) && !time_at ) // sometimes people will let go of their triggerbot key too quickly and will cause them to not shoot. + return; + + vec3_t viewangles{ }; + vec3_t forward{ }; + g_csgo.m_engine( )->GetViewAngles( viewangles ); + + auto wep = g_ctx.m_local->get_weapon( ); + if( !wep ) return; + if( wep->is_knife( ) ) return; + + auto wpn_info = wep->get_wpn_info( ); + if( !wpn_info ) return; + + const float length = wpn_info->range; + const float current_time = TICKS_TO_TIME( g_csgo.m_globals->m_tickcount ); + + if( time_at && abs( current_time - time_at ) > 0.3f ) { + time_at = 0.f; // delta too big + } + + if( length > 1.0f ) { + if( !time_at ) { + viewangles += g_ctx.m_local->m_aimPunchAngle( ) * 2.f; + + forward = math::angle_vectors( viewangles ); + forward *= length; + + vec3_t src = g_ctx.m_local->get_eye_pos( ); + vec3_t dst = src + forward; + + CTraceFilter filter{ }; + CGameTrace tr{ }; + Ray_t ray{ }; + + filter.pSkip = g_ctx.m_local; + ray.Init( src, dst ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); + + if( tr.m_pEnt ) { + auto ent = tr.m_pEnt->as< c_base_player >( ); + if( ent->is_valid( ) ) { + if( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.legit.friendlies ) { + time_at = current_time; + } + } + } + } + + if( time_at ) { + if( ( current_time - time_at ) >= g_settings.legit.trigger_delay( ) ) { + cmd->m_buttons |= IN_ATTACK; + time_at = 0.f; + } + } + } + } + + void c_legitbot::sample_angle_data( const vec3_t& cur_angles ) { + auto time = g_csgo.m_globals->m_curtime; + + if ( !m_aiming ) { + m_angle_samples.push_front( { cur_angles, time } ); + } + + while ( m_angle_samples.size( ) > g_settings.legit.sample_size( ) ) { + m_angle_samples.pop_back( ); + } + } + + float c_legitbot::get_avg_delta( ) { + if ( m_angle_samples.empty( ) ) + return 0.f; + + float avg_delta{ }; + + for ( auto& it : m_angle_samples ) { + static vec3_t last_angle = it.m_viewangles; + + //doing this implements nonsticky aswell + //once you already are at the target + //after lets say a flick + //it will reduce the aim speed + //making it not "stick" to the bone + //as we dont store records when aiming + float time_delta = g_csgo.m_globals->m_curtime - it.m_time; + float delta_diff = m_deltatime / ( time_delta * 2.f ); + + vec3_t angle_delta = ( last_angle - it.m_viewangles ).clamp( ); + float delta_length = angle_delta.length( ) * delta_diff; + + avg_delta += delta_length; + last_angle = it.m_viewangles; + } + + //scale the delta down + return avg_delta / float( g_settings.legit.sample_size( ) ); + } + + vec2_t c_legitbot::angle_to_pixels( const vec3_t& angle ) { + static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = angle.x / m_pitch->get_float( ); + float y = angle.y / m_yaw->get_float( ); + + return vec2_t( -y, x ); + } + + vec3_t c_legitbot::pixels_to_angle( const vec2_t& pixel ) { + static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = pixel.x * m_pitch->get_float( ); + float y = pixel.y * m_yaw->get_float( ); + + return vec3_t( -y, x, 0.f ).clamp( ); + } + + bool c_legitbot::update_settings( ) { + if ( !g_ctx.run_frame( ) ) return false; + + auto weapon = g_ctx.m_local->get_weapon( ); + if ( !weapon ) return false; + + if ( weapon->is_grenade( ) || weapon->is_knife( ) ) { + return false; + } + + if ( weapon->is_rifle( ) ) { + g_settings.legit.active = &g_settings.legit.rifles; + } + else if ( weapon->is_sniper( ) ) { + g_settings.legit.active = &g_settings.legit.snipers; + } + else if ( weapon->is_pistol( ) ) { + g_settings.legit.active = &g_settings.legit.pistols; + } + else { + g_settings.legit.active = &g_settings.legit.general; + } + + return true; + } + + void c_legitbot::aim_at_target( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t cur_ang; + vec3_t delta; + vec2_t pixels; + vec2_t mouse; + + g_csgo.m_engine( )->GetViewAngles( cur_ang ); + + if ( g_settings.legit.backtracking( ) && m_lagcomp.find_best_record( target->ce( )->GetIndex( ) ) ) { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + m_lagcomp.get_backtracked_position( target->ce( )->GetIndex( ) ) ).clamp( ); + } + else { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + target->get_hitbox_pos( 0 ) ).clamp( ); + } + + aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * ( g_settings.legit.active->m_rcs / 100.f ); + + delta = ( aim_ang - cur_ang ).clamp( ); + float delta_length = delta.length( ); + + if ( delta_length ) { + float final_time = delta_length / ( g_settings.legit.active->m_speed( ) / 100.f ); + m_curtime += m_deltatime; + + if ( m_curtime > final_time ) { + m_curtime = final_time; + } + + float aim_progress = m_curtime / final_time; + delta *= aim_progress; + aim_ang = delta; + + pixels = angle_to_pixels( delta ); + *x += pixels.x; + *y += pixels.y; + } + } + + void c_legitbot::aimbot( float* x, float* y ) { + if ( !g_settings.legit.enabled( ) ) return; + if ( !update_settings( ) ) return; + + m_aiming = false; + static float old_time = g_csgo.m_globals->m_curtime; + float time = g_csgo.m_globals->m_curtime; + + m_deltatime = time - old_time; + if ( g_settings.legit.dynamic_smoothing( ) ) { + float avg_delta = get_avg_delta( ) * g_settings.legit.smooth_factor( ); + if ( avg_delta > m_deltatime ) { + m_deltatime = avg_delta; + } + } + + old_time = time; + + bool in_attack = false; + if ( g_settings.legit.activation_type == 0 ) + in_attack = true; + if ( g_settings.legit.activation_type == 1 + && g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) { + in_attack = true; + } + if( g_settings.legit.trigger_magnet + && g_settings.legit.triggerbot + && g_input.is_key_pressed( g_settings.legit.trigger_key ) ) { + in_attack = true; + } + + int target_index = get_aim_target( ); + auto target = g_csgo.m_entlist( )->GetClientEntity< >( target_index ); + + if ( target_index != -1 ) { + if( in_attack ) { + m_aiming = true; + aim_at_target( target, x, y ); + } + if( g_settings.legit.assist ) { + assist( target, x, y ); + } + } + else { + m_curtime = 0; + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/legitbot.hpp b/cheat/internal_rewrite/legitbot.hpp new file mode 100644 index 0000000..f543fd4 --- /dev/null +++ b/cheat/internal_rewrite/legitbot.hpp @@ -0,0 +1,75 @@ +#pragma once +#include +#include + +#include "sdk.hpp" + +namespace features +{ + class c_legitbot { + public: + void operator()( float* x, float* y ) { + aimbot( x, y ); + } + + //call once per tick + void sample_angle_data( const vec3_t& angle ); + void triggerbot( user_cmd_t* cmd ); + private: + struct aim_record_t { + vec3_t m_viewangles; + float m_time; + }; + + struct lag_record_t { + int m_tickcount{ }; + vec3_t m_position{ }; + matrix3x4 m_matrix[ 128 ]{ }; + + bool is_valid( ); + }; + + class c_lagcomp { + public: + friend class c_legitbot; + using lag_deque_t = std::deque< lag_record_t >; + + lag_record_t* find_best_record( int ent_index ); + vec3_t get_backtracked_position( int ent_index ); + auto& get_records( int ent_index ) { + return m_data[ ent_index ]; + } + + void store( ); + void operator()( user_cmd_t* cmd ); + + private: + bool backtrack_entity( int ent_index ); + bool can_backtrack_entity( int ent_index ); + void store_player( int ent_index ); + + lag_deque_t m_data[ 65 ]; + user_cmd_t* m_cmd; + }; + + vec2_t angle_to_pixels( const vec3_t& angle ); + vec3_t pixels_to_angle( const vec2_t& pixel ); + void aimbot( float* x, float* y ); + void assist( c_base_player* player, float* x, float* y ); + void aim_at_target( c_base_player*, float*, float* ); + + bool update_settings( ); + float get_avg_delta( ); + int get_aim_target( float fov = 0.f ); + + private: + float m_deltatime{ }; + float m_curtime{ }; + bool m_aiming{ }; + + std::deque< aim_record_t > m_angle_samples; + + public: + c_lagcomp m_lagcomp; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/legitbot_lagcomp.cpp b/cheat/internal_rewrite/legitbot_lagcomp.cpp new file mode 100644 index 0000000..c80bcbd --- /dev/null +++ b/cheat/internal_rewrite/legitbot_lagcomp.cpp @@ -0,0 +1,155 @@ +#include "legitbot.hpp" +#include "interface.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "math.hpp" +#include "base_cheat.hpp" +#include "input_system.hpp" +#include "d3d.hpp" + +namespace features +{ + bool c_legitbot::lag_record_t::is_valid( ) { + return util::is_tick_valid( m_tickcount ); + } + + void c_legitbot::c_lagcomp::store_player( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + vec3_t pos = ent->get_hitbox_pos( 0 ); + int tickcount = TIME_TO_TICKS( ent->m_flSimulationTime( ) ); + + lag_record_t new_record; + if ( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { + new_record.m_position = pos; + new_record.m_tickcount = tickcount; + + m_data[ ent_index ].push_front( new_record ); + } + + while ( !m_data[ ent_index ].empty( ) && + ( m_data[ ent_index ].size( ) > TIME_TO_TICKS( 1.0f ) ) ) { + m_data[ ent_index ].pop_back( ); + } + } + + bool c_legitbot::c_lagcomp::can_backtrack_entity( int ent_index ) { + if ( m_data[ ent_index ].empty( ) ) { + return false; + } + + for( auto& it : m_data[ ent_index ] ) { + if( it.is_valid( ) ) return true; + } + + return false; + } + + c_legitbot::lag_record_t* c_legitbot::c_lagcomp::find_best_record( int ent_index ) { + c_legitbot::lag_record_t* best_record = nullptr; + float best_fov{ g_settings.legit.backtracking_fov( ) }; + vec3_t cur_angle; + vec3_t aim_angle; + vec3_t aim_pos; + vec3_t cur_pos; + int cur_tick; + + if( m_data[ ent_index ].empty( ) ) { + return nullptr; + } + + if( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) { + best_fov = 360.f; + } + + g_csgo.m_engine( )->GetViewAngles( cur_angle ); + cur_pos = g_ctx.m_local->get_eye_pos( ); + cur_tick = g_csgo.m_globals->m_tickcount; + + for( auto& it : m_data[ ent_index ] ) { + int delta = std::abs( cur_tick - it.m_tickcount ); + + if( !( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) ) { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float max_latency = g_settings.legit.backtracking_time + nci->GetLatency( 0 ); + if( delta > TIME_TO_TICKS( max_latency ) ) + continue; + } + } + + if( !it.is_valid( ) ) + continue; + + aim_pos = it.m_position; + aim_angle = math::vector_angles( cur_pos, aim_pos ).clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if ( fov < best_fov ) { + best_fov = fov; + best_record = ⁢ + } + } + + return best_record; + } + + vec3_t c_legitbot::c_lagcomp::get_backtracked_position( int ent_index ) { + if( !m_data[ ent_index ].size( ) ) return vec3_t( ); + auto lag_record = find_best_record( ent_index ); + + vec3_t last_position{ }; + for( auto& it : util::reverse_iterator( m_data[ ent_index ] ) ) { + if( it.is_valid( ) ) last_position = it.m_position; break; + } + + return lag_record ? lag_record->m_position : last_position; + } + + void c_legitbot::c_lagcomp::store( ) { + for ( int i = 1; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if ( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { + store_player( i ); + } + else { + m_data[ i ].clear( ); + } + } + } + + bool c_legitbot::c_lagcomp::backtrack_entity( int ent_index ) { + if ( !m_cmd ) return false; + + if ( !can_backtrack_entity( ent_index ) ) return false; + + auto best_record = find_best_record( ent_index ); + + if ( best_record ) { + m_cmd->m_tick_count = best_record->m_tickcount; + return true; + } + + return false; + } + + void c_legitbot::c_lagcomp::operator()( user_cmd_t* cmd ) { + if ( !g_settings.legit.enabled( ) || !g_settings.legit.backtracking( ) ) + return; + + m_cmd = cmd; + store( ); + + auto target = g_cheat.m_legitbot.get_aim_target( g_settings.legit.backtracking_fov( ) ); + bool active = false; + + if ( g_settings.legit.activation_type( ) == 0 ) + active = true; + if ( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) + active = true; + + if ( active && target != -1 ) { + backtrack_entity( target ); + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/level_init_pre_entity.cpp b/cheat/internal_rewrite/level_init_pre_entity.cpp new file mode 100644 index 0000000..c4d8c38 --- /dev/null +++ b/cheat/internal_rewrite/level_init_pre_entity.cpp @@ -0,0 +1,18 @@ +#include "hooks.hpp" +#include "chams.hpp" +#include "base_cheat.hpp" + +void __fastcall hooks::level_init_pre_entity( void* ecx_, void* edx_, const char* map_name ) { + static auto original_fn = g_csgo.m_chl->get_old_function< decltype( &level_init_pre_entity ) >( 5 ); + + bool has_level_initialized = **( bool** )( ( uintptr_t )original_fn + 8 ); + + // obviously source engine is perfect + // "HACK: Bogus, but the logic is too complicated in the engine" + + if( !has_level_initialized ) { + //g_cheat.m_chams.m_materials.initialize_materials( ); + } + + return original_fn( ecx_, edx_, map_name ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/listener.cpp b/cheat/internal_rewrite/listener.cpp new file mode 100644 index 0000000..eb5caf4 --- /dev/null +++ b/cheat/internal_rewrite/listener.cpp @@ -0,0 +1,239 @@ +#include "listener.hpp" +#include "interface.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +#undef PlaySound + +generic_listener_t::generic_listener_t( const char* name, void( *function )( IGameEvent* ) ) : + m_function( function ), m_name( name ) { } + +generic_listener_t::~generic_listener_t( ) { + if( m_registered ) + g_csgo.m_event_mgr( )->RemoveListener( this ); + +} + +void generic_listener_t::init( ) { + g_csgo.m_event_mgr( )->AddListener( this, m_name, false ); + m_registered = true; +} + +namespace listeners +{ + void weapon_fire( IGameEvent* e ) { + if( !g_csgo.m_panic && e ) { + int userid = e->GetInt( xors( "userid" ) ); + if( g_csgo.m_engine( )->GetPlayerForUserID( userid ) == g_csgo.m_engine( )->GetLocalPlayer( ) ) { + auto wep = e->GetString( xors( "weapon" ) ); + + if( !strstr( wep, xors( "knife" ) ) && !strstr( wep, xors( "taser" ) ) && !strstr( wep, xors( "molotov" ) ) && !strstr( wep, xors( "grenade" ) ) && !strstr( wep, xors( "flashbang" ) ) ) { + g_ctx.m_last_shot_ack++; + g_ctx.m_last_shot_ack %= 128; + + auto m_last_shot = g_ctx.m_last_shot_ack; + auto m_shot_data = g_ctx.m_shot_data; + + auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack ]; + if( shot.m_enemy_index && shot.m_resolver_state ) { + //g_cheat.m_ragebot.m_resolver->increment_shots( shot.m_enemy_index ); + } + } + } + } + } + + void bullet_impact( IGameEvent* e ) { + if( !g_csgo.m_panic && e ) { + static float last_time = g_csgo.m_globals->m_curtime; + float x = e->GetFloat( xors( "x" ) ); + float y = e->GetFloat( xors( "y" ) ); + float z = e->GetFloat( xors( "z" ) ); + int user_id = e->GetInt( xors( "userid" ) ); + int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); + + vec3_t impact{ x, y, z }; + if( player_id == g_csgo.m_engine( )->GetLocalPlayer( ) ) { + g_cheat.m_visuals.store_shot( impact, true ); + + if( g_ctx.m_last_shot_ack > g_ctx.m_last_shot ) { + g_ctx.reset_shot_queue( ); + } + + auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack ]; + + if( shot.m_enemy_index && !shot.m_handled ) { + vec3_t ang = math::vector_angles( shot.m_local_pos, impact ); + vec3_t dir = math::angle_vectors( ang ); + //csgo is gay + dir *= 8192.f; + + vec3_t pos = shot.m_local_pos; + + bool intersect = util::intersects_hitbox( pos, dir, shot.m_hitbox.min * 1.05f, shot.m_hitbox.max * 1.05f, shot.m_hitbox.radius * 1.05f ); + + if( !intersect ) { + if( shot.m_enemy_index ) { + g_cheat.m_ragebot.m_resolver->on_missed_spread( shot.m_enemy_index, g_ctx.m_last_shot_ack ); + shot.m_missed = true; + } + } + else { + if( shot.m_resolver_state ) { + //g_cheat.m_ragebot.m_resolver->increment_shots( shot.m_enemy_index ); + } + + shot.m_missed = false; + } + shot.m_handled = true; + } + } + + if( g_settings.visuals.bullet_tracers( ) && last_time != g_csgo.m_globals->m_curtime ) { + g_cheat.m_visuals.store_tracer( player_id, vec3_t( x, y, z ) ); + } + + last_time = g_csgo.m_globals->m_curtime; + } + } + + void player_hurt( IGameEvent* e ) { + if( !g_csgo.m_panic && e ) { + + int user_id = e->GetInt( xors( "userid" ) ); + int attacker = e->GetInt( xors( "attacker" ) ); + int hitgroup = e->GetInt( xors( "hitgroup" ) ); + int dmg = e->GetInt( xors( "dmg_health" ) ); + int hp = e->GetInt( xors( "health" ) ); + int attacker_id = g_csgo.m_engine( )->GetPlayerForUserID( attacker ); + int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); + + g_cheat.m_visuals.store_ent_dmg( attacker_id, player_id, dmg ); + if( attacker_id == g_csgo.m_engine( )->GetLocalPlayer( ) && user_id != attacker_id ) { + g_cheat.m_visuals.store_hit( ); + + auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack % 128 ]; + + if( shot.m_hitgroup == hitgroup && shot.m_resolver_state && !shot.m_missed && hitgroup != HITGROUP_GENERIC ) { + g_cheat.m_ragebot.m_resolver->listener( player_id, g_ctx.m_last_shot_ack ); + } + + if( shot.m_enemy_index && hitgroup != HITGROUP_GENERIC ) { + shot.m_hit = hitgroup; + shot.m_handled = true; + shot.m_logged = false; + shot.m_damage = dmg; + } + else if( g_settings.misc.log_hits( ) ) { + char print_str[ 100 ]; + sprintf_s( print_str, "[\3moneybot\1] hit player in %s for %d", util::hitgroup_to_string( hitgroup ).c_str( ), dmg ); + + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, print_str ); + g_con->game_console_print( "%s\n", print_str ); + } + + if( shot.m_enemy_index ) { + g_cheat.m_visuals.store_hit( &shot ); + //g_cheat.m_visuals.store_shot( shot.m_enemy_pos, true ); + } + } + } + } + + void round_start( IGameEvent* e ) { + g_cheat.m_visuals.on_round_start( ); + + if( g_ctx.run_frame( ) ) { + switch( g_settings.misc.autobuy.main_weapon ) { + case 1: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy g3sg1" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy scar20" ) ); + break; + case 2: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg08" ) ); + break; + case 3: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy awp" ) ); + break; + case 4: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ak47" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy m4a1" ) ); + break; + case 5: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg556" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy aug" ) ); + break; + case 6: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mac10" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mp9" ) ); + break; + } + + switch( g_settings.misc.autobuy.secondary_weapon ) { + case 1: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy deagle" ) ); + break; + case 2: + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy elite" ) ); + break; + } + + if( g_ctx.m_local->m_iAccount( ) > 1000 ) { + if( g_settings.misc.autobuy.armor( ) ) { + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vest" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vesthelm" ) ); + } + + if( g_settings.misc.autobuy.zeus( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy taser 34" ) ); + + + if( g_settings.misc.autobuy.defuser( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy defuser" ) ); + + + if( g_settings.misc.autobuy.molly( ) ) { + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy molotov" ) ); + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy incgrenade" ) ); + } + + if( g_settings.misc.autobuy.smoke( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy smokegrenade" ) ); + + + if( g_settings.misc.autobuy.grenade( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy hegrenade" ) ); + + + if( g_settings.misc.autobuy.flash( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); + + + if( g_settings.misc.autobuy.decoy( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy decoy" ) ); + + + if( g_settings.misc.autobuy.flash( ) ) + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); + } + } + } + + void molotov_detonate( IGameEvent* e ) { + //1 line pro + float x = e->GetFloat( xors( "x" ) ); + float y = e->GetFloat( xors( "y" ) ); + float z = e->GetFloat( xors( "z" ) ); + if( !( x && y && z ) ) + return; + + vec3_t pos{ x, y, z }; + auto thrower = g_csgo.m_engine( )->GetPlayerForUserID( e->GetInt( xors( "userid" ) ) ); + g_cheat.m_visuals.store_firegrenades( thrower, pos ); + + } + + void player_death( IGameEvent *evt ) { + g_cheat.m_extra.money_talk( evt ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/listener.hpp b/cheat/internal_rewrite/listener.hpp new file mode 100644 index 0000000..5e18879 --- /dev/null +++ b/cheat/internal_rewrite/listener.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "sdk.hpp" + +struct generic_listener_t : public IGameEventListener2 { + generic_listener_t( const char* event_name, + void( *function )( IGameEvent* ) ); + + generic_listener_t( ) = default; + + ~generic_listener_t( ); + + void init( ); + + void FireGameEvent( IGameEvent* event ) override { m_function( event ); } + int GetEventDebugID( ) override { return 0x2a; } +private: + void( *m_function )( IGameEvent* ); + const char* m_name{ }; + bool m_registered{ }; +}; + +namespace listeners { + extern void bullet_impact( IGameEvent* e ); + extern void player_hurt( IGameEvent* e ); + extern void round_start( IGameEvent* e ); + extern void molotov_detonate( IGameEvent* e ); + extern void weapon_fire( IGameEvent* e ); + extern void player_death( IGameEvent *e ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/lock_cursor.cpp b/cheat/internal_rewrite/lock_cursor.cpp new file mode 100644 index 0000000..6edb52a --- /dev/null +++ b/cheat/internal_rewrite/lock_cursor.cpp @@ -0,0 +1,10 @@ +#include "hooks.hpp" + +void __fastcall hooks::lock_cursor( void* ecx_, void* edx_ ) { + if( g_settings.menu.open || g_con->m_open ) { + g_csgo.m_surface( )->UnlockCursor( ); + return; + } + + lock_cursor_o( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/match_framework.h b/cheat/internal_rewrite/match_framework.h new file mode 100644 index 0000000..f63efb1 --- /dev/null +++ b/cheat/internal_rewrite/match_framework.h @@ -0,0 +1,23 @@ +#pragma once +#pragma once +#include "util.hpp" +#include "KeyValues.hpp" + +class CMatchSessionOnlineHost { +public: + KeyValues* GetSessionSettings( ) { + using fn = KeyValues* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 1 )( this ); + } + void UpdateSessionSettings( KeyValues* packet ) { + util::get_vfunc< 2, void >( this, packet ); + } +}; + +class CMatchFramework { +public: + CMatchSessionOnlineHost* GetMatchSession( ) { + using fn = CMatchSessionOnlineHost* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 13 )( this ); + } +}; diff --git a/cheat/internal_rewrite/materialsystem_config.cpp b/cheat/internal_rewrite/materialsystem_config.cpp new file mode 100644 index 0000000..102d09b --- /dev/null +++ b/cheat/internal_rewrite/materialsystem_config.cpp @@ -0,0 +1,10 @@ +#include "hooks.hpp" +#include "settings.hpp" + +bool __fastcall hooks::material_system( void* ecx, void* edx, IMaterialSystem_Config_t* config, bool forceupdate ) { + static auto original_fn = material_system_o; + + config->m_fullbright = g_settings.visuals.fullbright( ); + + return original_fn( ecx, edx, config, forceupdate ); +} diff --git a/cheat/internal_rewrite/math.cpp b/cheat/internal_rewrite/math.cpp new file mode 100644 index 0000000..79389a9 --- /dev/null +++ b/cheat/internal_rewrite/math.cpp @@ -0,0 +1,301 @@ +#include +#include "math.hpp" +#include "interface.hpp" + +using _m128 = __m128; + +namespace math +{ + uint32_t md5_pseudorandom( uint32_t seed ) { + using fn = uint32_t( __thiscall * )( uint32_t seed ); + + static auto func = pattern::first_code_match< fn >( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 70 6A 58" ) ); + if( !func ) { + return 0; + } + + return func( seed ); + } + + static const __declspec( align( 16 ) ) uint32_t g_simd_component_mask[ 4 ][ 4 ] = { + { INT_MAX, 0, 0, 0 }, + { 0, INT_MAX, 0, 0 }, + { 0, 0, INT_MAX, 0 }, + { 0, 0, 0, INT_MAX } + }; + + void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ) { + //SSE concat transforms - turbo mode engaged + + _m128 last_mask = *( _m128* )( &g_simd_component_mask[ 3 ] ); + _m128 row_a0 = _mm_loadu_ps( in[ 0 ] ); + _m128 row_a1 = _mm_loadu_ps( in[ 1 ] ); + _m128 row_a2 = _mm_loadu_ps( in[ 2 ] ); + + _m128 row_b0 = _mm_loadu_ps( in2[ 0 ] ); + _m128 row_b1 = _mm_loadu_ps( in2[ 1 ] ); + _m128 row_b2 = _mm_loadu_ps( in2[ 2 ] ); + + _m128 a0 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 0, 0, 0, 0 ) ); + _m128 a1 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 1, 1, 1, 1 ) ); + _m128 a2 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 2, 2, 2, 2 ) ); + + _m128 mul00 = _mm_mul_ps( a0, row_b0 ); + _m128 mul01 = _mm_mul_ps( a1, row_b1 ); + _m128 mul02 = _mm_mul_ps( a2, row_b2 ); + _m128 out0 = _mm_add_ps( mul00, _mm_add_ps( mul01, mul02 ) ); + + a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); + a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); + a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); + + _m128 mul10 = _mm_mul_ps( a0, row_b0 ); + _m128 mul11 = _mm_mul_ps( a1, row_b1 ); + _m128 mul12 = _mm_mul_ps( a2, row_b2 ); + _m128 out1 = _mm_add_ps( mul10, _mm_add_ps( mul11, mul12 ) ); + + a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); + a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); + a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); + + _m128 mul20 = _mm_mul_ps( a0, row_b0 ); + _m128 mul21 = _mm_mul_ps( a0, row_b1 ); + _m128 mul22 = _mm_mul_ps( a0, row_b2 ); + _m128 out2 = _mm_add_ps( mul20, _mm_add_ps( mul21, mul22 ) ); + + a0 = _mm_and_ps( row_a0, last_mask ); + a1 = _mm_and_ps( row_a1, last_mask ); + a2 = _mm_and_ps( row_a2, last_mask ); + + out0 = _mm_add_ps( out0, a0 ); + out1 = _mm_add_ps( out1, a1 ); + out2 = _mm_add_ps( out2, a2 ); + + *( _m128* )( out[ 0 ] ) = out0; + *( _m128* )( out[ 1 ] ) = out1; + *( _m128* )( out[ 2 ] ) = out2; + } + + void math::set_matrix_position( vec3_t pos, matrix3x4& matrix ) { + for( size_t i{ }; i < 3; ++i ) { + matrix[ i ][ 3 ] = pos[ i ]; + } + } + + vec3_t math::get_matrix_position( const matrix3x4& src ) { + return vec3_t( src[ 0 ][ 3 ], src[ 1 ][ 3 ], src[ 2 ][ 3 ] ); + } + + void angle_matrix( vec3_t angles, matrix3x4& matrix ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + matrix[ 0 ][ 0 ] = cp * cy; + matrix[ 1 ][ 0 ] = cp * sy; + matrix[ 2 ][ 0 ] = -sp; + + float crcy = cr * cy; + float crsy = cr * sy; + float srcy = sr * cy; + float srsy = sr * sy; + matrix[ 0 ][ 1 ] = sp * srcy - crsy; + matrix[ 1 ][ 1 ] = sp * srsy + crcy; + matrix[ 2 ][ 1 ] = sr * cp; + + matrix[ 0 ][ 2 ] = ( sp*crcy + srsy ); + matrix[ 1 ][ 2 ] = ( sp*crsy - srcy ); + matrix[ 2 ][ 2 ] = cr * cp; + + matrix[ 0 ][ 3 ] = 0.f; + matrix[ 1 ][ 3 ] = 0.f; + matrix[ 2 ][ 3 ] = 0.f; + } + + void angle_imatrix( vec3_t angles, matrix3x4& matrix ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + matrix[ 0 ][ 0 ] = cp * cy; + matrix[ 0 ][ 1 ] = cp * sy; + matrix[ 0 ][ 2 ] = -sp; + matrix[ 1 ][ 0 ] = sr * sp*cy + cr * -sy; + matrix[ 1 ][ 1 ] = sr * sp*sy + cr * cy; + matrix[ 1 ][ 2 ] = sr * cp; + matrix[ 2 ][ 0 ] = ( cr*sp*cy + -sr * -sy ); + matrix[ 2 ][ 1 ] = ( cr*sp*sy + -sr * cy ); + matrix[ 2 ][ 2 ] = cr * cp; + matrix[ 0 ][ 3 ] = 0.f; + matrix[ 1 ][ 3 ] = 0.f; + matrix[ 2 ][ 3 ] = 0.f; + } + + void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ) { + angle_matrix( angles, matrix ); + set_matrix_position( origin, matrix ); + } + + vec3_t matrix_angles( const matrix3x4& matrix ) { + //thx strackoverflow + vec3_t angles; + float forward[ 3 ]; + float left[ 3 ]; + float up[ 3 ]; + + forward[ 0 ] = matrix[ 0 ][ 0 ]; + forward[ 1 ] = matrix[ 1 ][ 0 ]; + forward[ 2 ] = matrix[ 2 ][ 0 ]; + left[ 0 ] = matrix[ 0 ][ 1 ]; + left[ 1 ] = matrix[ 1 ][ 1 ]; + left[ 2 ] = matrix[ 2 ][ 1 ]; + up[ 2 ] = matrix[ 2 ][ 2 ]; + + float xy_dist = sqrtf( forward[ 0 ] * forward[ 0 ] + forward[ 1 ] * forward[ 1 ] ); + + if( xy_dist > 0.001f ) { + angles.y = RAD2DEG( atan2f( forward[ 1 ], forward[ 0 ] ) ); + angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); + angles.z = RAD2DEG( atan2f( left[ 2 ], up[ 2 ] ) ); + } + else { + angles.y = RAD2DEG( atan2f( -left[ 0 ], left[ 1 ] ) ); + angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); + + angles.z = 0; + } + + return angles; + } + + void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ) { + angles.y += degrees; + angles.clamp( ); + + vec3_t rotated( 0, degrees, 0 ); + matrix3x4 rotated_matrix; + angle_matrix( rotated, rotated_matrix ); + + vec3_t delta = get_matrix_position( matrix ) - origin; + vec3_t out = vector_transform( delta, rotated_matrix ); + + matrix3x4 bone_rotation, matrix_out; + memcpy( &bone_rotation, &matrix, sizeof( matrix3x4 ) ); + + set_matrix_position( vec3_t( ), bone_rotation ); + concat_transforms( rotated_matrix, bone_rotation, matrix_out ); + auto angles_out = matrix_angles( matrix_out ); + angle_matrix( angles_out, matrix, out ); + } + + float approach_angle( float to, float from, float speed ) { + float delta = std::remainderf( to - from, 360.f ); + + if( delta > speed ) + from += speed; + else if( delta < -speed ) + from -= speed; + else from = to; + + return std::clamp( from, -180.f, 180.f ); + } + + float snap_yaw( float value ) { + //this is actually what the code looks like in the game btw + float sign = 1.0f; + if( value < 0.0f ) { + sign = -1.0f; + value = -value; + } + + if( value < 23.0f ) + value = 0.0f; + else if( value < 67.0f ) + value = 45.0f; + else if( value < 113.0f ) + value = 90.0f; + else if( value < 157 ) + value = 135.0f; + else + value = 180.0f; + + return ( value * sign ); + } + + float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ) { + vec3_t u = s2 - s1; + vec3_t v = k2 - k1; + vec3_t w = s1 - k1; + float a = u.dot( u ); + float b = u.dot( v ); + float c = v.dot( v ); + float d = u.dot( w ); + float e = v.dot( w ); + float D = a*c - b*b; + float sc, sN, sD = D; + float tc, tN, tD = D; + + if( D < SMALL_NUM ) { + sN = 0.0f; + sD = 1.0f; + tN = e; + tD = c; + } + else { + sN = ( b*e - c*d ); + tN = ( a*e - b*d ); + if( sN < 0.0f ) { + sN = 0.0f; + tN = e; + tD = c; + } + else if( sN > sD ) { + sN = sD; + tN = e + b; + tD = c; + } + } + + if( tN < 0.0f ) { + tN = 0.0; + + if( -d < 0.0f ) + sN = 0.0; + else if( -d > a ) + sN = sD; + else { + sN = -d; + sD = a; + } + } + else if( tN > tD ) { + tN = tD; + + if( ( -d + b ) < 0.0f ) + sN = 0; + else if( ( -d + b ) > a ) + sN = sD; + else { + sN = ( -d + b ); + sD = a; + } + } + + sc = ( abs( sN ) < SMALL_NUM ? 0.0f : sN / sD ); + tc = ( abs( tN ) < SMALL_NUM ? 0.0f : tN / tD ); + + vec3_t dP = w + ( u * sc ) - ( v * tc ); + + return dP.length(); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/math.hpp b/cheat/internal_rewrite/math.hpp new file mode 100644 index 0000000..b965600 --- /dev/null +++ b/cheat/internal_rewrite/math.hpp @@ -0,0 +1,164 @@ +#pragma once +#include +#include "util.hpp" +#include "pattern.hpp" +#include "sdk.hpp" + +static constexpr long double M_PI = 3.14159265358979323846f; +static constexpr long double M_RADPI = 57.295779513082f; +static constexpr long double M_PIRAD = 0.01745329251f; +static constexpr float SMALL_NUM = 0.00000001f; +static constexpr float M_PI_F = ( ( float )( M_PI ) ); +__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } +__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } + +namespace { + //make a random generator and seed it with a p random number + static std::random_device rd; + static std::mt19937 gen( rd( ) ); +} + +NAMESPACE_REGION( math ) + +#undef min +#undef max + +template < typename t > +t min( const t& t1, const t& t2 ) { + return t1 < t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t min( const t& t1, const t& t2, ts_&&... ts ) { + return t1 < t2 ? + min( t1, std::forward< ts_ >( ts )... ) : + min( t2, std::forward< ts_ >( ts )... ); +} + +template < typename t > +t max( const t& t1, const t& t2 ) { + return t1 > t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t max( const t& t1, const t& t2, ts_&&... ts ) { + return t1 > t2 ? + max( t1, std::forward< ts_ >( ts )... ) : + max( t2, std::forward< ts_ >( ts )... ); +} + +template < typename t > +t lerp( const t& t1, const t& t2, float progress ) { + return t1 + ( t2 - t1 ) * progress; +} + +// todo - dex; make 2 random generator funcs here, this one only works for floats normally + +template < typename t > +__forceinline t random_number( t min, t max ) { + if constexpr( !std::is_integral_v< t > ) { + std::uniform_real_distribution< t > dist( min, max ); + return dist( gen ); + } + else { + std::uniform_int_distribution< t > dist( min, max ); + return dist( gen ); + } +} + +__forceinline vec3_t get_rotated_pos( vec3_t start, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + start.x += cos( rad ) * distance; + start.y += sin( rad ) * distance; + + return start; +} + +__forceinline vec3_t vector_angles( const vec3_t& start, const vec3_t& end ) { + vec3_t delta = end - start; + + float magnitude = sqrtf( delta.x * delta.x + delta.y * delta.y ); + float pitch = atan2f( -delta.z, magnitude ) * M_RADPI; + float yaw = atan2f( delta.y, delta.x ) * M_RADPI; + + vec3_t angle( pitch, yaw, 0.0f ); + return angle.clamp( ); +} + + +__forceinline vec3_t vector_angles( const vec3_t& v ) { + float magnitude = sqrtf( v.x * v.x + v.y * v.y ); + float pitch = atan2f( -v.z, magnitude ) * M_RADPI; + float yaw = atan2f( v.y, v.x ) * M_RADPI; + + vec3_t angle( pitch, yaw, 0.0f ); + return angle; +} + +__forceinline vec3_t angle_vectors( const vec3_t& angles ) { + float sp, sy, cp, cy; + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + + return vec3_t{ cp * cy, cp * sy, -sp }; +} + +__forceinline void angle_vectors( const vec3_t& angles, vec3_t* forward, vec3_t* right, vec3_t* up ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + if ( forward ) { + forward->x = cp * cy; + forward->y = cp * sy; + forward->z = -sp; + } + + if ( right ) { + right->x = -1 * sr * sp * cy + -1 * cr * -sy; + right->y = -1 * sr * sp * sy + -1 * cr * cy; + right->z = -1 * sr * cp; + } + + if ( up ) { + up->x = cr * sp * cy + -sr * -sy; + up->y = cr * sp * sy + -sr * cy; + up->z = cr * cp; + } +} + +__forceinline float find_closest_step( float angle, float step ) { + int steps = ( int )( angle / step + 0.5f ); + + return steps * step; +} + +__forceinline vec3_t vector_transform( const vec3_t& in, const matrix3x4& matrix ) { + vec3_t out; + for ( int i{ }; i < 3; i++ ) + out[ i ] = in.dot( ( const vec3_t& )matrix[ i ] ) + matrix[ i ][ 3 ]; + + return out; +} + +extern void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ); +extern void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ); +extern void set_matrix_position( vec3_t pos, matrix3x4& src ); +extern vec3_t get_matrix_position( const matrix3x4& pos ); +extern vec3_t matrix_angles( const matrix3x4& matrix ); +extern void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ); +extern void angle_imatrix( vec3_t angles, matrix3x4& matrix ); +extern void angle_matrix( vec3_t angles, matrix3x4& matrix ); +extern float approach_angle( float to, float from, float speed ); +extern float snap_yaw( float value ); +extern uint32_t md5_pseudorandom( uint32_t seed ); +extern float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ); + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/mem.hpp b/cheat/internal_rewrite/mem.hpp new file mode 100644 index 0000000..37db3ad --- /dev/null +++ b/cheat/internal_rewrite/mem.hpp @@ -0,0 +1,66 @@ +#pragma once +#include +#include "util.hpp" + +#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) + +class stack_t { + uintptr_t m_ptr; + +public: + __forceinline stack_t( ) : m_ptr( get_baseptr( ) ) { } + + __forceinline stack_t( uintptr_t ptr ) : m_ptr( ptr ) { } + + template < typename t = uintptr_t > + __forceinline t get( ) { + return ( t )m_ptr; + } + + template < typename t = uintptr_t > + __forceinline t return_address( ) { + return *( t* )( m_ptr + sizeof( void* ) ); + } + + template < typename t = uintptr_t > + __forceinline t address_of_return_address( ) { + return ( t )( m_ptr + sizeof( uintptr_t ) ); + } + + __forceinline stack_t& next( ) { + return *( stack_t* )( m_ptr ); + } + + template < typename t = uintptr_t > + __forceinline t local( size_t at ) { + return ( t )( m_ptr - at ); + } + + template < typename t = uintptr_t > + __forceinline t arg( size_t at ) { + return ( t )( m_ptr + at ); + } +}; + +namespace util { + template < typename t = uint8_t > + __forceinline t* memcpy( t* dst, t* src, size_t size = sizeof( t ) ) { + __movsb( + ( uint8_t* )dst, + ( uint8_t* )src, + size + ); + + return dst; + } + + __forceinline void* memset( uint8_t* dst, uint8_t val, size_t size ) { + __stosb( + dst, + val, + size + ); + + return dst; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/modules.hpp b/cheat/internal_rewrite/modules.hpp new file mode 100644 index 0000000..6e78bf3 --- /dev/null +++ b/cheat/internal_rewrite/modules.hpp @@ -0,0 +1,35 @@ +#pragma once +#include + +struct patterns_t +{ + uint32_t beam_ptr; // B9 ? ? ? ? A1 ? ? ? ? FF 10 A1 ? ? ? ? B9 + uint32_t move_helper; // 8B 0D ? ? ? ? 8B 46 08 68 + uint32_t calc_abs_velocity; // 55 8B EC 83 E4 F8 83 EC 1C 53 56 57 8B F9 F7 87 + uint32_t animstate_update; // 55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24 + uint32_t draw_small_entities_retaddr; // FF 90 ? ? ? ? FF 15 ? ? ? ? 84 C0 74 28 + uint32_t is_breakable_ptr; // 55 8B EC 51 56 8B F1 85 F6 74 68 83 BE + uint32_t set_abs_angles; // 55 8B EC 83 E4 F8 83 EC 64 53 56 57 8B F1 E8 + uint32_t set_abs_origin; // 55 8B EC 83 E4 F8 51 53 56 57 8B F1 + uint32_t glow_manager; // 0F 11 05 00 00 00 00 83 C8 01 + uint32_t smoke_count; // 55 8B EC 83 EC 08 8B 15 ? ? ? ? 0F 57 C0 + uint32_t in_prediction_retaddr; // 84 C0 75 08 57 8B CE E8 ? ? ? ? 8B 06 + uint32_t net_update_retaddr; // 5F 5E 5D C2 04 00 83 3D ? ? ? ? ? +}; + + +struct header_t { + uint8_t xor_key{ }; + + char username[ 32 ]{ }; + + uintptr_t client_panorama{ }; + uintptr_t vguimatsurface{ }; + uintptr_t shaderapidx9{ }; + uintptr_t vstdlib{ }; + uintptr_t steam_api{ }; + + patterns_t patterns{ }; +}; + +extern header_t g_header; \ No newline at end of file diff --git a/cheat/internal_rewrite/movement.cpp b/cheat/internal_rewrite/movement.cpp new file mode 100644 index 0000000..3793e1b --- /dev/null +++ b/cheat/internal_rewrite/movement.cpp @@ -0,0 +1,345 @@ +#include "movement.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" + +#include +#include "base_cheat.hpp" +#include "input_system.hpp" +#include "renderer.hpp" + +NAMESPACE_REGION( features ) + +float get_ideal_strafe_step( float speed ) { + static auto* sv_airaccelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); + float airaccel = std::min< float >( sv_airaccelerate->get_float( ), 30.f ); + + return RAD2DEG( std::asinf( 30.f / speed ) ) * 0.5f; +} + +void rotate_movement( user_cmd_t* cmd, float rotation ) { + rotation = rotation * M_PIRAD; + + float cos_rot = cos( rotation ); + float sin_rot = sin( rotation ); + + float new_forwardmove = ( cos_rot * cmd->m_forwardmove ) - ( sin_rot * cmd->m_sidemove ); + float new_sidemove = ( sin_rot * cmd->m_forwardmove ) + ( cos_rot * cmd->m_sidemove ); + + cmd->m_forwardmove = new_forwardmove; + cmd->m_sidemove = new_sidemove; +} + +void c_movement::bhop( ) { + if ( !g_settings.misc.bunny_hop ) + return; + + if ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || + g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) + return; + + //jump like you nohat + if ( m_ucmd->m_buttons & IN_JUMP && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + m_ucmd->m_buttons &= ~IN_JUMP; + } +} + +void c_movement::auto_strafer( ) { + if( !g_settings.misc.auto_strafe ) + return; + + vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); + float speed = velocity.length2d( ); + + bool use_original = !g_settings.rage.enabled && !g_settings.rage.anti_aim; + + auto cmd = use_original ? m_ucmd : g_ctx.get_last_cmd( ); + + auto on_ground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + if( cmd && ( m_ucmd->m_buttons & IN_JUMP ) && ( speed > 1.0f || g_settings.misc.air_duck( ) ) && !on_ground ) { + if( !cmd->m_forwardmove && !cmd->m_sidemove ) { + if( !cmd->m_mousedx ) { + float ideal_rotation = std::min( RAD2DEG( std::asinf( 30.f / std::max( speed, FLT_EPSILON ) ) ) * 0.5f, 45.f ); + + if( ( cmd->m_cmd_nr % 2 ) ) + ideal_rotation *= -1; + + cmd->m_sidemove = ( cmd->m_cmd_nr % 2 ) ? 450.f : -450.f; + cmd->m_forwardmove = 0; + + rotate_movement( cmd, ideal_rotation ); + } + else { + cmd->m_sidemove = m_ucmd->m_mousedx < 0.f ? -450.f : 450.f; + } + } + else if( g_settings.misc.auto_strafe == 2 ) { + if( !cmd->m_mousedx ) { + float ideal_rotation = std::min( RAD2DEG( std::asinf( 30.f / std::max( speed, FLT_EPSILON ) ) ) * 0.5f, 45.f ); + + float move_yaw = math::vector_angles( vec3_t( ), vec3_t( cmd->m_forwardmove, cmd->m_sidemove, 0.f ) ).y; + float vel_yaw = math::vector_angles( vec3_t( ), velocity ).y; + + float velocity_delta = std::remainderf( g_csgo.m_engine( )->GetViewAngles( ).y - vel_yaw, 360.f ); + + float move_delta = std::remainderf( move_yaw - velocity_delta, 360.f ); + float ideal_yaw = math::approach_angle( move_yaw, velocity_delta, ideal_rotation ); + + float delta_yaw = std::remainderf( move_yaw - ideal_yaw, 360.f ); + + if( std::abs( delta_yaw ) > ideal_rotation ) + ideal_rotation = 0.f; + else if( ( cmd->m_cmd_nr % 2 ) ) + ideal_rotation *= -1; + + cmd->m_sidemove = ( cmd->m_cmd_nr % 2 ) ? 450.f : -450.f; + cmd->m_forwardmove = 0; + + rotate_movement( cmd, std::remainderf( ideal_yaw + ideal_rotation, 360.f ) ); + } + else { + float move_yaw = math::vector_angles( vec3_t( ), vec3_t( cmd->m_forwardmove, cmd->m_sidemove, 0.f ) ).y; + + float rotation = cmd->m_mousedx < 0.f ? -90.f : 90.f; + + cmd->m_forwardmove = 450.f; + cmd->m_sidemove = 0.f; + + rotate_movement( cmd, move_yaw + rotation ); + } + } + } +} + + +void c_movement::edge_jump( ) { + if ( !g_settings.misc.edge_jump ) + return; + + if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.edge_jump_key( ) ) ) + return; + + //needs key check here so its not always on + //what?? + bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; + + if ( pre_onground && !post_onground ) { + m_ucmd->m_buttons |= IN_JUMP; + } +} + +void c_movement::air_duck( ) { + if( !g_settings.misc.air_duck ) + return; + + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + m_ucmd->m_buttons |= IN_DUCK; +} + +void c_movement::auto_jumpbug( ) { + if ( !g_settings.misc.auto_jumpbug( ) ) + return; + + if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.auto_jumpbug_key( ) ) ) + return; + + static bool jumped = false; + static bool jump_next = false; + + vec3_t origin = g_ctx.m_local->m_vecOrigin( ); + origin += g_ctx.m_local->m_vecVelocity( ) * TICK_INTERVAL( ); + + Ray_t ray; + ray.Init( origin, origin + vec3_t( 0.f, 0.f, 4.f ) ); + + CTraceFilter f; + f.pSkip = g_ctx.m_local; + + CGameTrace tr; + g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); + + bool unduck = tr.fraction != 1.0f; + + if( unduck ) { + m_ucmd->m_buttons &= ~IN_DUCK; + m_ucmd->m_buttons |= IN_JUMP; + } + else { + m_ucmd->m_buttons |= IN_DUCK; + m_ucmd->m_buttons &= ~IN_JUMP; + } +} + +void c_movement::jump_stats( ) { + if( !g_settings.misc.show_jump_stats ) return; + + static auto sv_airaccelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); + static bool was_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + static vec3_t last_origin{ }; + static float ground_vel{ }; + static float last_jump_max_speed{ }; + static float last_height{ }; + static float last_dist{ }; + + const float lj_threshold = sv_airaccelerate->get_float( ) < 15.f ? 190.f : 240.f; + + bool on_ground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + bool ducking = g_ctx.m_local->m_fFlags( ) & FL_DUCKING; + + char jump_string[ 250 ] = { }; + + if( on_ground ) { + int vertical = 0; + + if( !was_onground ) { + vec3_t cur_origin = g_ctx.m_local->m_vecOrigin( ); + last_dist = cur_origin.dist_to( last_origin ); + + if( std::abs( cur_origin.z - last_origin.z ) >= ( ducking ? 10.f : 5.f ) ) { + vertical = cur_origin.z > last_origin.z ? 1 : -1; + } + + if( ground_vel > 200.f && last_jump_max_speed > 260.f && std::abs( last_height ) > 20.f ) { + if( vertical ) { + strenc::w_sprintf_s( jump_string, 250, xors( "[\3JUMP STAT\1] pre: %0.2f | max vel: %0.2f | height: %0.2f | duck: %d | \2%s\n" ), + ground_vel, last_jump_max_speed, last_height, ducking, vertical == 1 ? xors( "vertical" ) : xors( "dropjump" ) ); + } + else { + bool is_lj = last_dist > lj_threshold; + strenc::w_sprintf_s( jump_string, 250, xors( "[\3JUMP STAT\1]: pre: %0.2f | max vel: %0.2f | height: %0.2f | duck: %d | dist: %c%0.2f\n" ), + ground_vel, last_jump_max_speed, last_height, ducking, is_lj ? 4 : 1, last_dist ); + } + + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, jump_string ); + } + } + last_origin = g_ctx.m_local->m_vecOrigin( ); + last_jump_max_speed = 0.f; + last_height = 0.f; + ground_vel = g_ctx.m_local->m_vecVelocity( ).length2d( ); + + was_onground = true; + } + else { + was_onground = false; + float vel = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( vel > last_jump_max_speed ) { + last_jump_max_speed = vel; + } + float delta = g_ctx.m_local->m_vecOrigin( ).z - last_origin.z; + if( std::abs( delta ) > std::abs( last_height ) ) { + last_height = delta; + } + } +} + +//fuck hardcode +const vec3_t mins( -26.f, -26.f, 0 ); +const vec3_t maxs( 26.f, 26.f, 44.f ); + +constexpr int TRACE_STEP_MAX = 45; +bool trace_ideal_step( float step, float speed, vec3_t velocity, vec3_t start_pos ) { + vec3_t direction = math::vector_angles( vec3_t( ), velocity ); + float wish_step = direction.y + step; + + vec3_t origin = start_pos; + + vec3_t start = origin; + vec3_t trace_step = math::angle_vectors( vec3_t( 0, wish_step, 0 ) ) * velocity.length2d( ) * TICK_INTERVAL( ); + + vec3_t pos = start + trace_step; + + CGameTrace tr; + CTraceFilter filter; + filter.pSkip = g_ctx.m_local; + + for( size_t i{ }; i <= 1 / TICK_INTERVAL( ); ++i ) { + start = pos; + trace_step = math::angle_vectors( vec3_t( 0, wish_step += step, 0 ) ) * velocity.length2d( ) * TICK_INTERVAL( ); + pos += trace_step; + + Ray_t ray; + ray.Init( start, pos, mins, maxs ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &tr ); + + if( !tr.DidHit( ) ) { + if( i == TRACE_STEP_MAX ) { + return true; + } + continue; + } + + break; + } + + return false; +} + +float c_movement::get_best_strafe_angle( ) { + vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); + float ideal_step = get_ideal_strafe_step( velocity.length2d( ) ) * 0.8f; + + float step = ideal_step; + vec3_t start = g_ctx.m_local->m_vecOrigin( ); + + for( size_t i{ }; i < 9; ++i ) { + if( trace_ideal_step( step, velocity.length2d( ), velocity, start ) ) { + vec3_t direction = math::vector_angles( vec3_t( ), velocity ); + return direction.y + step; + } + + step -= step * 0.2f; + } + + step = ideal_step; + for( size_t i{ }; i < velocity.length2d( ) * 0.015f; ++i ) { + step += step * 0.2f; + if( trace_ideal_step( step, velocity.length2d( ), velocity, start ) ) { + vec3_t direction = math::vector_angles( vec3_t( ), velocity ); + return direction.y + step; + } + } + + return math::vector_angles( vec3_t( ), velocity ).y; +} + +void c_movement::circle_strafe( ) { + if( g_settings.misc.circle_strafe ) { + if( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) + return; + + static bool can_finish = true; + auto cmd = g_ctx.get_last_cmd( ); + if( g_input.is_key_pressed( g_settings.misc.circle_strafe_key ) || !can_finish ) { + m_ucmd->m_buttons |= IN_JUMP; + cmd->m_forwardmove = 450.f; + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed > 1.f ) { + can_finish = false; + float angle = get_best_strafe_angle( ); + + float delta = std::remainderf( m_ucmd->m_viewangles.y - angle, 360.f ); + + cmd->m_forwardmove = 5850.f / speed; + cmd->m_sidemove = -450.f; + rotate_movement( cmd, delta ); + + vec3_t current_view; + g_csgo.m_engine( )->GetViewAngles( current_view ); + float view_delta = std::remainderf( current_view.y - angle, 360.f ); + + if( std::fabs( view_delta ) < 10.0f || speed < 250.f ) { + can_finish = true; + } + } + else { + can_finish = true; + } + } + } +} + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/movement.hpp b/cheat/internal_rewrite/movement.hpp new file mode 100644 index 0000000..0c0b1a6 --- /dev/null +++ b/cheat/internal_rewrite/movement.hpp @@ -0,0 +1,39 @@ +#pragma once +#include "util.hpp" + +//forward declarations +class user_cmd_t; + +NAMESPACE_REGION( features ) + +class c_movement { + user_cmd_t* m_ucmd{ }; + bool m_direction{ }; + + void bhop( ); + void auto_strafer( ); + + void edge_jump( ); + void auto_jumpbug( ); + void jump_stats( ); + + bool get_best_direction( float ideal_step, float left, float right, float weight ); + float get_best_strafe_step( float speed, vec3_t direction ); + float get_best_strafe_angle( ); + void circle_strafe( ); + void air_duck( ); + +public: + void operator()( user_cmd_t* ucmd ) { + m_ucmd = ucmd; + auto_strafer( ); + circle_strafe( ); + bhop( ); + edge_jump( ); + auto_jumpbug( ); + jump_stats( ); + air_duck( ); + } +}; + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/movement_recorder.cpp b/cheat/internal_rewrite/movement_recorder.cpp new file mode 100644 index 0000000..6e9245c --- /dev/null +++ b/cheat/internal_rewrite/movement_recorder.cpp @@ -0,0 +1,79 @@ +#include "movement_recorder.hpp" +#include "input_system.hpp" +#include "settings.hpp" +#include "interface.hpp" + +namespace features +{ + void c_move_recorder::operator()( user_cmd_t* cmd ) { + if( !g_settings.misc.recorder_enable ) + return; + + if( g_input.is_key_pressed( g_settings.misc.recording_start_key( ) ) ) + start_recording( ); + + if( g_input.is_key_pressed( g_settings.misc.recording_stop_key( ) ) ) + stop_recording( ); + + if( m_recording ) { + record_cmd( cmd ); + } + + if( m_playing ) { + if( m_move_data.empty( ) ) { + m_playing = false; + } + else if( ++m_record_index >= m_move_data.size( ) ) { + m_playing = false; + } + else { + auto& old_cmd = m_move_data.at( m_record_index ); + + if( g_settings.misc.recording_show_angles == 1 && ( old_cmd.m_buttons & IN_ATTACK ) || + g_settings.misc.recording_show_angles == 2 ) { + g_csgo.m_engine( )->SetViewAngles( old_cmd.m_viewangles ); + } + + cmd->m_buttons = old_cmd.m_buttons; + cmd->m_aimdirection = old_cmd.m_aimdirection; + cmd->m_forwardmove = old_cmd.m_forwardmove; + cmd->m_impulse = old_cmd.m_impulse; + cmd->m_mousedx = old_cmd.m_mousedx; + cmd->m_mousedy = old_cmd.m_mousedy; + cmd->m_sidemove = old_cmd.m_sidemove; + cmd->m_upmove = old_cmd.m_upmove; + cmd->m_viewangles = old_cmd.m_viewangles; + cmd->m_weaponselect = old_cmd.m_weaponselect; + cmd->m_weaponsubtype = old_cmd.m_weaponsubtype; + } + } + else { + m_record_index = 0; + } + } + + void c_move_recorder::record_cmd( user_cmd_t* cmd ) { + m_move_data.push_back( *cmd ); + } + + void c_move_recorder::start_recording( ) { + m_recording = true; + } + + void c_move_recorder::stop_recording( ) { + m_recording = false; + } + + void c_move_recorder::play_back( ) { + m_recording = false; + m_playing = true; + } + + void c_move_recorder::stop_playback( ) { + m_playing = false; + } + + void c_move_recorder::clear_recording( ) { + m_move_data.clear( ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/movement_recorder.hpp b/cheat/internal_rewrite/movement_recorder.hpp new file mode 100644 index 0000000..03bcf8c --- /dev/null +++ b/cheat/internal_rewrite/movement_recorder.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "sdk.hpp" +#include "vector.hpp" + +namespace features +{ + class c_move_recorder { + public: + void play_back( ); + void stop_playback( ); + void clear_recording( ); + + bool is_recording( ) const { return m_recording; } + bool is_playing( ) const { return m_playing; } + int get_record_count( ) const { return m_move_data.size( ); } + auto get_current_record( ) const { return m_record_index; } + + void operator()( user_cmd_t* ); + private: + void record_cmd( user_cmd_t* cmd ); + void start_recording( ); + void stop_recording( ); + + bool m_recording = false; + bool m_playing = false; + size_t m_record_index = 0; + std::vector< user_cmd_t > m_move_data; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/net_showfragments.cpp b/cheat/internal_rewrite/net_showfragments.cpp new file mode 100644 index 0000000..93e5db0 --- /dev/null +++ b/cheat/internal_rewrite/net_showfragments.cpp @@ -0,0 +1,50 @@ +#include "hooks.hpp" +#include "mem.hpp" +#include "context.hpp" + +// Index 13 is GetBool, GetInt and GetFloat are inlined by default. +int __fastcall hooks::net_showfragments_get_int( void* ecx_, void* edx_ ) { + static auto old_fn = g_csgo.m_netshowfragments->get_old_function< decltype( &net_showfragments_get_int ) >( 13 ); + + static auto ret_checkreceivinglist = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "FF 50 34 8B 1D ? ? ? ? 85 C0 74 16 FF B6" ), 0x3 ); + static auto ret_readsubchanneldata = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "FF 50 34 85 C0 74 12 53 FF 75 0C" ), 0x3 ); + + static auto last_fragment = 0; + static auto last_time = 0.f; + + stack_t stack( get_baseptr( ) ); + auto cl = g_csgo.m_global_state->get_client_state( ); + auto nc = cl->m_netchannel; + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + + if ( nci && ( nci->GetLatency( 1 ) > 0.06f ) && g_ctx.m_local ) { + if ( stack.return_address( ) == ret_readsubchanneldata ) { + auto e = ( uint32_t* ) ( nc ); + auto data = &e [ 0x54 ]; + + auto fragment = data [ 0x43 ]; + + if ( fragment == last_fragment ) { + float delta = GetTickCount( ) * 0.001f - last_time; + + if ( delta <= std::max( nci->GetLatency( 1 ), 0.3f ) ) { + ( ( uint32_t* ) data ) [ 0x42 ] = 0; + last_time = GetTickCount( ) * 0.001f; + } + } + } + + if ( stack.return_address( ) == ret_checkreceivinglist ) { + auto e = ( uint32_t* ) ( nc ); + auto data = &e [ 0x54 ]; + + auto fragment = data [ 0x43 ]; + + last_fragment = fragment; + last_time = GetTickCount( ) * 0.001f; + } + } + + return old_fn( ecx_, 0 ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/netvar_proxy.hpp b/cheat/internal_rewrite/netvar_proxy.hpp new file mode 100644 index 0000000..113f212 --- /dev/null +++ b/cheat/internal_rewrite/netvar_proxy.hpp @@ -0,0 +1,36 @@ +#pragma once +#include "Valve/dt_recv.h" + +//dont leave things out of namespaces +namespace hooks +{ + class c_netvar_proxy { + public: + c_netvar_proxy( RecvProp* target_property, RecvVarProxyFn new_proxy ) { + m_target = target_property; + m_original = target_property->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + c_netvar_proxy( ) = default; + + void init( RecvProp* target, RecvVarProxyFn new_proxy ) { + m_target = target; + m_original = target->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + ~c_netvar_proxy( ) { + if( !m_target ) return; + m_target->m_ProxyFn = m_original; + } + + RecvVarProxyFn get_old_function( ) const { + return m_original; + } + + private: + RecvProp* m_target; + RecvVarProxyFn m_original; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/netvars.cpp b/cheat/internal_rewrite/netvars.cpp new file mode 100644 index 0000000..eb2d8fd --- /dev/null +++ b/cheat/internal_rewrite/netvars.cpp @@ -0,0 +1,93 @@ +#include "netvars.hpp" +#include "interface.hpp" + +factory::c_netvars g_netvars; + +NAMESPACE_REGION( factory ) + +void c_netvars::init( ) { + for ( auto client_class = g_csgo.m_chl( )->GetAllClasses( ); + !!client_class; + client_class = client_class->m_next + ) { + auto table = client_class->m_rt_table; + m_tables.push_back( table ); + } +} + +RecvTable* c_netvars::get_table( hash_t hash ) const { + if ( m_tables.empty( ) ) return nullptr; + + for ( auto& table : m_tables ) { + if ( !table ) continue; + + if ( hash == hash::fnv1a( table->m_pNetTableName ) ) { + return table; + } + } + + return nullptr; +} + +//iterating this too much results in a stack overflow, so thats cool +RecvProp* c_netvars::get_prop( hash_t data, hash_t name ) const { + RecvProp* prop{ }; + RecvTable* child{ }; + + auto table = get_table( data ); + if( !table ) return nullptr; + + for( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if( child && child->m_nProps ) { + auto tmp = get_prop( hash::fnv1a( child->m_pNetTableName ), name ); + if( tmp ) return tmp; + } + + if( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop; + } + + return nullptr; +} + +std::ptrdiff_t c_netvars::get_entry( hash_t name, RecvTable* table ) const { + std::ptrdiff_t ret{ }; + RecvProp* prop; + RecvTable* child; + + for ( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if ( child && child->m_nProps ) { + auto tmp = get_entry( name, child ); + if ( tmp ) ret += prop->GetOffset( ) + tmp; + } + + if ( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop->GetOffset( ) + ret; + } + + return ret; +} + +std::ptrdiff_t c_netvars::get_netvar( hash_t data, hash_t name ) const { + std::ptrdiff_t ret{ }; + auto table = get_table( data ); + if ( !table ) return 0; + + ret = get_entry( name, table ); +#ifdef DEBUG + printf( "%s:\t\t 0x%05x\n", name.c_str( ), ret ); +#endif + return ret; +} + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/netvars.hpp b/cheat/internal_rewrite/netvars.hpp new file mode 100644 index 0000000..ca50ed9 --- /dev/null +++ b/cheat/internal_rewrite/netvars.hpp @@ -0,0 +1,44 @@ +#pragma once +#include + +#include "Valve\dt_recv.h" +#include "util.hpp" +#include "fnv.hpp" + +class RecvTable; + +#define NETVAR( funcname, name, table, extra, type ) \ +__forceinline auto& funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return get< type >( offset + extra ); \ +} + +#define PNETVAR( funcname, name, table, extra, type ) \ +__forceinline type* funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return reinterpret_cast< type* >( uintptr_t( this ) + offset + extra ); \ +} + +#define OFFSET( funcname, offset, type ) \ +__forceinline auto& funcname( ) { \ + return get< type >( offset ); \ +} + +NAMESPACE_REGION( factory ) + +class c_netvars { +public: + void init( ); + //search through the netvar list + std::ptrdiff_t get_netvar( hash_t table, hash_t hash ) const; + RecvProp* get_prop( hash_t table, hash_t name ) const; +public: + std::ptrdiff_t get_entry( hash_t hash, RecvTable* table ) const; + RecvTable* get_table( hash_t hash ) const; +private: + std::vector< RecvTable* > m_tables; +}; + +END_REGION + +extern factory::c_netvars g_netvars; \ No newline at end of file diff --git a/cheat/internal_rewrite/on_screen_size_changed.cpp b/cheat/internal_rewrite/on_screen_size_changed.cpp new file mode 100644 index 0000000..731835e --- /dev/null +++ b/cheat/internal_rewrite/on_screen_size_changed.cpp @@ -0,0 +1,9 @@ +#include "hooks.hpp" + +void __fastcall hooks::on_screen_size_changed( void* ecx_, void* edx_, int old_w, int old_h ) { + static auto old_fn = on_screen_size_changed_o; + + old_fn( ecx_, nullptr, old_w, old_h ); + + g_fonts.initialize( ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/override_mouse_input.cpp b/cheat/internal_rewrite/override_mouse_input.cpp new file mode 100644 index 0000000..84e3f57 --- /dev/null +++ b/cheat/internal_rewrite/override_mouse_input.cpp @@ -0,0 +1,14 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::override_mouse_input( void* ecx_, void* edx_, float* x, float* y ) { + static auto omi_o = override_mouse_input_o; + omi_o( ecx_, edx_, x, y ); + + if( g_csgo.m_panic ) return; + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + g_cheat.m_legitbot( x, y ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/override_view.cpp b/cheat/internal_rewrite/override_view.cpp new file mode 100644 index 0000000..579f83f --- /dev/null +++ b/cheat/internal_rewrite/override_view.cpp @@ -0,0 +1,35 @@ +#include "base_cheat.hpp" +#include "context.hpp" +#include "hooks.hpp" +#include "settings.hpp" +void __fastcall hooks::override_view( void* ecx_, void* edx_, CViewSetup* setup ) { + if( g_csgo.m_panic ) { + return override_view_o( ecx_, nullptr, setup ); + } + + float fov = setup->m_flFov; + if ( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) ) { + if( g_settings.misc.no_zoom ) + setup->m_flFov = g_settings.misc.fov_changer( ); + else + setup->m_flFov = g_settings.misc.fov_changer( ) * ( fov / 90.f ); + } + + g_ctx.m_fov = setup->m_flFov; + + g_cheat.m_extra.thirdperson( ); + + if( g_settings.misc.no_scope && g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) && g_ctx.m_local->m_bIsScoped( ) ) { + int backup = setup->m_iEdgeBlur; + + setup->m_iEdgeBlur = 0; + + override_view_o( ecx_, edx_, setup ); + + setup->m_iEdgeBlur = backup; + + return; + } + + override_view_o( ecx_, nullptr, setup ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/packet_start.cpp b/cheat/internal_rewrite/packet_start.cpp new file mode 100644 index 0000000..a5c9db4 --- /dev/null +++ b/cheat/internal_rewrite/packet_start.cpp @@ -0,0 +1,26 @@ +#include "hooks.hpp" +#include "context.hpp" + +void __fastcall hooks::packet_start( void* ecx, void* edx, int in_seq, int out_ack ) { + if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { + *( int* )( uintptr_t( ecx ) + 0x114 ) = in_seq; + *( int* )( uintptr_t( ecx ) + 0x4cb4 ) = out_ack; + } + + // okay now this is epic + //printf("%08x -> %08x\n", &hooks::packet_start, hooks::packet_start_o); + + for( auto cmd_number = g_ctx.m_cmd_numbers.begin( ); cmd_number != g_ctx.m_cmd_numbers.end( ); ) { + if( *cmd_number == out_ack ) { + auto cl = ( uintptr_t )( ecx ); + + *( int* )( cl + 0x114 ) = in_seq; + *( int* )( cl + 0x4cb4 ) = out_ack; + + g_ctx.m_cmd_numbers.erase( cmd_number ); + return; + } + + cmd_number++; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/paint_traverse.cpp b/cheat/internal_rewrite/paint_traverse.cpp new file mode 100644 index 0000000..8376cdd --- /dev/null +++ b/cheat/internal_rewrite/paint_traverse.cpp @@ -0,0 +1,65 @@ +#include "hooks.hpp" +#include "renderer.hpp" +#include "context.hpp" +#include "console.hpp" +#include "base_cheat.hpp" +#include "math.hpp" +#include "settings.hpp" + +void __fastcall hooks::paint_traverse( void* ecx_, void* edx_, unsigned int panel, bool force_repaint, bool allowforce ) { + if( g_csgo.m_panic ) return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); + if( ecx_ != g_csgo.m_panel.get( ) ) + return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); + + g_csgo.m_main_thread = std::this_thread::get_id( ); + + if( g_settings.legit.enabled ) { + g_settings.rage.enabled( ) = false; + } + + static uint32_t mat_system_top_panel{ }; + if( !mat_system_top_panel ) { + auto panel_name = g_csgo.m_panel( )->GetName( panel ); + auto panel_hash = hash::fnv1a( panel_name ); + if( fnv( "MatSystemTopPanel" ) == panel_hash ) { + mat_system_top_panel = panel; + } + } + + static uint32_t hud_zoom{ }; + if( !hud_zoom ) { + auto panel_name = g_csgo.m_panel( )->GetName( panel ); + auto panel_hash = hash::fnv1a( panel_name ); + if( fnv( "HudZoom" ) == panel_hash ) { + hud_zoom = panel; + } + } + + if( panel && panel == hud_zoom && g_settings.misc.no_scope + && g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + return; + } + + if( panel && panel == mat_system_top_panel ) { + //render your epic 2008 hake esp here + g_renderer.draw_box( 0, 0, 1, 1, clr_t( 0, 0, 0, 1 ) ); + //g_renderer.draw_string( g_fonts.f_12, 100, 200, clr_t( 255, 255, 255, 255 ), "c: %d", g_csgo.m_global_state->get_client_state( )->m_chokedcommands ); + if( !g_settings.misc.hide_from_obs ) + g_cheat.m_visuals( ); + + /*auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float desired_in_latency = g_settings.misc.net_fakeping_amount * 0.001f; + float latency = nci->GetLatency( 1 ); + + float delta = latency - desired_in_latency; + + g_renderer.draw_string( g_fonts.f_12, 20, 400, clr_t( 255, 255, 255 ), "latency: %f", latency ); + //g_renderer.draw_string( g_fonts.f_12, 20, ) + g_renderer.draw_string( g_fonts.f_12, 20, 410, clr_t( 255, 255, 255 ), "delta: %f", delta ); + }*/ + } + + g_csgo.m_prediction( )->SetLocalViewAngles( g_ctx.m_last_fakeangle ); + return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/pattern.hpp b/cheat/internal_rewrite/pattern.hpp new file mode 100644 index 0000000..8b4e17e --- /dev/null +++ b/cheat/internal_rewrite/pattern.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma warning ( disable : 4018 ) + +namespace pattern +{ + inline bool bin_match( uint8_t* code, uint8_t* pattern, size_t size ) { + for( size_t j = 0; j < size; j++ ) { + if( pattern[ j ] && code[ j ] != pattern[ j ] ) { + return false; + } + } + return true; + } + + template< typename t = uintptr_t > static t first_match( uintptr_t start, std::string sig, size_t len, std::ptrdiff_t offset = 0 ) { + std::istringstream iss( sig ); + std::vector< std::string > tokens{ std::istream_iterator< std::string >{ iss }, std::istream_iterator< std::string >{} }; + std::vector< uint8_t > sig_bytes; + + for( const auto& hex_byte : tokens ) { + sig_bytes.push_back( static_cast< uint8_t >( std::strtoul( hex_byte.c_str( ), nullptr, 16 ) ) ); + } + + if( sig_bytes.empty( ) || sig_bytes.size( ) < 2 ) { + return t{ }; + } + + auto sig_data = sig_bytes.data( ); + auto sig_size = sig_bytes.size( ); + + for( size_t i{ }; i < len; i++ ) { + uint8_t* code_ptr = reinterpret_cast< uint8_t* >( start + i ); + + if( bin_match( code_ptr, sig_data, sig_size ) ) { + return( ( t )( start + i + offset ) ); + } + } + + return t{ }; + } + + //ultimately the function you want to call to sigscan ( ida style ) + template< typename t = uintptr_t > static t first_code_match( HMODULE start, std::string sig, std::ptrdiff_t offset = 0 ) { + auto dos_hdr = reinterpret_cast< PIMAGE_DOS_HEADER >( start ); + + if( !dos_hdr ) return t{ }; + + //DOS header, verifies if module is valid + if( dos_hdr->e_magic != 0x5a4d ) { + return t{ }; + } + + auto nt_hdrs = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< uintptr_t >( dos_hdr ) + dos_hdr->e_lfanew ); + + return first_match< t >( reinterpret_cast< uintptr_t >( dos_hdr ) + nt_hdrs->OptionalHeader.BaseOfCode, sig, nt_hdrs->OptionalHeader.SizeOfCode, offset ); + } +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/play_sound.cpp b/cheat/internal_rewrite/play_sound.cpp new file mode 100644 index 0000000..542be24 --- /dev/null +++ b/cheat/internal_rewrite/play_sound.cpp @@ -0,0 +1,31 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +void __fastcall hooks::play_sound( void* ecx_, void*, const char* file ) { +#ifdef HEADER_MODULE + // static auto is_ready = g_header.patterns.is_ready; + static auto is_ready = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 08 56 8B 35 00 00 00 00 57 83 BE" ), 0 ); +#else + static auto is_ready = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 08 56 8B 35 00 00 00 00 57 83 BE" ), 0 ); +#endif + static bool was_played = false; + static float played_tick = 0.f; + + play_sound_o( ecx_, 0, file ); + + if( !g_settings.misc.auto_accept || g_csgo.m_engine( )->IsInGame( ) ) { + was_played = false; + return; + } + + if( strstr( file, xors( "competitive_accept_beep.wav" ) ) && !was_played ) { + was_played = true; + played_tick = GetTickCount( ) * 0.001f + g_settings.misc.auto_accept_delay; + g_cheat.m_extra.server_information( ); + g_cheat.m_visuals.reset_local_dmg( ); + } + + if( was_played && GetTickCount( ) * 0.001f > played_tick ) { + reinterpret_cast< void( __cdecl* )( ) >( is_ready )( ); + was_played = false; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/player_manager.cpp b/cheat/internal_rewrite/player_manager.cpp new file mode 100644 index 0000000..f76b363 --- /dev/null +++ b/cheat/internal_rewrite/player_manager.cpp @@ -0,0 +1,44 @@ +#include "player_manager.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +namespace features +{ + void c_player_record::update( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + if( !ent ) { clear( ); return; } + + if( ent != m_ent || ent->m_flSimulationTime( ) > g_csgo.m_globals->m_curtime + 1.f ) + clear( ); + + m_ent = ent; + if( !ent->is_valid( ) ) + return; + + update_simtime( ); + update_antiaim( ); + + update_cheater( ); + } + + bool c_player_manager::is_cheater( int ent_index ) { +#ifdef _DEBUG + static con_var< bool > dbg_nocheater{ &data::holder_, fnv( "dbg_nocheater" ) }; + if( dbg_nocheater( ) ) + return true; +#endif + + return m_players[ ent_index ].is_cheater( ); + } + + void c_player_manager::frame_stage_notify( ) { + if( !g_ctx.m_local ) return; + + for( int i{ 1 }; i < 65; ++i ) { + if( i == g_csgo.m_engine( )->GetLocalPlayer( ) ) + continue; + + m_players[ i ].update( i ); + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/player_manager.hpp b/cheat/internal_rewrite/player_manager.hpp new file mode 100644 index 0000000..440ddf3 --- /dev/null +++ b/cheat/internal_rewrite/player_manager.hpp @@ -0,0 +1,68 @@ +#pragma once +#include "sdk.hpp" + +namespace features +{ + constexpr int CHEATER_SIMTIME_THRESHOLD = 10; + constexpr int CHEATER_AA_THRESHOLD = 50; + constexpr int CHEATER_MAX_DETECTIONS = 200; + + class c_player_record { + float m_last_simtime; + int m_simtime_detections; + int m_aa_detections; + bool m_is_cheater; + + c_base_player* m_ent; + + void clear( ) { + m_last_simtime = { }; + m_simtime_detections = { }; + m_aa_detections = { }; + m_is_cheater = { }; + m_ent = { }; + } + + void update_simtime( ) { + if( !m_ent ) return; + + if( m_ent->m_flSimulationTime( ) == m_last_simtime ) { + m_simtime_detections += 2; + } + else if( m_simtime_detections > 0 ) { + m_simtime_detections--; + } + m_last_simtime = m_ent->m_flSimulationTime( ); + } + + void update_antiaim( ) { + if( !m_ent ) return; + + auto pitch = m_ent->m_angEyeAngles( ).x; + if( pitch > 75.f && m_aa_detections < CHEATER_MAX_DETECTIONS ) { + m_aa_detections++; + } + else if( m_aa_detections > 0 ) { + m_aa_detections--; + } + } + + void update_cheater( ) { + m_is_cheater = ( m_simtime_detections > CHEATER_SIMTIME_THRESHOLD + || m_aa_detections > CHEATER_AA_THRESHOLD ) + && m_simtime_detections; + } + + public: + c_player_record( ) { clear( ); } + bool is_cheater( ) const { return m_is_cheater; } + void update( int ent_index ); + }; + + class c_player_manager { + std::array< c_player_record, 65 > m_players; + public: + void frame_stage_notify( ); + bool is_cheater( int ent_index ); + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/prediction.cpp b/cheat/internal_rewrite/prediction.cpp new file mode 100644 index 0000000..2f6f606 --- /dev/null +++ b/cheat/internal_rewrite/prediction.cpp @@ -0,0 +1,627 @@ +#include "prediction.hpp" +#include "hooks.hpp" +#include "context.hpp" + +NAMESPACE_REGION( features ) + +void c_prediction::player_data_t::update( int ent_index ) { + auto player = g_csgo.m_entlist( )->GetClientEntity( ent_index ); + if( !player || !player->is_valid( ) || player == g_ctx.m_local ) { + m_valid = false; + return; + } + + float simtime = player->m_flSimulationTime( ); + + if( std::abs( simtime - m_simtime ) ) { + float delta = std::abs( m_simtime - simtime ); + if( !m_valid ) { + m_old_velocity = player->m_vecVelocity( ); + } + else { + m_last_choke = TIME_TO_TICKS( delta ); + m_old_velocity = m_velocity; + m_breaking_lc = player->m_vecOrigin( ).dist_to( m_position ) > 64; + } + + m_velocity = player->get_animdata( ).m_last_velocity; + m_position = player->m_vecOrigin( ); + + m_valid = true; + + if( m_breaking_lc ) + m_records.push_front( { m_velocity, m_last_choke } ); + } + + m_simtime = simtime; + + while( m_records.size( ) > 32 ) + m_records.pop_back( ); +} + +void c_prediction::frame_stage_notify( ) { + for( int i{ 1 }; i < 65; ++i ) { + m_players[ i ].update( i ); + } +} + +int c_prediction::get_predicted_choke( int idx ) { + auto& data = m_players[ idx ]; + + int adaptive_dtc = 0; + int static_dtc = 0; + int min_choke = 16; + int max_choke = 0; + + if( !data.m_records.empty( ) ) { + int prev_choke = data.m_last_choke; + float last_dist = 0.f; + for( auto& it : data.m_records ) { + if( it.m_tick == prev_choke ) + static_dtc++; + + float speed = it.m_velocity.length2d( ); + float dist = speed * it.m_tick * TICK_INTERVAL( ); + + if( dist > 62.f && std::abs( last_dist - dist ) < 12.f ) + adaptive_dtc++; + + prev_choke = it.m_tick; + last_dist = dist; + min_choke = math::min( it.m_tick, min_choke ); + max_choke = math::max( it.m_tick, max_choke ); + } + } + + if( adaptive_dtc > 10 ) { + return TIME_TO_TICKS( 64.f / data.m_velocity.length2d( ) ) + 1; + } + else if( static_dtc > 16 || data.m_records.empty( ) ) { + return data.m_last_choke; + } + + float factor = math::random_number( 0.f, 1.f ); + return ( 1.0f - factor ) * min_choke + factor * max_choke; +} + +vec3_t c_prediction::aimware_extrapolate( c_base_player* ent, vec3_t origin, vec3_t& velocity ) { + static auto sv_jump_impulse = g_csgo.m_cvar( )->FindVar( xors( "sv_jump_impulse" ) ); + static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + + auto min = ent->m_vecMins( ); + auto max = ent->m_vecMaxs( ); + + auto start = origin; + auto end = start + velocity * TICK_INTERVAL( ); + + CTraceFilter f; + CGameTrace tr; + Ray_t ray; + + ray.Init( start, end, min, max ); + f.pSkip = ent; + + g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); + + if( tr.fraction != 1.f ) { + for( int i{ }; i < 2; ++i ) { + velocity -= tr.plane.normal * velocity.dot( tr.plane.normal ); + + auto dot = velocity.dot( tr.plane.normal ); + if( dot < 0.f ) { + velocity -= dot * tr.plane.normal; + } + + end = tr.endpos + ( velocity * TICK_INTERVAL( ) * ( 1.f - tr.fraction ) ); + ray.Init( tr.endpos, end, min, max ); + g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); + + if( tr.fraction == 1.f ) + break; + } + } + + end = tr.endpos; + end.z -= 2.f; + + ray.Init( tr.endpos, end, min, max ); + g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); + + if( tr.fraction != 1.f && tr.plane.normal.z > 0.7f ) { + velocity.z = sv_jump_impulse->get_float( ); + } + else { + velocity.z -= sv_gravity->get_float( ) * TICK_INTERVAL( ); + } + + return tr.endpos; +} + +vec3_t c_prediction::full_walk_move( c_base_player* player, int ticks ) { + auto index = player->ce( )->GetIndex( ); + auto data = get_player_data( index ); + vec3_t origin = data.m_position; + vec3_t velocity = data.m_velocity; + vec3_t old_velocity = data.m_velocity; + vec3_t acceleration; + + bool is_on_ground = player->m_fFlags( ) & FL_ONGROUND; + + m_player = data; + + if( !data.m_valid ) + return origin; + + float velocity_dir = RAD2DEG( atan2( velocity.y, velocity.x ) ); + float angle_dir = velocity_dir - RAD2DEG( atan2( data.m_old_velocity.y, data.m_old_velocity.x ) ); + + angle_dir *= TICKS_TO_TIME( data.m_last_choke ); + + if( velocity_dir <= 180.f ) { + if( velocity_dir < -180.f ) + velocity_dir += 360.f; + } + else { + velocity_dir -= 360.f; + } + + float length = velocity.length2d( ); + + for( int i{ }; i < ticks; ++i ) { + float extrapolated_dir = velocity_dir + angle_dir; + + velocity.x = cos( DEG2RAD( extrapolated_dir ) ) * length; + velocity.y = sin( DEG2RAD( extrapolated_dir ) ) * length; // hey.... fix please In Fucking Correct + + start_gravity( player, origin, velocity ); + + if( is_on_ground ) { + check_jump_button( player, origin, velocity ); // Won't jump all the time + } + + if( is_on_ground ) { + //velocity.z = 0.f; go to hell + friction( player, origin, velocity ); + } + + check_velocity( player, origin, velocity ); + + // fuck walking + if( !is_on_ground ) { + air_move( player, origin, velocity, old_velocity, acceleration ); + } + + try_player_move( player, origin, velocity ); + + is_on_ground = categorize_position( player, origin, velocity ); + + check_velocity( player, origin, velocity ); + + finish_gravity( player, origin, velocity ); + + if( is_on_ground ) { + velocity.z = 0.f; + } + + old_velocity = velocity; + + velocity_dir = extrapolated_dir; + } + + return origin; +} + +void c_prediction::check_jump_button( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { + static auto sv_jump_impulse = g_csgo.m_cvar( )->FindVar( xors( "sv_jump_impulse" ) ); + float ground_factor = 1.f; + vec3_t ground_point = origin; + + ground_point.z -= 2.f; + + CGameTrace pm; + trace_player_bbox( player, origin, ground_point, &pm ); + + if( pm.m_pEnt ) { + auto surface_data = g_csgo.m_phys_props( )->GetSurfaceData( pm.surface.surfaceProps ); + if( surface_data ) { + ground_factor = surface_data->game.jumpfactor; + } + } + + + if( !ground_factor ) { + ground_factor = 1.f; + } + + //if( player->m_fFlags( ) & FL_DUCKING ) { + //velocity.z += ground_factor * sv_jump_impulse->get_float( ); // how they do it in csgo + //} + //else { + velocity.z = ground_factor * sv_jump_impulse->get_float( ); + //} + + finish_gravity( player, origin, velocity ); + +} + +void c_prediction::start_gravity( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { + static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + + float m_flGravity = player->m_flGravity( ); + + //if( !m_flGravity ) { + m_flGravity = 1.f; + //} + + velocity.z -= ( m_flGravity * sv_gravity->get_float( ) * 0.5f * TICK_INTERVAL( ) ); + + check_velocity( player, origin, velocity ); +} + +void c_prediction::finish_gravity( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { + static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + + float m_flGravity = player->m_flGravity( ); + //if( !m_flGravity ) { + m_flGravity = 1.f; + //} + + velocity.z -= ( m_flGravity * sv_gravity->get_float( ) * 0.5f * TICK_INTERVAL( ) ); + + check_velocity( player, origin, velocity ); +} + +void c_prediction::friction( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { + static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); + static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); + const float m_surfaceFriction = player->m_surfaceFriction( ); + + float speed = velocity.length( ); + + if( speed < 0.1f ) + return; + + float friction = sv_friction->get_float( ) * m_surfaceFriction; + float control = ( speed < sv_stopspeed->get_float( ) ) ? sv_stopspeed->get_float( ) : speed; + float drop = control * friction * TICK_INTERVAL( ); + + float newspeed = speed - drop; + if( newspeed < 0.f ) + newspeed = 0.f; + + if( newspeed != speed ) { + newspeed /= speed; + velocity *= newspeed; + } +} + +void c_prediction::air_move( c_base_player* player, vec3_t& origin, vec3_t& velocity, vec3_t& old_velocity, vec3_t& acceleration ) { + vec3_t wishvel; + vec3_t wishdir; + float wishspeed; + vec3_t forward, right, up; + + //fmove = m_player.m_movement.x; + //smove = m_player.m_movement.y; + // + //math::angle_vectors( m_player.m_angles, &forward, &right, &up ); + // + //forward.z = right.z = 0.f; + // + //forward.normalize_vector( ); + //right.normalize_vector( ); + // + //for( int i{ }; i < 2; ++i ) { + // wishvel[ i ] = forward[ i ] * fmove + right[ i ] * smove; + //} + + + wishvel = velocity; + + wishvel[ 2 ] = 0.f; + + wishdir = wishvel; + wishdir.normalize_vector( ); + + wishspeed = acceleration.length( ); // probably wrong + + air_accelerate( player, origin, old_velocity, wishdir, wishspeed ); +} + +void c_prediction::air_accelerate( c_base_player* player, vec3_t& origin, vec3_t& velocity, vec3_t& wishdir, float wishspeed ) { + static auto sv_airaccelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); + + float wishspd = wishspeed; + + if( wishspd > 30.f ) + wishspd = 30.f; + + float currentspeed = velocity.dot( wishdir ); + + float addspeed = wishspd - currentspeed; + + if( addspeed <= 0 ) + return; + + float accelspeed = sv_airaccelerate->get_float( ) * wishspeed * TICK_INTERVAL( ); + + if( accelspeed > addspeed ) + accelspeed = addspeed; + + for( int i{ }; i < 2; ++i ) { + velocity[ i ] += accelspeed * wishdir[ i ]; + } +} + +void c_prediction::try_player_move( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { + CGameTrace pm; + vec3_t end_pos = origin + velocity * TICK_INTERVAL( ); + + trace_player_bbox( player, origin, end_pos, &pm ); + + if( pm.fraction != 1.f ) { + end_pos = pm.endpos; + } + + origin = end_pos; +} + + + +//there are supposed to be some ladder checks etc here, but we're really only supposed to be doing this when people are breaking lag comp etc +//also ugly code, please fix :( +bool c_prediction::categorize_position( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { + constexpr float NON_JUMP_VELOCITY = 140.f; + vec3_t ground_point = origin; + bool is_moving_up_rapidally = velocity.z > NON_JUMP_VELOCITY; + CGameTrace pm; + + ground_point.z -= 2.f; + + if( is_moving_up_rapidally ) { + return false; + } + else { + trace_player_bbox( player, origin, ground_point, &pm ); + if( !pm.m_pEnt || pm.plane.normal.z < 0.7 ) { + try_touch_ground_in_quadrants( player, origin, ground_point, &pm ); + if( !pm.m_pEnt || pm.plane.normal.z < 0.7 ) { + return false; + } + else { + return true; + } + } + else { + return true; + } + } + + return true; +} + + +void c_prediction::check_velocity( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { + static auto sv_max_velocity = g_csgo.m_cvar( )->FindVar( xors( "sv_maxvelocity" ) ); + const float max_velocity = sv_max_velocity->get_float( ); + + for( int i{ }; i < 3; ++i ) { + if( !std::isfinite( velocity[ i ] ) ) { + velocity[ i ] = 0.f; + } + + if( !std::isfinite( origin[ i ] ) ) { + origin[ i ] = 0.f; + } + + velocity[ i ] = std::clamp( velocity[ i ], -max_velocity, max_velocity ); + } +} + + + +// https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/shared/gamemovement.cpp#L2025 +vec3_t c_prediction::extrapolate_player( c_base_player* player, int ticks ) { + static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + static auto sv_jump_impulse = g_csgo.m_cvar( )->FindVar( xors( "sv_jump_impulse" ) ); + + auto index = player->ce( )->GetIndex( ); + auto data = get_player_data( index ); + + vec3_t& m_vecBaseVelocity = player->get< vec3_t >( 0x11C ); + + vec3_t predicted( data.m_position ); + vec3_t velocity( data.m_velocity ); + vec3_t acceleration{ }; + + if( !data.m_valid ) + return predicted; + + float velocity_dir = RAD2DEG( atan2( velocity.y, velocity.x ) ); + float angle_dir = velocity_dir - RAD2DEG( atan2( data.m_old_velocity.y, data.m_old_velocity.x ) ); + + angle_dir *= TICKS_TO_TIME( data.m_last_choke ); + + if( velocity_dir <= 180.f ) { + if( velocity_dir < -180.f ) + velocity_dir += 360.f; + } + else { + velocity_dir -= 360.f; + } + + float length = velocity.length2d( ); + + float dir = velocity_dir; + + for( int i = 0; i < ticks; ++i ) { + float extrapolated_dir = velocity_dir + angle_dir; + + velocity.x = cos( DEG2RAD( extrapolated_dir ) ) * length; + velocity.y = sin( DEG2RAD( extrapolated_dir ) ) * length; + + predicted = aimware_extrapolate( player, predicted, velocity ); + + velocity_dir = extrapolated_dir; + } + + return predicted; +} + +void c_prediction::trace_player_bbox( c_base_player* player, const vec3_t& start, const vec3_t& end, CGameTrace* pm ) { + Ray_t ray; + ray.Init( start, end, player->m_vecMins( ), player->m_vecMaxs( ) ); + + CTraceFilter filter; + filter.pSkip = player; + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, pm ); +} + +void c_prediction::try_touch_ground( c_base_player* player, const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs, CGameTrace* pm ) { + Ray_t ray; + ray.Init( start, end, mins, maxs ); + + CTraceFilter filter; + filter.pSkip = player; + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, pm ); +} + +void c_prediction::try_touch_ground_in_quadrants( c_base_player* player, const vec3_t& start, const vec3_t& end, CGameTrace* pm ) { + vec3_t mins, maxs; + + vec3_t mins_src = player->m_vecMins( ); + vec3_t maxs_src = player->m_vecMaxs( ); + + float fraction = pm->fraction; + vec3_t end_pos = pm->endpos; + + mins = mins_src; + maxs = vec3_t( std::min( 0.f, maxs_src.x ), std::min( 0.f, maxs_src.y ), maxs_src.z ); + + try_touch_ground( player, start, end, mins, maxs, pm ); + if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { + pm->fraction = fraction; + pm->endpos = end_pos; + return; + } + + mins = vec3_t( std::max( 0.f, mins_src.x ), std::max( 0.f, mins_src.y ), mins_src.z ); + maxs = maxs_src; + + try_touch_ground( player, start, end, mins, maxs, pm ); + if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { + pm->fraction = fraction; + pm->endpos = end_pos; + return; + } + + mins = vec3_t( mins_src.x, std::max( 0.f, mins_src.y ), mins_src.z ); + maxs = vec3_t( std::min( 0.f, maxs_src.x ), maxs_src.y, maxs_src.z ); + + try_touch_ground( player, start, end, mins, maxs, pm ); + if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { + pm->fraction = fraction; + pm->endpos = end_pos; + return; + } + + mins = vec3_t( std::max( 0.f, mins_src.x ), mins_src.y, mins_src.z ); + maxs = vec3_t( maxs_src.x, std::min( 0.f, maxs_src.y ), maxs_src.z ); + + try_touch_ground( player, start, end, mins, maxs, pm ); + if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { + pm->fraction = fraction; + pm->endpos = end_pos; + return; + } + + pm->fraction = fraction; + pm->endpos = end_pos; +} + +// This code got nasty after a while, imo. You can clean it up if you care enough. +void c_prediction::run_command( user_cmd_t *ucmd ) { + CMoveData movedata{ }; + + if ( !ucmd || !g_csgo.m_engine( )->IsConnected( ) || !g_csgo.m_engine( )->IsInGame( ) || !g_csgo.m_move_helper.get( ) ) + return; + + int backup_buttons = ucmd->m_buttons; + float backup_forwardmove = ucmd->m_forwardmove; + float backup_sidemove = ucmd->m_sidemove; + + ucmd->m_forwardmove = ucmd->m_sidemove = 0.f; + ucmd->m_buttons &= ~( IN_BACK | IN_FORWARD | IN_MOVELEFT | IN_MOVERIGHT ); + + if( !ucmd || !g_ctx.m_local || !g_ctx.m_local->is_alive( ) ) + return; + + static uintptr_t run_command_address = g_csgo.m_prediction->get_old_function< uintptr_t >( 19 ); + + CMoveData move_data{ }; + IClientEntity* local_ent = g_ctx.m_local->ce( ); + + //backup data + int old_buttons = ucmd->m_buttons; + float old_curtime = g_csgo.m_globals->m_curtime; + float old_frame_time = g_csgo.m_globals->m_frametime; + int old_tickbase = g_ctx.m_local->m_nTickBase( ); + int old_flags = g_ctx.m_local->m_fFlags( ); + MoveType_t old_move_type = g_ctx.m_local->m_nMoveType( ); + vec3_t old_velocity = g_ctx.m_local->m_vecVelocity( ); + + //set globals + g_csgo.m_globals->m_curtime = g_csgo.m_globals->m_interval_per_tick * old_tickbase; + g_csgo.m_globals->m_frametime = g_csgo.m_globals->m_interval_per_tick; + + //random seed is already being calculated and set in createmove + **( uintptr_t** )( run_command_address + 0x3E ) = ucmd->m_random_seed; //prediction seed + **( uintptr_t** )( run_command_address + 0x54 ) = uintptr_t( g_ctx.m_local ); //prediction player + + //start prediction + g_csgo.m_move_helper( )->SetHost( local_ent ); + g_csgo.m_game_movement( )->StartTrackPredictionErrors( local_ent ); + + //run prediction + g_csgo.m_prediction( )->SetupMove( local_ent, ucmd, g_csgo.m_move_helper( ), &move_data ); + g_csgo.m_game_movement( )->ProcessMovement( local_ent, &move_data ); + g_csgo.m_prediction( )->FinishMove( local_ent, ucmd, &move_data ); + + //finish prediction + g_csgo.m_game_movement( )->FinishTrackPredictionErrors( local_ent ); + g_csgo.m_move_helper( )->SetHost( nullptr ); + + **( uintptr_t** )( run_command_address + 0x3E ) = 0xffffffff; + **( uintptr_t*** )( run_command_address + 0x54 ) = nullptr; + + //good to have, can be used for edge jump and such + m_predicted_flags = g_ctx.m_local->m_fFlags( ); + + //restore + ucmd->m_buttons = old_buttons; + g_csgo.m_globals->m_curtime = old_curtime; + g_csgo.m_globals->m_frametime = old_frame_time; + //g_ctx.m_local->m_nTickBase( ) = old_tickbase; + g_ctx.m_local->m_fFlags( ) = old_flags; + g_ctx.m_local->m_nMoveType( ) = old_move_type; + g_ctx.m_local->m_vecVelocity( ) = old_velocity; + + ucmd->m_forwardmove = backup_forwardmove; + ucmd->m_sidemove = backup_sidemove; + ucmd->m_buttons = backup_buttons; + + auto wep = g_ctx.m_local->get_weapon( ); + + if( wep ) { + wep->update_accuracy_penalty( ); + g_ctx.m_weapon_inaccuracy = wep->get_inaccuracy( ); + g_ctx.m_weapon_spread = wep->get_spread( ); + } + else { + g_ctx.m_weapon_inaccuracy = g_ctx.m_weapon_spread = 0.f; + } +} + +END_REGION diff --git a/cheat/internal_rewrite/prediction.hpp b/cheat/internal_rewrite/prediction.hpp new file mode 100644 index 0000000..d6adb44 --- /dev/null +++ b/cheat/internal_rewrite/prediction.hpp @@ -0,0 +1,95 @@ +#pragma once +#include "vector.hpp" +#include "util.hpp" + +#include +#include + +class user_cmd_t; +class c_base_player; + +NAMESPACE_REGION( features ) + +class c_prediction +{ + user_cmd_t* m_ucmd{ }; + int m_predicted_flags{ }; + + float m_old_time; + float m_old_frametime; + int m_old_tickcount; + + int m_prediction_seed; + int m_prediction_player; + + struct player_data_t { + struct lag_velocity_record_t { + vec3_t m_velocity; + int m_tick; + }; + + void update( int ent_index ); + + float m_simtime{ }; + int m_last_choke{ }; + vec3_t m_angles{ }; + vec3_t m_velocity{ }; + vec3_t m_old_velocity{ }; + vec3_t m_position{ }; + vec3_t m_movement{ }; + bool m_valid{ }; + bool m_breaking_lc{ }; + + std::deque< lag_velocity_record_t > m_records{ }; + }; + + std::array< player_data_t, 65 > m_players; + + void run( user_cmd_t* ucmd ); +public: + // You should be using the un-predicted velocity for fake-walk. + vec3_t m_velocity{ }; + + // void local_pred( user_cmd_t* ); + + void run_command( user_cmd_t *cmd ); + + int get_predicted_flags( ) const { + return m_predicted_flags; + } + + bool is_breaking_lc( int ent ) const { + return m_players[ ent ].m_breaking_lc; + } + + inline player_data_t get_player_data( int ent_index ) { + return m_players[ ent_index ]; + } + + player_data_t m_player; + + //gamemovement functions + vec3_t full_walk_move( c_base_player*, int ); + void check_jump_button( c_base_player*, vec3_t&, vec3_t& ); + void start_gravity( c_base_player*, vec3_t&, vec3_t& ); + void finish_gravity( c_base_player*, vec3_t&, vec3_t& ); + void friction( c_base_player*, vec3_t&, vec3_t& ); + void air_move( c_base_player*, vec3_t&, vec3_t&, vec3_t&, vec3_t& ); + void air_accelerate( c_base_player*, vec3_t&, vec3_t&, vec3_t&, float ); + // void walk_move( c_base_player*, vec3_t&, vec3_t& ); + bool categorize_position( c_base_player*, vec3_t&, vec3_t& ); + void check_velocity( c_base_player*, vec3_t&, vec3_t& ); + void try_player_move( c_base_player*, vec3_t&, vec3_t& ); + + void frame_stage_notify( ); + vec3_t aimware_extrapolate( c_base_player* ent, vec3_t origin, vec3_t& velocity ); + void predict_player( c_base_player* player ); + int get_predicted_choke( int ); + vec3_t extrapolate_player( c_base_player*, int ); + void trace_player_bbox( c_base_player*, const vec3_t& start, const vec3_t& end, CGameTrace* pm ); + void try_touch_ground( c_base_player*, const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs, CGameTrace* pm ); + void try_touch_ground_in_quadrants( c_base_player*, const vec3_t& start, const vec3_t& end, CGameTrace* pm ); + +}; + +END_REGION diff --git a/cheat/internal_rewrite/proxies.cpp b/cheat/internal_rewrite/proxies.cpp new file mode 100644 index 0000000..287970b --- /dev/null +++ b/cheat/internal_rewrite/proxies.cpp @@ -0,0 +1,116 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +void __cdecl hooks::lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { + lby_proxy.get_old_function( )( proxy_data_const, entity, output ); + + if( !g_csgo.m_panic ) { + auto player = ( c_base_player* )( entity ); + if( player && player == g_ctx.m_local ) { + g_cheat.m_ragebot.m_antiaim->on_lby_proxy( ); + } + } +} + +void __cdecl hooks::last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { + last_shot_proxy.get_old_function( )( proxy_data_const, entity, output ); + if( !g_csgo.m_panic && proxy_data_const && g_settings.rage.enabled( ) && g_settings.rage.resolver( ) ) { + auto wep = ( c_base_weapon* )( entity ); + if( wep && !wep->is_knife( ) && !wep->is_grenade( ) ) { + auto owner = g_csgo.m_entlist( )->GetClientEntityFromHandle( wep->m_hOwner( ) ); + if( owner && owner->is_valid( ) && owner != g_ctx.m_local && g_ctx.m_local->is_valid( ) && owner->has_valid_anim( ) ) { + if( owner->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) + return; + + static float last_time = 0.f; + float time = wep->m_fLastShotTime( ); + + if( !time ) + return; + + float anim_time = owner->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + auto record = g_cheat.m_ragebot.m_lagcomp->get_newest_record( owner->ce( )->GetIndex( ) ); + float& last_update = g_cheat.m_ragebot.m_lagcomp->get_last_updated_simtime( owner->ce( )->GetIndex( ) ); + + if( time == anim_time && owner->has_valid_anim( ) && owner->m_flSimulationTime( ) != last_update ) { + last_update = owner->m_flSimulationTime( ); + + vec3_t local_pos = g_ctx.m_local->m_vecOrigin( ); + vec3_t enemy_pos = owner->m_vecOrigin( ); + vec3_t ang = math::vector_angles( enemy_pos, local_pos ); + + owner->m_angEyeAngles( ).y = ang.y; + owner->fix_animations( ); + + features::c_ragebot::lag_record_t record( owner ); + record.m_shot = true; + + g_cheat.m_ragebot.m_lagcomp->store_record( owner->ce( )->GetIndex( ), RECORD_NORMAL, record ); + last_time = time; + } + else if( owner->has_valid_anim( ) && time != last_time ) { + auto lby_records = g_cheat.m_ragebot.m_lagcomp->get_records( owner->ce( )->GetIndex( ), RECORD_LBY ); + auto sim_records = g_cheat.m_ragebot.m_lagcomp->get_records( owner->ce( )->GetIndex( ), RECORD_NORMAL ); + + features::c_ragebot::lag_record_t* prev_record = nullptr; + float min_delta = FLT_MAX; + + if( lby_records->size( ) ) { + for( auto& it : *lby_records ) { + float delta = std::abs( it.m_flSimulationTime - time ); + if( delta > TICKS_TO_TIME( 15 ) ) + break; + + if( delta < g_csgo.m_globals->m_interval_per_tick ) + break; + + if( delta < min_delta ) { + prev_record = ⁢ + min_delta = delta; + } + } + } + + if( sim_records->size( ) ) { + for( auto& it : *sim_records ) { + if( it.m_shot ) + continue; + + float delta = std::abs( it.m_flSimulationTime - time ); + if( delta > TICKS_TO_TIME( 15 ) ) + break; + + if( delta < g_csgo.m_globals->m_interval_per_tick ) + break; + + if( delta < min_delta ) { + prev_record = ⁢ + min_delta = delta; + } + } + } + + if( prev_record && !prev_record->m_shot ) { + owner->m_angEyeAngles( ).x = prev_record->m_vecAngles.x; + } + + last_time = time; + } + } + } + } +} + +void __cdecl hooks::simtime_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { + auto old_fn = simtime_proxy.get_old_function( ); + + auto ent = ( c_base_player* )( entity ); + if( ent && ent->is_valid( ) && ent->has_valid_anim( ) && ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.rage.friendlies( ) ) && ent != g_ctx.m_local ) { + if( !proxy_data_const->m_Value.m_Int ) { + return; + } + } + + old_fn( proxy_data_const, entity, output ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ragebot.cpp b/cheat/internal_rewrite/ragebot.cpp new file mode 100644 index 0000000..4a85078 --- /dev/null +++ b/cheat/internal_rewrite/ragebot.cpp @@ -0,0 +1,1142 @@ +#include "ragebot.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "math.hpp" +#include "base_cheat.hpp" +#include "input_system.hpp" + +namespace features +{ + c_ragebot::c_ragebot( ) : + m_antiaim( std::make_shared< c_antiaim >( ) ), + m_lagcomp( std::make_shared< c_lagcomp >( ) ), + m_resolver( std::make_shared< c_resolver >( ) ) { } + + void c_ragebot::operator()( user_cmd_t* cmd ) { + if( !cmd ) return; + m_cmd = cmd; + + m_antiaim->run( cmd ); + run( ); + m_antiaim->fix_movement( ); + } + + vec3_t head_scale( c_base_player* ent, vec3_t pos ) { + + // broke, crashes the hack + //not what it is + //return pos; + + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + CTraceFilterOneEntity filter; + Ray_t ray; + CGameTrace trace; + + filter.ent = ent; + + float height{ }; + float highest_dmg{ }; + float max_height{ }; + + const float max = 6.5f * g_settings.rage.active->m_hitbox_scale; + + for( float i = 0.f; i < max; i += 0.25f ) { + vec3_t end = pos; + end.z += i; + + ray.Init( eye_pos, end ); + g_csgo.m_trace( )->TraceRay( ray, 0x46004003, &filter, &trace ); + + if( trace.m_pEnt == ent->ce( ) ) { + max_height = i; + if( trace.hitgroup == HITGROUP_HEAD && !height ) { + height = i; + } + } + } + + if( height < 0.5f ) { + pos.z += height; + return pos; + } + + pos.z += ( height + max_height ) * 0.5f; + return pos; + } + + int c_ragebot::get_min_dmg( c_base_player* ent ) { + int hp = ent->m_iHealth( ); + int dmg = g_settings.rage.active->m_damage( ); + int scale = g_settings.rage.active->m_damage_scale( ); + return std::min< int >( ( int )( hp * scale * 0.01f ) + dmg, 100 ); + } + + vec3_t c_ragebot::multipoint( c_base_player* ent, int hitbox, float* out_dmg ) { + auto should_multipoint = [ ]( int hitbox, bool moving ) -> bool { + if( !g_settings.rage.multipoint_enable ) + return false; + + auto& setting = g_settings.rage.multipoint; + + switch( hitbox ) { + case HITBOX_HEAD: + return setting.head; + case HITBOX_PELVIS: + case HITBOX_BODY: + return setting.stomach; + //case HITBOX_CHEST: + case HITBOX_UPPER_CHEST: + case HITBOX_THORAX: + return setting.chest; + case HITBOX_RIGHT_THIGH: + case HITBOX_LEFT_THIGH: + if( moving && g_settings.rage.ignore_limbs_moving ) + return false; + + if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) + return false; + + return setting.thighs; + + case HITBOX_LEFT_CALF: + case HITBOX_RIGHT_CALF: + if( moving && g_settings.rage.ignore_limbs_moving ) + return false; + + if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) + return false; + + return setting.calves; + default: + return false; + } + }; + + bool moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ); + + vec3_t pos = ent->get_hitbox_pos( hitbox ); + if( hitbox == HITBOX_HEAD ) + pos = head_scale( ent, pos ); + + float dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, pos ); + if( dmg > get_min_dmg( ent ) ) { + *out_dmg = dmg; + return pos; + } + + if( should_multipoint( hitbox, moving ) ) { + const auto model = ent->ce( )->GetModel( ); + if( !model ) return vec3_t{ }; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !hdr ) return vec3_t{ }; + + matrix3x4 bone_matrix[ 128 ]; + if( !ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) { + return vec3_t{ }; + } + + auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); + if( !set ) return vec3_t{ }; + + //literally 20000 iq, the best multipoint + //im an actual fucking retard jesus christ + auto box = set->pHitbox( hitbox ); + if( !box ) return vec3_t{ }; + + vec3_t center = ( box->bbmax + box->bbmin ) * 0.5f; + + float dist = box->m_flRadius; + + if( box->m_flRadius == -1.f ) + dist = center.dist_to( box->bbmin ) * 0.85f; + vec3_t min_dir = math::angle_vectors( math::vector_angles( center, box->bbmin ) ); + vec3_t min = center + min_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; + + if( box->m_flRadius == -1.f ) + dist = center.dist_to( box->bbmax ) * 0.85f; + vec3_t max_dir = math::angle_vectors( math::vector_angles( center, box->bbmax ) ); + vec3_t max = center + max_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; + + static int point_index[ 65 ][ HITBOX_MAX ]; + + std::vector< vec3_t > points; + + if( g_settings.rage.multipoint_enable( ) == 1 || + hitbox == HITBOX_LEFT_CALF || hitbox == HITBOX_RIGHT_CALF || + hitbox == HITBOX_LEFT_THIGH || hitbox == HITBOX_RIGHT_THIGH ) { + points.push_back( vec3_t{ min.x, min.y, center.z } ); + points.push_back( vec3_t{ max.x, min.y, center.z } ); + points.push_back( vec3_t{ min.x, max.y, center.z } ); + points.push_back( vec3_t{ max.x, max.y, center.z } ); + } + else if( g_settings.rage.multipoint_enable( ) == 2 ) { + points.push_back( vec3_t{ max.x, max.y, max.z } ); + points.push_back( vec3_t{ min.x, max.y, max.z } ); + points.push_back( vec3_t{ max.x, min.y, max.z } ); + points.push_back( vec3_t{ min.x, min.y, max.z } ); + + points.push_back( vec3_t{ max.x, max.y, min.z } ); + points.push_back( vec3_t{ min.x, max.y, min.z } ); + points.push_back( vec3_t{ max.x, min.y, min.z } ); + points.push_back( vec3_t{ min.x, min.y, min.z } ); + } + else if( g_settings.rage.multipoint_enable( ) == 3 ) { + points.push_back( vec3_t{ min.x, min.y, center.z } ); + points.push_back( vec3_t{ max.x, min.y, center.z } ); + points.push_back( vec3_t{ min.x, max.y, center.z } ); + points.push_back( vec3_t{ max.x, max.y, center.z } ); + + points.push_back( vec3_t{ max.x, max.y, max.z } ); + points.push_back( vec3_t{ min.x, max.y, max.z } ); + points.push_back( vec3_t{ max.x, min.y, max.z } ); + points.push_back( vec3_t{ min.x, min.y, max.z } ); + + points.push_back( vec3_t{ max.x, max.y, min.z } ); + points.push_back( vec3_t{ min.x, max.y, min.z } ); + points.push_back( vec3_t{ max.x, min.y, min.z } ); + points.push_back( vec3_t{ min.x, min.y, min.z } ); + } + + float min_dmg = get_min_dmg( ent ); + auto& point_idx = point_index[ ent->ce( )->GetIndex( ) ][ hitbox ]; + + float percentage = g_settings.rage.multipoint_scale( ) * 0.01f; + int mul = ( int )( g_csgo.m_globals->m_frametime / TICK_INTERVAL( ) ); + + int count = math::min< int >( math::max< int >( mul * points.size( ) * percentage, + points.size( ) * percentage, + 1 ), points.size( ) ); + + for( int i{ }; i < count; ++i ) { + point_idx %= points.size( ); + + vec3_t point = points[ point_idx ]; + + vec3_t trans_point = math::vector_transform( point, bone_matrix[ box->bone ] ); + CTraceFilterOneEntity filter; + CGameTrace trace; + Ray_t ray; + + filter.ent = ent; + ray.Init( g_ctx.m_local->get_eye_pos( ), trans_point ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &trace ); + + if( trace.m_pEnt == ent->ce( ) ) { + float dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, trans_point ); + if( dmg > min_dmg ) { + *out_dmg = dmg; + return trans_point; + } + else { + point_idx++; + } + } + else { + point_idx++; + } + } + } + + return ent->get_hitbox_pos( hitbox ); + } + + int c_ragebot::hitscan( c_base_player* ent, bool baim, vec3_t& out_pos, float& out_dmg ) { + auto should_histcan = []( int hitbox, bool moving ) -> bool { + switch ( hitbox ) { + case HITBOX_HEAD: + case HITBOX_NECK: + return g_settings.rage.hitscan.head; + case HITBOX_PELVIS: + case HITBOX_BODY: + return g_settings.rage.hitscan.stomach; + case HITBOX_CHEST: + case HITBOX_UPPER_CHEST: + case HITBOX_THORAX: + return g_settings.rage.hitscan.chest; + case HITBOX_RIGHT_HAND: + case HITBOX_LEFT_HAND: + if( moving && g_settings.rage.ignore_limbs_moving ) + return false; + + if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) + return false; + + return g_settings.rage.hitscan.arms; + case HITBOX_RIGHT_THIGH: + case HITBOX_LEFT_THIGH: + case HITBOX_LEFT_CALF: + case HITBOX_RIGHT_CALF: + if( moving && g_settings.rage.ignore_limbs_moving ) + return false; + + if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) + return false; + + return g_settings.rage.hitscan.legs; + + case HITBOX_RIGHT_FOOT: + case HITBOX_LEFT_FOOT: + if( moving ) + return false; + + if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) + return false; + + return g_settings.rage.hitscan.feet; + default: + return false; + } + }; + + constexpr std::array< std::pair< PlayerHitboxes_t, int >, 15 > hitbox_order = { + std::make_pair( HITBOX_HEAD, 3 ), + + std::make_pair( HITBOX_PELVIS, 3 ), + std::make_pair( HITBOX_BODY, 3 ), + std::make_pair( HITBOX_THORAX, 3 ), + std::make_pair( HITBOX_CHEST, 3 ), + std::make_pair( HITBOX_UPPER_CHEST, 3 ), + + std::make_pair( HITBOX_NECK, 2 ), + + std::make_pair( HITBOX_RIGHT_HAND, 2 ), + std::make_pair( HITBOX_LEFT_HAND, 2 ), + + std::make_pair( HITBOX_RIGHT_THIGH, 2 ), + std::make_pair( HITBOX_LEFT_THIGH, 2 ), + + std::make_pair( HITBOX_RIGHT_CALF, 1 ), + std::make_pair( HITBOX_LEFT_CALF , 1 ), + + std::make_pair( HITBOX_RIGHT_FOOT, 0 ), + std::make_pair( HITBOX_LEFT_FOOT, 0 ), + }; + + bool moving = ent->m_vecVelocity( ).length( ) > 0.1f && !ent->is_fakewalking( ); + float min_dmg = get_min_dmg( ent ); + + if( g_settings.rage.hitbox != -1 ) { + float dmg{ }; + vec3_t pos = multipoint( ent, g_settings.rage.hitbox, &dmg ); + + if( dmg > min_dmg && pos ) { + out_dmg = dmg; + out_pos = pos; + return g_settings.rage.hitbox; + } + + return -1; + } + + struct hitbox_t { + float dmg; + int hitbox; + int priority; + vec3_t position; + }; + + std::vector< hitbox_t > hitboxes; + + for( size_t i{ }; i < hitbox_order.size( ); ++i ) { + auto hitbox = hitbox_order[ i ]; + if( !should_histcan( hitbox.first, moving ) ) { + continue; + } + + float dmg{ }; + vec3_t pos = multipoint( ent, hitbox.first, &dmg ); + + if( pos ) + hitboxes.push_back( { dmg, hitbox.first, hitbox.second, pos } ); + } + + std::sort( hitboxes.begin( ), hitboxes.end( ), [ &ent, &baim ]( hitbox_t& a, hitbox_t& b ) -> bool { + int hp = ent->m_iHealth( ); + + bool a_head = !( a.hitbox == HITBOX_HEAD || a.hitbox == HITBOX_NECK ); + bool b_head = !( b.hitbox == HITBOX_HEAD || b.hitbox == HITBOX_NECK ); + + if( a.dmg != b.dmg ) { + if( a.dmg > ( float )( hp + 10 ) && ( float )( b.dmg > hp + 10 ) ) { + if( a_head != b_head ) { + return a_head > b_head; + } + } + } + + if( a_head != b_head && baim ) + return a_head > b_head; + + if( a.priority != b.priority ) { + return a.priority > b.priority; + } + + if( a.dmg != b.dmg ) { + return a.dmg > b.dmg; + } + + return a.hitbox > b.hitbox; + } ); + + for( auto& it : hitboxes ) { + if( it.dmg > min_dmg ) { + out_dmg = it.dmg; + out_pos = it.position; + + return it.hitbox; + } + } + + return -1; + } + + void c_ragebot::update_settings( ) { + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) return; + int weapon_id = weapon->m_iItemDefinitionIndex( ); + + switch ( weapon_id ) { + case WEAPON_DEAGLE: + case WEAPON_R8REVOLVER: + g_settings.rage.active = &g_settings.rage.heavy_pistols; + break; + case WEAPON_AWP: + case WEAPON_SSG08: + g_settings.rage.active = &g_settings.rage.snipers; + break; + case WEAPON_G3SG1: + case WEAPON_SCAR20: + g_settings.rage.active = &g_settings.rage.auto_snipers; + break; + default: + g_settings.rage.active = &g_settings.rage.general; + break; + } + } + + bool c_ragebot::should_baim_entity( c_base_player* ent, bool backtracked ) { + int index = ent->ce( )->GetIndex( ); + + auto weap = g_ctx.m_local->get_weapon( ); + if( weap->m_iItemDefinitionIndex( ) == WEAPON_TASER ) + return true; + + if( !g_cheat.m_player_mgr.is_cheater( index ) ) + return false; + + int min_hp = g_settings.rage.active->m_baim_health; + int min_shots = g_settings.rage.active->m_baim_shots; + + if( m_resolver->get_shots( index ) >= min_shots ) + return true; + + if( ent->m_iHealth( ) <= min_hp ) + return true; + + if( !( ent->m_fFlags( ) & FL_ONGROUND ) && g_settings.rage.active->m_baim_air ) + return true; + + if( !backtracked && g_settings.rage.active->m_baim_fake ) + return true; + + return false; + } + + void quick_stop( user_cmd_t* cmd ) { + if( g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) + return; + + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return; + + vec3_t vel = g_ctx.m_local->m_vecVelocity( ); + float speed = vel.length2d( ); + + if( g_settings.rage.active->m_auto_stop == 1 || g_settings.rage.active->m_auto_stop == 4 ) { + auto wep = g_ctx.m_local->get_weapon( ); + auto wep_info = wep->get_wpn_info( ); + + bool scoped = g_ctx.m_local->m_bIsScoped( ); + float max_vel = scoped ? wep_info->max_speed_alt : wep_info->max_speed; + + if( speed < max_vel / 3 ) + return; + } + + if( speed < 0.1f ) { + g_ctx.get_last_cmd( )->m_forwardmove = 0.f; + g_ctx.get_last_cmd( )->m_sidemove = 0.f; + return; + } + + static auto sv_accelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_accelerate" ) ); + float accel = sv_accelerate->get_float( ); + float max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed; + if( g_ctx.m_local->get_weapon( )->is_sniper( ) && g_ctx.m_local->m_bIsScoped( ) ) { + max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed_alt; + } + + // thx ida + max_speed = std::min< float >( max_speed, 250.f ); + + if( g_ctx.m_local->m_fFlags( ) & FL_DUCKING ) { + // max_speed /= 3.f; + // accel /= 3.f; + } + + float surf_friction = 1.f; + float max_accelspeed = accel * g_csgo.m_globals->m_interval_per_tick * max_speed * surf_friction; + + float wishspeed{ }; + + if( speed - max_accelspeed <= -1.f ) { + wishspeed = max_accelspeed / ( speed / ( accel * g_csgo.m_globals->m_interval_per_tick ) ); + } + else { + wishspeed = max_accelspeed; + } + + vec3_t ndir = math::vector_angles( vel * -1.f ); + ndir.y = g_csgo.m_engine( )->GetViewAngles( ).y - ndir.y; + ndir = math::angle_vectors( ndir ); + + g_ctx.get_last_cmd( )->m_forwardmove = ndir.x * wishspeed; + g_ctx.get_last_cmd( )->m_sidemove = ndir.y * wishspeed; + } + + std::array< int, 65 > c_ragebot::get_sorted_targets( ) { + typedef struct { + int index; + float dist; + float fov; + bool moving; + int hp; + float simtime; + } target; + + std::array< target, 65 > targets{ }; + std::array< int, 65 > ret{ }; + + vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); + vec3_t cur_ang, dir_vec; + g_csgo.m_engine( )->GetViewAngles( cur_ang ); + + dir_vec = math::angle_vectors( cur_ang ); + + for( size_t i{ }; i < 65; ++i ) { + auto& cur_target = targets.at( i ); + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + cur_target.index = i; + + if( !ent || ent == g_ctx.m_local || !ent->is_valid( ) ) + continue; + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && + !g_settings.rage.friendlies( ) ) + continue; + + if( !ent->has_valid_anim( ) ) + continue; + + auto pos = ent->m_vecOrigin( ); + pos.z += 30.f; //eh + + auto dir = ( pos - local_pos ); + dir.normalize_vector( ); + + float fov = dir_vec.fov_to( dir ) * M_RADPI; // epic fov fix by friendly.... + + cur_target.fov = fov; + cur_target.dist = pos.dist_to( local_pos ); + cur_target.hp = ent->m_iHealth( ); + cur_target.moving = ent->m_vecVelocity( ).length2d( ) > 0.1f + && !ent->is_fakewalking( ) + && ( ent->m_fFlags( ) & FL_ONGROUND ); + cur_target.simtime = ent->m_flSimulationTime( ); + } + + auto sort_fn = [ ]( const target& a, const target& b ) { + if( g_settings.rage.prefer_low_hp ) { + if( a.hp != b.hp ) + return a.hp < b.hp; + } + + if( g_settings.rage.prefer_moving ) { + if( a.moving != b.moving ) + return a.moving > b.moving; + } + + if( g_settings.rage.selection_type == 0 ) { + if( a.fov != b.fov ) + return a.fov < b.fov; + } + else if( g_settings.rage.selection_type == 1 ) { + if( a.dist != b.dist ) + return a.dist < b.dist; + } + else if( g_settings.rage.selection_type == 2 ) { + if( a.simtime != b.simtime ) + return a.simtime > b.simtime; + } + + return a.index > b.index; + }; + + std::sort( targets.begin( ), targets.end( ), sort_fn ); + for( size_t i{ }; i < 65; ++i ) { + if( targets[ i ].fov < g_settings.rage.fov ) { + ret[ i ] = targets[ i ].index; + } + } + + return ret; + } + + bool c_ragebot::can_hit_without_ping( int entity ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( entity ); + + if( !ent ) + return false; + + int min_dmg = get_min_dmg( ent ); + auto check_records = [ &ent, &min_dmg ]( std::deque< lag_record_t >* records ) { + auto& front = records->front( ); + vec3_t pred_pos = front.m_vecPelvisPos; + + float dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, pred_pos, false ); + if( dmg > min_dmg ) + return true; + + pred_pos = front.m_vecHeadPos; + dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, pred_pos, false ); + if( dmg > min_dmg ) + return true; + + return false; + }; + + auto lby_records = m_lagcomp->get_records( entity, RECORD_LBY ); + auto sim_records = m_lagcomp->get_records( entity, RECORD_NORMAL ); + + if( lby_records->size( ) ) { + if( check_records( lby_records ) ) + return true; + } + + if( sim_records->size( ) ) { + if( check_records( sim_records ) ) + return true; + } + + return false; + } + + int c_ragebot::knifebot( ) { + auto aim_pos = g_ctx.m_local->get_eye_pos( ); + + float dist = FLT_MAX; + int ideal_ent = 0; + int ideal_tick = 0; + int hp = 0; + vec3_t pos; + + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); + + if( !ent || !ent->is_valid( ) || ent == g_ctx.m_local || !ent->has_valid_anim( ) || ent->m_bGunGameImmunity( ) ) + continue; + + auto newest_record = m_lagcomp->get_newest_valid_record( i ); + if( !newest_record ) + continue; + + if( newest_record->m_vecPelvisPos.dist_to( aim_pos ) < dist ) { + hp = ent->m_iHealth( ); + ideal_ent = i; + ideal_tick = newest_record->m_tickcount; + pos = newest_record->m_vecPelvisPos; + + dist = pos.dist_to( aim_pos ); + } + } + + if( ideal_ent && dist < 80.f ) { + int attack = 0; + + if( dist < 65.f ) + attack = IN_ATTACK2; + else if( hp < 35 ) + attack = IN_ATTACK; + else + return -1; + + vec3_t ang = math::vector_angles( aim_pos, pos ); + float fov = ang.dist_to( g_csgo.m_engine( )->GetViewAngles( ) ); + + if( fov < g_settings.rage.fov ) { + m_cmd->m_viewangles = math::vector_angles( aim_pos, pos ); + m_cmd->m_tick_count = ideal_tick; + m_cmd->m_buttons |= attack; + + return ideal_ent; + } + else { + return -1; + } + } + + return -1; + } + + bool c_ragebot::can_hit_target( int it, aim_target_t* ret, bool zeus, bool hitchance ) { + vec3_t aim_ang; + vec3_t aim_pos; + vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); + + auto entity = g_csgo.m_entlist( )->GetClientEntity< >( it ); + if( !entity || !entity->is_valid( ) || entity == g_ctx.m_local ) + return false; + if( entity->m_bGunGameImmunity( ) ) + return false; + if( !entity->has_valid_anim( ) ) + return false; + if( entity->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) + return false; + + bool baim = false; + bool should_baim = true; + bool backtracked = false; + bool restore = false; + float hit_damage = 0.f; + vec3_t extrapolate{ }; + + lag_record_t original_record( entity ); + lag_record_t* backtracked_record{ }; + + int tick_count = m_cmd->m_tick_count; + float lerp = util::get_lerptime( ); + auto record_type = m_lagcomp->can_backtrack_entity( it ); + if( !g_settings.rage.resolver( ) ) { + if( !util::is_tick_valid( entity->m_flSimulationTime( ) + lerp ) ) { + int new_tickcount = m_lagcomp->backtrack_entity( it, + record_type, &backtracked_record ); + + if( new_tickcount != -1 ) { + restore = true; + tick_count = new_tickcount; + } + else if( g_settings.misc.net_fakelag == 4 && can_hit_without_ping( it ) ) { + m_can_fakeping = false; + } + } + } + else { + int new_tickcount = m_lagcomp->backtrack_entity( it, record_type, &backtracked_record ); + if( new_tickcount != -1 ) { + tick_count = new_tickcount; + should_baim = record_type != RECORD_LBY; + backtracked = record_type == RECORD_LBY; + restore = true; + } + else { + if( g_settings.misc.net_fakelag == 4 ) { + //if( can_hit_without_ping( it ) ) + // m_can_fakeping = false; + } + + lag_record_t* last_simtime_record = m_lagcomp->get_newest_valid_record( it ); + if( last_simtime_record ) { + //ENSURE THE MOST ACCURATE DATA + entity->m_vecVelocity( ) = entity->get_animdata( ).m_last_velocity; + + auto velocity = entity->m_vecVelocity( ); + auto min_vel = 64 / TICK_INTERVAL( ) / 14; + + //IS HE A SLOW BOI OR A FAST NIGGER + if( g_settings.rage.fakelag_resolver( ) && velocity.length2d( ) > min_vel - 10.f ) { + auto new_record = *last_simtime_record; + + //FUCK FAKE PINGERS WE IN THIS BITCH + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); //GOD FUCKING KNOWS WHY + float latency = nci->GetLatency( 0 ) + g_csgo.m_globals->m_frametime; + + auto pred_choke = g_cheat.m_prediction.get_predicted_choke( it ); + auto latency_ticks = TIME_TO_TICKS( latency ); + + float time_since_update = g_ctx.pred_time( ) + latency - entity->m_flSimulationTime( ); + + //NIGGA UPDATED ALREADY FUCK ADAPTIVE + if( TIME_TO_TICKS( time_since_update ) > pred_choke && pred_choke > 0 ) { + if( g_settings.rage.fakelag_resolver( ) == 1 ) + return false; + + else if( latency_ticks > 0 ) { + int update_count = TIME_TO_TICKS( time_since_update ) / pred_choke; + + vec3_t extrapolated_origin = g_cheat.m_prediction.full_walk_move( entity, update_count * pred_choke ); + new_record.m_vecRenderOrigin = extrapolated_origin; + new_record.m_tickcount += update_count * pred_choke; + } + } + + //if( !new_record.is_valid( ) ) + // continue; + + int shots = m_resolver->get_shots( it ); + bool recalc = shots != last_simtime_record->m_shots; + + new_record.restore( true, recalc ); + tick_count = new_record.m_tickcount; + backtracked_record = last_simtime_record; + restore = true; + } + else { + int shots = m_resolver->get_shots( it ); + bool recalc = shots != last_simtime_record->m_shots; + + last_simtime_record->restore( recalc, recalc ); + tick_count = last_simtime_record->m_tickcount; + backtracked_record = last_simtime_record; + restore = true; + } + } + else { + //fake ping, just wait for an update + return false; + } + } + } + + baim = should_baim_entity( entity, !should_baim ); + + auto restore_player = [ &original_record, &restore, &entity, this ]( ) { + original_record.restore( true ); + //entity->m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); + }; + + int hitbox = hitscan( entity, baim, aim_pos, hit_damage ); + if( hitbox == -1 ) { + restore_player( ); + return false; + } + + if( aim_pos.dist_to( local_pos ) > 150.f && zeus ) { + restore_player( ); + return false; + } + + aim_ang = math::vector_angles( local_pos, aim_pos ).clamp( ); + + if( g_settings.rage.active->m_auto_stop( ) == 2 ) + quick_stop( m_cmd ); + else if( g_settings.rage.active->m_auto_stop( ) == 3 ) { + m_antiaim->run_fakewalk( ); + } + + if( g_settings.rage.active->m_auto_stop( ) == 5 ) { + m_cmd->m_buttons |= IN_DUCK; + } + + if( hitchance && !util::hitchance( it, aim_ang, + g_settings.rage.active->m_hitchance, hitbox ) ) { + if( g_settings.rage.active->m_auto_stop( ) == 1 || g_settings.rage.active->m_auto_stop( ) == 4 ) + quick_stop( m_cmd ); + + if( g_settings.rage.active->m_auto_stop( ) == 5 ) { + if( g_ctx.m_local->m_flDuckAmount( ) < 1.f ) + quick_stop( m_cmd ); + } + + if( g_settings.rage.active->m_auto_stop( ) == 4 && g_cheat.m_lagmgr.get_choked( ) < 10 && !m_antiaim->is_fakewalking( ) ) + g_cheat.m_lagmgr.set_state( false ); + + if( g_settings.rage.auto_scope( ) && g_ctx.m_local->get_weapon( )->is_sniper( ) ) { + if( !g_ctx.m_local->m_bIsScoped( ) ) { + m_cmd->m_buttons |= IN_ATTACK2; + } + } + + restore_player( ); + return false; + } + + ret->m_ent_index = it; + ret->m_position = aim_pos; + ret->m_tick_count = tick_count; + ret->m_hitbox = hitbox; + ret->m_backtracked = backtracked; + ret->m_min = entity->get_hitbox_mins( hitbox ); + ret->m_max = entity->get_hitbox_maxs( hitbox ); + ret->m_radius = entity->get_hitbox_radius( hitbox ); + + memcpy( m_shot_matrix, entity->m_CachedBoneData( ).GetElements( ), sizeof( matrix3x4 ) * entity->m_CachedBoneData( ).GetSize( ) ); + + m_shot_target = it; + + restore_player( ); + + return true; + } + + c_ragebot::aim_target_t c_ragebot::find_best_target( ) { + aim_target_t ret{ -1, m_cmd->m_tick_count, -1, vec3_t{ }, vec3_t{ }, vec3_t{ }, 0.f, 0 }; + vec3_t aim_angle{ }; + vec3_t aim_pos{ }; + auto weapon_info = g_ctx.m_local->get_weapon( )->get_wpn_info( ); + bool is_zeus = g_ctx.m_local->get_weapon( )->m_iItemDefinitionIndex( ) == WEAPON_TASER; + int damage = weapon_info->damage; + + auto players = get_sorted_targets( ); + auto data = players.data( ); + + for( size_t i{ }; i < players.size( ); ++i ) { + if( can_hit_target( data[ i ], &ret, is_zeus ) ) + break; + } + + return ret; + } + + void c_ragebot::set_angles( const vec3_t& angles ) { + auto weapon = g_ctx.m_local->get_weapon( ); + + // TODO: Implement the get_spread_direction here I guess. + if( g_settings.rage.compensate_spread ) { + int seed = m_cmd->m_random_seed; + + float inaccuracy = g_ctx.m_weapon_inaccuracy; + float spread = g_ctx.m_weapon_spread; + + util::set_random_seed( ( seed & 0xff ) + 1 ); + + float rand_a = util::get_random_float( 0.0f, 1.0f ); + float pi_rand_a = util::get_random_float( 0.f, 2.f * M_PI ); + float rand_b = util::get_random_float( 0.f, 1.0f ); + float pi_rand_b = util::get_random_float( 0.f, 2.f * M_PI ); + + float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); + float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); + + vec3_t forward, right, up; + math::angle_vectors( angles, &forward, &right, &up ); + + vec3_t spread_dir = forward + ( right * -spread_x ) + ( up * -spread_y ); + spread_dir.normalize_vector( ); + + vec3_t comp = math::vector_angles( vec3_t( ), spread_dir ); + + m_cmd->m_viewangles = comp; + } + else { + m_cmd->m_viewangles = angles; + } + + //if( g_settings.rage.silent == 2 ) { + // if( !m_antiaim->is_fakewalking( ) ) + // g_cheat.m_lagmgr.set_state( g_cheat.m_lagmgr.get_choked( ) ); + //} + + if( g_settings.rage.silent == 1 && !m_antiaim->is_fakewalking( ) ) { + //if( weapon->m_iItemDefinitionIndex( ) != WEAPON_R8REVOLVER ) + g_cheat.m_lagmgr.set_state( !g_cheat.m_lagmgr.get_sent( ) ); + } + + if( !g_settings.rage.silent( ) ) { + g_csgo.m_engine( )->SetViewAngles( m_cmd->m_viewangles ); + } + } + + void c_ragebot::aim_at_target( const aim_target_t& target ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( target.m_ent_index ); + if( !ent ) + return; + + if( g_ctx.m_local->get_weapon( )->m_iItemDefinitionIndex( ) != WEAPON_R8REVOLVER ) { + if( g_settings.rage.active->m_delay_type == 2 ) { + static auto time_to_fire = 0.f; + const float delay = float( g_settings.rage.active->m_delay( ) ) * 0.001f; + const float time = g_ctx.pred_time( ); + + float delta = time_to_fire - time; + + if( delta > delay ) { + time_to_fire = time + delay; + } + + if( delta < 0.f ) { + time_to_fire = time + delay; + delta = delay; + } + + if( delta > g_csgo.m_globals->m_interval_per_tick ) { + return; + } + } + if( g_settings.rage.active->m_delay_type == 3 ) { + static float time_to_fire = 0.f; + const float time = g_ctx.pred_time( ); + + float delta = time_to_fire - time; + + vec3_t velocity = ent->m_vecVelocity( ); + float speed = velocity.length2d( ); + if( speed > g_ctx.m_local->m_vecVelocity( ).length2d( ) && speed > 100.f ) { + vec3_t head_pos = ent->get_hitbox_pos( 0 ); + vec3_t origin = ent->m_vecOrigin( ); + origin.z = head_pos.z = 0.f; + + float dist = origin.dist_to( head_pos ); //1 / 64 + auto delay = dist / speed + 0.015625f; + + if( delta > delay ) + time_to_fire = time + delay; + + if( delta < 0.f ) { + time_to_fire = time + delay; + delta = delay; + } + + if( delta > g_csgo.m_globals->m_interval_per_tick ) + return; + } + } + } + + if( g_settings.rage.active->m_auto_stop && !m_antiaim->is_fakewalking( ) && !g_settings.rage.compensate_spread ) + m_cmd->m_forwardmove = m_cmd->m_sidemove = 0.f; + + m_cmd->m_buttons |= IN_ATTACK; + m_cmd->m_buttons &= ~IN_USE; + + vec3_t position = target.m_position; + m_cmd->m_tick_count = target.m_tick_count; + + auto angle = math::vector_angles( + g_ctx.m_local->get_eye_pos( ), + target.m_position ); + + static auto weapon_recoil_scale = g_csgo.m_cvar( )->FindVar( xors( "weapon_recoil_scale" ) ); + angle -= g_ctx.m_local->m_aimPunchAngle( ) * weapon_recoil_scale->get_float( ); + + g_cheat.m_visuals.store_shot( target.m_position ); + + if( !target.m_backtracked && g_cheat.m_player_mgr.is_cheater( target.m_ent_index ) ) { + m_resolver->aimbot( + target.m_ent_index, + target.m_hitbox, angle, + target.m_position, + target.m_min, + target.m_max, + target.m_radius ); + } + else { + context::shot_data_t new_shot{ }; + new_shot.m_angle = angle; + new_shot.m_enemy_index = target.m_ent_index; + + new_shot.m_hitbox.max = target.m_min; + new_shot.m_hitbox.min = target.m_max; + new_shot.m_hitbox.radius = target.m_radius; + new_shot.m_hitgroup = target.m_hitbox; + + new_shot.m_enemy_pos = target.m_position; + + g_ctx.m_last_shot++; + g_ctx.m_last_shot %= 128; + + g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; + g_ctx.m_has_incremented_shots = true; + } + + memcpy( g_ctx.m_shot_data[ g_ctx.m_last_shot ].m_matrix, + m_shot_matrix, + sizeof( matrix3x4 ) * ent->m_CachedBoneData( ).GetSize( ) ); + + set_angles( angle.clamp( ) ); + + if( g_settings.rage.active->m_auto_stop && !g_settings.rage.compensate_spread( ) ) + quick_stop( m_cmd ); + } + + void c_ragebot::run( ) { + if( !g_settings.rage.enabled( ) || !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { + m_target = -1; + return; + } + + update_settings( ); + + if( m_send_next ) { + if( !g_cheat.m_lagmgr.get_sent( ) && !m_antiaim->is_fakewalking( ) ) + g_cheat.m_lagmgr.set_state( true ); + + m_send_next = false; + } + + auto wep = g_ctx.m_local->get_weapon( ); + if( !wep ) { + m_target = -1; + return; + } + + bool is_revolver = wep->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER; + + bool in_attack = false; + + m_can_fakeping = true; + + if ( g_settings.rage.activation_type == 0 ) in_attack = true; + else in_attack = g_input.is_key_pressed( + ( VirtualKeys_t )g_settings.rage.aimkey( ) ); + + if( !in_attack ) { + m_target = -1; + return; + } + + if( wep->is_knife( ) ) { + m_target = knifebot( ); + return; + } + + if( !wep->m_iClip1( ) || wep->is_grenade( ) ) { + m_target = -1; + return; + } + + if( !g_ctx.m_local->can_attack( ) ) { + aim_target_t t{ }; + bool is_zeus = wep->m_iItemDefinitionIndex( ) == WEAPON_TASER; + + if( m_target != -1 && !m_antiaim->is_fakewalking( ) ) { + bool can_hit = can_hit_target( m_target, &t, is_zeus, false ); + + if( !can_hit ) + m_target = -1; + + else if( g_settings.rage.active->m_auto_stop == 3 && can_hit ) { + m_antiaim->run_fakewalk( ); + //if( !g_cheat.m_lagmgr.get_choked( ) || g_cheat.m_lagmgr.get_state( ) ) + m_cmd->m_viewangles.y = m_antiaim->get_yaw( ); + } + } + return; + } + + // do not + if( g_settings.rage.silent == 2 && !g_cheat.m_lagmgr.get_choked( ) && !is_revolver ) { + if( !m_antiaim->is_fakewalking( ) ) + g_cheat.m_lagmgr.set_state( false ); + return; + } + + auto target = find_best_target( ); + if ( target.m_ent_index != -1 ) { + aim_at_target( target ); + } + + m_target = target.m_ent_index; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ragebot.hpp b/cheat/internal_rewrite/ragebot.hpp new file mode 100644 index 0000000..7bc6c24 --- /dev/null +++ b/cheat/internal_rewrite/ragebot.hpp @@ -0,0 +1,349 @@ +#pragma once +#include +#include + +#include "sdk.hpp" +#include "console.hpp" + +struct CCSGOPlayerAnimState; + +enum RecordType_t { + RECORD_NONE, + RECORD_LBY, + RECORD_NORMAL, +}; + +enum HitscanTypes_t { + HITSCAN_OFF, + HITSCAN_HEAD_BODY, + HITSCAN_HEAD_BODY_ARMS, + HITSCAN_LIMBS, +}; + +enum BreakerState_t { + BS_OFF, + BS_MOVING, + BS_WAS_MOVING, + BS_BREAKING, +}; + +struct lby_update_t { + int m_tickbase; + BreakerState_t m_state; +}; + +namespace features +{ + class c_ragebot { + public: + c_ragebot( ); + + class c_lagcomp; + struct lag_record_t; + struct render_record_t; + class c_antiaim; + class c_lby_breaker; + class c_resolver; + + std::shared_ptr< c_resolver > m_resolver; + std::shared_ptr< c_lagcomp > m_lagcomp; + std::shared_ptr< c_antiaim > m_antiaim; + private: + struct aim_target_t { + int m_ent_index; + int m_tick_count; + int m_hitbox; + vec3_t m_position; + vec3_t m_min; + vec3_t m_max; + float m_radius; + bool m_backtracked; + }; + user_cmd_t* m_cmd; + int m_target; + bool m_send_next; + matrix3x4 m_shot_matrix[ 128 ]; + int m_shot_target; + bool m_can_fakeping; + + void run( ); + + std::array< int, 65 > get_sorted_targets( ); + aim_target_t find_best_target( ); + bool can_hit_target( int, aim_target_t* target, bool zeus, bool hitchance = true ); + int hitscan( c_base_player* ent, bool baim, vec3_t& out_pos, float& out_dmg ); + void set_angles( const vec3_t& viewangles ); + bool should_baim_entity( c_base_player* ent, bool backtracked = false ); + void aim_at_target( const aim_target_t& target ); + bool can_hit_without_ping( int entity ); + vec3_t multipoint( c_base_player* ent, int hitbox, float* out_dmg ); + int knifebot( ); + + void update_settings( ); + public: + int get_min_dmg( c_base_player* ent ); + bool can_fakeping( ) const { return m_can_fakeping; } + auto get_shot_target( ) const { return m_shot_target; } + auto get_shot_matrix( ) const { return m_shot_matrix; } + int get_target( ) const { return m_target; } + void operator()( user_cmd_t* cmd ); + }; + + class c_ragebot::c_lby_breaker { + friend class c_antiaim; + private: + std::array< lby_update_t, 64 > m_lby_updates; + void update_animstate( ); + + float m_next_update{ }; + public: + int get_next_update( ) const; + void on_lby_proxy( ); + void override_angles( float* angle, float original, float offset, bool freestanding = false ); + }; + + class c_ragebot::c_antiaim { + private: + c_lby_breaker m_breaker; + user_cmd_t* m_cmd; + bool m_is_edging{ }; + bool m_is_fakewalking{ }; + bool m_direction{ }; + + void run( ); + + float get_yaw( bool fake, float original, bool no_jitter = false ); + float get_pitch( ); + + bool run_freestanding( int player = -1 ); + bool run_edge_dtc( ); + + + public: + bool is_fakewalking( ) const { return m_is_fakewalking; } + void run_fakewalk( ); + + bool is_edging( ) const { return m_is_edging; } + float get_yaw( bool no_jitter = false ); + + void on_runcommand( ) { + m_breaker.update_animstate( ); + } + void on_lby_proxy( ) { + m_breaker.on_lby_proxy( ); + } + auto get_next_update( ) { + return m_breaker.get_next_update( ); + } + + + void fix_movement( ); + void run( user_cmd_t* cmd ) { + m_cmd = cmd; + run( ); + } + }; + + struct c_ragebot::lag_record_t { + c_base_player* m_ent{ }; + + int m_tickcount{ }; + float m_flSimulationTime{ }; + float m_flOldSimulationTime{ }; + bool m_balanceadjust{ }; + bool m_shot{ }; + int m_choked{ }; + + float m_flCycle{ }; + float m_flLowerBodyYawTarget{ }; + float m_flDuckAmount{ }; + float m_flDuckSpeed{ }; + float m_animDuck{ }; + int m_fFlags{ }; + int m_animFlags{ }; + float m_lastAnimTime; + + vec3_t m_animVelocity{ }; + vec3_t m_prevVelocity{ }; + + bool m_sim_record{ }; + int m_shots{ }; + + C_AnimationLayer m_AnimLayers[ 13 ]{ }; + float m_PoseParameters[ 24 ]{ }; + + vec3_t m_vecOrigin{ }, m_vecAngles{ }; + vec3_t m_vecRenderOrigin{ }, m_vecRenderAngles{ }; + + vec3_t m_vecMins{ }, m_vecMaxs{ }; + vec3_t m_vecHeadPos{ }; + vec3_t m_vecPelvisPos{ }; + + CCSGOPlayerAnimState m_state{ }; + matrix3x4 m_matrix[ 128 ]{ }; + + bool is_valid( ); + + lag_record_t( ) : m_tickcount( -1 ), m_valid( false ) { } + lag_record_t( c_base_player* ent ); + + bool restore( bool recalculate = false, bool reanimate = false ); + + bool m_valid{ }; + }; + + struct c_ragebot::render_record_t { + matrix3x4 m_matrix[ 128 ]{ }; + vec3_t m_origin{ }; + float m_simtime{ }; + float m_globaltime{ }; + float m_validtime{ }; + }; + + class c_ragebot::c_lagcomp { + public: + using lag_deque_t = std::deque< lag_record_t >; + using anim_array_t = C_AnimationLayer[ 13 ]; + using render_deque_t = std::deque< render_record_t >; + + + lag_record_t* find_best_record( int ent_index ); + vec3_t get_backtracked_position( int ent_index ); + lag_deque_t* get_records( int ent_index, RecordType_t type ) { + switch( type ) { + case RECORD_LBY: + return &m_data_lby[ ent_index ]; + case RECORD_NORMAL: + return &m_data_normal[ ent_index ]; + } + + return nullptr; + } + + void store_record( int ent_index, RecordType_t type, const lag_record_t& record ) { + auto records = get_records( ent_index, type ); + if( records ) { + records->push_front( record ); + } + } + + void fsn_net_update_start( ); + void fsn_render_start( ); + void restore_animations( ); + void store_visuals( ); + void invalidate_bone_caches( ); + + lag_record_t* get_newest_record( int ent_index ); + lag_record_t* get_newest_valid_record( int ent_index ); + + bool get_render_record( int ent_index, matrix3x4* out ); + + void operator()( user_cmd_t* cmd ); + + int backtrack_entity( int ent_index, RecordType_t type, lag_record_t** out_record = nullptr ); + RecordType_t can_backtrack_entity( int ent_index ); + float get_flick_time( int ent_index ) { + return m_flick_time[ ent_index ]; + } + + float& get_last_updated_simtime( int ent_index ) { + return m_last_simtime[ ent_index ]; + } + + private: + float m_last_simtime[ 65 ]{ }; + float m_flick_time[ 65 ]{ }; + bool m_first_update[ 65 ]{ }; + lag_deque_t m_data_lby[ 65 ]; + lag_deque_t m_data_normal[ 65 ]; + render_deque_t m_data_render[ 65 ]; + user_cmd_t* m_cmd; + }; + + enum ResolverState_t { + R_NONE, + R_NORMAL, + R_FREESTANDING, + R_LAST, + }; + + enum OverrideDir_t { + OVERRIDE_NONE, + OVERRIDE_CENTER, + OVERRIDE_LEFT, + OVERRIDE_RIGHT, + OVERRIDE_LAST + }; + + class c_ragebot::c_resolver { + public: + void aimbot( int ent_index, int hitbox, vec3_t angle, vec3_t position, vec3_t min, vec3_t max, float radius ); + void listener( int ent_index, int shots ); + void frame_stage_notify( ); + std::vector< float > get_shot_vec( int ent ); + float get_shot_yaw( int shots, int ent ); + + void force_yaw( c_base_player*, float ); + + void brute_force( c_base_player* ); + int manual_override( c_base_player* ); + void force_lby( c_base_player* ); + void on_missed_spread( int ent_index, int shots ); + + int try_freestanding( c_base_player* ); + void update_player( int i ); + + void increment_shots( int ent_index ); + + __forceinline int get_shots( int ent_index ) { + auto& data = m_data[ ent_index ]; + + return data.m_missed_shots; + } + + __forceinline bool& yaw_change( int ent_index ) { + return m_data[ ent_index ].m_angle_change; + } + + __forceinline int get_state( int ent_index ) { + return m_data[ ent_index ].m_state; + } + + __forceinline int& get_resolver_shots( int ent_index ) { + auto& data = m_data[ ent_index ]; + + return data.m_shots[ data.m_state ]; + } + + protected: + + struct resolve_log_t { + //todo: deque to log hits etc + void update( int ent_index ); + void reset( ); + + bool m_logged[ R_LAST ]{ }; + float m_logged_lby{ }; + int m_state{ }; + float m_last_lby{ }; + float m_last_moving_lby{ }; + float m_last_update{ }; + int m_shots[ R_LAST ]{ }; + bool m_was_invalid{ }; + bool m_has_valid_lby{ }; + int m_last_freestanding{ }; + int m_overriding{ }; + int m_missed_shots{ }; + int m_logged_shots[ R_LAST ]{ }; + bool m_angle_change{ }; + vec3_t m_last_pos{ }; + }; + + struct resolve_data_t : public resolve_log_t { + std::array< resolve_log_t, 150 > m_snapshot; + }; + + std::array< resolve_data_t, 65 > m_data; + }; + +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ragebot_antiaim.cpp b/cheat/internal_rewrite/ragebot_antiaim.cpp new file mode 100644 index 0000000..beff445 --- /dev/null +++ b/cheat/internal_rewrite/ragebot_antiaim.cpp @@ -0,0 +1,889 @@ +#include "ragebot.hpp" +#include "base_cheat.hpp" +#include "context.hpp" +#include "math.hpp" +#include "input_system.hpp" + +namespace features +{ + //don't ask + /*vec3_t func( vec3_t a1, float a3, float a4, float a5, float a6, float a7, float a8, float a9 ) { + int v8; // ebp@0 + float v9; // xmm6@1 + float v10; // xmm7_4@1 + float v11; // xmm2@1 + float v12; // xmm5@1 + float v13; // xmm4_4@1 + float v14 = 0.f; // xmm3_4@1 + float v15; // xmm1_4@2 + vec3_t v16; // xmm0@2 + float v17; // eax@2 + vec3_t v18; // ecx@2 + float v20; // xmm1_4@4 + float v21 = 0.f; // eax@4 + vec3_t v22; // ecx@4 + float v23; // eax@5 + float v24; // [sp-10h] [bp-1Ch]@1 + vec3_t v25; + int v28; // [sp+0h] [bp-Ch]@1 + int v29; // [sp+4h] [bp-8h]@1 + + v12 = a4; + v9 = a3; + v11 = a5; + v10 = a7; + v11 = a5 - a8; + v12 = a4 - a7; + + v13 = a6 - a9; + v24 = a6 - a9; + + v14 = sqrt( v12 * v12 + v11 * v11 + v13 * v13 ); + + if( v14 <= v9 ) { + if( -v9 <= v14 ) { + a1.x = a4; + a1.y = a5; + a1.z = a6; + return a1; + } + else { + vec3_t v25 = { v11, v12, v24 }; + v20 = 1.0f / ( v12 * v12 + v11 * v11 + v13 * v13 + FLT_EPSILON ); + + a7 = v10 - v20 * v12 * v9; + a8 = a8 - v25.y * v20 * v9; + + a9 = a9 - v25.z * v20 * v9; + v12 = a9; + + v22.x = a7; + v22.y = a8; + v22.z = a9; + + return v22; + } + } + else { + vec3_t v25 = { v11, v12, v24 }; + + v15 = 1.0f / ( v12 * v12 + v11 * v11 + v13 * v13 + FLT_EPSILON ); + + a7 = v15 * v12 * v9 + v10; + a8 = v12 * v15 * v9 + a8; + + v16.x = a7; + v16.y = a8; + + a9 = v25.z * v15 * v9 + a9; + + v18.x = a7; + v18.y = a8; + v18.z = a9; + + return v18; + } + }*/ + + + void c_ragebot::c_lby_breaker::update_animstate( ) { + if( !g_settings.rage.anti_aim( ) ) + return; + + if( !g_ctx.m_local->get_animstate( ) ) + return; + + auto cl = g_csgo.m_global_state->get_client_state( ); + if( !cl ) + return; + + if( g_cheat.m_lagmgr.get_choked( ) != 1 ) + return; + + float backup_curtime = g_csgo.m_globals->m_curtime; + float backup_frametime = g_csgo.m_globals->m_frametime; + + g_csgo.m_globals->m_curtime = g_ctx.pred_time( ); + g_csgo.m_globals->m_frametime = TICK_INTERVAL( ); + + vec3_t real_angle = g_ctx.m_thirdperson_angle; + + float pitch; + if( g_ctx.m_local->get_animstate( )->m_bInHitGroundAnimation && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + bool dist = g_settings.rage.enabled( ) && g_settings.rage.selection_type( ) == 1; + int target = util::get_closest_player( dist ); + + if( target != -1 ) { + auto t = g_csgo.m_entlist( )->GetClientEntity( target ); + + pitch = math::vector_angles( g_ctx.m_local->get_eye_pos( ), t->get_hitbox_pos( 0 ) ).x; + } + else + pitch = 0.f; + + real_angle.x = pitch; + } + + g_ctx.m_local->get_animstate( )->m_iLastClientSideAnimationUpdateFramecount -= 1; + g_ctx.m_local->get_animstate( )->update( real_angle.y, real_angle.x ); + g_ctx.m_local->cache_anim_data( false ); + + g_csgo.m_globals->m_curtime = backup_curtime; + g_csgo.m_globals->m_frametime = backup_frametime; + + if( g_ctx.m_local->get_animstate( )->m_velocity < 0.1f ) + g_ctx.m_local->get_animstate( )->m_velocity = 0.f; + + bool moving = g_ctx.m_local->get_animstate( )->m_velocity > 0.1f; + bool onground = g_ctx.m_local->get_animstate( )->m_bOnGround; + + float time = g_ctx.pred_time( ); + + if( onground ) { + if( moving ) { + m_next_update = time + 0.22f; + } else if( time > m_next_update ) { + m_next_update = time + 1.1f; + } + } + + if( g_ctx.m_tickbase > 0 ) { + //auto& cur_update = m_lby_updates[ g_ctx.m_tickbase % 64 ]; + //cur_update.m_tickbase = g_ctx.m_tickbase; + //cur_update.m_state = m_state; + } + } + + void c_ragebot::c_lby_breaker::on_lby_proxy( ) { + float oldsimtime_1tickfuture = g_ctx.m_local->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + int oldsimtime_ticks = TIME_TO_TICKS( oldsimtime_1tickfuture ); + + float latency = g_csgo.m_engine( )->GetNetChannelInfo( )->GetLatency( 0 ) + g_csgo.m_globals->m_interval_per_tick; + for( auto& it : m_lby_updates ) { + if( it.m_tickbase == oldsimtime_ticks ) { + //if( it.m_state == BS_BREAKING ) + //m_next_update = oldsimtime_1tickfuture + 1.1f - latency; + break; + + } + } + } + + int c_ragebot::c_lby_breaker::get_next_update( ) const { + auto current_tick = TIME_TO_TICKS( g_ctx.pred_time( ) ); + auto update_tick = TIME_TO_TICKS( m_next_update ); + + return update_tick - current_tick; + } + + void c_ragebot::c_lby_breaker::override_angles( float* angles, float original, float offset, bool freestanding ) { + static bool was_breaking = false; + static float last_angle = 0.f; + const float angle = original; + int update_ticks = get_next_update( ); + + if( g_cheat.m_lagmgr.get_state( ) ) + return; + + if( g_cheat.m_lagmgr.get_choked( ) ) + return; + + //yep + if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) + return; + + bool breaking = g_ctx.m_local->get_animstate( )->m_velocity < 0.1f; + float break_angle = angle + offset; + + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + float real = angle; + float delta = std::remainderf( lby - real, 360.f ); + + if( std::abs( delta ) < 37.f && breaking ) { + if( update_ticks < -TIME_TO_TICKS( 1.f ) ) { + *angles = break_angle; + return; + } + } + + if( freestanding && g_settings.rage.lby_avoid_updates && was_breaking ) { + if( std::abs( std::remainderf( original - last_angle, 360.f ) ) > 50.f + && update_ticks < 1 ) { + break_angle = last_angle; + offset = std::remainderf( original - last_angle, 360.f ); + } + } + + if( std::abs( offset ) < 105 ) { + int min_tick = g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ? g_settings.rage.fakewalk_ticks( ) + 2 : 4; + if( update_ticks < min_tick && update_ticks >= 1 ) { + *angles = break_angle + ( offset < 0 ? 105 : -105 ); + return; + } + } + + if( breaking && update_ticks < 1 ) { + *angles = break_angle; + if( !freestanding ) { + last_angle = break_angle; + was_breaking = true; + } + } + + //g_ctx.m_thirdperson_angle.y = *angles; + } + + void c_ragebot::c_antiaim::fix_movement( ) { + if( !g_settings.rage.anti_aim && !g_settings.rage.enabled ) + return; + + float pitch = std::remainderf( m_cmd->m_viewangles.x, 360.f ); + bool fix_forward_move = ( pitch < -90.f || pitch > 90.f ); + + auto last_cmd = g_ctx.get_last_cmd( ); + auto old_yaw = last_cmd->m_viewangles.y; + auto cur_yaw = m_cmd->m_viewangles.y; + + float yaw_delta = cur_yaw - old_yaw; + + float f1 = old_yaw < 0.f ? old_yaw + 360.f : old_yaw; + float f2 = cur_yaw < 0.f ? cur_yaw + 360.f : cur_yaw; + + if( f2 < f1 ) + yaw_delta = abs( f2 - f1 ); + else + yaw_delta = 360.f - abs( f1 - f2 ); + yaw_delta = 360.f - yaw_delta; + + m_cmd->m_forwardmove = cos( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + cos( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; + m_cmd->m_sidemove = sin( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + sin( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; + + if( fix_forward_move ) + m_cmd->m_forwardmove *= -1.f; + + if( g_ctx.m_local->m_nMoveType( ) != MOVETYPE_LADDER && g_settings.rage.fix_legs( ) ) { + if( m_cmd->m_forwardmove ) { + m_cmd->m_buttons &= ~( m_cmd->m_forwardmove < 0 ? IN_FORWARD : IN_BACK ); + m_cmd->m_buttons |= ( m_cmd->m_forwardmove > 0 ? IN_FORWARD : IN_BACK ); + } + if( m_cmd->m_sidemove ) { + m_cmd->m_buttons &= ~( m_cmd->m_sidemove < 0 ? IN_MOVERIGHT : IN_MOVELEFT ); + m_cmd->m_buttons |= ( m_cmd->m_sidemove > 0 ? IN_MOVERIGHT : IN_MOVELEFT ); + } + } + } + + bool c_ragebot::c_antiaim::run_edge_dtc( ) { + if( !g_settings.rage.edge_dtc_normal ) + return false; + + if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) + return false; + + if( g_settings.rage.edge_dtc_normal == 1 ) { + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + if( speed < 30.f ) return false; + } + + bool peeking = g_ctx.m_local->m_vecVelocity( ).length( ) > 30.f; + if( is_fakewalking( ) ) peeking = false; + CTraceFilterWorldAndPropsOnly filter; + + float max_dist = peeking ? g_settings.rage.edge_dtc_moving : g_settings.rage.edge_dtc_standing; + float min_dist = 64.f; + float edge_yaw = 0.f; + float final_yaw = 0.f; + bool detected = false; + + const float step = 45.f; + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + + for( float rot = -180.f; rot < 180.f; rot += step ) { + float rot_left = rot - 90.f; + float rot_right = rot + 90.f; + + vec3_t pos_left = math::get_rotated_pos( eye_pos, rot_left, 30.f ); + vec3_t pos_right = math::get_rotated_pos( eye_pos, rot_right, 30.f ); + + vec3_t forward = math::angle_vectors( vec3_t( 0.f, rot, 0.f ) ); + forward *= 4000.f; + + CGameTrace trace_left, trace_right; + Ray_t ray_left, ray_right; + + ray_left.Init( pos_left, pos_left + forward ); + ray_right.Init( pos_right, pos_right + forward ); + + g_csgo.m_trace( )->TraceRay( ray_left, MASK_SHOT_HULL, &filter, &trace_left ); + g_csgo.m_trace( )->TraceRay( ray_right, MASK_SHOT_HULL, &filter, &trace_right ); + + float dist_left = ( pos_left - trace_left.endpos ).length( ); + float dist_right = ( pos_right - trace_right.endpos ).length( ); + + if( dist_right > dist_left ) { + if( dist_right > max_dist && dist_left < min_dist ) { + max_dist = dist_right; + edge_yaw = rot_left; + detected = true; + } + } + else { + if( dist_left > max_dist && dist_right < min_dist ) { + max_dist = dist_left; + edge_yaw = rot_right; + detected = true; + } + } + } + + if( !detected ) + return false; + + final_yaw = edge_yaw; + if( g_cheat.m_lagmgr.get_state( ) ) { + final_yaw = edge_yaw + 180.f; + } + + m_cmd->m_viewangles.y = final_yaw; + return true; + } + + float get_damage( const vec3_t& start, const vec3_t& end, c_base_player* a, c_base_player* b ) { + static weapon_info_t wpn_data{ }; + wpn_data.damage = 200; + wpn_data.range_modifier = 1.0f; + wpn_data.penetration = 3.0f; + wpn_data.armor_ratio = 0.5f; + wpn_data.range = 8192.f; + + fire_bullet_data_t data{ }; + data.src = start; + data.filter.pSkip = a; + + data.travel_range = ( end - data.src ).length( ); + data.traveled = 0.f; + data.to_travel = data.travel_range; + + vec3_t angle = math::vector_angles( start, end ); + data.direction = math::angle_vectors( angle ); + + data.direction.normalize_vector( ); + + if( g_cheat.m_autowall.fire_bullet( a, b, &wpn_data, data, false, false ) ) { + return data.current_damage; + } + + return -1.f; + } + + vec3_t trace_ent_pos( vec3_t start, vec3_t end, c_base_player* ent ) { + Ray_t ray; + CGameTrace tr; + CTraceFilter filter; + + const vec3_t min( -2.f, -2.f, -2.f ); + const vec3_t max( 2.f, 2.f, 2.f ); + + ray.Init( start, end, min, max ); + filter.pSkip = ent; + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); + + return tr.endpos; + } + + float get_min_dist( vec3_t origin ) { + const float max_dist = 150.f; + float dist = 0.f; + float ret = FLT_MAX; + + CTraceFilterWorldAndPropsOnly filter; + CGameTrace tr; + Ray_t ray; + + for( size_t f = 0.f; f < 360.f; f += 45.f ) { + vec3_t rotated = math::get_rotated_pos( origin, f, max_dist ); + + ray.Init( origin, rotated ); + + g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &tr ); + dist = tr.endpos.dist_to( origin ); + + if( dist <= 75.f ) + return 75.f; + + if( dist < ret ) + ret = dist; + } + + return ret; + } + + bool c_ragebot::c_antiaim::run_freestanding( int player ) { + if( !g_settings.rage.edge_detection ) + return false; + + if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) + return false; + + bool is_fake = g_cheat.m_lagmgr.get_state( ); + vec3_t enemy_pos; + vec3_t local_pos; + + vec3_t aim_angle; + + float cur_damage{ 30.f }; + bool direction{ false }; + int enemy_index; + + enemy_index = player == -1 ? util::get_closest_player( ) : player; + + if( enemy_index == -1 ) + return false; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( enemy_index ); + + if( !ent || !ent->is_valid( ) ) + return false; + + enemy_pos = ent->m_vecOrigin( ); + enemy_pos.z = ent->get_hitbox_pos( 0 ).z; + + local_pos = g_ctx.m_local->get_eye_pos( ); + aim_angle = math::vector_angles( enemy_pos, local_pos ); + + float local_dist = get_min_dist( local_pos ); + float enemy_dist = get_min_dist( enemy_pos ); + + float start_dmg = get_damage( enemy_pos, local_pos, ent, g_ctx.m_local ); + + auto test_dmg = [ & ]( float dist, float enemy_dist, float delta = 50.f ) { + vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y - 90.f, enemy_dist ); + vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_dist ); + + enemy_left = trace_ent_pos( enemy_pos, enemy_left, ent ); + enemy_right = trace_ent_pos( enemy_pos, enemy_right, ent ); + + vec3_t local_left = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, dist ); + vec3_t local_right = math::get_rotated_pos( local_pos, aim_angle.y - 90.f, dist ); + + local_left = trace_ent_pos( local_pos, local_left, g_ctx.m_local ); + local_right = trace_ent_pos( local_pos, local_right, g_ctx.m_local ); + + float dmg_left = get_damage( enemy_left, local_left, ent, g_ctx.m_local ) + + get_damage( enemy_right, local_left, ent, g_ctx.m_local ); + + float dmg_right = get_damage( enemy_left, local_right, ent, g_ctx.m_local ) + + get_damage( enemy_right, local_right, ent, g_ctx.m_local ); + + if( std::abs( dmg_left - dmg_right ) < delta ) + return false; + + float max_dmg = math::max( dmg_left, dmg_right ); + direction = dmg_left > dmg_right; + + cur_damage = max_dmg; + return max_dmg > delta; + }; + + float radius = std::floorf( ( g_ctx.m_local->get_hitbox_pos( 0 ) - g_ctx.m_local->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); + radius = radius >= 15.f ? 20.f : 10.f; + + float enemy_radius = std::floorf( ( ent->get_hitbox_pos( 0 ) - ent->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); + enemy_radius = enemy_radius >= 15.f ? 20.f : 10.f; + + if( !test_dmg( radius + 1.f, enemy_radius + 1.f, 25.f ) ) { + if( cur_damage < start_dmg * 2.f ) + return false; + } + + bool found = false; + + for( size_t i = 5; i > 0; --i ) { + float cur_dist = local_dist / i; + float cur_enemy_dist = enemy_dist / i; + + if( cur_dist < radius ) + continue; + + if( cur_enemy_dist < enemy_radius ) + continue; + + if( test_dmg( cur_dist, cur_enemy_dist, 125.f / i ) ) { + found = true; + break; + } + else if( cur_damage > 125.f / i ) + break; + } + + if( !found ) + return false; + + m_direction = direction; + aim_angle.y += direction ? -90.f : 90.f; + + if( g_settings.rage.angle_step ) { + aim_angle.y = math::find_closest_step( aim_angle.y, g_settings.rage.angle_step_degrees ); + } + + if( g_settings.rage.pitch == 3 && g_settings.rage.break_lby_edge && m_breaker.get_next_update( ) < 2 && g_ctx.m_local->get_animstate( )->m_velocity < 0.1f ) { + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + vec3_t rotated_pos = math::get_rotated_pos( eye_pos, aim_angle.y - 180.f, 25.f ); + + vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); + + vec3_t middle_pos = eye_pos + velocity * TICK_INTERVAL( ) * 2.f; + middle_pos.z += 10.f; + + int dmg_rot = get_damage( enemy_pos, rotated_pos, ent, g_ctx.m_local ); + int dmg_mid = get_damage( enemy_pos, middle_pos, ent, g_ctx.m_local ); + + if( dmg_mid < dmg_rot ) + m_cmd->m_viewangles.x = 0.f; + } + + if( is_fake ) { + int jitter = g_settings.rage.edge_dtc_jitter; + if( jitter ) { + aim_angle.y += math::random_number< float >( -jitter, jitter ); + } + aim_angle.y -= 180.f; + } + else { + int jitter = g_settings.rage.edge_dtc_real_jitter; + if (jitter) { + aim_angle.y += math::random_number< float >(-jitter, jitter); + } + } + + m_cmd->m_viewangles.y = aim_angle.clamp( ).y; + return true; + } + + void c_ragebot::c_antiaim::run_fakewalk( ) { + m_is_fakewalking = false; + if( !g_ctx.m_local->get_weapon( ) ) + return; + + bool in_move = ( m_cmd->m_buttons & IN_FORWARD ) || ( m_cmd->m_buttons & IN_BACK ) || ( m_cmd->m_buttons & IN_LEFT ) || ( m_cmd->m_buttons & IN_RIGHT ); + + if( !m_cmd->m_sidemove && !m_cmd->m_forwardmove && !g_ctx.m_local->m_vecVelocity( ) && !in_move ) + return; + + if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) + return; + + if( m_cmd->m_buttons & IN_WALK ) { + m_cmd->m_buttons &= ~IN_WALK; + } + + if( m_cmd->m_buttons & IN_SPEED ) { + m_cmd->m_buttons &= ~IN_SPEED; + } + + m_is_fakewalking = true; + + auto velocity = g_ctx.m_local->m_vecVelocity( ); + + static auto predict_velocity = [ ]( vec3_t* velocity ) { + static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); + static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); + + float speed = velocity->length( ); + if( speed >= 0.1f ) { + //if it works, it works + float friction = sv_friction->get_float( ) * 1.12f; + float stop_speed = std::max< float >( speed, sv_stopspeed->get_float( ) ); + float time = std::max< float >( g_csgo.m_globals->m_interval_per_tick, g_csgo.m_globals->m_frametime ); + *velocity *= std::max< float >( 0.f, speed - friction * stop_speed * time / speed ); + } + }; + + static auto quick_stop = [ & ]( ) { + vec3_t vel = g_ctx.m_local->m_vecVelocity( ); + float speed = vel.length2d( ); + + if( speed < 0.1f ) { + g_ctx.get_last_cmd( )->m_forwardmove = 0.f; + g_ctx.get_last_cmd( )->m_sidemove = 0.f; + return; + } + + static auto sv_accelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_accelerate" ) ); + float accel = sv_accelerate->get_float( ); + float max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed; + if( g_ctx.m_local->get_weapon( )->is_sniper( ) && g_ctx.m_local->m_bIsScoped( ) ) { + max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed_alt; + } + + if( g_ctx.m_local->m_fFlags( ) & FL_DUCKING ) { + max_speed /= 3.f; + accel /= 3.f; + } + + float surf_friction = 1.f; + float max_accelspeed = accel * g_csgo.m_globals->m_interval_per_tick * max_speed * surf_friction; + + float wishspeed{ }; + + if( speed - max_accelspeed <= -1.f ) { + wishspeed = max_accelspeed / ( speed / ( accel * g_csgo.m_globals->m_interval_per_tick ) ); + } + else { + wishspeed = max_accelspeed; + } + + vec3_t ndir = math::vector_angles( vel * -1.f ); + ndir.y = g_csgo.m_engine( )->GetViewAngles( ).y - ndir.y; + ndir = math::angle_vectors( ndir ); + + g_ctx.get_last_cmd( )->m_forwardmove = ndir.x * wishspeed; + g_ctx.get_last_cmd( )->m_sidemove = ndir.y * wishspeed; + }; + + int ticks_to_stop; + for( ticks_to_stop = 0; ticks_to_stop < 15; ++ticks_to_stop ) { + if( velocity.length2d( ) < 0.1f ) + break; + + predict_velocity( &velocity ); + } + + int update_ticks = m_breaker.get_next_update( ) - 1; + + const int max_ticks = math::min< int >( g_settings.rage.fakewalk_ticks, update_ticks ); + const int choked = g_cheat.m_lagmgr.get_choked( ); + int ticks_left = max_ticks - choked; + + if( choked < max_ticks || ticks_to_stop ) { + g_cheat.m_lagmgr.set_state( false ); + } + + if( ticks_left <= ticks_to_stop || !choked ) { + quick_stop( ); + } + } + + float c_ragebot::c_antiaim::get_pitch( ) { + switch( g_settings.rage.pitch( ) ) { + case 1: //custom + return float( g_settings.rage.pitch_offset( ) ); + case 2: //flip + return g_cheat.m_lagmgr.get_state( ) ? 75.f : 89.f; + case 3: + return 89.f; + case 4: + return 1080.f + g_settings.rage.pitch_offset( ); + case 5: + return -1080.f + g_settings.rage.pitch_offset( ); + case 6: + return m_cmd->m_cmd_nr % 2 ? 1080.f : -1080.f; + case 7: //random + return math::random_number( -89.f, 89.f ); + } + + return 0.f; + } + + float c_ragebot::c_antiaim::get_yaw( bool fake, float original, bool no_jitter ) { + constexpr static double rate = 360.0 / 1.618033988749895; + constexpr static int switch_rate = 10; + static float last_onground = 0.f; + static int ticks = 0; + static bool side_switch = false; + bool on_ground = false; + + int setting = fake ? g_settings.rage.fake_yaw : g_settings.rage.real_yaw; + int jitter = fake ? g_settings.rage.fake_yaw_jitter : g_settings.rage.real_yaw_jitter; + int add = fake ? g_settings.rage.fake_yaw_add : g_settings.rage.real_yaw_add; + if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) { + if( !fake && g_settings.rage.air_yaw( ) ) { + setting = g_settings.rage.air_yaw; + jitter = g_settings.rage.air_yaw_jitter; + add = g_settings.rage.air_yaw_add; + } + } + else if( g_ctx.m_local->m_vecVelocity( ).length( ) > 0.1f && !is_fakewalking( ) ) { + if( !fake && g_settings.rage.real_yaw_moving( ) ) { + setting = g_settings.rage.real_yaw_moving( ); + jitter = g_settings.rage.real_moving_jitter( ); + add = g_settings.rage.real_yaw_moving_add( ); + } + } + + on_ground = g_ctx.m_local->get_animstate( )->m_bOnGround; + + if( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { + last_onground = g_ctx.pred_time( ); + } + + ticks++; + if( ticks > switch_rate ) { + side_switch ^= 1; + ticks = 0; + } + + float rand = 0.f; + if( setting && jitter && !no_jitter ) { + rand = math::random_number( -float( jitter ), float( jitter ) ); + } + + if( setting && add ) { + original += add; + } + + switch( setting ) { + case 0: + return g_csgo.m_engine( )->GetViewAngles( ).y; + case 1: //back + return original - 180.f + rand; + case 2: {//back spin + float time = on_ground ? g_csgo.m_globals->m_curtime * 0.5f : ( g_csgo.m_globals->m_curtime - last_onground ); + float range = on_ground ? jitter : jitter * 2.f; + return original - 180.f - range * 0.5f + ( no_jitter ? range : std::fmod( time * rate, range + 1.f ) ); + } + case 3: //sideways + return rand + ( fake ? ( side_switch ? original + 90.f : original - 90.f ) : + ( side_switch ? original - 90.f : original + 90.f ) ); + case 4: //slowpin lol + return rand + std::fmod( g_csgo.m_globals->m_curtime * rate, 360.f ); + case 5: //random + return math::random_number( -180.f, 180.f ); + case 6: //direction + return rand + ( fake ? ( m_direction ? original - 90.f : original + 90.f ) : + ( m_direction ? original + 90.f : original - 90.f ) ); + case 7: + return original - 180.f + ( no_jitter ? 0 : ( side_switch ? -jitter : jitter ) ); + } + + return original; + } + + float c_ragebot::c_antiaim::get_yaw( bool no_jitter ) { + const auto is_fake = g_cheat.m_lagmgr.get_state( ); + auto original = g_ctx.get_last_cmd( )->m_viewangles.y; + + if( g_settings.rage.at_players ) { + auto closest_ent = util::get_closest_player( ); + if( closest_ent != -1 ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( closest_ent ); + if( ent ) { + vec3_t ang = math::vector_angles( g_ctx.m_local->m_vecOrigin( ), + ent->m_vecOrigin( ) ); + + original = ang.y; + } + } + } + + if( is_fake && !g_settings.rage.fake_yaw( ) ) + return original; + if( !is_fake && !g_settings.rage.real_yaw( ) ) + return original; + + if( g_settings.rage.angle_step( ) && g_settings.rage.angle_step_degrees( ) ) { + float step = float( g_settings.rage.angle_step_degrees( ) ); + original = math::find_closest_step( original, step ); + } + return get_yaw( is_fake, original, no_jitter ); + } + + void c_ragebot::c_antiaim::run( ) { + m_is_edging = false; + if( !g_settings.rage.anti_aim( ) ) + return; + + auto is_everyone_dormant = [ ]( ) { + for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + if( ent && ent->is_valid( ) && + ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) + || g_settings.rage.friendlies ) ) { + return false; + } + } + + return true; + }; + + if( ( m_cmd->m_forwardmove || m_cmd->m_sidemove ) && + ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || + g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) ) + return; + + if( g_ctx.m_local->m_fFlags( ) & FL_FROZEN ) + return; + + if( is_everyone_dormant( ) && g_settings.rage.dormant_check ) + return; + + if( g_settings.rage.fakewalk( ) && g_input.is_key_pressed( g_settings.rage.fakewalk_key( ) ) ) { + run_fakewalk( ); + } + else { + m_is_fakewalking = false; + } + + if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) ) + return; + + if( *( bool* )( c_base_player::get_game_rules( ) + 0x20 ) ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( weapon && weapon->is_grenade( ) ) { + if( weapon->m_fThrowTime( ) > g_csgo.m_globals->m_interval_per_tick ) { + return; + } + } + + if( ( m_cmd->m_buttons & IN_ATTACK2 ) && weapon->is_knife( ) && g_ctx.m_local->can_attack( ) ) + return; + + if( m_cmd->m_buttons & IN_USE ) + return; + + if( g_settings.rage.real_yaw( ) || + g_settings.rage.fake_yaw( ) ) { + m_cmd->m_viewangles.y = get_yaw( ); + } + + if( g_settings.rage.pitch( ) ) { + m_cmd->m_viewangles.x = get_pitch( ); + } + + bool edge_detected = false; + bool freestanding = false; + + if( !g_settings.rage.edge_dtc_priority ) { + freestanding = run_freestanding( ); + if( !freestanding ) + edge_detected = run_edge_dtc( ); + } + else { + edge_detected = run_edge_dtc( ); + if( !edge_detected ) + freestanding = run_freestanding( ); + } + + m_is_edging = freestanding || edge_detected; + + if( g_settings.rage.break_lby( ) && ( !m_is_edging || g_settings.rage.break_lby_edge ) ) { + float yaw = m_is_edging ? m_cmd->m_viewangles.y : get_yaw( true ); + + m_breaker.override_angles( &m_cmd->m_viewangles.y, + yaw, + std::remainderf( 180.f - float( g_settings.rage.lby_delta ), 360.f ), + freestanding ); + } + + if( g_cheat.m_lagmgr.get_state( ) && !g_settings.rage.fake_yaw( ) ) + m_cmd->m_viewangles.y = g_csgo.m_engine( )->GetViewAngles( ).y; + + //since we're going to have fake pitches most likely + //make sure to clamp yaw anyway just in case some retard + //decides to enable untrusted shit in an mm server or w/e + m_cmd->m_viewangles.y = std::remainderf( m_cmd->m_viewangles.y, 360.f ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ragebot_lagcomp.cpp b/cheat/internal_rewrite/ragebot_lagcomp.cpp new file mode 100644 index 0000000..5014143 --- /dev/null +++ b/cheat/internal_rewrite/ragebot_lagcomp.cpp @@ -0,0 +1,657 @@ +#include "ragebot.hpp" +#include "interface.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "mem.hpp" +#include "hooks.hpp" + +namespace features +{ + c_ragebot::lag_record_t::lag_record_t( c_base_player* ent ) : m_ent( ent ) { + if( !m_ent || !m_ent->is_valid( ) ) return; + m_valid = true; + + m_flSimulationTime = m_ent->m_flSimulationTime( ); + m_flOldSimulationTime = m_ent->m_flOldSimulationTime( ); + m_lastAnimTime = m_ent->get_animdata( ).m_last_animtime; + m_tickcount = TIME_TO_TICKS( m_flSimulationTime + util::get_lerptime( ) ); + m_choked = m_ent->get_choked_ticks( ); + + m_flLowerBodyYawTarget = m_ent->m_flLowerBodyYawTarget( ); + m_flCycle = m_ent->m_flCycle( ); + m_fFlags = m_ent->m_fFlags( ); + m_animDuck = m_ent->get_animdata( ).m_last_duck; + m_animVelocity = m_ent->get_animdata( ).m_anim_velocity; + m_prevVelocity = m_ent->get_animdata( ).m_last_velocity; + m_flDuckSpeed = m_ent->m_flDuckSpeed( ); + m_flDuckAmount = m_ent->m_flDuckAmount( ); + m_animFlags = m_ent->get_animdata( ).m_anim_flags; + + m_vecHeadPos = ent->get_hitbox_pos( 0 ); + m_vecPelvisPos = ent->get_hitbox_pos( HITBOX_PELVIS ); + + //we need mins/maxs because traces check them before checking if it hit a player + m_vecMins = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ); + m_vecMaxs = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ); + + m_vecOrigin = m_ent->m_vecOrigin( ); + m_vecAngles = m_ent->m_angEyeAngles( ); + m_vecRenderAngles = m_ent->ce( )->GetRenderAngles( ); + m_vecRenderOrigin = m_ent->ce( )->GetRenderOrigin( ); + + memcpy( &m_state, + m_ent->get_animstate( ), + sizeof( CCSGOPlayerAnimState ) ); + + memcpy( m_PoseParameters, + m_ent->m_flPoseParameter( ), + sizeof( float ) * 24 ); + + memcpy( m_AnimLayers, + m_ent->m_AnimOverlay( ).GetElements( ), + sizeof( C_AnimationLayer ) * 13 ); + + for( int i{ }; i < 13; ++i ) + m_ent->m_AnimOverlay( ).GetElements( )[ i ].m_player = ent; + + m_valid = m_ent->ce( )->SetupBones( m_matrix, 128, BONE_USED_BY_HITBOX, m_flSimulationTime ); + } + + bool c_ragebot::lag_record_t::restore( bool recalculate, bool reanimate ) { + if( !m_ent || !m_ent->is_valid( ) ) return false; + + *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ) = m_vecMins; + *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ) = m_vecMaxs; + + memcpy( ( void* )( m_ent->m_CachedBoneData( ).GetElements( ) ), + m_matrix, + sizeof( matrix3x4 ) * m_ent->m_CachedBoneData( ).GetSize( ) ); + + if( !recalculate ) { + return true; + } + + m_ent->set_abs_angles( m_vecRenderAngles ); + + //m_ent->m_flDuckAmount( ) = m_flDuckAmount; + m_ent->m_flLowerBodyYawTarget( ) = m_flLowerBodyYawTarget; + m_ent->m_fFlags( ) = m_fFlags; + m_ent->m_flSimulationTime( ) = m_flSimulationTime; + + memcpy( m_ent->m_flPoseParameter( ), + m_PoseParameters, + sizeof( float ) * 24 ); + + memcpy( m_ent->m_AnimOverlay( ).GetElements( ), + m_AnimLayers, + sizeof( C_AnimationLayer ) * 13 ); + + //why? + //why not? + if( reanimate ) { + vec3_t velocity = m_ent->m_vecVelocity( ); + int backup_eflags = m_ent->get< int >( 0xe4 ); + int backup_byte = m_ent->get< byte >( 0x35f8 ); + + m_ent->m_vecVelocity( ) = m_animVelocity; + m_ent->get< vec3_t >( 0x94 ) = m_animVelocity; + m_ent->get< byte >( 0x35f8 ) = 1; + m_ent->get< int >( 0xe4 ) &= ~0x1000; + + m_state.m_flFeetYawRate = 0.f; + + float backup_curtime = g_csgo.m_globals->m_curtime; + float backup_frametime = g_csgo.m_globals->m_frametime; + + g_csgo.m_globals->m_curtime = m_flOldSimulationTime + TICK_INTERVAL( ); + g_csgo.m_globals->m_frametime = TICK_INTERVAL( ); + + m_state.m_iLastClientSideAnimationUpdateFramecount -= 1; + + g_cheat.m_ragebot.m_resolver->brute_force( m_ent ); + + float lby_delta = m_flLowerBodyYawTarget - m_ent->m_angEyeAngles( ).y; + lby_delta = std::remainderf( lby_delta, 360.f ); + lby_delta = std::clamp( lby_delta, -60.f, 60.f ); + + float feet_yaw = std::remainderf( m_ent->m_angEyeAngles( ).y + lby_delta, 360.f ); + if( feet_yaw < 0.f ) + feet_yaw += 360.f; + + m_state.m_flGoalFeetYaw = m_state.m_flCurrentFeetYaw = feet_yaw; + + float backup_duck = m_ent->m_flDuckAmount( ); + float backup_duckspeed = m_ent->m_flDuckSpeed( ); + + m_ent->m_flDuckSpeed( ) = m_flDuckSpeed; + m_ent->m_flDuckAmount( ) = m_animDuck; + + m_ent->m_fFlags( ) = m_animFlags; + + m_state.m_flLastClientSideAnimationUpdateTime = m_lastAnimTime; + m_state.update( m_ent->m_angEyeAngles( ).y, m_ent->m_angEyeAngles( ).x ); + + m_ent->m_fFlags( ) = m_fFlags; + + m_ent->m_flDuckAmount( ) = backup_duck; + m_ent->m_flDuckSpeed( ) = backup_duckspeed; + + g_csgo.m_globals->m_curtime = backup_curtime; + g_csgo.m_globals->m_frametime = backup_frametime; + + m_ent->m_vecVelocity( ) = velocity; + m_ent->get< vec3_t >( 0x94 ) = velocity; + m_ent->get< byte >( 0x35f8 ) = backup_byte; + m_ent->get< int >( 0xe4 ) = backup_eflags; + } + + m_ent->set_abs_origin( m_vecRenderOrigin ); + + byte backup = m_ent->get< byte >( 0x270 ); + + m_ent->get< byte >( 0x270 ) = 0; + m_ent->invalidate_bone_cache( ); + bool ret = m_ent->ce( )->SetupBones( m_matrix, 128, BONE_USED_BY_HITBOX, m_flSimulationTime + TICK_INTERVAL( ) ); + + m_ent->get< byte >( 0x270 ) = backup; + + return ret; + } + + bool c_ragebot::lag_record_t::is_valid( ) { + if( !m_valid ) return false; + + return util::is_tick_valid( m_tickcount ); + } + + void c_ragebot::c_lagcomp::restore_animations( ) { + if( g_csgo.m_engine( )->IsInGame( ) ) { + if( g_ctx.m_local ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_player( ) ) { + ent->set_needs_interpolate( true ); + ent->invalidate_bone_cache( ); + ent->ce( )->SetupBones( nullptr, -1, BONE_USED_BY_ANYTHING, 0.f ); + + ent->m_bClientSideAnimation( ) = true; + } + } + } + } + } + + void c_ragebot::c_lagcomp::store_visuals( ) { + if( g_csgo.m_engine( )->IsInGame( ) ) { + static float last_simtime[ 65 ]{ }; + + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + for( int i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + auto& data = m_data_render[ i ]; + + if( ent == g_ctx.m_local ) + continue; + + if( !ent || !ent->is_valid( ) || ent->m_bGunGameImmunity( ) ) { + data.clear( ); + continue; + } + + if( std::abs( last_simtime[ i ] - ent->m_flSimulationTime( ) ) && ent->has_valid_anim( ) ) { + render_record_t new_record; + new_record.m_simtime = ent->m_flSimulationTime( ) + util::get_lerptime( ); + new_record.m_origin = ent->m_vecOrigin( ); + + float delta = ent->m_flSimulationTime( ) - ent->m_flOldSimulationTime( ); + new_record.m_globaltime = g_csgo.m_globals->m_curtime; + + if( g_settings.legit.enabled( ) ) + new_record.m_globaltime -= TICK_INTERVAL( ); + + new_record.m_validtime = 0.f; + + if( ent->ce( )->SetupBones( new_record.m_matrix, 128, BONE_USED_BY_ANYTHING, 0.f ) ) { + data.push_front( new_record ); + } + + last_simtime[ i ] = ent->m_flSimulationTime( ); + } + + while( !data.empty( ) && + data.size( ) > TIME_TO_TICKS( 1.f ) ) { + data.pop_back( ); + } + } + } + } + } + + bool c_ragebot::c_lagcomp::get_render_record( int ent_index, matrix3x4* out ) { + if( !g_ctx.m_local || !g_ctx.m_local->is_valid( ) ) + return false; + + auto& data = m_data_render[ ent_index ]; + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + auto is_time_valid = [ & ]( float time ) -> bool { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( !nci ) return false; + + float latency = util::get_total_latency( ); + float correct = std::clamp( latency + util::get_lerptime( ), 0.f, 1.f ); + float delta = correct - ( g_csgo.m_globals->m_curtime - time ); + + return std::abs( delta ) <= 0.2f; + }; + + for( auto it = data.rbegin( ); it != data.rend( ); it++ ) { + if( ( it + 1 ) == data.rend( ) || is_time_valid( it->m_simtime ) || ( it + 1 )->m_simtime == ent->m_flSimulationTime( ) + util::get_lerptime( ) ) { + if( it->m_origin.dist_to( ent->m_vecOrigin( ) ) < 1.f ) + return false; + + if( ent->is_breaking_lc( ) ) + return false; + + auto next_record = ( it + 1 ); + + if( std::abs( it->m_simtime - ent->m_flSimulationTime( ) ) > TIME_TO_TICKS( 16 ) ) + break; + + if( !it->m_validtime ) + it->m_validtime = g_csgo.m_globals->m_curtime; + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + float latency = util::get_total_latency( ); + float correct = latency + util::get_lerptime( ); + + float choke = ent->m_flSimulationTime( ) - ent->m_flOldSimulationTime( ); + float lerptime = next_record == data.rend( ) ? choke : next_record->m_simtime - it->m_simtime; + + lerptime = std::max( lerptime, TICK_INTERVAL( ) ); + + float curtime = g_csgo.m_globals->m_curtime; + + float delta = ( curtime - it->m_validtime ) / lerptime; + + vec3_t next = ( it + 1 ) == data.rend( ) ? ent->m_vecOrigin( ) : ( it + 1 )->m_origin; + vec3_t lerp = math::lerp( it->m_origin, next, std::clamp( delta, 0.f, 1.f ) ); + + matrix3x4 ret[ 128 ]; + + util::memcpy( ret, + it->m_matrix, + sizeof( ret ) ); + + for( size_t i{ }; i < 128; ++i ) { + vec3_t matrix_delta = math::get_matrix_position( it->m_matrix[ i ] ) - it->m_origin; + math::set_matrix_position( matrix_delta + lerp, ret[ i ] ); + } + + util::memcpy( out, + ret, + sizeof( ret ) ); + + return true; + } + } + + return false; + } + + void c_ragebot::c_lagcomp::fsn_net_update_start( ) { + static bool restored = true; + + if( !g_settings.rage.enabled( ) ) { + if( !restored ) { + restore_animations( ); + restored = true; + } + + return; + } + + restored = false; + if( g_csgo.m_engine( )->IsInGame( ) ) { + if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { + ent->set_needs_interpolate( false ); + } + } + } + } + } + + void c_ragebot::c_lagcomp::fsn_render_start( ) { + if( !g_settings.rage.enabled( ) ) + return; + + if( !g_ctx.m_local ) + return; + + static bool invalidated = true; + if( !g_ctx.m_local->is_valid( ) ) { + if( !invalidated ) + restore_animations( ); + + invalidated = true; + return; + } + + invalidated = false; + + static float stored_lby[ 65 ]; + static bool was_dormant[ 65 ]; + + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_player( ) ) { + //invalidate_animstate( i ); + m_first_update[ i ] = true; + continue; + } + + if( ent == g_ctx.m_local ) { + if( g_ctx.m_stage == FRAME_RENDER_START ) { + //printf( "ya\n" ); + //hooks::update_clientside_animation( ent, 0 ); + } + continue; + } + + if( !ent->is_alive( ) ) { + ent->m_bClientSideAnimation( ) = true; + was_dormant[ i ] = true; + m_first_update[ i ] = true; + continue; + } + + if( ent->ce( )->IsDormant( ) ) { + ent->m_bClientSideAnimation( ) = true; + m_first_update[ i ] = true; + was_dormant[ i ] = true; + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) + && !g_settings.rage.friendlies ) { + ent->m_bClientSideAnimation( ) = true; + continue; + } + + ent->restore_anim_data( false ); + if( was_dormant[ i ] ) { + g_cheat.m_ragebot.m_resolver->update_player( i ); + ent->calc_anim_velocity( true ); + ent->fix_animations( true ); + ent->do_ent_interpolation( true ); + stored_lby[ i ] = ent->m_flLowerBodyYawTarget( ); + m_last_simtime[ i ] = ent->m_flSimulationTime( ); + m_flick_time[ i ] = FLT_MAX; + } + else if( g_ctx.m_stage == FRAME_RENDER_START ) { + ent->m_bClientSideAnimation( ) = false; + ent->do_ent_interpolation( was_dormant[ i ] ); + continue; + } + + was_dormant[ i ] = false; + + if( m_data_lby[ i ].size( ) && + m_data_lby[ i ].front( ).m_ent != ent ) { + m_data_lby[ i ].clear( ); + } + + if( m_data_normal[ i ].size( ) && + m_data_normal[ i ].front( ).m_ent != ent ) { + m_data_normal[ i ].clear( ); + } + + auto update_anims = [ this, &ent ]( int e ) { + ent->fix_animations( ); + }; + + + + float lby = ent->m_flLowerBodyYawTarget( ); + + float last_simtime = m_last_simtime[ i ]; + float simtime = ent->m_flSimulationTime( ); + + if( !!std::abs( simtime - last_simtime ) ) { + g_cheat.m_ragebot.m_resolver->update_player( i ); + bool yaw_change = g_cheat.m_ragebot.m_resolver->yaw_change( i ); + + ent->calc_anim_velocity( was_dormant[ i ] ); + + bool is_moving = ent->get_anim_velocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) + && ( ent->m_fFlags( ) & FL_ONGROUND ); + + if( ent->m_bGunGameImmunity( ) ) { + update_anims( i ); + } + + else if( is_moving && !was_dormant[ i ] && g_settings.rage.resolver ) { + m_first_update[ i ] = false; + ent->m_angEyeAngles( ).y = lby; + + update_anims( i ); + lag_record_t new_record( ent ); + + m_data_lby[ i ].push_front( new_record ); + stored_lby[ i ] = lby; + } + + else if( ( lby != stored_lby[ i ] ) && !was_dormant[ i ] && g_settings.rage.resolver ) { + stored_lby[ i ] = lby; + ent->m_angEyeAngles( ).y = lby; + + update_anims( i ); + lag_record_t new_record( ent ); + + if( !m_first_update[ i ] ) { + m_data_lby[ i ].push_front( new_record ); + m_flick_time[ i ] = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + } + + m_first_update[ i ] = false; + } + else { + bool has_updated = false; + if( g_settings.rage.resolver( ) ) { + float anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); + + if( anim_time - m_flick_time[ i ] > 1.1f && !m_first_update[ i ] ) { + has_updated = true; + + ent->m_angEyeAngles( ).y = lby; + m_flick_time[ i ] = anim_time; + update_anims( i ); + lag_record_t new_record( ent ); + new_record.m_balanceadjust = true; + m_data_lby[ i ].push_front( new_record ); + } + } + + if( !has_updated ) { + ent->fix_animations( false, yaw_change ); + + lag_record_t new_record( ent ); + new_record.m_sim_record = true; + + new_record.m_shots = g_cheat.m_ragebot.m_resolver->get_shots( i ); + + m_data_normal[ i ].push_front( new_record ); + } + } + + + g_cheat.m_ragebot.m_resolver->yaw_change( i ) = false; + } + + ent->do_ent_interpolation( false ); + m_last_simtime[ i ] = simtime; + + while( !m_data_lby[ i ].empty( ) && + m_data_lby[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { + m_data_lby[ i ].pop_back( ); + } + + while( !m_data_normal[ i ].empty( ) && + m_data_normal[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { + m_data_normal[ i ].pop_back( ); + } + } + } + + RecordType_t c_ragebot::c_lagcomp::can_backtrack_entity( int ent_index ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + if( ent->is_breaking_lc( ) ) { + return RECORD_NONE; + } + + auto data_lby = &m_data_lby[ ent_index ]; + auto data_normal = &m_data_normal[ ent_index ]; + + if( !data_lby->empty( ) ) { + for( auto& it : *data_lby ) { + if( it.is_valid( ) ) return RECORD_LBY; + } + } + + if( !data_normal->empty( ) ) { + for( auto& it : *data_normal ) { + if( it.is_valid( ) ) return RECORD_NORMAL; + } + } + + return RECORD_NONE; + } + + void c_ragebot::c_lagcomp::invalidate_bone_caches( ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); + if( !ent || !ent->is_player( ) ) + continue; + + ent->m_iMostRecentModelBoneCounter( ) -= 1; + ent->m_flLastBoneSetupTime( ) = -FLT_MAX; + } + } + + c_ragebot::lag_record_t* c_ragebot::c_lagcomp::get_newest_record( int ent_index ) { + lag_record_t* newest_record{ }; + if( get_records( ent_index, RECORD_LBY )->size( ) ) + newest_record = &get_records( ent_index, RECORD_LBY )->front( ); + + if( get_records( ent_index, RECORD_NORMAL )->size( ) ) { + auto& newest_rec = get_records( ent_index, RECORD_NORMAL )->front( ); + if( ( newest_record && newest_rec.m_flSimulationTime > newest_record->m_flSimulationTime ) || + !newest_record ) { + newest_record = &newest_rec; + } + } + + return newest_record; + } + + c_ragebot::lag_record_t* c_ragebot::c_lagcomp::get_newest_valid_record( int ent_index ) { + lag_record_t* last_simtime_record{ }; + for( auto& it : *get_records( ent_index, RECORD_LBY ) ) { + if( !it.is_valid( ) ) continue; + last_simtime_record = ⁢ + break; + } + + for( auto& it : *get_records( ent_index, RECORD_NORMAL ) ) { + if( !it.is_valid( ) ) continue; + if( !last_simtime_record || ( last_simtime_record && it.m_flSimulationTime > last_simtime_record->m_flSimulationTime ) ) { + last_simtime_record = ⁢ + } + break; + } + + return last_simtime_record; + } + + int c_ragebot::c_lagcomp::backtrack_entity( int ent_index, RecordType_t type, lag_record_t** out_record ) { + if( type == RECORD_NONE ) return -1; + + auto& data = *get_records( ent_index, type ); + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + auto check_record = [ &ent, &out_record, &ent_index ]( lag_record_t* record, bool check_pelvis ) { + if( record->m_balanceadjust && record->m_shot ) return -1; + + vec3_t head_pos = record->m_vecHeadPos; + vec3_t pelvis_pos = record->m_vecPelvisPos; + + float damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, head_pos, false ) * 4.f; + float min_damage = std::min< float >( ent->m_iHealth( ), + g_settings.rage.active->m_damage ); + + //g_con->log( xors( "record: %d damage: %f" ), counter++, damage ); + + int shots = g_cheat.m_ragebot.m_resolver->get_shots( ent_index ); + bool recalc = shots != record->m_shots && record->m_sim_record; + + + if( damage > min_damage ) { + if( !record->restore( recalc, recalc ) ) + return -1; + + if( out_record ) { + *out_record = record; + } + return record->m_tickcount; + } + + if( check_pelvis ) { + float pelvis_damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, pelvis_pos, false ); + if( pelvis_damage > min_damage ) { + if( !record->restore( recalc, recalc ) ) + return -1; + + if( out_record ) { + *out_record = record; + } + return record->m_tickcount; + } + } + + return -1; + }; + + if( data.empty( ) ) + return -1; + + auto* back = &data.back( ); + auto* front = &data.front( ); + + for( auto& it : data ) { + if( !it.is_valid( ) ) continue; + front = ⁢ + break; + } + + for( auto& it : util::reverse_iterator( data ) ) { + if( !it.is_valid( ) ) continue; + back = ⁢ + break; + } + + int front_result = check_record( front, true ); + if( front_result != -1 ) return front_result; + + int back_result = check_record( back, true ); + if( back_result != -1 ) return back_result; + + return -1; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ragebot_resolver.cpp b/cheat/internal_rewrite/ragebot_resolver.cpp new file mode 100644 index 0000000..1b29305 --- /dev/null +++ b/cheat/internal_rewrite/ragebot_resolver.cpp @@ -0,0 +1,626 @@ +#include "ragebot.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "math.hpp" +#include "input_system.hpp" + +namespace features +{ + constexpr float FLT_ANG_LBY = 360.f; + constexpr float FLT_ANG_MOVING_LBY_UP = -360.f; + constexpr float FLT_ANG_180 = 720.f; + constexpr float FLT_ANG_FREESTANDING = -720.f; + constexpr float FLT_ANG_90 = 480.f; + constexpr float FLT_ANG_MINUS_90 = -480.f; + constexpr float FLT_ANG_MINUS_135 = -700.f; + constexpr float FLT_ANG_135 = 700.f; + constexpr float FLT_ANG_PITCH_UP = 1080.f; + + static const std::vector< float > possible_angles_none = { + FLT_ANG_MOVING_LBY_UP, + FLT_ANG_180, + FLT_ANG_90, + FLT_ANG_MINUS_90, + FLT_ANG_MINUS_135, + FLT_ANG_135, + }; + + static const std::vector< float > possible_angles_normal = { + FLT_ANG_MOVING_LBY_UP, + FLT_ANG_180, + FLT_ANG_135, + FLT_ANG_MINUS_135 + }; + + static const std::vector< float > possible_angles_freestanding = { + 0.f, + 45.f, + 90.f, + 135.f, + 180.f, + }; + + bool dbg_resolver( ) { + static con_var< bool > var{ &data::holder_, fnv( "dbg_resolver" ), false }; + return var( ); + } + + int c_ragebot::c_resolver::try_freestanding( c_base_player* ent ) { + if( !( ent->m_fFlags( ) & FL_ONGROUND ) || ( ent->get_anim_velocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) ) ) + return -1; + + int ret_dir = -1; + float cur_damage = 0.f; + + vec3_t enemy_pos = ent->m_vecOrigin( ); + enemy_pos.z = ent->get_hitbox_pos( 0 ).z; + + vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); + local_pos -= g_ctx.m_local->m_vecOrigin( ); + local_pos += g_ctx.m_last_origin; + + vec3_t aim_angle = math::vector_angles( + enemy_pos, + local_pos + ); + + auto get_damage = [ & ]( const vec3_t& start, const vec3_t& end, c_base_player* a, c_base_player* b ) { + static weapon_info_t wpn_data{ }; + wpn_data.damage = 200; + wpn_data.range_modifier = 1.0f; + wpn_data.penetration = 3.0f; + wpn_data.armor_ratio = 0.5f; + wpn_data.range = 8192.f; + + fire_bullet_data_t data{ }; + data.src = start; + data.travel_range = ( end - data.src ).length( ); + data.traveled = 0.f; + data.to_travel = data.travel_range; + + vec3_t angle = math::vector_angles( start, end ); + data.direction = math::angle_vectors( angle ); + + data.direction.normalize_vector( ); + + if( g_cheat.m_autowall.fire_bullet( a, b, &wpn_data, data, false, false ) ) { + return data.current_damage; + } + + return -1.f; + }; + + auto trace_ent_pos = [ & ]( vec3_t start, vec3_t end, c_base_player* ent ) { + Ray_t ray; + CGameTrace tr; + CTraceFilter filter; + + const vec3_t min( -2.f, -2.f, -2.f ); + const vec3_t max( 2.f, 2.f, 2.f ); + + ray.Init( start, end, min, max ); + filter.pSkip = ent; + + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); + + return tr.endpos; + }; + + float local_dist = 75.f; + float enemy_dist = 75.f; + + float start_dmg = get_damage( enemy_pos, local_pos, g_ctx.m_local, ent ); + + auto test_dmg = [ & ]( float dist, float enemy_dist, float delta = 50.f ) { + vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y - 90.f, enemy_dist ); + vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_dist ); + + enemy_left = trace_ent_pos( enemy_pos, enemy_left, ent ); + enemy_right = trace_ent_pos( enemy_pos, enemy_right, ent ); + + vec3_t local_left = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, dist ); + vec3_t local_right = math::get_rotated_pos( local_pos, aim_angle.y - 90.f, dist ); + + local_left = trace_ent_pos( local_pos, local_left, g_ctx.m_local ); + local_right = trace_ent_pos( local_pos, local_right, g_ctx.m_local ); + + float dmg_left = get_damage( local_left, enemy_left, g_ctx.m_local, ent ) + + get_damage( local_right, enemy_left, g_ctx.m_local, ent ); + + float dmg_right = get_damage( local_left, enemy_right, g_ctx.m_local, ent ) + + get_damage( local_right, enemy_right, g_ctx.m_local, ent ); + + if( std::abs( dmg_left - dmg_right ) < delta ) + return false; + + float max_dmg = math::max( dmg_left, dmg_right ); + ret_dir = dmg_left > dmg_right; + + cur_damage = max_dmg; + return max_dmg > delta; + }; + + float radius = std::floorf( ( g_ctx.m_local->get_hitbox_pos( 0 ) - g_ctx.m_local->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); + radius = radius >= 15.f ? 20.f : 10.f; + + float enemy_radius = std::floorf( ( ent->get_hitbox_pos( 0 ) - ent->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); + enemy_radius = enemy_radius >= 15.f ? 20.f : 10.f; + + if( !test_dmg( enemy_radius + 1.f, radius + 1.f, 25.f ) ) { + if( cur_damage < start_dmg * 2.f ) + return -1; + } + + bool found = false; + + for( size_t i = 5; i > 0; --i ) { + float cur_dist = local_dist / i; + float cur_enemy_dist = enemy_dist / i; + + if( cur_dist < radius ) + continue; + + if( cur_enemy_dist < enemy_radius ) + continue; + + if( test_dmg( cur_enemy_dist, cur_dist, 125.f / i ) ) { + found = true; + break; + } else if( cur_damage > 125.f / i ) + break; + } + + if( !found ) + return -1; + + return ret_dir; + } + + void c_ragebot::c_resolver::resolve_log_t::update( int ent_index ) { + static C_AnimationLayer last_layer[ 65 ]{ }; + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + if( !ent || ent == g_ctx.m_local || !ent->is_player( ) || !ent->is_alive( ) || ent->ce( )->IsDormant( ) || !ent->has_valid_anim( ) ) { + m_was_invalid = true; + m_has_valid_lby = false; + return; + } + + if( m_was_invalid && m_last_pos.dist_to( ent->m_vecOrigin( ) ) > 4.f ) + reset( ); + + if( !( ent->m_fFlags( ) & FL_ONGROUND ) ) { + m_state = R_NONE; + return; + } + + if( ent->get_anim_velocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) ) { + m_state = R_NONE; + m_has_valid_lby = true; + m_last_moving_lby = ent->m_flLowerBodyYawTarget( ); + return; + } + + m_last_pos = ent->m_vecOrigin( ); + + m_was_invalid = false; + + int freestanding = g_cheat.m_ragebot.m_resolver->try_freestanding( ent ); + + if( freestanding != -1 ) { + m_state = R_FREESTANDING; + } + else + m_state = R_NORMAL; + + if( m_last_freestanding != freestanding ) + m_angle_change = true; + + m_last_freestanding = freestanding; + m_has_valid_lby = true; + } + + void c_ragebot::c_resolver::resolve_log_t::reset( ) { + //assuming theyre STILL not moving this shouldnt change + //however if they are, it will be reset to none anyway + m_state = R_NONE; + m_last_update = 0.f; + m_last_lby = 0.f; + m_missed_shots = 0; + memset( m_shots, 0, sizeof( m_shots ) ); + memset( m_logged, 0, sizeof( m_logged ) ); + memset( m_logged_shots, 0, sizeof( m_logged ) ); + } + + std::vector< float > c_ragebot::c_resolver::get_shot_vec( int ent ) { + auto& data = m_data[ ent ]; + + if( data.m_state == R_NORMAL ) + return possible_angles_normal; + if( data.m_state == R_FREESTANDING ) + return possible_angles_freestanding; + + return possible_angles_none; + } + + float c_ragebot::c_resolver::get_shot_yaw( int shots, int ent_index ) { + auto& data = m_data[ ent_index ]; + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + + auto vec = get_shot_vec( ent_index ); + + float new_ang = vec.at( shots % vec.size( ) ); + float new_yaw = 0.f; + + float ang = math::vector_angles( ent->m_vecOrigin( ), g_ctx.m_last_origin ).y; + + if( data.m_state == R_FREESTANDING ) { + ang += ( data.m_last_freestanding == 1 ? 90.f : -90.f ); + + float sign = data.m_last_freestanding == 1 ? 1.f : -1.f; + + return ang + new_ang * sign; + } + + if( new_ang == FLT_ANG_LBY ) + new_yaw = ent->m_flLowerBodyYawTarget( ); + else if( new_ang == FLT_ANG_MOVING_LBY_UP ) { + if( !data.m_has_valid_lby && !g_settings.rage.pitch_resolver ) { + return get_shot_yaw( ++get_resolver_shots( ent_index ), ent_index ); + } + + auto delta = std::remainderf( data.m_last_moving_lby - data.m_last_lby, 360.f ); + bool breaking_lby = std::abs( delta ) > 35.f; + + new_yaw = breaking_lby ? data.m_last_moving_lby : data.m_last_lby; + } + else if( new_ang == FLT_ANG_180 ) { + new_yaw = ang - 180.f; + } + else if( new_ang == FLT_ANG_MINUS_90 ) { + new_yaw = ang - 90.f; + } + else if( new_ang == FLT_ANG_90 ) { + new_yaw = ang + 90.f; + } + else if( new_ang == FLT_ANG_135 ) + new_yaw = ang + 135.f; + else if( new_ang == FLT_ANG_MINUS_135 ) + new_yaw = ang - 135.f; + else + new_yaw = std::remainderf( ent->m_flLowerBodyYawTarget( ) + new_ang, 360.f ); + + return new_yaw; + } + + void c_ragebot::c_resolver::aimbot( int ent_index, int hitbox, vec3_t angle, vec3_t position, vec3_t min, vec3_t max, float radius ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); + bool moving = ent->get_anim_velocity( ).length2d( ) > 0.1f && ( ent->m_fFlags( ) & FL_ONGROUND ); + + if( moving && !ent->is_fakewalking( ) ) { + return; + } + + if( !data.m_state ) { + increment_shots( ent_index ); + return; + } + + auto model = ent->ce( )->GetModel( ); + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); + + if( hitbox == HITBOX_HEAD ) { + auto box = set->pHitbox( 0 ); + if( box ) { + auto dist = box->bbmin.dist_to( box->bbmax ); + + context::shot_data_t new_shot{ }; + new_shot.m_angle = angle; + new_shot.m_enemy_pos = position; + new_shot.m_enemy_index = ent_index; + new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); + new_shot.m_resolver_shots = get_resolver_shots( ent_index ); + new_shot.m_resolver_state = true; + new_shot.m_hitbox.min = min; + new_shot.m_hitbox.min = max; + new_shot.m_hitbox.radius = radius; + new_shot.m_missed = true; + new_shot.m_hitgroup = HITGROUP_HEAD; + + g_ctx.m_last_shot++; + g_ctx.m_last_shot %= 128; + g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; + + g_ctx.m_has_incremented_shots = true; + + + data.m_snapshot[ g_ctx.m_last_shot ] = data; + + if( data.m_logged[ data.m_state ] ) { + if( !--data.m_logged_shots[ data.m_state ] ) { + data.m_logged[ data.m_state ] = false; + } + } + else { + int shots = get_resolver_shots( ent_index ); + + increment_shots( ent_index ); + +#if _DEBUG + if( dbg_resolver( ) ) { + char str[ 128 ]; + sprintf_s< 128 >( str, "[\3moneybot\1] incrementing shots from %d to %d" + "[\3moneybot\1] resolver state: %d\n", shots, get_resolver_shots( ent_index ), data.m_state ); + + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, str ); + } +#endif + } + } + } + else { + matrix3x4 bone_matrix[ 128 ]; + if( model && hdr && set && ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) { + auto box = set->pHitbox( hitbox ); + if( !box ) return; + + auto origin = ent->m_vecOrigin( ); + + vec3_t shot_pos = position; + vec3_t rotated_center; + + vec3_t offset = position - origin; + float radius = offset.length2d( ); + float cosine = offset.x / radius; + + float deg = RAD2DEG( acos( cosine ) ); + if( offset.y < 0 ) deg += 360.f; + + float rot = ( deg - 180.f ) * ( M_PI / 180.f ); + rotated_center.x = origin.x + cos( rot ) * radius; + rotated_center.y = origin.y + sin( rot ) * radius; + rotated_center.z = position.z; + + Ray_t ray; + CTraceFilterOneEntity filter; + CGameTrace tr_center; + CGameTrace tr_rot; + + filter.ent = ent; + + ray.Init( g_ctx.m_local->get_eye_pos( ), position ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_center ); + + ray.Init( g_ctx.m_local->get_eye_pos( ), rotated_center ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_rot ); + + bool is_within = tr_center.hitbox == tr_rot.hitbox; + + if( !is_within ) { + auto dist = box->bbmin.dist_to( box->bbmax ); + + context::shot_data_t new_shot{ }; + new_shot.m_angle = angle; + new_shot.m_enemy_pos = position; + new_shot.m_enemy_index = ent_index; + new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); + new_shot.m_resolver_shots = get_resolver_shots( ent_index ); + new_shot.m_resolver_state = true; + new_shot.m_hitbox.min = min; + new_shot.m_hitbox.min = max; + new_shot.m_hitbox.radius = radius; + new_shot.m_missed = true; + new_shot.m_hitgroup = util::hitbox_to_hitgroup( hitbox ); + + g_ctx.m_last_shot++; + g_ctx.m_last_shot %= 128; + g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; + + g_ctx.m_has_incremented_shots = true; + + data.m_snapshot[ g_ctx.m_last_shot ] = data; + + if( data.m_logged[ data.m_state ] ) { + if( !--data.m_logged_shots[ data.m_state ] ) { + data.m_logged[ data.m_state ] = false; + } + } + else { + int shots = get_resolver_shots( ent_index ); + increment_shots( ent_index ); + +#if _DEBUG + if( dbg_resolver( ) ) { + char str[ 128 ]; + sprintf_s< 128 >( str, "[\3moneybot\1] incrementing shots from %d to %d" + "[\3moneybot\1] resolver state: %d\n", shots, get_resolver_shots( ent_index ), data.m_state ); + + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, str ); + } +#endif + } + } + } + } + + //printf( "resolver: logging aimbot shot %d missed: %d state: %d time: %f\n", + // data.m_shots, data.m_missed_shots[ data.m_breaking ], data.m_breaking, g_Interfaces.Globals->curtime ); + } + + void c_ragebot::c_resolver::increment_shots( int ent_index ) { + get_resolver_shots( ent_index )++; + m_data[ ent_index ].m_missed_shots++; + m_data[ ent_index ].m_angle_change = true; + } + + void c_ragebot::c_resolver::on_missed_spread( int ent_index, int shots ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + auto& snapshot = data.m_snapshot[ shots % 150 ]; + + data.m_shots[ snapshot.m_state ] = snapshot.m_shots[ snapshot.m_state ]; + + if( snapshot.m_logged[ snapshot.m_state ] ) { + data.m_logged[ snapshot.m_state ] = true; + data.m_logged_shots[ snapshot.m_state ] = snapshot.m_logged_shots[ snapshot.m_state ]; + } + } + + void c_ragebot::c_resolver::listener( int ent_index, int shots ) { + if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) + return; + + auto& data = m_data[ ent_index ]; + auto& snapshot = data.m_snapshot[ shots ]; + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( !nci ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) + return; + + auto rate = weapon->get_wpn_info( )->cycle_time; + + data.m_shots[ snapshot.m_state ] = snapshot.m_shots[ snapshot.m_state ]; + data.m_logged[ snapshot.m_state ] = true; + + int latency_shots = ( nci->GetLatency( 0 ) + g_csgo.m_globals->m_frametime ) / rate + 1; + + data.m_logged_shots[ snapshot.m_state ] = latency_shots; + +#if _DEBUG + if( dbg_resolver( ) ) { + char str[ 128 ]; + sprintf_s< 128 >( str, "[\3moneybot\1] resolver: logging %d shots for %d with %d", data.m_logged_shots[ data.m_state ], ent_index, get_resolver_shots( ent_index ) ); + + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, str ); + } +#endif + } + + void c_ragebot::c_resolver::update_player( int i ) { + if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) + return; + + if( !g_cheat.m_player_mgr.is_cheater( i ) ) + return; + + auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); + bool was_invalid = m_data[ i ].m_was_invalid; + + m_data[ i ].update( i ); + if( g_settings.rage.resolver_override( ) ) { + if( g_input.is_key_pressed( g_settings.rage.resolver_override_key( ) ) ) { + int dir = manual_override( ent ); + if( dir ) { + if( dir != m_data[ i ].m_overriding ) + m_data[ i ].m_angle_change = true; + + //to be finished + m_data[ i ].m_overriding = dir; + return; + } + } + } + + m_data[ i ].m_overriding = 0; + brute_force( ent ); + } + + void c_ragebot::c_resolver::frame_stage_notify( ) { + if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) + return; + + if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) + return; + + for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || ent == g_ctx.m_local || ent->ce( )->IsDormant( ) || !ent->is_player( ) + || !ent->is_alive( ) || !g_cheat.m_player_mgr.is_cheater( i ) ) { + m_data[ i ].m_was_invalid = true; + m_data[ i ].m_has_valid_lby = false; + continue; + } + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) + continue; + + //update_player( i ); + } + } + + void c_ragebot::c_resolver::force_yaw( c_base_player* ent, float yaw ) { + ent->m_angEyeAngles( ).y = yaw;// + 180.f; + } + + int c_ragebot::c_resolver::manual_override( c_base_player* ent ) { + if( ent->get_animdata( ).m_anim_velocity.length2d( ) > 0.1f && !ent->is_fakewalking( ) ) { //no point in overriding moving targets, it will also fuck up backtrack records otherwise + return OVERRIDE_NONE; + } + + vec3_t pos; + vec3_t angle; + vec3_t local_angle; + vec3_t local_pos; + float delta; + float dist; + + + local_pos = g_ctx.m_local->m_vecOrigin( ); + g_csgo.m_engine( )->GetViewAngles( local_angle ); + pos = ent->get_hitbox_pos( 0 ); + + angle = math::vector_angles( local_pos, pos ); + dist = pos.dist_to( local_pos ); + delta = ( angle - local_angle ).clamp( ).y; + float yaw_delta = sin( DEG2RAD( ( angle - local_angle ).clamp( ).y ) ) * dist; + + if( std::abs( yaw_delta ) < 25.f ) { + force_yaw( ent, angle.y ); + return OVERRIDE_CENTER; + } + else { + force_yaw( ent, angle.y + ( ( delta < 0.f ) ? 90.f : -90.f ) ); + return delta > 0.f ? OVERRIDE_LEFT : OVERRIDE_RIGHT; + } + } + + void c_ragebot::c_resolver::force_lby( c_base_player* ent ) { + force_yaw( ent, ent->m_flLowerBodyYawTarget( ) ); + } + + void c_ragebot::c_resolver::brute_force( c_base_player* ent ) { + if( ent->m_flSimulationTime( ) == g_cheat.m_ragebot.m_lagcomp->get_last_updated_simtime( ent->ce( )->GetIndex( ) ) ) + return; + + if( ent->get_anim_velocity( ).length( ) > 0.1f && ( ent->m_fFlags( ) & FL_ONGROUND ) && !ent->is_fakewalking( ) ) { + m_data[ ent->ce( )->GetIndex( ) ].m_last_moving_lby = ent->m_flLowerBodyYawTarget( ); + m_data[ ent->ce( )->GetIndex( ) ].m_has_valid_lby = true; + force_lby( ent ); + return; + } + + int i = ent->ce( )->GetIndex( ); + int s = get_resolver_shots( i ); + auto vec = get_shot_vec( i ); + + if( vec.at( s % vec.size( ) ) == FLT_ANG_MOVING_LBY_UP && g_settings.rage.pitch_resolver ) + ent->m_angEyeAngles( ).x = -89.f; + + float new_yaw = get_shot_yaw( get_resolver_shots( i ), i ); + + force_yaw( ent, new_yaw ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/renderer.cpp b/cheat/internal_rewrite/renderer.cpp new file mode 100644 index 0000000..3d22805 --- /dev/null +++ b/cheat/internal_rewrite/renderer.cpp @@ -0,0 +1,93 @@ +#include "renderer.hpp" +#include "interface.hpp" + +#undef CreateFont + + +drawings::c_fonts g_fonts; +drawings::c_drawings g_renderer; + +NAMESPACE_REGION( drawings ) + +c_fonts::font_t::font_t( std::string name, int size, + int weight, ulong_t flags ) : + m_name( name ), m_size( size ), + m_weight( weight ), m_flags( flags ) { + g_fonts.m_container.push_back( this ); +}; + +void c_fonts::font_t::initialize( ) { + m_font = g_csgo.m_surface( )->CreateFont( ); + g_csgo.m_surface( )->SetFontGlyphSet( + m_font, m_name.c_str( ), m_size, + m_weight, 0, 0, + m_flags + ); +} + +void c_fonts::initialize( ) { + for( auto& it : m_container ) { + it->initialize( ); + } +} + +void c_drawings::draw_string( const wchar_t* text, HFont font, int x, int y, const clr_t& color ) { + g_csgo.m_surface( )->DrawSetTextPos( x, y ); + g_csgo.m_surface( )->DrawSetTextFont( font ); + g_csgo.m_surface( )->DrawSetTextColor( color ); + g_csgo.m_surface( )->DrawPrintText( text, wcslen( text ) ); +} + +void c_drawings::draw_rect( int x, int y, int w, int h, const clr_t& color ) { + g_csgo.m_surface( )->DrawSetColor( color ); + g_csgo.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); +} + +void c_drawings::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + g_csgo.m_surface( )->DrawSetColor( clr ); + g_csgo.m_surface( )->DrawLine( x, y, x1, y1 ); +} + +void c_drawings::draw_box( int x, int y, int w, int h, const clr_t& clr ) { + draw_line( x, y, x + w, y, clr ); + draw_line( x + w, y, x + w, y + h, clr ); + draw_line( x, y + h, x + w + 1, y + h, clr ); + draw_line( x, y, x, y + h, clr ); +} + +void c_drawings::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + g_csgo.m_surface( )->DrawSetColor( col ); + g_csgo.m_surface( )->DrawOutlinedCircle( x, y, r, res ); +} + +void c_drawings::draw_filled_circle( int x, int y, int r, const clr_t& col, int res ) { + vertex_t* v = ( vertex_t* )( _alloca( res * sizeof( vertex_t ) ) ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + v[ i ].init( x + x_off, y + y_off ); + } + + draw_polygon( res, v, col ); +} + +void c_drawings::draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& clr ) { + draw_line( ( int )begin.x, ( int )begin.y, ( int )end.x, ( int )end.y, clr ); +} + +void c_drawings::draw_polygon( int count, vertex_t* vertices, const clr_t& col ) { + static int texture = g_csgo.m_surface( )->CreateNewTextureID( true ); + + clr_t buf( 255, 255, 255 ); + + g_csgo.m_surface( )->DrawSetTextureRGBA( texture, ( byte* )( &buf ), 1, 1 ); + g_csgo.m_surface( )->DrawSetColor( col ); + g_csgo.m_surface( )->DrawSetTexture( texture ); + + g_csgo.m_surface( )->DrawTexturedPolygon( count, vertices ); +} + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/renderer.hpp b/cheat/internal_rewrite/renderer.hpp new file mode 100644 index 0000000..59e4dd1 --- /dev/null +++ b/cheat/internal_rewrite/renderer.hpp @@ -0,0 +1,126 @@ +#pragma once +#include +#include +#include + +#include "util.hpp" +#include "sdk.hpp" + +enum e_font_style : size_t { + +}; + +enum FontAlign_t : size_t { + ALIGN_CENTER, + ALIGN_LEFT, + ALIGN_RIGHT +}; + +NAMESPACE_REGION( drawings ) + + +class c_fonts { +protected: + struct font_t { + friend class c_fonts; + font_t( std::string name, int size, + int weight, ulong_t flags ); + + operator HFont( ) { + return m_font; + } + + private: + void initialize( ); + + HFont m_font; + std::string m_name; + int m_size; + int m_weight; + ulong_t m_flags; + }; + + std::vector< font_t* > m_container; + friend struct c_fonts::font_t; +public: + void initialize( ); + + font_t f_esp_small{ xors( "Tahoma" ), 11, 500, FONTFLAG_DROPSHADOW }; + font_t f_bold{ xors( "Verdana" ), 24, 700, FONTFLAG_ANTIALIAS }; + font_t f_12{ +#ifndef COMIC_SANS + xors( "Tahoma" ) +#else + xors( "Comic Sans" ) +#endif + , 12, 0, FONTFLAG_DROPSHADOW }; + font_t f_14{ xors( "Verdana" ), 14, 700, 128 }; + font_t f_16{ xors( "Verdana" ), 16, 700, 128 }; + font_t f_18{ xors( "Verdana" ), 18, 700, 128 }; +}; + + + +//im going to fill ur triangles +class c_drawings { +private: + //dumb hacky fix for template functions + void draw_string( const wchar_t* msg, HFont font, int x, int y, const clr_t& color ); + +public: + void draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& color ); + void draw_line( int x, int y, int x1, int y2, const clr_t& color ); + void draw_rect( int x, int y, int w, int h, const clr_t& color ); + void draw_box( int x, int y, int w, int h, const clr_t& color ); //thicc + void draw_polygon( int count, vertex_t* vertices, const clr_t& col ); + void draw_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + void draw_filled_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + + template < FontAlign_t align = ALIGN_LEFT > //fuck ur sprintf nigga varargs nigga + void draw_string( HFont font, int x, int y, const clr_t& color, const wchar_t* msg, ... ) { + wchar_t* buffer = ( wchar_t* )_alloca( 2048 ); + va_list list{ }; + int wide, tall; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vswprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + g_csgo.m_surface( )->GetTextSize( + font, buffer, wide, tall ); + + switch( align ) { + case ALIGN_CENTER: + x -= wide / 2; + break; + case ALIGN_RIGHT: + x -= wide; + break; + default: break; + } + + draw_string( buffer, font, x, y, color ); + } + + template < FontAlign_t align = ALIGN_LEFT > //debatable whether it should be center or not + void draw_string( HFont font, int x, int y, const clr_t& color, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + auto wide_str = util::ascii_to_unicode( buffer ); + draw_string< align >( font, x, y, color, wide_str.c_str( ) ); + } +}; + +END_REGION + +extern drawings::c_fonts g_fonts; +extern drawings::c_drawings g_renderer; \ No newline at end of file diff --git a/cheat/internal_rewrite/run_command.cpp b/cheat/internal_rewrite/run_command.cpp new file mode 100644 index 0000000..d8df083 --- /dev/null +++ b/cheat/internal_rewrite/run_command.cpp @@ -0,0 +1,11 @@ +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::run_command( void* ecx_, void* edx_, IClientEntity* entity, user_cmd_t* ucmd, IMoveHelper* move_helper ) { + if( !g_csgo.m_panic && g_settings.rage.anti_aim( ) && entity == g_ctx.m_local->ce( ) ) { + + } + + run_command_o( ecx_, edx_, entity, ucmd, move_helper ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/scene_end.cpp b/cheat/internal_rewrite/scene_end.cpp new file mode 100644 index 0000000..997ed21 --- /dev/null +++ b/cheat/internal_rewrite/scene_end.cpp @@ -0,0 +1,42 @@ +#include "hooks.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::scene_end( void* ecx_, void* edx_ ) { + scene_end_o( edx_, 0 ); + + if( !g_csgo.m_panic && g_ctx.m_local && g_settings.visuals.chams.enabled( ) && g_settings.visuals.chams.ignore_z( ) && g_settings.visuals.chams.clear_occlusion && !g_settings.misc.hide_from_obs ) { + g_ctx.m_drawing_screneend = true; + for( int i = 1; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) ) { + if( ent == g_ctx.m_local && ent->m_bIsScoped( ) ) { + continue; + } + + int team = ent->m_iTeamNum( ); + bool enemy = team != g_ctx.m_local->m_iTeamNum( ); + + if( enemy || g_settings.visuals.chams.friendlies( ) ) { + IMaterial* mat = g_settings.visuals.chams.flat ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; + fclr_t clr_vis = enemy ? g_settings.visuals.chams.color_visible_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_visible_friendly( ).to_fclr( ); + fclr_t clr_hid = enemy ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); + g_cheat.m_chams.m_materials.force_material( mat, clr_hid ); + ent->ce( )->DrawModel( 0x1, 255 ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + g_cheat.m_chams.m_materials.force_material( mat, clr_vis ); + ent->ce( )->DrawModel( 0x1, 255 ); + + g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); + } + } + } + + g_ctx.m_drawing_screneend = false; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/sdk.hpp b/cheat/internal_rewrite/sdk.hpp new file mode 100644 index 0000000..91f9bba --- /dev/null +++ b/cheat/internal_rewrite/sdk.hpp @@ -0,0 +1,28 @@ +#pragma once +#include "vector.hpp" + +#include "IClientMode.hpp" +#include "CHLClient.hpp" +#include "ISurface.hpp" +#include "IPanel.hpp" +#include "IVEngineClient.hpp" +#include "IClientEntityList.hpp" +#include "GlobalVars_t.hpp" +#include "IPrediction.hpp" +#include "ICvar.hpp" +#include "IVModelInfoClient.hpp" +#include "IMaterialSystem.hpp" +#include "IEngineTrace.hpp" +#include "IVRenderView.hpp" +#include "IPhysicsSurfaceProps.hpp" +#include "CUtlVector.hpp" +#include "IMemAlloc.hpp" +#include "IGameEventManager.hpp" +#include "KeyValues.hpp" +#include "CInput.hpp" +#include "bf_write.hpp" +#include "match_framework.h" + + +#include "c_base_player.hpp" +#include "ISteamClient.hpp" \ No newline at end of file diff --git a/cheat/internal_rewrite/send_datagram.cpp b/cheat/internal_rewrite/send_datagram.cpp new file mode 100644 index 0000000..7a86842 --- /dev/null +++ b/cheat/internal_rewrite/send_datagram.cpp @@ -0,0 +1,32 @@ +#include "mem.hpp" +#include "base_cheat.hpp" +#include "context.hpp" +#include "hooks.hpp" + +uintptr_t cl_sendmove = 0; + +int __fastcall hooks::send_datagram( INetChannel* channel, void* edx_, void* datagram ) { + if( g_csgo.m_panic || !g_settings.misc.net_fakelag || datagram ) { + return send_datagram_o( channel, 0, datagram ); + } + + auto cl = g_csgo.m_global_state->get_client_state( ); + if( !cl || cl->m_delta_tick <= 0 ) { + return send_datagram_o( channel, 0, datagram ); + } + + // There is no need to restore the reliable state sequence since + // we are not fucking with reliable state with 'proper' fake latency. + + int backup_sequence = channel->m_nInSequenceNr; + + g_cheat.m_extra.add_latency( channel ); + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + + int ret = send_datagram_o( channel, 0, datagram ); + + channel->m_nInSequenceNr = backup_sequence; + + return ret; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/settings.hpp b/cheat/internal_rewrite/settings.hpp new file mode 100644 index 0000000..6880bff --- /dev/null +++ b/cheat/internal_rewrite/settings.hpp @@ -0,0 +1,460 @@ +#pragma once +#include "simple_settings.hpp" +#include "strings.hpp" +#include "color.hpp" +#include +//later i will implement a way to load all config files + +namespace data +{ + + + extern SettingHolder holder_; + + struct skin_data { + + skin_data( int id_input = 0, int paintkit_input = 0, const char* name_input = nullptr, float wear_input = 0.0f, int seed_input = 0 ) { + id = id_input; + name = name_input; + paintkit = paintkit_input; + seed = seed_input; + wear = wear_input; + } + + int id = 0; + int paintkit = 0; + int seed = 0; + float wear = 0.0f; + const char* name = nullptr; + }; + + + class legitbot_settings : SettingHolder { + public: + using SettingHolder::SettingHolder; + + con_var< float > m_fov{ this, fnv( "fov" ), 5.f }; + con_var< float > m_speed{ this, fnv( "speed" ), 10.f }; + con_var< float > m_rcs{ this, fnv( "rcs" ), 25.f }; + con_var< float > m_assist_strength{ this, fnv( "assist_strength" ), 0.f }; + con_var< int > m_hitbox{ this, fnv( "hitbox" ), 0 }; + }; + + class ragebot_settings : SettingHolder { + public: + using SettingHolder::SettingHolder; + + con_var< int > m_damage{ this, fnv( "damage" ), 0 }; + con_var< int > m_damage_scale{ this, fnv( "damage_scale" ), 0 }; + con_var< int > m_hitchance{ this, fnv( "hitchance" ), 0 }; + con_var< bool > m_baim_air{ this, fnv( "baim_air" ), 0 }; + con_var< bool > m_baim_fake{ this, fnv( "baim_fake" ), 0 }; + con_var< int > m_baim_shots{ this, fnv( "baim_shots" ), 5 }; + con_var< int > m_baim_health{ this, fnv( "baim_health" ), 50 }; + con_var< int > m_delay{ this, fnv( "delay" ), 0 }; + con_var< int > m_delay_type{ this, fnv( "delay_type" ), 0 }; + con_var< bool > m_spread_limit{ this, fnv( "spread_limit" ), 0 }; + con_var< int > m_spread_limit_min{ this, fnv( "spread_limit_min" ), 100 }; + con_var< int > m_auto_stop{ this, fnv( "auto_stop" ), false }; + con_var< float > m_hitbox_scale{ this, fnv( "point_scale" ), 0.5f }; + }; + + class c_settings { + public: + c_settings( ) { + memset( this->misc.skins.skins( ).data( ), -1, sizeof( this->misc.skins.skins( ) ) ); + } + + __declspec( noinline ) void load( ) { + switch( menu.cur_setting ) { + case 0: + holder_.load( "", xors( "money_legit.cfg" ) ); + break; + case 1: + holder_.load( "", xors( "money_closet.cfg" ) ); + break; + case 2: + holder_.load( "", xors( "money_rage1.cfg" ) ); + break; + case 3: + holder_.load( "", xors( "money_rage2.cfg" ) ); + break; + case 4: + holder_.load( "", xors( "money_test.cfg" ) ); + break; + } + + menu.anti_untrusted = true; + misc.skins.current_skin = -1; + } + + __declspec( noinline ) void save( ) { + switch( menu.cur_setting ) { + case 0: + holder_.save( "", xors( "money_legit.cfg" ) ); + break; + case 1: + holder_.save( "", xors( "money_closet.cfg" ) ); + break; + case 2: + holder_.save( "", xors( "money_rage1.cfg" ) ); + break; + case 3: + holder_.save( "", xors( "money_rage2.cfg" ) ); + break; + case 4: + holder_.save( "", xors( "money_test.cfg" ) ); + break; + } + } + + __declspec( noinline ) void reset( ) { + holder_.reset( ); + } + + void copy_to_clipboard( ) { + holder_.save( "", xors( "./csgo/cfg/money_temp.cfg" ) ); + std::vector< uint8_t > file_data; + FILE* f = fopen( xors( "./csgo/cfg/money_temp.cfg" ), "r" ); + size_t size = 0; + fseek( f, 0, SEEK_END ); + size = ftell( f ); + + char* buf = ( char* )malloc( size ); + fread( buf, 1, size, f ); + fclose( f ); + for( size_t i{ }; i < size; ++i ) { + file_data.push_back( buf[ i ] ); + } + + free( buf ); + + EmptyClipboard( ); + OpenClipboard( nullptr ); + + auto g = GlobalAlloc( GMEM_FIXED, size ); + memcpy( g, file_data.data( ), size ); + + SetClipboardData( CF_TEXT, g ); + CloseClipboard( ); + //DeleteFileA( xors( "./csgo/cfg/money_temp.cfg" ) ); + } + + void load_from_clipboard( ) { + FILE* f = fopen( xors( "./csgo/cfg/money_temp.cfg" ), "wb" ); + auto data = GetClipboardData( CF_TEXT ); + + auto size = GlobalSize( data ); + fwrite( data, 1, size, f ); + fclose( f ); + + holder_.load( "", xors( "./csgo/cfg/money_temp.cfg" ) ); + + CloseClipboard( ); + //DeleteFileA( xors( "./csgo/cfg/money_temp.cfg" ) ); + } + + struct { + con_var< bool > enabled{ &holder_, fnv( "legit_active" ), false }; + con_var< size_t > sample_size{ &holder_, fnv( "legit_sample_size" ), 12 }; + con_var< float > smooth_factor{ &holder_, fnv( "legit_smooth_factor" ), 1.0f }; + con_var< bool > dynamic_smoothing{ &holder_, fnv( "legit_dynamic_smoothing" ), false }; + con_var< bool > awp_baim{ &holder_, fnv( "legit_awp_baim" ), false }; + con_var< bool > assist{ &holder_, fnv( "legit_assist" ), false }; + con_var< bool > friendlies{ &holder_, fnv( "legit_friendlies" ), false }; + con_var< int > activation_type{ &holder_, fnv( "legit_activation_type" ), 1 }; + con_var< int > key{ &holder_, fnv( "legit_key" ), 0 }; + con_var< bool > backtracking{ &holder_, fnv( "legit_backtracking" ), 0 }; + con_var< float > backtracking_time{ &holder_, fnv( "legit_bt_time" ), 0.2f }; + con_var< float > backtracking_fov{ &holder_, fnv( "legit_bt_fov" ), 5.0f }; + con_var< bool > backtracking_target{ &holder_, fnv( "legit_bt_target" ), false }; + con_var< bool > backtracking_visualize{ &holder_, fnv( "legit_bt_visualize" ), 0 }; + con_var< clr_t > backtracking_col{ &holder_, fnv( "legit_bt_col" ), clr_t( 255, 255, 255, 120 ) }; + con_var< bool > triggerbot{ &holder_, fnv( "legit_triggerbot" ), false }; + con_var< int > trigger_key{ &holder_, fnv( "legit_triggerkey" ), 0 }; + con_var< float > trigger_delay{ &holder_, fnv( "legit_triggerdelay" ), 0.f }; + con_var< bool > trigger_magnet{ &holder_, fnv( "legit_trigger_magnet" ) }; + legitbot_settings pistols{ &holder_, "legit_pistols" }; + legitbot_settings rifles{ &holder_, "legit_rifles" }; + legitbot_settings snipers{ &holder_, "legit_snipers" }; + legitbot_settings general{ &holder_, "legit_general" }; + legitbot_settings* active = &general; + } legit; + + struct { + con_var< bool > enabled{ &holder_, fnv( "rage_enabled" ), false }; + con_var< int > activation_type{ &holder_, fnv( "rage_activation_type" ), 0 }; + con_var< float > fov{ &holder_, fnv( "rage_fov" ), 0.f }; + con_var< bool > friendlies{ &holder_, fnv( "rage_friendlies" ), false }; + con_var< int > hitbox{ &holder_, fnv( "rage_hitbox" ), false }; + struct { + con_var< bool > head{ &holder_, fnv( "rage_hitscan_head" ), true }; + con_var< bool > stomach{ &holder_, fnv( "rage_hitscan_stomach" ), true }; + con_var< bool > arms{ &holder_, fnv( "rage_hitscan_arms" ), false }; + con_var< bool > legs{ &holder_, fnv( "rage_hitscan_legs" ), false }; + con_var< bool > feet{ &holder_, fnv( "rage_hitscan_feet" ), false }; + con_var< bool > chest{ &holder_, fnv( "rage_hitscan_chest" ), false }; + } hitscan; + + con_var< int > multipoint_enable{ &holder_, fnv( "rage_multipoint" ), false }; + con_var< int > multipoint_scale{ &holder_, fnv( "rage_multipoint_scale" ), 10 }; + + struct { + con_var< bool > head{ &holder_, fnv( "rage_multipoint_head" ), true }; + con_var< bool > stomach{ &holder_, fnv( "rage_multipoint_stomach" ), true }; + con_var< bool > chest{ &holder_, fnv( "rage_multipoint_chest" ), false }; + con_var< bool > thighs{ &holder_, fnv( "rage_multipoint_thighs" ), false }; + con_var< bool > calves{ &holder_, fnv( "rage_multipoint_calves" ), false }; + } multipoint; + + + con_var< bool > ignore_limbs_moving{ &holder_, fnv( "rage_ignore_limbs_moving" ), false }; + con_var< int > silent{ &holder_, fnv( "rage_silent" ), false }; + con_var< int > aimkey{ &holder_, fnv( "rage_key" ), 0 }; + con_var< bool > auto_scope{ &holder_, fnv( "rage_auto_scope" ), false }; + con_var< bool > resolver{ &holder_, fnv( "rage_resolver" ), false }; + con_var< bool > resolver_override{ &holder_, fnv( "rage_resolver_override" ), false }; + con_var< bool > pitch_resolver{ &holder_, fnv( "rage_pitch_resolver" ) }; + con_var< int > resolver_override_key{ &holder_, fnv( "override_key" ), 0 }; + con_var< bool > bt_visualize{ &holder_, fnv( "rage_visualize_records" ), false }; + con_var< clr_t > bt_col{ &holder_, fnv( "rage_bt_color" ), clr_t( 150, 150, 150, 20 ) }; + con_var< int > fakelag_resolver{ &holder_, fnv( "rage_fakelag_resolver" ) }; + con_var< bool > preserve_fps{ &holder_, fnv( "rage_preserve_fps" ), false }; + con_var< bool > compensate_spread{ &holder_, fnv( "rage_compensate_spread" ) }; + + con_var< int > selection_type{ &holder_, fnv( "rage_selection_type" ) }; + con_var< bool > prefer_moving{ &holder_, fnv( "rage_prefer_moving" ) }; + con_var< bool > prefer_low_hp{ &holder_, fnv( "rage_low_hp" ) }; + + ragebot_settings general{ &holder_, "rage_general" }; + ragebot_settings heavy_pistols{ &holder_, "rage_pistols" }; + ragebot_settings snipers{ &holder_, "rage_snipers" }; + ragebot_settings auto_snipers{ &holder_, "rage_auto" }; + ragebot_settings* active = &general; + + struct { + con_var< int > mode{ &holder_, fnv( "fakelag_mode" ), 0 }; + con_var< int > ticks{ &holder_, fnv( "fakelag_ticks" ), 0 }; + con_var< int > fluctuate{ &holder_, fnv( "fakelag_fluctuate" ), 0 }; + con_var< bool > in_air{ &holder_, fnv( "fakelag_in_air" ), false }; + con_var< bool > on_peek{ &holder_, fnv( "fakelag_on_peek" ), false }; + con_var< bool > on_select{ &holder_, fnv( "fakelag_on_select" ), false }; + con_var< bool > in_move{ &holder_, fnv( "fakelag_in_move" ), false }; + con_var< bool > in_attack{ &holder_, fnv( "fakelag_in_attack" ), false }; + con_var< bool > avoid_ground{ &holder_, fnv( "fakelag_avoid_ground" ), false }; + con_var< bool > jump_reset{ &holder_, fnv( "fakelag_jump_reset" ), false }; + con_var< bool > on_duck{ &holder_, fnv( "fakelag_on_duck" ), false }; + } fakelag; + + con_var< bool > anti_aim{ &holder_, fnv( "rage_anti_aim" ), false }; + con_var< bool > dormant_check{ &holder_, fnv( "rage_dormant_check" ), false }; + con_var< bool > at_players{ &holder_, fnv( "rage_at_players" ), false }; + con_var< int > pitch{ &holder_, fnv( "rage_pitch" ), 0 }; + con_var< int > pitch_offset{ &holder_, fnv( "rage_pitch_offset" ), 0 }; + + con_var< int > real_yaw{ &holder_, fnv( "rage_real_yaw" ), 0 }; + con_var< int > real_yaw_add{ &holder_, fnv( "rage_real_yaw_add" ), 0 }; + con_var< int > real_yaw_jitter{ &holder_, fnv( "rage_real_jitter" ), 0 }; + + con_var< int > air_yaw{ &holder_, fnv( "rage_air_yaw" ), 0 }; + con_var< int > air_yaw_add{ &holder_, fnv( "rage_air_yaw_add" ), 0 }; + con_var< int > air_yaw_jitter{ &holder_, fnv( "rage_air_yaw_jitter" ), 0 }; + + con_var< int > fake_yaw{ &holder_, fnv( "rage_fake_yaw" ), 0 }; + con_var< int > fake_yaw_add{ &holder_, fnv( "rage_fake_yaw_add" ), 0 }; + con_var< int > fake_yaw_jitter{ &holder_, fnv( "rage_fake_jitter" ), 0 }; + + con_var< int > real_yaw_moving{ &holder_, fnv( "rage_real_yaw_moving" ), 0 }; + con_var< int > real_yaw_moving_add{ &holder_, fnv( "rage_real_yaw_moving_add" ), 0 }; + con_var< int > real_moving_jitter{ &holder_, fnv( "rage_real_moving_jitter" ), 0 }; + + con_var< bool > edge_detection{ &holder_, fnv( "rage_edge_dtc" ), 0 }; + con_var< int > edge_dtc_jitter{ &holder_, fnv( "rage_edge_dtc_jitter" ), 0 }; + con_var< int > edge_dtc_real_jitter{ &holder_, fnv("rage_edge_dtc_real_jitter"), 0 }; + + con_var< bool > break_lby_edge{ &holder_, fnv( "rage_break_lby_edge" ) }; + con_var< int > edge_dtc_normal{ &holder_, fnv( "rage_edge_dtc_normal" ), 0 }; + con_var< int > edge_dtc_standing{ &holder_, fnv( "rage_edge_dtc_standing" ), 100 }; + con_var< int > edge_dtc_moving{ &holder_, fnv( "rage_edge_dtc_moving" ), 100 }; + con_var< int > edge_dtc_priority{ &holder_, fnv( "rage_edge_dtc_priority" ), 0 }; + con_var< bool > edge_break_lby{ &holder_, fnv( "rage_edge_break_lby" ) }; + con_var< bool > fix_legs{ &holder_, true }; + + con_var< bool > break_lby{ &holder_, fnv( "rage_break_lby" ), 0 }; + con_var< int > lby_delta{ &holder_, fnv( "rage_lby_delta" ), 180 }; + con_var< bool > lby_avoid_updates{ &holder_, fnv( "rage_lby_avoid_updates" ) }; + + con_var< bool > fakewalk{ &holder_, fnv( "rage_fakewalk" ), 0 }; + con_var< int > fakewalk_key{ &holder_, fnv( "rage_fakewalk_key" ), 0 }; + con_var< int > fakewalk_ticks{ &holder_, fnv( "rage_fakewalk_ticks" ), 7 }; + + con_var< bool > angle_step{ &holder_, fnv( "rage_angle_step" ), false }; + con_var< int > angle_step_degrees{ &holder_, fnv( "range_angle_step_degrees" ), false }; + } rage; + + struct { + struct { + con_var< bool > enabled{ &holder_, fnv( "visuals_chams_enabled" ), 0 }; + con_var< bool > flat{ &holder_, fnv( "visuals_chams_flat" ), 0 }; + con_var< bool > ignore_z{ &holder_, fnv( "visuals_chams_ignore_z" ), 0 }; + con_var< float > reflectivity{ &holder_, fnv( "visuals_chams_reflectivity" ), 1.0f }; + con_var< float > shine{ &holder_, fnv( "visuals_chams_shine" ), 1.0f }; + con_var< bool > friendlies{ &holder_, fnv( "visuals_chams_friendlies" ), 0 }; + con_var< clr_t > color_visible_friendly{ &holder_, fnv( "visuals_chams_color_friendly" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > color_visible_enemy{ &holder_, fnv( "visuals_chams_color_enemy" ), clr_t( 255, 255, 0 ) }; + con_var< clr_t > color_hidden_friendly{ &holder_, fnv( "visuals_chams_color_h_friendly" ), clr_t( 0, 0, 255 ) }; + con_var< clr_t > color_hidden_enemy{ &holder_, fnv( "visuals_chams_color_h_enemy" ), clr_t( 255, 0, 0 ) }; + con_var< bool > clear_occlusion{ &holder_, fnv( "visuals_chams_clear_occlusion" ) }; + con_var< float > luminance{ &holder_, fnv( "visuals_chams_luminance" ), 1.f }; + } chams; + + con_var< int > activation_type{ &holder_, fnv( "visuals_activation" ), false }; + con_var< bool > box{ &holder_, fnv( "visuals_box" ), false }; + con_var< bool > dormant{ &holder_, fnv( "visuals_dormant" ), false }; + con_var< bool > health{ &holder_, fnv( "visuals_health" ), false }; + con_var< bool > weapon{ &holder_, fnv( "visuals_weapon" ), false }; + con_var< bool > name{ &holder_, fnv( "visuals_name" ), false }; + con_var< bool > out_of_pov{ &holder_, fnv( "visuals_out_of_pov" ), false }; + con_var< float > out_of_pov_radius{ &holder_, fnv( "visuals_out_of_pov_radius" ), 0.75f }; + con_var< int > out_of_pov_size{ &holder_, fnv( "visuals_out_of_pov_size" ), 25 }; + con_var< bool > friendlies{ &holder_, fnv( "visuals_friendlies" ), false }; + con_var< bool > skeleton{ &holder_, fnv( "visuals_skeleton" ) }; + con_var< bool > glow{ &holder_, fnv( "visuals_glow" ), false }; + con_var< bool > flags{ &holder_, fnv( "visuals_flags" ), false }; + con_var< bool > resolver_indicator{ &holder_, fnv( "visuals_resolver_indicator" ), false }; + con_var< bool > ammo{ &holder_, fnv( "visuals_ammo" ), false }; + con_var< bool > money{ &holder_, fnv( "visuals_money" ) }; + con_var< bool > ping{ &holder_, fnv( "visuals_ping" ) }; + con_var< bool > floating_ragdolls{ &holder_, fnv( "visuals_floating_ragdolls" ) }; + con_var< bool > sound{ &holder_, fnv( "visuals_sound" ), false }; + con_var< clr_t > box_enemy{ &holder_, fnv( "visuals_clr_enemy" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > box_friendly{ &holder_, fnv( "visuals_clr_friendly" ), clr_t( 255, 0, 255 ) }; + + con_var< bool > hits{ &holder_, fnv( "visuals_hits" ), false }; + + con_var< clr_t > glow_enemy{ &holder_, fnv( "visuals_glow_enemy" ), clr_t( 255, 0, 255, 150 ) }; + con_var< clr_t > glow_friendly{ &holder_, fnv( "visuals_glow_friendly" ), clr_t( 255, 120, 0, 150 ) }; + con_var< clr_t > skeleton_enemy{ &holder_, fnv( "visuals_skeleton_enemy" ), clr_t( 255, 255, 255 ) }; + con_var< clr_t > skeleton_friendly{ &holder_, fnv( "visuals_skeleton_friendly" ), clr_t( 255, 255, 255 ) }; + + con_var< clr_t > name_enemy{ &holder_, fnv( "visuals_name_enemy" ), clr_t( 255, 255, 255 ) }; + con_var< clr_t > name_friendly{ &holder_, fnv( "visuals_name_friendly" ), clr_t( 255, 255, 255 ) }; + + con_var< clr_t > ammo_bar_clr{ &holder_, fnv( "visuals_ammo_bar_clr" ), clr_t( 84, 173, 247 ) }; + con_var< clr_t > lby_bar_clr{ &holder_, fnv( "visuals_lby_bar_clr" ), clr_t( 0xf4, 0x7c, 0xa8 ) }; + + con_var< int > bullet_tracers{ &holder_, fnv( "visuals_bullet_tracers" ), 0 }; + con_var< bool > target{ &holder_, fnv( "visuals_target" ) }; + con_var< int > target_time{ &holder_, fnv( "visuals_target_time" ) }; + con_var< int > sound_range{ &holder_, fnv( "visuals_sound_range" ), 360 }; + + con_var< int > key{ &holder_, fnv( "visuals_key" ), 0 }; + con_var< bool > hitmarkers{ &holder_, fnv( "visuals_hitmarkers" ), false }; + bool active = true; + + con_var< bool > world_modulate{ &holder_, fnv( "visuals_world_modulate" ), false }; + con_var< bool > night_mode{ &holder_, fnv( "visuals_night_mode" ), false }; + con_var< bool > transparent_props{ &holder_, fnv( "visuals_transparent_props" ), false }; + con_var< bool > no_cascade_shadows{ &holder_, fnv( "visuals_no_cascade_shadows" ), false }; + + con_var< bool > recoil_crosshair{ &holder_, fnv( "misc_recoil_crosshair" ), false }; + con_var< bool > autowall_crosshair{ &holder_, fnv( "visual_recoil_crosshair" ), false }; + con_var< bool > draw_spread{ &holder_, fnv( "visual_draw_spread" ), false }; + con_var< bool > snipers_crosshair{ &holder_, fnv( "visuals_sniper_crosshair" ), false }; + con_var< bool > grenade_prediction{ &holder_, fnv( "visuals_grenade_prediction" ), false }; + con_var< clr_t > grenade_pred_clr{ &holder_, fnv( "visuals_grenade_pred_clr" ), clr_t( 84, 173, 247 ) }; + + con_var< int > weapon_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; + con_var< int > grenade_esp{ &holder_, fnv( "visuals_grenade_esp" ), 0 }; + con_var< bool > grenade_owner{ &holder_, fnv( "visuals_grenade_owner" ), false }; + + con_var< clr_t > weapon_esp_clr{ &holder_, fnv( "visuals_weapon_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + con_var< clr_t > grenade_esp_clr{ &holder_, fnv( "visuals_grenade_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + + con_var< bool > spec_list{ &holder_, fnv( "visuals_spec_list" ), false }; + con_var< bool > radar{ &holder_, fnv( "visuals_radar" ), false }; + con_var< bool > fullbright{ &holder_, fnv( "visuals_fullbright" ), false }; + con_var< bool > bomb_info{ &holder_, fnv( "visuals_bomb_information" ), false }; + } visuals; + + struct { + con_var< bool > watermark{ &holder_, fnv( "misc_watermark" ), false }; + con_var< bool > bunny_hop{ &holder_, fnv( "misc_bhop" ), false }; + con_var< int > auto_strafe{ &holder_, fnv( "misc_autostrafe" ), false }; + con_var< bool > circle_strafe{ &holder_, fnv( "misc_circlestrafe" ), false }; + con_var< int > circle_strafe_key{ &holder_, fnv( "misc_circle_key" ), 0 }; + con_var< bool > edge_jump{ &holder_, fnv( "misc_edgejump" ), false }; + con_var< int > edge_jump_key{ &holder_, fnv( "misc_edge_jump_key" ), false }; + con_var< bool > auto_jumpbug{ &holder_, fnv( "misc_auto_jumpbug" ), false }; + con_var< int > auto_jumpbug_key{ &holder_, fnv( "misc_auto_jumpbug_key" ), 0 }; + con_var< bool > show_jump_stats{ &holder_, fnv( "misc_show_jump_stats" ), 0 }; + con_var< int > viewmodel_fov{ &holder_, fnv( "misc_viewmodel_fov" ), 0 }; + con_var< int > fov_changer{ &holder_, fnv( "fov_changer" ), 90 }; + con_var< bool > clantag_changer{ &holder_, fnv( "misc_clantag" ), false }; + con_var< bool > log_hits{ &holder_, fnv( "misc_log_hits" ) }; + con_var< int > name_changer{ &holder_, fnv( "misc_namechanger" ), 0 }; + con_var< bool > thirdperson{ &holder_, fnv( "misc_thirdperson" ), false }; + con_var< int > thirdperson_key{ &holder_, fnv( "misc_tp_key" ), 0 }; + con_var< bool > auto_accept{ &holder_, fnv( "misc_autoaccept" ), false }; + con_var< int > auto_accept_delay{ &holder_, fnv( "misc_autoaccept_delay" ), 0 }; + con_var< bool > net_fakelag{ &holder_, fnv( "misc_net_fakelag" ), false }; + con_var< bool > air_duck{ &holder_, fnv( "air_duck" ) }; + bool net_fakeping_active = false; + + struct { + con_var< int > main_weapon{ &holder_, fnv( "misc_autobuy_main_weapon" ), 0 }; + con_var< int > secondary_weapon{ &holder_, fnv( "misc_autobuy_secondary_weapon" ), 0 }; + con_var< bool > zeus{ &holder_, fnv( "misc_autobuy_zeus" ), false }; + con_var< bool > armor{ &holder_, fnv( "misc_autobuy_armor" ), false }; + con_var< bool > defuser{ &holder_, fnv( "misc_autobuy_defuse" ), false }; + con_var< bool > molly{ &holder_, fnv( "misc_autobuy_molly" ), false }; + con_var< bool > grenade{ &holder_, fnv( "misc_autobuy_nade" ), false }; + con_var< bool > smoke{ &holder_, fnv( "misc_autobuy_smoke" ), false }; + con_var< bool > flash{ &holder_, fnv( "misc_autobuy_flash" ), false }; + con_var< bool > decoy{ &holder_, fnv( "misc_autobuy_decoy" ), false }; + } autobuy; + + con_var< bool > team_dmg{ &holder_, fnv( "misc_teamdmg" ), false }; + con_var< bool > server_information{ &holder_, fnv( "misc_server_info" ), false }; + con_var< bool > rich_presence{ &holder_, fnv( "misc_rich_presence" ), false }; + con_var< bool > no_sound{ &holder_, fnv( "misc_no_sound" ), false }; + con_var< bool > rank_reveal{ &holder_, fnv( "misc_rank_reveal" ), 0 }; + con_var< bool > unlock_inventory{ &holder_, fnv( "misc_unlock_inventory" ), 0 }; + con_var< bool > auto_revolver{ &holder_, fnv( "misc_auto_revolver" ), 0 }; + con_var< bool > no_scope{ &holder_, fnv( "misc_no_scope" ), false }; + con_var< bool > no_zoom{ &holder_, fnv( "misc_no_zoom" ), false }; + con_var< bool > no_recoil{ &holder_, fnv( "misc_no_recoil" ), false }; + con_var< bool > no_smoke{ &holder_, fnv( "misc_no_smoke" ), false }; + con_var< bool > no_flash{ &holder_, fnv( "misc_no_flash" ), false }; + con_var< bool > transparent_vm{ &holder_, fnv( "misc_transparent_vm" ), false }; + con_var< bool > hide_from_obs{ &holder_, fnv( "misc_hide_from_obs" ), false }; + con_var< bool > disable_post_process{ &holder_, fnv( "misc_disable_post_process" ), false }; + con_var< int > recording_start_key{ &holder_, fnv( "recording_start_key" ), 0 }; + con_var< int > recording_stop_key{ &holder_, fnv( "recording_stop_key" ), 0 }; + con_var< int > recording_show_angles{ &holder_, fnv( "recording_show_angles" ), 0 }; + con_var< bool > no_crouch_cooldown{ &holder_, fnv("no_crouch_cooldown") }; + con_var< bool > money_talk { &holder_, fnv( "misc_money_talk" ), false }; + + struct { + con_var< int > knife{ &holder_, fnv( "misc_skins_knife" ), 0 }; + con_var< int > glove{ &holder_, fnv( "misc_skins_glove" ), 0 }; + con_var< int > glove_skin{ &holder_, fnv( "misc_skins_glove_skin" ) }; + int current_skin; + con_var< std::array< int, 65 > > skins{ &holder_, fnv( "misc_skins_data" ) }; + } skins; + + bool recorder_enable = false; + } misc; + + struct { + con_var< clr_t > menu_color{ &holder_, fnv( "menu_color" ), clr_t( 231, 105, 105 ) }; + + bool anti_untrusted = true; + bool open = false; + bool logs_enable = false; + int cur_setting = 0; + } menu; + }; +} + +extern data::c_settings g_settings; \ No newline at end of file diff --git a/cheat/internal_rewrite/shut_down.cpp b/cheat/internal_rewrite/shut_down.cpp new file mode 100644 index 0000000..c3d2a95 --- /dev/null +++ b/cheat/internal_rewrite/shut_down.cpp @@ -0,0 +1,20 @@ +#include "hooks.hpp" +#include "chams.hpp" +#include "base_cheat.hpp" +#include "detours.h" + +void __fastcall hooks::shut_down( void* ecx_, void* edx_ ) { + static auto original_fn = shut_down_o; + + g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "host_writeconfig" ) ); + //fuck you + + memory::detours.restore( ); + + g_con->destroy( ); + + abort( ); + + g_cheat.m_chams.m_materials.destroy_materials( ); + return original_fn( ecx_, edx_ ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/simple_settings.cpp b/cheat/internal_rewrite/simple_settings.cpp new file mode 100644 index 0000000..b6b3281 --- /dev/null +++ b/cheat/internal_rewrite/simple_settings.cpp @@ -0,0 +1,32 @@ +#include "settings.hpp" + +SettingHolder data::holder_{ "iloveyou" }; +data::c_settings g_settings; + +#pragma warning(disable: 4996) + +void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< const uint8_t* >( src ); + + for ( size_t i = 0; i < size; i++ ) + sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); + + WritePrivateProfileStringA( path, name, buffer, filename ); +} + +void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< uint8_t* >( dest ); + + GetPrivateProfileStringA( path, name, "", buffer, size * 2 + 1, filename ); + + if ( *buffer == 0 ) + return; + + for ( size_t i = 0; i < size; i++ ) { + unsigned temp; + sscanf( &buffer[ 2 * i ], "%02X", &temp ); + data[ i ] = temp; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/simple_settings.hpp b/cheat/internal_rewrite/simple_settings.hpp new file mode 100644 index 0000000..e3187ba --- /dev/null +++ b/cheat/internal_rewrite/simple_settings.hpp @@ -0,0 +1,283 @@ +#pragma once +#include +#include +#include +#include +#include + +#include "util.hpp" +#include "fnv.hpp" + +#pragma comment( lib, "Shlwapi.lib" ) + +//nama stuff +extern void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ); +extern void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ); + +class ISettingNode { +public: + virtual ~ISettingNode( ) = default; + + virtual void load( const char* path, const char* file ) = 0; + virtual void save( const char* path, const char* file ) const = 0; + virtual void reset( ) const = 0; + virtual void register_( ISettingNode* node_ptr ) = 0; + virtual bool has_nodes( ) { return false; } + virtual hash_t get_hash( ) { return 0; } +}; + +class SettingHolder : public ISettingNode { +public: + __forceinline SettingHolder( const char* name ) : name_( name ) {} + __forceinline SettingHolder( SettingHolder* holder_ptr, const char* name ) : name_( name ) { holder_ptr->register_( this ); } + + void register_( ISettingNode* node_ptr ) override { + setting_nodes_.push_back( node_ptr ); + } + + __declspec( noinline ) void load( const char* path, const char* file ) override + { + static char full_path[1024]; + memset( full_path, 0, 1024 ); + + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_.c_str( ) ); + + for( auto x : setting_nodes_ ) { + if( !x ) + continue; + + x->load( full_path, file ); + } + } + + __declspec( noinline ) void save( const char* path, const char* file ) const override + { + static char full_path[1024]; + memset( full_path, 0, 1024 ); + + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_.c_str( ) ); + for ( auto x : setting_nodes_ ) + x->save( full_path, file ); + } + + __declspec( noinline ) void reset( ) const override { + for( auto x : setting_nodes_ ) + x->reset( ); + } + + auto& get_nodes( ) { + return setting_nodes_; + } + + virtual bool has_nodes( ) { + return true; + } + +private: + std::string name_; + bool has_nodes_; + std::vector setting_nodes_; +}; + +class ISetting : public ISettingNode { + void register_( ISettingNode* node_ptr ) override {} +public: + virtual void set( float value ) = 0; + virtual void set( int value ) = 0; + virtual void set( ulong_t value ) = 0; + virtual std::string get_string( ) = 0; + virtual hash_t get_hash( ) = 0; + virtual std::string get_data_string( ) = 0; + virtual void load_from_string( const std::string& ) = 0; +}; + +template < size_t L > +class SettingString : ISetting { +public: + __forceinline SettingString( SettingHolder* holder_ptr, hash_t hash ) : + m_name( name ), m_value( "" ) { + holder_ptr->register_( this ); + }; + + __declspec( noinline ) void load( const char* path, const char* file ) override { + static char str[ MAX_PATH ]; + + GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); + PathRemoveFileSpecA( str ); + strcat_s< MAX_PATH >( str, path ); + strcat_s< MAX_PATH >( str, "\\" ); + + GetPrivateProfileStringA( path, std::to_string( m_name ).c_str( ), "", m_value, L, file ); + } + + __declspec( noinline ) void save( const char* path, const char* file ) const override { + static char str[ MAX_PATH ]; + + GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); + PathRemoveFileSpecA( str ); + strcat_s< MAX_PATH >( str, path ); + strcat_s< MAX_PATH >( str, "\\" ); + + WritePrivateProfileStringA( path, std::to_string( m_name ).c_str( ), m_value, file ); + } + + + char* get( ) { + return m_value; + } + +private: + char m_value[ L ]; + hash_t m_name; +}; + +template < typename T > +class con_var : public ISetting { +public: + __declspec( noinline ) con_var( SettingHolder* holder_ptr, hash_t name ) : + name_( name ), + original_{ }, + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + __declspec( noinline ) con_var( SettingHolder* holder_ptr, hash_t name, const T& rhs ) : + value_( rhs ), + name_( name ), + original_( value_ ), + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + + __declspec( noinline ) void load( const char* path, const char* file ) override { + static char str[ MAX_PATH ]; + static char full_path[ MAX_PATH ]; + static bool taken = false; + + if( !taken ) { + GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); + PathRemoveFileSpecA( str ); + strcat_s< MAX_PATH >( str, "\\csgo\\cfg\\" ); + + taken = true; + } + + memset( full_path, 0, MAX_PATH ); + memcpy( full_path, str, MAX_PATH ); + strcat_s< MAX_PATH >( full_path, file ); + + simple_load( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), full_path ); + } + + __declspec( noinline ) void save( const char* path, const char* file ) const override { + static char str[ MAX_PATH ]; + static char full_path[ MAX_PATH ]; + static bool taken = false; + + if( !taken ) { + GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); + PathRemoveFileSpecA( str ); + strcat_s< MAX_PATH >( str, "\\csgo\\cfg\\" ); + + taken = true; + } + + memset( full_path, 0, MAX_PATH ); + memcpy( full_path, str, MAX_PATH ); + strcat_s< MAX_PATH >( full_path, file ); + + simple_save( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), full_path ); + } + + __declspec( noinline ) void reset( ) const override { + // now this is really epic. + memcpy( ( void* )&value_, ( void* )&original_, sizeof( original_ ) ); + } + + __forceinline operator T&( ) { return value_; } + __forceinline T* operator &( ) { return &value_; } + + __forceinline T& operator ()( ) { return value_; } + + virtual std::string get_string( ) { + if constexpr( std::is_arithmetic_v< T > ) { + return std::to_string( value_ ); + } + else { + return util::to_hex_str( *( ulong_t* )( &value_ ) ); + } + } + + virtual void set( float value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + } + + virtual void set( int value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + else { + value_ = *( T* )( &value ); + } + } + + virtual void set( ulong_t value ) { + if constexpr( sizeof( T ) == sizeof( ulong_t ) ) { + *( ulong_t* )( &value_ ) = value; + return; + } + + memcpy( &value_, &value, sizeof( value_ ) ); + } + + virtual hash_t get_hash( ) { + return name_; + } + + __forceinline bool is_floating_point( ) { + return is_float_; + } + + __forceinline bool is_integral( ) { + return is_integral_; + } + + virtual std::string get_data_string( ) override { + auto buffer = reinterpret_cast< char* >( _alloca( sizeof( T ) * 2 + 1 ) ); + auto data = reinterpret_cast< const uint8_t* >( &value_ ); + + for( size_t i = 0; i < sizeof( T ); i++ ) + sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); + + return buffer; + } + + virtual void load_from_string( const std::string& str ) override { + auto data = reinterpret_cast< uint8_t* >( &value_ ); + auto buffer = str.data( ); + + if( *buffer == 0 ) + return; + + for( size_t i = 0; i < sizeof( T ); i++ ) { + unsigned temp; + sscanf( &buffer[ 2 * i ], "%02X", &temp ); + data[ i ] = temp; + } + } + + +private: + hash_t name_; + bool is_float_; + bool is_integral_; + T value_; + T original_; +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/simulate.cpp b/cheat/internal_rewrite/simulate.cpp new file mode 100644 index 0000000..28ec687 --- /dev/null +++ b/cheat/internal_rewrite/simulate.cpp @@ -0,0 +1,46 @@ +#include + +#include "hooks.hpp" +#include "base_cheat.hpp" +#include "context.hpp" + +void __fastcall hooks::simulate( void* ecx, void* edx ) { + static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_engine.dll( ), "8B CE 6A FF 8B 06", -0x81 ); + + if( _ReturnAddress( ) == (void*)ret_addr ) { + g_ctx.run_frame( ); + + g_ctx.m_stage = FRAME_RENDER_START; + g_cheat.m_visuals.world_modulate( ); + + //g_con->game_console_print( "render start\n" ); + g_cheat.m_extra.disable_post_processing( ); + g_cheat.m_extra.no_flash( ); + g_cheat.m_extra.no_recoil( false ); + util::disable_pvs( ); + g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); + //g_cheat.m_ragebot.m_lagcomp->invalidate_bone_caches( ); + if( g_csgo.m_input( )->m_fCameraInThirdPerson ) { + bool real_yaw = g_settings.rage.anti_aim( ); + if( g_ctx.get_last_cmd( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { + //g_ctx.m_local->m_vecThirdpersonAngles( ) = ( real_yaw ? g_ctx.m_thirdperson_angle : g_ctx.get_last_cmd( )->m_viewangles ); + } + } + + g_cheat.m_extra.no_smoke( ); + if( g_settings.misc.no_smoke ) { +#ifdef HEADER_MODULE + static auto smoke_count = g_header.patterns.smoke_count; +#else + static auto smoke_count = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "55 8B EC 83 EC 08 8B 15 ? ? ? ? 0F 57 C0" ) ); +#endif + **reinterpret_cast< int** >( smoke_count + 0x8 ) = 0; + } + + simulate_o( ecx, edx ); + } + else { + simulate_o( ecx, edx ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/skins.cpp b/cheat/internal_rewrite/skins.cpp new file mode 100644 index 0000000..4abef06 --- /dev/null +++ b/cheat/internal_rewrite/skins.cpp @@ -0,0 +1,271 @@ +#include "skins.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "interface.hpp" + +namespace features +{ + int c_skins::get_knife_index( ) { + switch( g_settings.misc.skins.knife( ) ) { + case 0: + return 0; + case 1: + return 500; + case 2: + return 505; + case 3: + return 506; + case 4: + return 507; + case 5: + return 508; + case 6: + return 509; + } + + return 0; + } + + const char* c_skins::get_model_str( ) { + switch( g_settings.misc.skins.knife( ) ) { + case 0: + return 0; + case 1: + return xors( "models/weapons/v_knife_bayonet.mdl" ); + case 2: + return xors( "models/weapons/v_knife_flip.mdl" ); + case 3: + return xors( "models/weapons/v_knife_gut.mdl" ); + case 4: + return xors( "models/weapons/v_knife_karam.mdl" ); + case 5: + return xors( "models/weapons/v_knife_m9_bay.mdl" ); + case 6: + return xors( "models/weapons/v_knife_tactical.mdl" ); + } + + return nullptr; + } + + const char* c_skins::get_glove_model( ) { + switch( g_settings.misc.skins.glove ) { + case 5027: + return xors( "models/weapons/v_models/arms/glove_bloodhound/v_glove_bloodhound.mdl" ); + case 5030: + return xors( "models/weapons/v_models/arms/glove_sporty/v_glove_sporty.mdl" ); + case 5031: + return xors( "models/weapons/v_models/arms/glove_slick/v_glove_slick.mdl" ); + case 5032: + return xors( "models/weapons/v_models/arms/glove_handwrap_leathery/v_glove_handwrap_leathery.mdl" ); + case 5033: + return xors( "models/weapons/v_models/arms/glove_motorcycle/v_glove_motorcycle.mdl" ); + case 5034: + return xors( "models/weapons/v_models/arms/glove_specialist/v_glove_specialist.mdl" ); + } + + return nullptr; + } + + const char* c_skins::get_killicon_str( ) { + switch( g_settings.misc.skins.knife( ) ) { + case 0: + return 0; + case 1: + return xors( "bayonet" ); + case 2: + return xors( "knife_flip" ); + case 3: + return xors( "knife_gut" ); + case 4: + return xors( "knife_karambit" ); + case 5: + return xors( "knife_m9_bayonet" ); + case 6: + return xors( "knife_tactical" ); + } + + return nullptr; + } + + int c_skins::get_current_weapon_id( ) { + if( !g_ctx.m_local || !g_ctx.m_local->is_valid( ) ) + return WEAPON_KNIFE; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) + return WEAPON_KNIFE; + + return get_weapon_id( weapon ); + } + + int c_skins::get_weapon_id( c_base_weapon* weapon ) { + if( weapon->is_knife( ) || weapon->is_grenade( ) ) + return WEAPON_KNIFE; + + if( weapon->m_iItemDefinitionIndex( ) == WEAPON_TASER ) + return WEAPON_KNIFE; + + return std::clamp< int >( weapon->m_iItemDefinitionIndex( ), 0, 64 ); + } + + // This is nasty. + void c_skins::replace_deaths( IGameEvent* event ) { + if( !strcmp( event->GetName( ), xors( "player_death" ) ) && g_csgo.m_engine( )->GetPlayerForUserID( event->GetInt( xors( "attacker" ) ) ) == g_csgo.m_engine( )->GetLocalPlayer( ) ) { + if( ( !strcmp( event->GetString( xors( "weapon" ) ), xors( "knife_default_ct" ) ) || !strcmp( event->GetString( xors( "weapon" ) ), xors( "knife_t" ) ) ) ) { + if( get_killicon_str( ) ) + event->SetString( xors( "weapon" ), get_killicon_str( ) ); + } + } + } + + //stop this + void c_skins::override_weapon( c_base_weapon* wep ) { + auto aw = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hActiveWeapon( ) ); + auto vm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hViewModel( ) ); + auto wm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->get_weapon( )->m_hWeaponWorldModel( ) ); + + auto info = g_ctx.m_local->get_info( ); + int index = get_knife_index( ); + + if( wep->is_knife( ) && index ) { + int model = g_csgo.m_model_info( )->GetModelIndex( get_model_str( ) ); + + wep->m_iItemDefinitionIndex( ) = index; + wep->m_nModelIndex( ) = model; + wep->m_iWorldDroppedModelIndex( ) = model + 2; + wep->m_iWorldModelIndex( ) = model + 1; + wep->m_iViewModelIndex( ) = model; + wep->m_iItemIDHigh( ) = -1; + wep->m_iEntityQuality( ) = 3; + + if( aw->m_iItemDefinitionIndex( ) == wep->m_iItemDefinitionIndex( ) ) + vm->m_nModelIndex( ) = model; + + if( wm && wep == aw ) { + wm->m_nModelIndex( ) = model + 1; + } + } + + if( m_last_index != g_settings.misc.skins.current_skin ) { + g_settings.misc.skins.skins( )[ get_current_weapon_id( ) ] = g_settings.misc.skins.current_skin; + + if( g_csgo.m_global_state->get_client_state( )->m_delta_tick != -1 ) { + g_csgo.m_global_state->get_client_state( )->m_delta_tick = -1; // fullupdate happens + } + + + m_last_index = g_settings.misc.skins.current_skin; + g_ctx.run_frame( ); + } + + if( ( wep->m_hOwner( ) & 0xfff ) == g_ctx.m_local->ce( )->GetIndex( ) ) { + if( g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ] <= 0 ) + return; + + if( g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ] != wep->m_nFallbackPaintKit( ) ) { + wep->m_iItemIDHigh( ) = -1; + wep->m_iAccountID( ) = info.m_xuidlow; + } + + wep->m_nFallbackPaintKit( ) = g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ]; + wep->m_nFallbackStatTrak( ) = -1; + wep->m_nFallbackSeed( ) = math::random_number( 0, 1000 ); + + wep->m_flFallbackWear( ) = 0.0000001f; + } + } + + void c_skins::override_gloves( ) { + static int last_glove = 0; + static int last_skin = 0; + static ulong_t glove_handle = 0; + auto wearables = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2EF4 ); + + auto glove = ( c_base_weapon* )( g_csgo.m_entlist( )->GetClientEntityFromHandle( wearables[ 0 ] ) ); + + if( !glove ) { + auto last_glove = ( c_base_weapon* )( g_csgo.m_entlist( )->GetClientEntityFromHandle( glove_handle ) ); + + if( last_glove ) { + wearables[ 0 ] = glove_handle; + glove = last_glove; + } + } + + if( !g_ctx.m_local->is_alive( ) || !g_settings.misc.skins.glove ) { + if( glove ) { + glove->ce( )->GetClientNetworkable( )->SetDestroyedOnRecreateEntities( ); + glove->ce( )->GetClientNetworkable( )->Release( ); + } + + return; + } + + if( !g_settings.misc.skins.glove || !g_settings.misc.skins.glove_skin ) + return; + + bool update = false; + if( last_glove != g_settings.misc.skins.glove || last_skin != g_settings.misc.skins.glove_skin ) { + g_csgo.m_global_state->get_client_state( )->m_delta_tick = -1; + update = true; + } + + last_glove = g_settings.misc.skins.glove; + last_skin = g_settings.misc.skins.glove_skin; + + if( !glove ) { + for( auto cc = g_csgo.m_chl( )->GetAllClasses( ); !!cc; cc = cc->m_next ) { + if( cc->m_class_id != CEconWearable ) + continue; + + int entry = g_csgo.m_entlist( )->GetHighestEntityIndex( ) + 1; + int serial = math::random_number( 0, 4095 ); + + cc->m_create_fn( entry, serial ); + + glove = g_csgo.m_entlist( )->GetClientEntity< c_base_weapon >( entry ); + wearables[ 0 ] = entry | serial << 16; + glove_handle = wearables[ 0 ]; + update = true; + + break; + } + } + + if( glove ) { + auto desired_glove = g_settings.misc.skins.glove; + if( !desired_glove ) + return; + + glove->m_iItemDefinitionIndex( ) = desired_glove; + glove->m_nFallbackPaintKit( ) = g_settings.misc.skins.glove_skin; + glove->m_iEntityQuality( ) = 4; + glove->m_nFallbackSeed( ) = math::random_number( 0, 600 ); + glove->m_iItemIDHigh( ) = -1; + glove->m_iAccountID( ) = g_ctx.m_local->get_info( ).m_xuidlow; + + if( update ) { + int model_index = g_csgo.m_model_info( )->GetModelIndex( get_glove_model( ) ); + glove->set_glove_model( desired_glove ); + glove->ce( )->GetClientNetworkable( )->PreDataUpdate( 0 ); + } + } + } + + + void c_skins::operator()( ) { + if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.run_frame( ) && g_ctx.m_local->is_player( ) ) { + override_gloves( ); + + if( g_ctx.m_local->m_iHealth( ) > 0 && g_ctx.m_local->get_weapon( ) ) { + auto weapons = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2DE8 ); + for( int i{ }; weapons[ i ]; ++i ) { + auto wep = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weapons[ i ] ); + if( wep && wep->m_OriginalOwnerXuidLow( ) == g_ctx.m_local->get_info( ).m_xuidlow && !wep->is_grenade( ) && wep->m_iItemDefinitionIndex( ) != WEAPON_TASER ) { + override_weapon( wep ); + } + } + } + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/skins.hpp b/cheat/internal_rewrite/skins.hpp new file mode 100644 index 0000000..f60deef --- /dev/null +++ b/cheat/internal_rewrite/skins.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include + +class c_base_weapon; +class IGameEvent; +namespace features +{ + class c_skins { + private: + int m_last_index{ 0 }; + bool m_needs_update{ }; + + int get_knife_index( ); + const char* get_model_str( ); + + const char* get_glove_model( ); + + const char* get_killicon_str( ); + + //void override_knife( ); + void override_gloves( ); + void override_weapon( c_base_weapon* wep ); + //void update_active_skin( ); + int get_current_weapon_id( ); + int get_weapon_id( c_base_weapon* ); + + + public: + void operator()( ); + void replace_deaths( IGameEvent* event ); + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/strings.hpp b/cheat/internal_rewrite/strings.hpp new file mode 100644 index 0000000..f34c082 --- /dev/null +++ b/cheat/internal_rewrite/strings.hpp @@ -0,0 +1,162 @@ +//-------------------------------------------------------------------------------- +//-- XorCompileTime.hpp +// +// Author: frk +// Date: 12.12.2015 +// +//-------------------------------------------------------------------------------- + +#pragma once +#include +#include +#include + +#define BEGIN_NAMESPACE( x ) namespace x { +#define END_NAMESPACE } + +BEGIN_NAMESPACE( strenc ) + +constexpr auto time = __TIME__; +constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; + +// 1988, Stephen Park and Keith Miller +// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" +// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: +// with 32-bit math and without division + +template < int N > +struct RandomGenerator { +private: + static constexpr unsigned a = 16807; // 7^5 + static constexpr unsigned m = 2147483647; // 2^31 - 1 + + static constexpr unsigned s = RandomGenerator< N - 1 >::value; + static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 + static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 + static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits + static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi + static constexpr unsigned lo3 = lo2 + hi; + +public: + static constexpr unsigned max = m; + static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; +}; + +template <> +struct RandomGenerator< 0 > { + static constexpr unsigned value = seed; +}; + +template < int N, int M > +struct RandomInt { + static constexpr auto value = RandomGenerator< N + 1 >::value % M; +}; + +template < int N > +struct RandomChar { + static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); +}; + +template < size_t N, int K > +struct XorString { +private: + const char _key; + std::array< char, N + 1 > _encrypted; + bool decrypted = false; + + constexpr char enc( char c ) const { + return c ^ _key; + } + + char dec( char c ) const { + return c ^ _key; + } + +public: + template < size_t... Is > + constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { + } + + __forceinline const char* decrypt( void ) { + if( !decrypted ) { + for( size_t i = 0; i < N; ++i ) { + _encrypted[ i ] = dec( _encrypted[ i ] ); + } + _encrypted[ N ] = '\0'; + decrypted = true; + } + printf( "N: %u K: %d str: %s address: %08x\n", N, K, _encrypted.data( ), _encrypted.data( ) ); + + return _encrypted.data( ); + } +}; + +//-------------------------------------------------------------------------------- +//-- Note: XorStr will __NOT__ work directly with functions like printf. +// To work with them you need a wrapper function that takes a const char* +// as parameter and passes it to printf and alike. +// +// The Microsoft Compiler/Linker is not working correctly with variadic +// templates! +// +// Use the functions below or use std::cout (and similar)! +//-------------------------------------------------------------------------------- + +static auto w_printf = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_printf_s = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf( buf, fmt, args ); + va_end( args ); +}; + +static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf_s( buf, buf_size, fmt, args ); + va_end( args ); +}; + +//for compatibility with debug mode +struct debug_ret { +private: + const char* ret; + +public: + debug_ret( const char* str ) : ret( str ) { }; + + auto decrypt( ) { + return ret; + } +}; + +constexpr size_t strlen_ct( const char* const str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; +} + +#if 0 +#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) +#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) +#else +#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) +#define xors( s ) ( s ) +#endif + +END_NAMESPACE \ No newline at end of file diff --git a/cheat/internal_rewrite/suppress_lists.cpp b/cheat/internal_rewrite/suppress_lists.cpp new file mode 100644 index 0000000..01036ea --- /dev/null +++ b/cheat/internal_rewrite/suppress_lists.cpp @@ -0,0 +1,43 @@ +#include + +#include "hooks.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "base_cheat.hpp" + +void __fastcall hooks::suppress_lists( void* ecx, void* edx, int list_mask, bool suppress ) { +#ifdef HEADER_MODULE + static auto net_update_ret = g_header.patterns.net_update_retaddr; +#else + static auto net_update_ret = pattern::first_code_match< void* >( g_csgo.m_chl.dll( ), "5F 5E 5D C2 04 00 83 3D ? ? ? ? ?" ); +#endif + + if( _ReturnAddress( ) == (void*)net_update_ret ) { + g_ctx.m_stage = FRAME_NET_UPDATE_START; + g_cheat.m_visuals.world_modulate( ); + // FRAME_NET_UPDATE_START + //g_con->game_console_print( "net start\n" ); + + static bool rich_presence_active = false; + + g_ctx.run_frame( ); + g_cheat.m_ragebot.m_lagcomp->fsn_net_update_start( ); + + if( g_settings.misc.rich_presence( ) ) { + g_cheat.m_extra.rich_presence_flex( ); + rich_presence_active = true; + } + else if( rich_presence_active ) { + if( !g_settings.misc.rich_presence( ) ) + g_cheat.m_extra.remove_rich_presence_flex( ); + + rich_presence_active = false; + } + g_cheat.m_visuals.draw_sound( ); + g_cheat.m_visuals.draw_tracers( ); + + } + + suppress_lists_o( ecx, edx, list_mask, suppress ); + +} \ No newline at end of file diff --git a/cheat/internal_rewrite/table32.h b/cheat/internal_rewrite/table32.h new file mode 100644 index 0000000..2bd19d8 --- /dev/null +++ b/cheat/internal_rewrite/table32.h @@ -0,0 +1,73 @@ +/* +* Hacker Disassembler Engine 32 C +* Copyright (c) 2008-2009, Vyacheslav Patkov. +* All rights reserved. +* +*/ + +#define C_NONE 0x00 +#define C_MODRM 0x01 +#define C_IMM8 0x02 +#define C_IMM16 0x04 +#define C_IMM_P66 0x10 +#define C_REL8 0x20 +#define C_REL32 0x40 +#define C_GROUP 0x80 +#define C_ERROR 0xff + +#define PRE_ANY 0x00 +#define PRE_NONE 0x01 +#define PRE_F2 0x02 +#define PRE_F3 0x04 +#define PRE_66 0x08 +#define PRE_67 0x10 +#define PRE_LOCK 0x20 +#define PRE_SEG 0x40 +#define PRE_ALL 0xff + +#define DELTA_OPCODES 0x4a +#define DELTA_FPU_REG 0xf1 +#define DELTA_FPU_MODRM 0xf8 +#define DELTA_PREFIXES 0x130 +#define DELTA_OP_LOCK_OK 0x1a1 +#define DELTA_OP2_LOCK_OK 0x1b9 +#define DELTA_OP_ONLY_MEM 0x1cb +#define DELTA_OP2_ONLY_MEM 0x1da + +static unsigned char hde32_table[] = { + 0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3, + 0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xac,0xaa,0xb2,0xaa,0x9f,0x9f, + 0x9f,0x9f,0xb5,0xa3,0xa3,0xa4,0xaa,0xaa,0xba,0xaa,0x96,0xaa,0xa8,0xaa,0xc3, + 0xc3,0x96,0x96,0xb7,0xae,0xd6,0xbd,0xa3,0xc5,0xa3,0xa3,0x9f,0xc3,0x9c,0xaa, + 0xaa,0xac,0xaa,0xbf,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0x90, + 0x82,0x7d,0x97,0x59,0x59,0x59,0x59,0x59,0x7f,0x59,0x59,0x60,0x7d,0x7f,0x7f, + 0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x9a,0x88,0x7d, + 0x59,0x50,0x50,0x50,0x50,0x59,0x59,0x59,0x59,0x61,0x94,0x61,0x9e,0x59,0x59, + 0x85,0x59,0x92,0xa3,0x60,0x60,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59, + 0x59,0x59,0x9f,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xcc,0x01,0xbc,0x03,0xf0, + 0x10,0x10,0x10,0x10,0x50,0x50,0x50,0x50,0x14,0x20,0x20,0x20,0x20,0x01,0x01, + 0x01,0x01,0xc4,0x02,0x10,0x00,0x00,0x00,0x00,0x01,0x01,0xc0,0xc2,0x10,0x11, + 0x02,0x03,0x11,0x03,0x03,0x04,0x00,0x00,0x14,0x00,0x02,0x00,0x00,0xc6,0xc8, + 0x02,0x02,0x02,0x02,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xca, + 0x01,0x01,0x01,0x00,0x06,0x00,0x04,0x00,0xc0,0xc2,0x01,0x01,0x03,0x01,0xff, + 0xff,0x01,0x00,0x03,0xc4,0xc4,0xc6,0x03,0x01,0x01,0x01,0xff,0x03,0x03,0x03, + 0xc8,0x40,0x00,0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00, + 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xff,0xff,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x7f,0x00,0x00,0xff,0x4a,0x4a,0x4a,0x4a,0x4b,0x52,0x4a,0x4a,0x4a,0x4a,0x4f, + 0x4c,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x55,0x45,0x40,0x4a,0x4a,0x4a, + 0x45,0x59,0x4d,0x46,0x4a,0x5d,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a, + 0x4a,0x4a,0x4a,0x4a,0x4a,0x61,0x63,0x67,0x4e,0x4a,0x4a,0x6b,0x6d,0x4a,0x4a, + 0x45,0x6d,0x4a,0x4a,0x44,0x45,0x4a,0x4a,0x00,0x00,0x00,0x02,0x0d,0x06,0x06, + 0x06,0x06,0x0e,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x06,0x06,0x02,0x06, + 0x00,0x0a,0x0a,0x07,0x07,0x06,0x02,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04, + 0x04,0x04,0x00,0x00,0x00,0x0e,0x05,0x06,0x06,0x06,0x01,0x06,0x00,0x00,0x08, + 0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01, + 0x86,0x00,0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba, + 0xf8,0xbb,0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00, + 0xc4,0xff,0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00, + 0x13,0x09,0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07, + 0xb2,0xff,0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf, + 0xe7,0x08,0x00,0xf0,0x02,0x00 +}; \ No newline at end of file diff --git a/cheat/internal_rewrite/ui.h b/cheat/internal_rewrite/ui.h new file mode 100644 index 0000000..968a969 --- /dev/null +++ b/cheat/internal_rewrite/ui.h @@ -0,0 +1,885 @@ +#pragma once +#include "ui_base_item.h" +#include "ui_menu.h" +#include "ui_form.h" +#include "ui_render.h" +#include "ui_checkbox.h" +#include "ui_tab_manager.h" +#include "ui_slider.h" +#include "ui_dropdown.h" +#include "ui_key_picker.h" +#include "ui_button.h" +#include "ui_color_picker.h" +#include "ui_label.h" +#include "ui_itemlist.h" +#include "ui_itemlist_def.h" + +#include "settings.hpp" +#include "base_cheat.hpp" + +#include "modules.hpp" + +namespace ui +{ + int current_category = 0; + + static std::string date_str = __DATE__; + auto menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "quebot" ), + "" ); + + static void render( ) { + static bool was_setup = false; + if ( !was_setup ) { + std::transform( date_str.begin( ), date_str.end( ), date_str.begin( ), + [ ]( char c ) { return ::tolower( c ); } + ); + + menu.reset( ); + +#ifndef _DEBUG + date_str = g_header.username; + + + menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "automated currency" ), + //don't ask + date_str.c_str( ) ); +#else + menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "dmt hook" ), + date_str.c_str( ) ); +#endif + + auto tab_sheet = std::make_shared< ui::c_tab_manager >( ); + + //todo: replace with icons? + auto tab_legit = std::make_shared< ui::c_tab_sheet >( xors( "legit" ), &icons::sprite_legit ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_main = std::make_shared< ui::c_tab_sheet >( xors( "main" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.enabled ) ); + auto activation_dropdown = std::make_shared< ui::c_dropdown< > >( + 0, 0, 120, xors( "activation type" ), + &g_settings.legit.activation_type, + &ui::dropdowns::activation_types_aimbot ); + activation_dropdown->add_item( std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.key ) )->set_cond( + [ ]( ) { return g_settings.legit.activation_type == 1; } ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.legit.friendlies ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "aim assist" ), &g_settings.legit.assist ) ); + + main_form->add_item( activation_dropdown ); + } + + auto smooth_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "smoothing" ) ); { + smooth_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dynamic smoothing" ), &g_settings.legit.dynamic_smoothing ) ); + smooth_form->add_item( std::make_shared< ui::c_slider< size_t > >( 0, 0, 120, 2, 28, xors( "sample size" ), &g_settings.legit.sample_size ) ); + smooth_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.1f, 2.0f, xors( "multiplier" ), &g_settings.legit.smooth_factor ) ); + } + + auto backtracking_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "backtracking" ) ); { + backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.backtracking ) ); + backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "target" ), &g_settings.legit.backtracking_target ) ); + auto visualize_checkbox = backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "visualize" ), &g_settings.legit.backtracking_visualize ) ); + visualize_checkbox->add_item( std::make_shared< ui::c_color_picker >( 175, 2, 15, &g_settings.legit.backtracking_col ) ); + visualize_checkbox->set_cond( [ ] { return !g_settings.misc.hide_from_obs( ); } ); + + backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 50.f, xors( "max fov" ), &g_settings.legit.backtracking_fov ) ); + backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "max time" ), &g_settings.legit.backtracking_time, "s" ) ); + } + + auto triggerbot_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "triggerbot" ) ); { + triggerbot_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.triggerbot ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.trigger_key ) ); + + triggerbot_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "magnet" ), &g_settings.legit.trigger_magnet ) ); + + triggerbot_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "trigger delay" ), &g_settings.legit.trigger_delay, "s" ) + )->set_cond( [] { return g_settings.legit.triggerbot( ); } ); + } + + left_column->add_item( main_form ); + left_column->add_item( smooth_form ); + + right_column->add_item( backtracking_form ); + right_column->add_item( triggerbot_form ); + + subtab_main->add_item( left_column ); + subtab_main->add_item( right_column ); + } + + //make a subtab for each weapon type? + auto subtab_weapons = std::make_shared< ui::c_tab_sheet >( xors( "weapons" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto general_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "general" ) ); { + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.general.m_fov ) ); + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.general.m_speed ) ); + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.general.m_rcs ) ); + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.general.m_assist_strength ) ); + } + + auto snipers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "snipers" ) ); { + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.snipers.m_fov ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.snipers.m_speed ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.snipers.m_rcs ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.snipers.m_assist_strength ) ); + snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "awp body aim" ), &g_settings.legit.awp_baim ) ); + } + + auto rifles_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "rifles" ) ); { + rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.rifles.m_fov ) ); + rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.rifles.m_speed ) ); + rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.rifles.m_rcs ) ); + rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.rifles.m_assist_strength ) ); + } + + auto pistols_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "pistols" ) ); { + pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.pistols.m_fov ) ); + pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.pistols.m_speed ) ); + pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.pistols.m_rcs ) ); + pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.pistols.m_assist_strength ) ); + } + + left_column->add_item( general_form ); + left_column->add_item( snipers_form ); + right_column->add_item( rifles_form ); + right_column->add_item( pistols_form ); + + subtab_weapons->add_item( left_column ); + subtab_weapons->add_item( right_column ); + } + + subtab_sheet->add_item( subtab_weapons ); + subtab_sheet->add_item( subtab_main ); + + tab_legit->add_item( subtab_sheet ); + } + + + auto tab_rage = std::make_shared< ui::c_tab_sheet >( xors( "rage" ), &icons::sprite_rage ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_aimbot = std::make_shared< ui::c_tab_sheet >( xors( "aimbot" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 235, xors( "main" ), 235 ); { + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.enabled ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.rage.friendlies ) ); + main_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 180.f, xors( "max fov" ), &g_settings.rage.fov ) ); + + + main_form->add_item( std::make_shared< ui::c_dropdown< int > >( + 0, 0, 120, xors( "activation type" ), + &g_settings.rage.activation_type, + &dropdowns::activation_types_aimbot ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.aimkey ) )->set_cond( + [ ]( ) { return g_settings.rage.activation_type == 1; } ); + + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "silent" ), + &g_settings.rage.silent, &dropdowns::silent_aimbot_types ) ); + + + main_form->add_item( std::make_shared< ui::c_dropdown< int > >( 0, 0, 120, xors( "hitbox" ), + &g_settings.rage.hitbox, &dropdowns::hitboxes ) ); + + auto hitscan_form = main_form->add_item( std::make_shared< ui::c_form >( 0, 5, 119, 0, xors( "hitscan" ), 0, true ) ); + hitscan_form->set_cond( [ ]( ) { return g_settings.rage.hitbox == -1; } ); + + hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "head" ), &g_settings.rage.hitscan.head ) ); + hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "chest" ), &g_settings.rage.hitscan.chest ) ); + hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "stomach" ), &g_settings.rage.hitscan.stomach ) ); + hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "arms" ), &g_settings.rage.hitscan.arms ) ); + hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "legs" ), &g_settings.rage.hitscan.legs ) ); + hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "feet" ), &g_settings.rage.hitscan.feet ) ); + + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore limbs when moving" ), &g_settings.rage.ignore_limbs_moving ) + )->set_cond( [ ]( ) { return g_settings.rage.hitbox == -1; } ); + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "multipoint" ), &g_settings.rage.multipoint_enable, &dropdowns::multipoint_types ) ); + main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 10, 100, &g_settings.rage.multipoint_scale( ) ) ); + auto multipoint_form = main_form->add_item( std::make_shared< ui::c_form >( 0, 5, 119, 0, xors( "multipoint" ), 0, true ) ); + multipoint_form->set_cond( [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); + + multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "head" ), &g_settings.rage.multipoint.head ) ); + multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "chest" ), &g_settings.rage.multipoint.chest ) ); + multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "stomach" ), &g_settings.rage.multipoint.stomach ) ); + multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thighs" ), &g_settings.rage.multipoint.thighs ) ); + multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "calves" ), &g_settings.rage.multipoint.calves ) ); + + + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "preserve fps" ), &g_settings.rage.preserve_fps ) ); + } + + auto accuracy_form = std::make_shared< ui::c_form >( 0, 0, 215, 157, xors( "accuracy" ), 157 ); { + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto scope" ), &g_settings.rage.auto_scope ) ); + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "anti-aim correction" ), &g_settings.rage.resolver ) ); + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "pitch correction" ), &g_settings.rage.pitch_resolver ) + )->set_cond( [ ]( ) { return g_settings.rage.resolver; } ); + accuracy_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "fake lag correction" ), &g_settings.rage.fakelag_resolver, &dropdowns::fakelag_fix_types ) + )->set_cond( [ ]( ) { return g_settings.rage.resolver; } ); + + auto override_checkbox = accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "resolver override" ), &g_settings.rage.resolver_override ) ); + override_checkbox->add_item( std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.resolver_override_key ) ); + override_checkbox->set_cond( [ ]( ) { return g_settings.rage.resolver; } ); + auto visualize_checkbox = accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "visualize lag compensation" ), &g_settings.rage.bt_visualize ) ); + visualize_checkbox->set_cond( [ ]( ) { return g_settings.rage.resolver( ) && !g_settings.misc.hide_from_obs( );; } ); + visualize_checkbox->add_item( std::make_shared< ui::c_color_picker >( 175, 2, 15, &g_settings.rage.bt_col ) ); + + accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "compensate spread" ), &g_settings.rage.compensate_spread ) ); + } + + auto selection_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "selection" ) ); { + selection_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "type" ), &g_settings.rage.selection_type, &dropdowns::selection_type ) ); + selection_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "prefer moving" ), &g_settings.rage.prefer_moving ) ); + selection_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "prefer low hp" ), &g_settings.rage.prefer_low_hp ) ); + } + + + + auto general_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { + general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); + + general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.general.m_auto_stop, &dropdowns::auto_stop ) ); + general_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.general.m_spread_limit ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + + general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.general.m_spread_limit_min ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.general.m_spread_limit; } ); + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.general.m_hitbox_scale ) )->set_cond( + [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); + + general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.general.m_hitchance ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.general.m_damage ) ); + general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.general.m_damage_scale, xors( "%%hp" ) ) ); + general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.general.m_delay_type, &dropdowns::delay_type ) ); + general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.general.m_delay, xors( "ms" ) ) + )->set_cond( [ ]( ) { return g_settings.rage.general.m_delay_type == 2; } ); + + general_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.general.m_baim_air ) ); + general_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.general.m_baim_fake ) ); + general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.general.m_baim_shots, xors( "shots" ) ) ); + general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.general.m_baim_health, xors( "hp" ) ) ); + } + + general_form->set_cond( [ ]( ) { return current_category == 0; } ); + + auto pistols_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { + pistols_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); + + pistols_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.heavy_pistols.m_auto_stop, &dropdowns::auto_stop ) ); + pistols_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.heavy_pistols.m_spread_limit ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + + pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.heavy_pistols.m_spread_limit_min ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.heavy_pistols.m_spread_limit; } ); + pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.heavy_pistols.m_hitbox_scale ) )->set_cond( + [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); + pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.heavy_pistols.m_hitchance ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.heavy_pistols.m_damage ) ); + pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.heavy_pistols.m_damage_scale, xors( "%%hp" ) ) ); + pistols_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.heavy_pistols.m_delay_type, &dropdowns::delay_type ) ); + pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.heavy_pistols.m_delay, xors( "ms" ) ) + )->set_cond( [ ]( ) { return g_settings.rage.heavy_pistols.m_delay_type == 2; } ); + + pistols_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.heavy_pistols.m_baim_air ) ); + pistols_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.heavy_pistols.m_baim_fake ) ); + pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.heavy_pistols.m_baim_shots, xors( "shots" ) ) ); + pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.heavy_pistols.m_baim_health, xors( "hp" ) ) ); + } + + pistols_form->set_cond( [ ]( ) { return current_category == 1; } ); + + auto snipers_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { + snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); + + snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.snipers.m_auto_stop, &dropdowns::auto_stop ) ); + snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.snipers.m_spread_limit ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + + snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.snipers.m_spread_limit_min ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.snipers.m_spread_limit; } ); + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.snipers.m_hitbox_scale ) )->set_cond( + [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); + snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.snipers.m_hitchance ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.snipers.m_damage ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.snipers.m_damage_scale, xors( "%%hp" ) ) ); + snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.snipers.m_delay_type, &dropdowns::delay_type ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.snipers.m_delay, xors( "ms" ) ) + )->set_cond( [ ]( ) { return g_settings.rage.snipers.m_delay_type == 2; } ); + + snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.snipers.m_baim_air ) ); + snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.snipers.m_baim_fake ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.snipers.m_baim_shots, xors( "shots" ) ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.snipers.m_baim_health, xors( "hp" ) ) ); + } + + snipers_form->set_cond( [ ]( ) { return current_category == 2; } ); + + auto auto_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { + auto_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); + + auto_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.auto_snipers.m_auto_stop, &dropdowns::auto_stop ) ); + auto_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.auto_snipers.m_spread_limit ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + + auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.auto_snipers.m_spread_limit_min ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.auto_snipers.m_spread_limit; } ); + auto_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.auto_snipers.m_hitbox_scale ) )->set_cond( + [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); + auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.auto_snipers.m_hitchance ) + )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); + auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.auto_snipers.m_damage ) ); + auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.auto_snipers.m_damage_scale, xors( "%%hp" ) ) ); + auto_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.auto_snipers.m_delay_type, &dropdowns::delay_type ) ); + auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.auto_snipers.m_delay, xors( "ms" ) ) + )->set_cond( [ ]( ) { return g_settings.rage.auto_snipers.m_delay_type == 2; } ); + + auto_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.auto_snipers.m_baim_air ) ); + auto_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.auto_snipers.m_baim_fake ) ); + auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.auto_snipers.m_baim_shots, xors( "shots" ) ) ); + auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.auto_snipers.m_baim_health, xors( "hp" ) ) ); + } + + auto_form->set_cond( [ ]( ) { return current_category == 3; } ); + + left_column->add_item( main_form ); + left_column->add_item( accuracy_form ); + right_column->add_item( selection_form ); + right_column->add_item( general_form ); + right_column->add_item( pistols_form ); + right_column->add_item( snipers_form ); + right_column->add_item( auto_form ); + + + subtab_aimbot->add_item( left_column ); + subtab_aimbot->add_item( right_column ); + } + + auto subtab_antiaim = std::make_shared< ui::c_tab_sheet >( xors( "antiaim" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 131, xors( "main" ), 131 ); { + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.anti_aim ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "at players" ), &g_settings.rage.at_players ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant check" ), &g_settings.rage.dormant_check ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "angle step" ), &g_settings.rage.angle_step ) ); + main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, &g_settings.rage.angle_step_degrees ) )->set_cond( + [ ]( ) { return g_settings.rage.angle_step( ); } ); + + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fix leg movement" ), &g_settings.rage.fix_legs ) ); + } + + auto pitch_form = std::make_shared< ui::c_form >( 0, 0, 215, 60, xors( "pitch" ) ); { + pitch_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "pitch" ), &g_settings.rage.pitch, &dropdowns::antiaim_pitch ) ); + pitch_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -89, 89, &g_settings.rage.pitch_offset ) )->set_cond( + [ ]( ) { return g_settings.rage.pitch == 1 || g_settings.rage.pitch == 4 || g_settings.rage.pitch == 5; } ); + } + + auto yaw_form = std::make_shared< ui::c_form >( 0, 0, 215, 190, xors( "yaw" ), 190 ); { + yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw" ), &g_settings.rage.real_yaw, &dropdowns::antiaim_yaw ) ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.real_yaw_add( ) ) )->set_cond( + [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw jitter" ), &g_settings.rage.real_yaw_jitter ) )->set_cond( + [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw moving" ), &g_settings.rage.real_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( + [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.real_yaw_moving_add( ) ) )->set_cond( + [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw moving jitter" ), &g_settings.rage.real_moving_jitter ) )->set_cond( + [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "in-air yaw" ), &g_settings.rage.air_yaw, &dropdowns::antiaim_yaw ) )->set_cond( + [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.air_yaw_add( ) ) )->set_cond( + [ ]( ) { return !!g_settings.rage.air_yaw( ) && !!g_settings.rage.real_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "in-air yaw jitter" ), &g_settings.rage.air_yaw_jitter ) )->set_cond( + [ ]( ) { return !!g_settings.rage.air_yaw( ) && !!g_settings.rage.real_yaw( ); } ); + + + yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw" ), &g_settings.rage.fake_yaw, &dropdowns::antiaim_yaw ) ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.fake_yaw_add( ) ) )->set_cond( + [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw jitter" ), &g_settings.rage.fake_yaw_jitter ) )->set_cond( + [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); + } + + auto edge_form = std::make_shared< ui::c_form >( 0, 0, 215, 110, xors( "edge detection" ), 110 ); { + edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge" ), &g_settings.rage.edge_dtc_normal, + &dropdowns::antiaim_edge ) ); + + edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_standing ) )->set_cond( + [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); + + edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_moving ) )->set_cond( + [ ]( ) { return !!g_settings.rage.edge_dtc_normal( ); } ); + + edge_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "freestanding" ), + &g_settings.rage.edge_detection ) ); + + edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "priority" ), + &g_settings.rage.edge_dtc_priority, &dropdowns::edge_priority ) + )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) && g_settings.rage.edge_detection( ); } ); + + edge_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "break lby when edging" ), &g_settings.rage.break_lby_edge( ) ) + )->set_cond( [ ]( ) { return g_settings.rage.break_lby; } ); + + edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake jitter" ), &g_settings.rage.edge_dtc_jitter ) ); + edge_form->add_item(std::make_shared< ui::c_slider< int > >(0, 0, 140, 0, 90, xors("real jitter"), &g_settings.rage.edge_dtc_real_jitter)); + } + + auto lby_form = std::make_shared< ui::c_form >( 0, 0, 215, 106, xors( "lby breaker" ), 106 ); { + lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "break lby" ), &g_settings.rage.break_lby ) ); + lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -120, 120, &g_settings.rage.lby_delta ) )->set_cond( + [ ]( ) { return g_settings.rage.break_lby( ); } ); + + lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid updates" ), &g_settings.rage.lby_avoid_updates ) ); + + lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fakewalk" ), &g_settings.rage.fakewalk ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.fakewalk_key ) + ); + + lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 7, 16 + , &g_settings.rage.fakewalk_ticks ) )->set_cond( + [ ]( ) { return g_settings.rage.fakewalk; } ); + } + + auto fakelag_form = std::make_shared< ui::c_form >( 0, 0, 215, 165, xors( "fakelag" ), 165 ); { + fakelag_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "mode" ), &g_settings.rage.fakelag.mode, &dropdowns::fakelag_types ) ); + fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 2, 16, &g_settings.rage.fakelag.ticks ) ); + fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 50, xors( "variance" ), &g_settings.rage.fakelag.fluctuate ) ); + + auto flags_form = fakelag_form->add_item( std::make_shared< ui::c_form >( 0, 5, 139, 0, xors( "flags" ), 0, true ) ); + + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "in air" ), &g_settings.rage.fakelag.in_air ) ); + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on move" ), &g_settings.rage.fakelag.in_move ) ); + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on peek" ), &g_settings.rage.fakelag.on_peek ) ); + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on duck" ), &g_settings.rage.fakelag.on_duck ) ); + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on weapon select" ), &g_settings.rage.fakelag.on_select ) ); + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "while shooting" ), &g_settings.rage.fakelag.in_attack ) ); + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid ground" ), &g_settings.rage.fakelag.avoid_ground ) ); + flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "reset on jump" ), &g_settings.rage.fakelag.jump_reset ) ); + } + + left_column->add_item( main_form ); + left_column->add_item( pitch_form ); + left_column->add_item( yaw_form ); + + right_column->add_item( edge_form ); + right_column->add_item( lby_form ); + right_column->add_item( fakelag_form ); + + subtab_antiaim->add_item( left_column ); + subtab_antiaim->add_item( right_column ); + } + + subtab_sheet->add_item( subtab_antiaim ); + subtab_sheet->add_item( subtab_aimbot ); + + tab_rage->add_item( subtab_sheet ); + } + + + auto tab_visuals = std::make_shared< ui::c_tab_sheet >( xors( "visuals" ), &icons::sprite_visuals ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_players = std::make_shared< ui::c_tab_sheet >( xors( "players" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "activation type" ), &g_settings.visuals.activation_type, &dropdowns::activation_type_visuals ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.visuals.key ) )->set_cond( [ ]( ) { return g_settings.visuals.activation_type > 1; } ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.friendlies ) ); + } + + auto player_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "players" ) ); { + auto box_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "box" ), &g_settings.visuals.box ) ); + box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.box_enemy( ) ) ); + box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.visuals.box_friendly( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.friendlies; } ); + + auto glow_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "glow" ), &g_settings.visuals.glow ) ); + glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.glow_enemy ) ); + glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.glow_friendly ) )->set_cond( + [ ]( ) { return g_settings.visuals.friendlies || g_settings.visuals.chams.friendlies; } ); + glow_checkbox->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); + + auto skeleton_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "skeleton" ), &g_settings.visuals.skeleton ) ); + skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.skeleton_enemy ) ); + skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.skeleton_friendly ) )->set_cond( + [ ]( ) { return g_settings.visuals.friendlies; } ); + + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant" ), &g_settings.visuals.dormant ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "health" ), &g_settings.visuals.health ) ); + auto name_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "name" ), &g_settings.visuals.name ) ); + name_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.name_enemy( ) ) ); + name_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.visuals.name_friendly( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.friendlies; } ); + + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "weapon" ), &g_settings.visuals.weapon ) ); + + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ammo" ), &g_settings.visuals.ammo ) )->add_item( + std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.ammo_bar_clr( ) ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flags" ), &g_settings.visuals.flags ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "money" ), &g_settings.visuals.money ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "high ping warning" ), &g_settings.visuals.ping ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "resolver indicator" ), &g_settings.visuals.resolver_indicator ) )->add_item( + std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.lby_bar_clr( ) ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "sound" ), &g_settings.visuals.sound ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); + player_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 220, 500, &g_settings.visuals.sound_range ) )->set_cond( [ ]( ) { return g_settings.visuals.sound && !g_settings.misc.hide_from_obs; } ); + } + + auto hud_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "hud" ) ); { + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "out of pov" ), &g_settings.visuals.out_of_pov ) ); + hud_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.25f, 1.f, &g_settings.visuals.out_of_pov_radius ) + )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); + + hud_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 15, 40, &g_settings.visuals.out_of_pov_size, xors( "px" ) ) + )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hitmarkers" ), &g_settings.visuals.hitmarkers ) ); + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spectator list" ), &g_settings.visuals.spec_list ) ); + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "radar" ), &g_settings.visuals.radar ) ); + } + + auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ), 100 ); { + other_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bullet tracers" ), &g_settings.visuals.bullet_tracers, &dropdowns::tracer_type ) ); + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "floating ragdolls" ), &g_settings.visuals.floating_ragdolls ) ); + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "rank revealer" ), &g_settings.misc.rank_reveal ) ); + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hit ghost" ), &g_settings.visuals.hits ) ); + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "target" ), &g_settings.visuals.target ) ); + + other_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 1, 7, &g_settings.visuals.target_time, "s" ) + )->set_cond( [ ]( ) { return g_settings.visuals.target || g_settings.visuals.hits; } ); + } + + auto chams_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "chams" ), 165 ); { + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.visuals.chams.enabled( ) ) ); + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "through walls" ), &g_settings.visuals.chams.ignore_z( ) ) ); + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "clear occlusion" ), &g_settings.visuals.chams.clear_occlusion ) ); + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.chams.friendlies( ) ) ); + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flat" ), &g_settings.visuals.chams.flat( ) ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); + chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "reflectivity" ), &g_settings.visuals.chams.reflectivity ) + )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); + + chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "luminance" ), &g_settings.visuals.chams.luminance ) + )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); + + chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "shine" ), &g_settings.visuals.chams.shine ) + )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); + + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies visible" ), &g_settings.visuals.chams.color_visible_friendly( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.chams.friendlies( ); } ); + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies hidden" ), &g_settings.visuals.chams.color_hidden_friendly( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.chams.friendlies( ) && g_settings.visuals.chams.ignore_z( ); } ); + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies visible" ), &g_settings.visuals.chams.color_visible_enemy( ) ) ); + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies hidden" ), &g_settings.visuals.chams.color_hidden_enemy( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.chams.ignore_z( ); } ); + } + + chams_form->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); + + left_column->add_item( main_form ); + left_column->add_item( player_form ); + + right_column->add_item( hud_form ); + right_column->add_item( other_form ); + right_column->add_item( chams_form ); + + subtab_players->add_item( left_column ); + subtab_players->add_item( right_column ); + } + + auto subtab_other = std::make_shared< ui::c_tab_sheet >( xors( "other" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto world_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "world" ) ); { + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "world modulate" ), &g_settings.visuals.world_modulate ) + )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "night mode" ), &g_settings.visuals.night_mode ) + )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent props" ), &g_settings.visuals.transparent_props ) + )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); + + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fullbright" ), &g_settings.visuals.fullbright ) ); + world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "dropped weapons" ), &g_settings.visuals.weapon_esp, &dropdowns::world_esp_type ) + )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.weapon_esp_clr( ) ) ); + + world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "grenades" ), &g_settings.visuals.grenade_esp, &dropdowns::world_esp_type ) + )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.grenade_esp_clr( ) ) ); + + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "grenade owner" ), &g_settings.visuals.grenade_owner ) + )->set_cond( [ ]( ) { return g_settings.visuals.grenade_esp == 1 || g_settings.visuals.grenade_esp == 3; } ); + + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bomb information" ), &g_settings.visuals.bomb_info ) ); + } + + auto local_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "local player" ) ); { + local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "recoil crosshair" ), &g_settings.visuals.recoil_crosshair( ) ) ); + local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "draw spread" ), &g_settings.visuals.draw_spread ) ); + local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "autowall crosshair" ), &g_settings.visuals.autowall_crosshair( ) ) ); + local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "grenade prediction" ), &g_settings.visuals.grenade_prediction( ) ) )->add_item( + std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.grenade_pred_clr ) + ); + + local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "snipers crosshair" ), &g_settings.visuals.snipers_crosshair( ) ) ); + } + + auto view_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "view" ) ); { + view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "watermark" ), &g_settings.misc.watermark ) ); + view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thirdperson" ), &g_settings.misc.thirdperson( ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.thirdperson_key ) + ); + view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 40, xors( "viewmodel fov" ), &g_settings.misc.viewmodel_fov( ) ) ); + view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 90, 130, xors( "view fov" ), &g_settings.misc.fov_changer( ) ) ); + } + + auto removals_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "removals" ) ); { + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no scope" ), &g_settings.misc.no_scope ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no zoom" ), &g_settings.misc.no_zoom ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.misc.no_recoil ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no flash" ), &g_settings.misc.no_flash ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no smoke" ), &g_settings.misc.no_smoke ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent viewmodel" ), &g_settings.misc.transparent_vm ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no post processing" ), &g_settings.misc.disable_post_process ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no cascade shadows" ), &g_settings.visuals.no_cascade_shadows ) ); + } + + left_column->add_item( world_form ); + left_column->add_item( local_form ); + + right_column->add_item( view_form ); + right_column->add_item( removals_form ); + + subtab_other->add_item( left_column ); + subtab_other->add_item( right_column ); + } + + subtab_sheet->add_item( subtab_other ); + subtab_sheet->add_item( subtab_players ); + + tab_visuals->add_item( subtab_sheet ); + } + + + auto tab_misc = std::make_shared< ui::c_tab_sheet >( xors( "miscellaneous" ), &icons::sprite_misc ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_general = std::make_shared< ui::c_tab_sheet >( xors( "general" ) ); { + auto column_left = subtab_general->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 0 ) ); + auto column_right = subtab_general->add_item( std::make_shared< ui::base_item >( 220, -5, 0, 0 ) ); + + auto movement_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "movement" ), 145 ); { + movement_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto strafe" ), &g_settings.misc.auto_strafe, &dropdowns::autostrafe_types ) ); + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bhop" ), &g_settings.misc.bunny_hop( ) ) ); + auto circle_box = movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "circle strafe" ), &g_settings.misc.circle_strafe ) ); + circle_box->add_item( std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.circle_strafe_key ) ); + circle_box->set_cond( [ ]( ) { return g_settings.misc.bunny_hop && g_settings.misc.auto_strafe; } ); + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no duck cooldown" ), &g_settings.misc.no_crouch_cooldown ) ); + + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "air duck" ), &g_settings.misc.air_duck ) ); + + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "edge jump" ), &g_settings.misc.edge_jump( ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.edge_jump_key( ) ) + ); + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto jumpbug" ), &g_settings.misc.auto_jumpbug( ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.auto_jumpbug_key( ) ) + ); + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "show jump stats" ), &g_settings.misc.show_jump_stats ) ); + } + + auto identity_form = std::make_shared< ui::c_form >( 0, 1, 215, 0, xors( "identity" ), 95 ); { + identity_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "clantag changer" ), &g_settings.misc.clantag_changer( ) ) ); + identity_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "name changer" ), &g_settings.misc.name_changer, + &dropdowns::name_changers ) ); + identity_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "rich presence" ), &g_settings.misc.rich_presence( ) ) ); + identity_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "money talk" ), &g_settings.misc.money_talk ) ); + } + + auto fake_ping = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "fake latency" ) ); { + static auto sv_maxunlag = g_csgo.m_cvar( )->FindVar( "sv_maxunlag" ); + + fake_ping->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "extended backtracking" ), &g_settings.misc.net_fakelag ) ); + } + + auto helpers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "helpers" ) ); { + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto revolver" ), &g_settings.misc.auto_revolver ) ); + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto match accept" ), &g_settings.misc.auto_accept ) ); + helpers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 10, xors( "accept delay" ), &g_settings.misc.auto_accept_delay ) + )->set_cond( [ ]( ) { return g_settings.misc.auto_accept( ); } ); + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "server information" ), &g_settings.misc.server_information ) ); + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "unlock inventory" ), &g_settings.misc.unlock_inventory ) ); + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "log hits" ), &g_settings.misc.log_hits ) ); + helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "show team damage" ), &g_settings.misc.team_dmg ) ); + } + + auto autobuy_form = std::make_shared< ui::c_form>( 0, 0, 215, 0, xors( "autobuy" ), 165 ); { + autobuy_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "primary" ), &g_settings.misc.autobuy.main_weapon, + &dropdowns::autobuy_main_wep ) ); + autobuy_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "secondary" ), &g_settings.misc.autobuy.secondary_weapon, + &dropdowns::autobuy_second_wep ) ); + autobuy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "armor" ), &g_settings.misc.autobuy.armor ) ); + autobuy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "defuser" ), &g_settings.misc.autobuy.defuser ) ); + autobuy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "zeus" ), &g_settings.misc.autobuy.zeus ) ); + + auto grenades_form = autobuy_form->add_item( std::make_shared< ui::c_form >( 0, 5, 139, 0, xors( "grenades" ), 0, true ) ); + + grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "molotov/incendiary" ), &g_settings.misc.autobuy.molly ) ); + grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "grenade" ), &g_settings.misc.autobuy.grenade ) ); + grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "smoke" ), &g_settings.misc.autobuy.smoke ) ); + grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flash" ), &g_settings.misc.autobuy.flash ) ); + grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "decoy" ), &g_settings.misc.autobuy.decoy ) ); + } + + auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ) ); { + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "remove gun sounds" ), &g_settings.misc.no_sound ) ); + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hide from obs" ), &g_settings.misc.hide_from_obs ) ); + other_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "unlock hidden cvars" ), []( ) { g_cheat.m_extra.unlock_hidden_cvars( ); } ) ); + } + + column_left->add_item( movement_form ); + column_left->add_item( identity_form ); + column_left->add_item( fake_ping ); + column_left->add_item( other_form ); + + column_right->add_item( helpers_form ); + column_right->add_item( autobuy_form ); + } + + auto subtab_skins = std::make_shared< ui::c_tab_sheet >( xors( "money compensator" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto knife_form = left_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "knife" ) ) ); { + knife_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "override knife" ), &g_settings.misc.skins.knife, &dropdowns::skin_knives ) ); + } + + auto skin_form = left_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "skin" ), 325 ) ); { + skin_form->add_item( std::make_shared< ui::c_itemlist< int, 20 > >( 0, 0, 180, xors( "override skin" ), &dropdowns::skins, &g_settings.misc.skins.current_skin ) ); + } + + auto gloves_form = right_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "glove" ) ) ); { + gloves_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "override glove" ), &g_settings.misc.skins.glove, &dropdowns::gloves ) ); + } + + auto gloves_skin_form = right_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "glove skin" ), 325 ) ); { + gloves_skin_form->add_item( std::make_shared< ui::c_itemlist< int, 20 > >( 0, 0, 180, xors( "override skin" ), &dropdowns::glove_skins, &g_settings.misc.skins.glove_skin ) ); + } + + subtab_skins->add_item( left_column ); + subtab_skins->add_item( right_column ); + } + + auto subtab_movement_recorder = std::make_shared< ui::c_tab_sheet >( xors( "movement recorder" ) ); { + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "idle" ) ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.misc.recorder_enable ) ); + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "show angles" ), &g_settings.misc.recording_show_angles, &dropdowns::recorder_angles ) ); + main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording start key" ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_start_key ) + ); + main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording stop key" ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_stop_key ) + ); + + main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "play" ), [ ]( ) { g_cheat.m_move_rec.play_back( ); } ) ); + main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "stop playing" ), [ ]( ) { g_cheat.m_move_rec.stop_playback( ); } ) ); + main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "clear recording" ), [ ]( ) { g_cheat.m_move_rec.clear_recording( ); } ) ); + } + + subtab_movement_recorder->add_item( main_form ); + } + + subtab_sheet->add_item( subtab_movement_recorder ); + subtab_sheet->add_item( subtab_skins ); + subtab_sheet->add_item( subtab_general ); + + tab_misc->add_item( subtab_sheet ); + } + + + auto tab_config = std::make_shared< ui::c_tab_sheet >( xors( "config" ), &icons::sprite_config ); { + auto cfg_form = std::make_shared< ui::c_form >( 0, 10, 200, 134, xors( "config" ) ); + cfg_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 180, xors( "setting" ), &g_settings.menu.cur_setting, &dropdowns::configs ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 0, 0, 85, 20, xors( "save" ), []( ) { g_settings.save( ); } ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 95, -25, 85, 20, xors( "load" ), []( ) { g_settings.load( ); } ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 0, -25, 85, 20, xors( "reset" ), []( ) { g_settings.reset( ); g_settings.save( ); } ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 95, -50, 85, 20, xors( "unload" ), []( ) { g_settings.reset( ); } ) ); + //cfg_form->add_item( std::make_shared< ui::c_button >( 0, -25, 85, 20, xors( "to clipboard" ), [ ]( ) { g_settings.copy_to_clipboard( ); } ) ); + //cfg_form->add_item( std::make_shared< ui::c_button >( 95, -50, 85, 20, xors( "from clipboard" ), [ ]( ) { g_settings.load_from_clipboard( ); } ) ); + auto label = cfg_form->add_item( std::make_shared< ui::c_label >( 0, -50, xors( "menu color" ) ) ); + label->add_item( std::make_shared< ui::c_color_picker >( 165, 4, 15, &g_settings.menu.menu_color ) ); + + cfg_form->add_item( std::make_shared< ui::c_checkbox >( 0, -50, xors( "anti-untrusted" ), &g_settings.menu.anti_untrusted ) ); + + tab_config->add_item( cfg_form ); + } + + tab_sheet->add_item( tab_config ); + tab_sheet->add_item( tab_misc ); + tab_sheet->add_item( tab_visuals ); + tab_sheet->add_item( tab_rage ); + tab_sheet->add_item( tab_legit ); + + menu->add_item( tab_sheet ); + + was_setup = true; + } + else { + static auto movement_state = menu->find_item( + xors( "movement recorder" ) )->find_item( + xors( "main" ) )->find_item( + xors( "idle" ) + ); + + if( !g_settings.misc.recorder_enable ) + movement_state->set_text( xors( "idle" ) ); + else if( g_cheat.m_move_rec.is_playing( ) ) { + movement_state->set_text( xors( "playing" ) ); + } + else if( g_cheat.m_move_rec.is_recording( ) ) { + movement_state->set_text( xors( "recording" ) ); + } + else { + movement_state->set_text( xors( "idle" ) ); + } + + static auto jitter_real = menu->find_item( xors( "real yaw jitter" ) ); + jitter_real->set_text( g_settings.rage.real_yaw == 2 ? xors( "spin range" ) : xors( "real yaw jitter" ) ); + + static auto jitter_real_moving = menu->find_item( xors( "real yaw moving jitter" ) ); + jitter_real_moving->set_text( g_settings.rage.real_yaw_moving == 2 ? xors( "spin range" ) : xors( "real yaw moving jitter" ) ); + + static auto jitter_fake = menu->find_item( xors( "fake yaw jitter" ) ); + jitter_fake->set_text( g_settings.rage.fake_yaw == 2 ? xors( "spin range" ) : xors( "fake yaw jitter" ) ); + + static auto jitter_air = menu->find_item( xors( "in-air yaw jitter" ) ); + jitter_air->set_text( g_settings.rage.air_yaw == 2 ? xors( "spin range" ) : xors( "in-air yaw jitter" ) ); + + static auto fakeping_form = menu->find_item( xors( "fake latency" ) ); + + auto game_rules = c_base_player::get_game_rules( ); + if( game_rules ) { + fakeping_form->set_visible( !*( bool* )( game_rules + 0x75 ) ); + } + + render_item( menu.get( ) ); + + // This was annoying me so I decided to remove it in Release mode. +#ifdef _DEBUG + //reset the menu if home is pressed for debugging purposes + if ( g_input.is_key_pressed( KEYS_END ) ) { + menu.reset( ); + menu = std::make_shared< c_menu >( 10, 10, 580, 470, xors( "golden cheat" ) ); + was_setup = false; + } +#endif + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_base_item.h b/cheat/internal_rewrite/ui_base_item.h new file mode 100644 index 0000000..482481a --- /dev/null +++ b/cheat/internal_rewrite/ui_base_item.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include + +#include "ui_draw.h" + +namespace ui +{ + //the offset between each item + constexpr int ITEM_OFFSET = 5; + + class base_item : public std::enable_shared_from_this< base_item > { + public: + base_item( ) { } + base_item( int x, int y, int w, int h, const char* name = nullptr ) : + m_x( x ), m_y( y ), m_width( w ), m_height( h ) { + if( name ) { + strcpy( m_text, name ); + } + } + + virtual void render( ) { }; + virtual bool is_hovered( ) { return false; } + virtual bool is_form( ) const { return false; } + + virtual void reset( ) { + m_y_offset = 0; + } + + virtual int get_total_height( ) const { + return m_height; + } + + void set_y_offset( int offset ) { + m_y_offset = offset; + } + + int get_y_offset( ) const { + return m_y_offset; + } + + auto add_item( std::shared_ptr< base_item > item ) { + item.get( )->m_parent = shared_from_this( ); + m_items.emplace( m_items.begin( ), item ); + + return item; + } + + auto& get_items( ) { return m_items; } + auto get_parent( ) { return m_parent; } + + virtual int x( ) const { return m_x; } + virtual int y( ) const { return m_y; } + virtual int w( ) const { return m_width; } + virtual int h( ) const { return m_height; } + + void set_x( int x ) { m_x = x; } + void set_y( int y ) { m_y = y; } + + void set_width( int w ) { m_width = w; } + void set_height( int h ) { m_height = h; } + + bool get_visible( ) const { + if( m_cond && !m_cond( ) ) { + return false; + } + + return m_visible; + } + + void set_cond( std::function< bool( ) > func ) { + m_cond = func; + } + + void set_visible( bool vis ) { m_visible = vis; } + void set_text( const char* text ) { + strcpy( m_text, text ); + } + auto get_text( ) const { + return m_text; + } + + std::shared_ptr< base_item > find_item( const char* name ) { + if( !m_items.empty( ) ) { + for( auto& it : m_items ) { + if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { + return it; + } + + auto it_find = it->find_item( name ); + if( it_find != it ) return it_find; + } + } + + return shared_from_this( ); + } + + auto get_top_parent( ) { + for( auto parent = m_parent; ; + parent = parent->get_parent( ) ) { + if( !parent->get_parent( ) ) { + return parent; + } + } + + return shared_from_this( ); + } + + int get_relative_x( ) { + int x = m_x; + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + x += parent->x( ); + } + + return x; + } + + int get_relative_y( ) { + int y = m_y + get_y_offset( ); + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + y += parent->y( ) + parent->get_y_offset( ); + } + + return y; + } + + void set_disabled( bool disabled ) { + m_disabled = disabled; + + for( auto& it : m_items ) { + it->set_disabled( disabled ); + } + } + + void set_disabled_callbacks( bool disabled ) { + auto top = get_top_parent( ); + + top->set_disabled( disabled ); + + m_disabled = false; + } + + protected: + int m_x{ }; + int m_y{ }; + + int m_width{ }; + int m_height{ }; + + //current y position for rendering + int m_y_offset{ }; + + bool m_visible = true; + bool m_disabled = false; + char m_text[ 256 ]{ }; + + std::shared_ptr< base_item > m_parent; + std::vector< std::shared_ptr< base_item > > m_items; + std::function< bool( ) > m_cond; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_button.h b/cheat/internal_rewrite/ui_button.h new file mode 100644 index 0000000..0472360 --- /dev/null +++ b/cheat/internal_rewrite/ui_button.h @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "ui_base_item.h" + +namespace ui +{ + class c_button : public base_item { + public: + c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : + base_item( x, y, w, h, name ), m_fn( fn ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); + if ( !m_mouse_held ) { + m_fn( ); + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); + } + + protected: + std::function< void( ) > m_fn; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_checkbox.h b/cheat/internal_rewrite/ui_checkbox.h new file mode 100644 index 0000000..3b0c251 --- /dev/null +++ b/cheat/internal_rewrite/ui_checkbox.h @@ -0,0 +1,68 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_checkbox : public base_item { + public: + c_checkbox( int x, int y, const char* txt, bool* setting ) : + base_item( x, y, 16, 16, txt ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int rel_x = get_relative_x( ); + int rel_y = get_relative_y( ); + + return mouse_x >= rel_x && mouse_x <= rel_x + m_width + && mouse_y >= rel_y && mouse_y <= rel_y + m_height; + } + + inline void render_checkbox( const int& x, const int& y ) { + clr_t col = ui_get_bg_col( ); + if ( is_hovered( ) ) { + col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; + } + else if ( *m_setting ) { + col = ui_get_accent_col( ); + } + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); + + //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + } + + inline void input( ) { + bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) && mouse_presesed ) { + if ( !m_mouse_held ) { + *m_setting = !*m_setting; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + render_checkbox( x, y ); + input( ); + + + ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); + } + + protected: + bool* m_setting; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_color_picker.h b/cheat/internal_rewrite/ui_color_picker.h new file mode 100644 index 0000000..8404e19 --- /dev/null +++ b/cheat/internal_rewrite/ui_color_picker.h @@ -0,0 +1,201 @@ +#pragma once + +#include "ui_base_item.h" +#include "d3d.hpp" + +namespace ui +{ + class c_color_picker : public base_item { + static constexpr int BOX_WIDTH = 106; + static constexpr int BOX_HEIGHT = 125; + public: + c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : + base_item( x, y, w, 4, name ), m_setting( setting ), + m_has_text( true ) { } + + c_color_picker( int x, int y, int w, clr_t* setting ) : + base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), + m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + + int cursor_x, cursor_y; + ui_get_cursor_pos( cursor_x, cursor_y ); + + if ( m_has_text ) y += 12; + + if ( !m_active ) { + return cursor_x >= x && cursor_x <= x + m_width + && cursor_y >= y && cursor_y <= y + m_height; + } + + return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 + && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; + } + + virtual int get_total_height( ) const override { + return m_has_text ? ( m_height + 12 ) : m_height; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_active ) { + m_mouse_held = true; + } + + m_active = true; + } + else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_active = false; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + + m_hue = m_setting->hue( ); + if ( m_hue > 1.0f ) { + m_hue -= 359.f; + } + + m_saturation = m_setting->saturation( ); + m_brightness = m_setting->brightness( ) / 255.f; + m_alpha = m_setting->a( ); + } + + void output( ) { + *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); + m_setting->a( ) = m_alpha; + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + if ( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + y += 12; + } + + input( ); + + if ( m_active ) { + RECT old_rect; + g_d3d.get_device( )->GetScissorRect( &old_rect ); + + RECT new_rect{ + x - 1, y - 1, + x + BOX_WIDTH + 22, + y + BOX_HEIGHT + 2 + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + clr_t bg_col( 0, 0, 0, 90 ); + ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); + ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); + + for ( int i{ }; i < 100; i += 3 ) { + for ( int i2{ }; i2 < 100; i2 += 3 ) { + ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, + clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); + } + } + + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held + && mouse_x > x && mouse_x <= x + 100 + && mouse_y > y && mouse_y <= y + 100 ) { + + int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); + int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); + + int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); + int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); + + m_saturation = float( delta_y ) * 0.01f; + m_brightness = float( delta_x ) * 0.01f; + } + + auto is_hue_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 110 && mouse_x < x + 122 + && mouse_y > y && mouse_y < y + 100; + }; + + auto draw_slider_hue = [&]( ) { + for ( int i{ }; i < 100; ++i ) { + auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); + + ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); + } + + ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, + is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + auto is_alpha_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 0 && mouse_x < x + 122 + && mouse_y > y + 110 && mouse_y < y + 124; + }; + + auto draw_slider_alpha = [&]( ) { + for ( int i{ 121 }; i >= 0; --i ) { + auto col = *m_setting; + col.a( ) = ( int )( float( i ) * 255.f / 121.f ); + + ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); + } + + int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); + ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, + is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + draw_slider_hue( ); + if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_y - y, 0, 100 ); + m_hue = float( delta ) * 0.01f; + } + + draw_slider_alpha( ); + if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_x - x, -1, 122 ); + m_alpha = ( int )( float( delta ) * 255.f / 121.f ); + } + + output( ); + + g_d3d.get_device( )->SetScissorRect( &old_rect ); + } + else { + if ( is_hovered( ) ) { + ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); + } + ui_draw_rect( x, y, m_width, m_height, *m_setting ); + } + } + + protected: + clr_t* m_setting = nullptr; + bool m_active = false; + bool m_mouse_held = false; + float m_saturation = 1.0f; + float m_brightness = 1.0f; + float m_hue = 0.f; + uint8_t m_alpha = 255; + bool m_has_text = false; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_draw.h b/cheat/internal_rewrite/ui_draw.h new file mode 100644 index 0000000..d95b1c2 --- /dev/null +++ b/cheat/internal_rewrite/ui_draw.h @@ -0,0 +1,161 @@ +#pragma once +#include "color.hpp" +#include "d3d.hpp" +#include "icons.hpp" +#include "d3d_sprite.hpp" +#include "input_system.hpp" + +namespace ui +{ + extern float get_csgo_frametime( ); + /*__forceinline auto ui_get_background_texture( ) { + static auto buffer = std::make_shared< byte[ 512 ] >( ); + static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); + static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); + static IDirect3DTexture9* texture; + + if ( !texture ) { + for ( int i = 0; i < 512; i += 4 ) { + *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; + } + + D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); + } + + return texture; + }*/ + + extern float anim_time; + + __forceinline void set_animtime( float animtime ) { + anim_time = animtime; + } + + __forceinline void setup_sprites( IDirect3DDevice9* device ) { + //fuck msvc + icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); + icons::sprite_visuals.init( device, icons::raw::visuals, icons::visuals_size, 66, 66 ); + icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); + icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); + } + + __forceinline clr_t ui_get_accent_col( ) { + clr_t col_start = g_settings.menu.menu_color; + + float brightness = col_start.brightness( ) / 255.f; + float saturation = col_start.saturation( ); + + float new_brightness = brightness > .5f ? brightness - 0.2f : brightness + 0.2f; + float new_saturation = saturation > .5f ? saturation - 0.2f : saturation + 0.2f; + + clr_t col_end = clr_t::from_hsb( col_start.hue( ), new_saturation, new_brightness ); + col_end.a( ) = col_start.a( ); + + clr_t col = clr_t::blend( col_start, col_end, anim_time ); + return col; + } + + __forceinline clr_t& ui_get_disabled_col( ) { + static clr_t col = clr_t( 61, 61, 61, 255 ); + return col; + } + + __forceinline clr_t& ui_get_bg_col( ) { + static clr_t col = clr_t( 24, 25, 27, 255 ); + return col; + } + + __forceinline clr_t& ui_get_text_col( ) { + static clr_t col = clr_t( 221, 221, 221, 255 ); + return col; + } + + __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, + clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { + + g_d3d.draw_gradient( start, end, x, y, w, h, type ); + } + + __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { + g_d3d.draw_line( color, x, y, x1, y1 ); + } + + __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_filled_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_filled_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { + char buf[ 2048 ]{ }; + va_list list{ }; + + __crt_va_start( list, str ); + vsprintf_s( buf, 2048, str, list ); + __crt_va_end( list ); + + g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, + center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); + } + + __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { + char* buf = ( char* )_alloca( 2048 ); + va_list list{ }; + + __crt_va_start( list, text ); + vsprintf_s( buf, 2048, text, list ); + __crt_va_end( list ); + + w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); + h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); + } + + __forceinline void ui_get_cursor_pos( int& x, int& y ) { + g_input.get_cursor_pos( x, y ); + } + + __forceinline float ui_get_frametime( ) { + return get_csgo_frametime( ); + } + + __forceinline void ui_draw_cursor( ) { + const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); + int x, y; + ui_get_cursor_pos( x, y ); + + + for ( int i{ }; i <= 9; ++i ) { + ui_draw_line( x, y, x + i, y + 11, accent ); + } + + for ( int i{ }; i <= 7; ++i ) { + ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); + } + + for ( int i{ }; i <= 3; ++i ) { + ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); + } + + ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); + ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); + + ui_draw_line( x, y, x, y + 17, black ); + ui_draw_line( x, y + 17, x + 3, y + 14, black ); + ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); + ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); + ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); + ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); + ui_draw_line( x + 11, y + 12, x, y, black ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_dropdown.h b/cheat/internal_rewrite/ui_dropdown.h new file mode 100644 index 0000000..12a9e98 --- /dev/null +++ b/cheat/internal_rewrite/ui_dropdown.h @@ -0,0 +1,219 @@ +#pragma once +#include "ui_dropdown_item.h" + +namespace ui +{ + template < typename t = int > + class c_dropdown : public base_item { + public: + c_dropdown( int x, int y, int w, const char* name, t* setting, + std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : + base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), + m_max_items( max_items ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + inline bool is_any_item_hovered( ) { + if ( m_disabled || !m_active ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + m_height + 12; + int h = m_height * ( std::min< size_t >( + m_dropdown_items->size( ), m_max_items ) ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 13; + } + + void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { + ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); + ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); + } + + void update_value( ) { + for ( auto& it : *m_dropdown_items ) { + if ( it.m_value == *m_setting ) { + m_selected_item = ⁢ + } + } + } + + void draw_items( const int& x, const int& y ) { + auto& items = *m_dropdown_items; + auto it = &items.front( ); + int offset = m_height + 1; + int hovered = 0; + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + auto is_hovered = [ & ] ( int y_offset ) { + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; + }; + + + for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; + i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); + ++i, offset += m_height + 1 + ) { + it = &items.at( i ); + + draw_box( x, y + offset, it->m_name ); + + if ( is_hovered( offset ) ) { + hovered = offset; + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_selected_item = it; + *m_setting = it->m_value; + m_active = false; + m_has_clicked_item = true; + } + } + } + + if ( hovered ) { + ui_draw_outlined_rect( x - 1, y - 1 + hovered, + m_width + 1, m_height + 1, ui_get_text_col( ) ); + } + } + + void input( ) { + static float enable_time{ }; + static bool needs_reenable{ }; + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = !m_active; + } + m_mouse_held = true; + } + else if ( !is_any_item_hovered( ) ) { + m_mouse_held = false; + } + + if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { + m_active = false; + } + + if ( GetTickCount( ) * 0.001f > enable_time && needs_reenable) { + set_disabled_callbacks( false ); + needs_reenable = false; + } + + + active_changed = m_active != active_backup; + //disable input on all items + if ( active_changed || m_has_clicked_item ) { + if ( !m_active ) { + enable_time = GetTickCount( ) * 0.001f + 0.220f; + needs_reenable = true; + } + else { + set_disabled_callbacks( true ); + } + + m_has_clicked_item = false; + } + + if ( m_selected_item ) { + *m_setting = m_selected_item->m_value; + } + + if ( m_active && m_dropdown_items->size( ) > m_max_items ) { + int scroll_input = g_input.get_scroll_state( ); + + if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max + m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it + + if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) + m_curr_scroll = m_dropdown_items->size( ) - m_max_items; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + bool restore = false; + RECT prev_rect{ }; + + if ( m_active ) { + restore = true; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + RECT new_rect{ + prev_rect.left, + prev_rect.top, + g_d3d.m_width, + g_d3d.m_height, + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_items( x, y + 11 ); + + + //draw scrollbar + size_t total_items = m_dropdown_items->size( ); + if ( total_items > m_max_items ) { + const size_t height = ( m_height + 1 ) * m_max_items; + const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); + + size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); + ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); + } + } + + update_value( ); + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( m_selected_item ) { + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); + } + + if( restore ) { + g_d3d.get_device( )->SetScissorRect( &prev_rect ); + } + } + + protected: + std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; + dropdowns::dropdown_item_t< t >* m_selected_item{ }; + bool m_active = false; + bool m_mouse_held = false; + bool m_has_clicked_item = true; + t* m_setting{ }; + size_t m_max_items{ }; + size_t m_curr_scroll{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_dropdown_item.h b/cheat/internal_rewrite/ui_dropdown_item.h new file mode 100644 index 0000000..2774013 --- /dev/null +++ b/cheat/internal_rewrite/ui_dropdown_item.h @@ -0,0 +1,861 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + namespace dropdowns + { + template < typename t = int > + struct dropdown_item_t { + const char* m_name; + t m_value; + }; + + static std::vector< dropdown_item_t< > > activation_types_aimbot = { + { xors( "always" ), 0 }, + { xors( "on key" ), 1 }, + }; + + static std::vector< dropdown_item_t< > > silent_aimbot_types = { + { xors( "none" ), 0 }, + { xors( "client-side" ), 1 }, + { xors( "server-side" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > hitboxes = { + { xors( "hitscan" ), -1 }, + { xors( "head" ), 0 }, + { xors( "neck" ), 1 }, + { xors( "pelvis" ), 3 }, + { xors( "chest" ), 6 }, + { xors( "thorax" ), 5 }, + }; + + static std::vector< dropdown_item_t< > > antiaim_yaw = { + { xors( "normal" ), 0 }, + { xors( "backwards" ), 1 }, + { xors( "backwards spin" ), 2 }, + { xors( "direction" ), 6 }, + { xors( "switch" ), 7 }, + { xors( "sideways" ), 3 }, + { xors( "golden spin" ), 4 }, + { xors( "random" ), 5 }, + }; + + static std::vector< dropdown_item_t< > > delay_type = { + { xors( "none" ), 0 }, + { xors( "time" ), 2 }, + { xors( "velocity" ), 3 }, + }; + + static std::vector< dropdown_item_t< > > antiaim_pitch = { + { xors( "normal" ), 0 }, + { xors( "custom" ), 1 }, + { xors( "flip" ), 2 }, + { xors( "minimal" ), 3 }, + { xors( "fake down" ), 4 }, + { xors( "fake up" ), 5 }, + { xors( "fake flip" ), 6 }, + { xors( "random" ), 7 } + }; + + static std::vector< dropdown_item_t< > > antiaim_freestanding = { + { xors( "disabled" ), 0 }, + { xors( "static" ), 1 }, + { xors( "narrow angle" ), 2 }, + { xors( "wide angle" ), 3 }, + }; + + static std::vector< dropdown_item_t< > > auto_stop = { + { xors( "none" ), 0 }, + { xors( "hitchance" ), 1 }, + { xors( "hitchance + lag" ), 4 }, + { xors( "duck" ), 5 }, + { xors( "slide" ), 3 }, + { xors( "full" ), 2 } + }; + + static std::vector< dropdown_item_t< > > antiaim_edge = { + { xors( "off" ), 0 }, + { xors( "peek" ), 1 }, + { xors( "full" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > autostrafe_types = { + { xors( "none" ), 0 }, + { xors( "view" ), 1 }, + { xors( "view + movement" ), 2 } + }; + + static std::vector< dropdown_item_t< > > antiaim_edge_type = { + { xors( "static" ), 0 }, + { xors( "narrow angle" ), 1 }, + { xors( "wide angle" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > fakelag_types = { + { xors( "disabled" ), 0 }, + { xors( "adaptive" ), 1 }, + { xors( "fluctuate" ), 2 }, + { xors( "static" ), 3 }, + }; + + static std::vector< dropdown_item_t< > > fakelag_fix_types = { + { xors( "disabled" ), 0 }, + { xors( "wait" ), 1 }, + { xors( "predict" ), 2 } + }; + + static std::vector< dropdown_item_t< > > activation_type_visuals = { + { xors( "never" ), 0 }, + { xors( "always" ), 1 }, + { xors( "on hold" ), 2 }, + { xors( "toggle" ), 3 }, + }; + + static std::vector< dropdown_item_t< > > configs = { + { xors( "legit" ), 0 }, + { xors( "closet" ), 1 }, + { xors( "rage 1" ), 2 }, + { xors( "rage 2" ), 3 }, +#if _DEBUG + { xors( "test" ), 4 }, +#endif + }; + + static std::vector< dropdown_item_t< > > recorder_angles = { + { xors( "none" ), 0 }, + { xors( "shot" ), 1 }, + { xors( "all" ), 2 } + }; + + static std::vector< dropdown_item_t< > > baim_types = { + { xors( "off" ), 0 }, + { xors( "basic" ), 1 }, + { xors( "smart" ), 2 }, + { xors( "aggressive" ), 3 }, + { xors( "force" ), 4 }, + }; + + static std::vector< dropdown_item_t< > > name_changers = { + { xors( "off" ), 0 }, + { xors( "dollar" ), 1 }, + { xors( "moneybot.cc" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > weapon_esp_types = { + { xors( "none" ), 0 }, + { xors( "icon" ), 1 }, + { xors( "name" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > fake_ping_activation = { + { xors( "off" ), 0 }, + { xors( "on hold" ), 1 }, + { xors( "toggle" ), 2 }, + { xors( "always" ), 3 }, +#ifdef _DEBUG + { xors( "auto" ), 4 } +#endif + }; + + static std::vector< dropdown_item_t< > > world_esp_type = { + { xors( "off" ), 0 }, + { xors( "name" ), 1 }, + { xors( "glow" ), 2 }, + { xors( "both" ), 3 } + }; + + static std::vector< dropdown_item_t< > > multipoint_types = { + { xors( "off" ), 0 }, + { xors( "center" ), 1 }, + { xors( "edges" ), 2 }, + { xors( "full" ), 3 } + }; + + static std::vector< dropdown_item_t< > > edge_priority = { + { xors( "freestanding" ), 0 }, + { xors( "edge" ), 1 } + }; + + static std::vector< dropdown_item_t< > > selection_type = { + { xors( "fov" ), 0 }, + { xors( "distance" ), 1 }, + { xors( "simulation time" ), 2 } + }; + + static std::vector< dropdown_item_t< > > autobuy_main_wep = { + { xors( "none" ), 0 }, + { xors( "autosniper" ), 1 }, + { xors( "scout" ), 2 }, + { xors( "sniper" ), 3 }, + { xors( "ak/m4" ), 4 }, + { xors( "aug/sg" ), 5 }, + { xors( "mac10/mp9" ), 6 }, + }; + + static std::vector< dropdown_item_t< > > autobuy_second_wep = { + { xors( "none" ), 0 }, + { xors( "deagle/r8" ), 1 }, + { xors( "dualies" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > skin_knives = { + { xors( "none" ), 0 }, + { xors( "bayonet" ), 1 }, + { xors( "flip knife" ), 2 }, + { xors( "gut knife" ), 3 }, + { xors( "karambit" ), 4 }, + { xors( "m9 bayonet" ), 5 }, + { xors( "huntsman" ), 6 }, + }; + + static std::vector< dropdown_item_t< > > weapon_configs = { + { xors( "general" ), 0 }, + { xors( "heavy pistols" ), 1 }, + { xors( "snipers" ), 2 }, + { xors( "auto snipers" ), 3 } + }; + + static std::vector< dropdown_item_t< > > tracer_type = { + { xors( "none" ), 0 }, + { xors( "line" ), 1 }, + { xors( "beam" ), 2 } + }; + + static std::vector< dropdown_item_t< > > gloves = { + { xors( "none" ), 0 }, + { xors( "bloodhound" ), 5027 }, + { xors( "sporty" ), 5030 }, + { xors( "slick" ), 5031 }, + { xors( "handwrap" ), 5032 }, + { xors( "motorcycle" ), 5033 }, + { xors( "specialist" ), 5034 } + }; + + static std::vector< dropdown_item_t< > > glove_skins = { + { xors( "charred" ), 10006 }, + { xors( "snakebite" ), 10007 }, + { xors( "bronzed" ), 10008 }, + { xors( "leather" ), 10009 }, + { xors( "spruce ddpat" ), 10010 }, + { xors( "lunar weave" ), 10013 }, + { xors( "convoy" ), 10015 }, + { xors( "crimson weave" ), 10016 }, + { xors( "superconductor" ), 10018 }, + { xors( "arid" ), 10019 }, + { xors( "slaughter" ), 10021 }, + { xors( "eclipse" ), 10024 }, + { xors( "spearmint" ), 10026 }, + { xors( "boom!" ), 10027 }, + { xors( "cool mint" ), 10028 }, + { xors( "forest ddpat" ), 10030 }, + { xors( "crimson kimono" ), 10033 }, + { xors( "emerald web" ), 10034 }, + { xors( "foundation" ), 10035 }, + { xors( "badlands" ), 10036 }, + { xors( "pandora's box" ), 10037 }, + { xors( "hedge maze" ), 10038 }, + { xors( "guerrilla" ), 10039 }, + { xors( "diamondback" ), 10040 }, + { xors( "king snake" ), 10041 }, + { xors( "imperial plaid" ), 10042 }, + { xors( "overtake" ), 10043 }, + { xors( "racing green" ), 10044 }, + { xors( "amphibious" ), 10045 }, + { xors( "bronze morph" ), 10046 }, + { xors( "omega" ), 10047 }, + { xors( "vice" ), 10048 }, + { xors( "pow!" ), 10049 }, + { xors( "turtle" ), 10050 }, + { xors( "transport" ), 10051 }, + { xors( "polygon" ), 10052 }, + { xors( "cobalt skulls" ), 10053 }, + { xors( "overprint" ), 10054 }, + { xors( "duct tape" ), 10055 }, + { xors( "arboreal" ), 10056 }, + { xors( "emerald" ), 10057 }, + { xors( "mangrove" ), 10058 }, + { xors( "rattler" ), 10059 }, + { xors( "case hardened" ), 10060 }, + { xors( "crimson web" ), 10061 }, + { xors( "buckshot" ), 10062 }, + { xors( "fade" ), 10063 }, + { xors( "mogul" ), 10064 }, + }; + + static std::vector< dropdown_item_t< > > skins = { + { xors( "none" ), -1 }, + { xors( "groundwater" ), 2 }, + { xors( "candy apple" ), 3 }, + { xors( "forest ddpat" ), 5 }, + { xors( "arctic camo" ), 6 }, + { xors( "desert storm" ), 8 }, + { xors( "bengal tiger" ), 9 }, + { xors( "copperhead" ), 10 }, + { xors( "skulls" ), 11 }, + { xors( "crimson web" ), 12 }, + { xors( "blue streak" ), 13 }, + { xors( "red laminate" ), 14 }, + { xors( "gunsmoke" ), 15 }, + { xors( "jungle tiger" ), 16 }, + { xors( "urban ddpat" ), 17 }, + { xors( "virus" ), 20 }, + { xors( "granite marbleized" ), 21 }, + { xors( "contrast spray" ), 22 }, + { xors( "forest leaves" ), 25 }, + { xors( "lichen dashed" ), 26 }, + { xors( "bone mask" ), 27 }, + { xors( "anodized navy" ), 28 }, + { xors( "snake camo" ), 30 }, + { xors( "silver" ), 32 }, + { xors( "hot rod" ), 33 }, + { xors( "metallic ddpat" ), 34 }, + { xors( "ossified" ), 36 }, + { xors( "blaze" ), 37 }, + { xors( "fade" ), 38 }, + { xors( "bulldozer" ), 39 }, + { xors( "night" ), 40 }, + { xors( "copper" ), 41 }, + { xors( "blue steel" ), 42 }, + { xors( "stained" ), 43 }, + { xors( "case hardened" ), 44 }, + { xors( "contractor" ), 46 }, + { xors( "colony" ), 47 }, + { xors( "dragon tattoo" ), 48 }, + { xors( "lightning strike" ), 51 }, + { xors( "slaughter" ), 59 }, + { xors( "dark water" ), 60 }, + { xors( "hypnotic" ), 61 }, + { xors( "bloomstick" ), 62 }, + { xors( "cold blooded" ), 67 }, + { xors( "carbon fiber" ), 70 }, + { xors( "scorpion" ), 71 }, + { xors( "safari mesh" ), 72 }, + { xors( "wings" ), 73 }, + { xors( "polar camo" ), 74 }, + { xors( "blizzard marbleized" ), 75 }, + { xors( "winter forest" ), 76 }, + { xors( "boreal forest" ), 77 }, + { xors( "forest night" ), 78 }, + { xors( "orange ddpat" ), 83 }, + { xors( "pink ddpat" ), 84 }, + { xors( "mudder" ), 90 }, + { xors( "cyanospatter" ), 92 }, + { xors( "caramel" ), 93 }, + { xors( "grassland" ), 95 }, + { xors( "blue spruce" ), 96 }, + { xors( "ultraviolet" ), 98 }, + { xors( "sand dune" ), 99 }, + { xors( "storm" ), 100 }, + { xors( "tornado" ), 101 }, + { xors( "whiteout" ), 102 }, + { xors( "grassland leaves" ), 104 }, + { xors( "polar mesh" ), 107 }, + { xors( "condemned" ), 110 }, + { xors( "glacier mesh" ), 111 }, + { xors( "sand mesh" ), 116 }, + { xors( "sage spray" ), 119 }, + { xors( "jungle spray" ), 122 }, + { xors( "sand spray" ), 124 }, + { xors( "urban perforated" ), 135 }, + { xors( "waves perforated" ), 136 }, + { xors( "orange peel" ), 141 }, + { xors( "urban masked" ), 143 }, + { xors( "jungle dashed" ), 147 }, + { xors( "sand dashed" ), 148 }, + { xors( "urban dashed" ), 149 }, + { xors( "jungle" ), 151 }, + { xors( "demolition" ), 153 }, + { xors( "afterimage" ), 154 }, + { xors( "bullet rain" ), 155 }, + { xors( "death by kitty" ), 156 }, + { xors( "palm" ), 157 }, + { xors( "walnut" ), 158 }, + { xors( "brass" ), 159 }, + { xors( "splash" ), 162 }, + { xors( "modern hunter" ), 164 }, + { xors( "splash jam" ), 165 }, + { xors( "blaze orange" ), 166 }, + { xors( "radiation hazard" ), 167 }, + { xors( "nuclear threat" ), 168 }, + { xors( "fallout warning" ), 169 }, + { xors( "predator" ), 170 }, + { xors( "irradiated alert" ), 171 }, + { xors( "black laminate" ), 172 }, + { xors( "boom" ), 174 }, + { xors( "scorched" ), 175 }, + { xors( "faded zebra" ), 176 }, + { xors( "memento" ), 177 }, + { xors( "doomkitty" ), 178 }, + { xors( "nuclear threat" ), 179 }, + { xors( "fire serpent" ), 180 }, + { xors( "corticera" ), 181 }, + { xors( "emerald dragon" ), 182 }, + { xors( "overgrowth" ), 183 }, + { xors( "corticera" ), 184 }, + { xors( "golden koi" ), 185 }, + { xors( "wave spray" ), 186 }, + { xors( "zirka" ), 187 }, + { xors( "graven" ), 188 }, + { xors( "bright water" ), 189 }, + { xors( "black limba" ), 190 }, + { xors( "tempest" ), 191 }, + { xors( "shattered" ), 192 }, + { xors( "bone pile" ), 193 }, + { xors( "spitfire" ), 194 }, + { xors( "demeter" ), 195 }, + { xors( "emerald" ), 196 }, + { xors( "anodized navy" ), 197 }, + { xors( "hazard" ), 198 }, + { xors( "dry season" ), 199 }, + { xors( "mayan dreams" ), 200 }, + { xors( "palm" ), 201 }, + { xors( "jungle ddpat" ), 202 }, + { xors( "rust coat" ), 203 }, + { xors( "mosaico" ), 204 }, + { xors( "jungle" ), 205 }, + { xors( "tornado" ), 206 }, + { xors( "facets" ), 207 }, + { xors( "sand dune" ), 208 }, + { xors( "groundwater" ), 209 }, + { xors( "anodized gunmetal" ), 210 }, + { xors( "ocean foam" ), 211 }, + { xors( "graphite" ), 212 }, + { xors( "ocean foam" ), 213 }, + { xors( "graphite" ), 214 }, + { xors( "x-ray" ), 215 }, + { xors( "blue titanium" ), 216 }, + { xors( "blood tiger" ), 217 }, + { xors( "hexane" ), 218 }, + { xors( "hive" ), 219 }, + { xors( "hemoglobin" ), 220 }, + { xors( "serum" ), 221 }, + { xors( "blood in the water" ), 222 }, + { xors( "nightshade" ), 223 }, + { xors( "water sigil" ), 224 }, + { xors( "ghost camo" ), 225 }, + { xors( "blue laminate" ), 226 }, + { xors( "electric hive" ), 227 }, + { xors( "blind spot" ), 228 }, + { xors( "azure zebra" ), 229 }, + { xors( "steel disruption" ), 230 }, + { xors( "cobalt disruption" ), 231 }, + { xors( "crimson web" ), 232 }, + { xors( "tropical storm" ), 233 }, + { xors( "ash wood" ), 234 }, + { xors( "varicamo" ), 235 }, + { xors( "night ops" ), 236 }, + { xors( "urban rubble" ), 237 }, + { xors( "varicamo blue" ), 238 }, + { xors( "calicamo" ), 240 }, + { xors( "hunting blind" ), 241 }, + { xors( "army mesh" ), 242 }, + { xors( "gator mesh" ), 243 }, + { xors( "teardown" ), 244 }, + { xors( "army recon" ), 245 }, + { xors( "amber fade" ), 246 }, + { xors( "damascus steel" ), 247 }, + { xors( "red quartz" ), 248 }, + { xors( "cobalt quartz" ), 249 }, + { xors( "full stop" ), 250 }, + { xors( "pit viper" ), 251 }, + { xors( "silver quartz" ), 252 }, + { xors( "acid fade" ), 253 }, + { xors( "nitro" ), 254 }, + { xors( "asiimov" ), 255 }, + { xors( "the kraken" ), 256 }, + { xors( "guardian" ), 257 }, + { xors( "mehndi" ), 258 }, + { xors( "redline" ), 259 }, + { xors( "pulse" ), 260 }, + { xors( "marina" ), 261 }, + { xors( "rose iron" ), 262 }, + { xors( "rising skull" ), 263 }, + { xors( "sandstorm" ), 264 }, + { xors( "kami" ), 265 }, + { xors( "magma" ), 266 }, + { xors( "cobalt halftone" ), 267 }, + { xors( "tread plate" ), 268 }, + { xors( "the fuschia is now" ), 269 }, + { xors( "victoria" ), 270 }, + { xors( "undertow" ), 271 }, + { xors( "titanium bit" ), 272 }, + { xors( "heirloom" ), 273 }, + { xors( "copper galaxy" ), 274 }, + { xors( "red fragcam" ), 275 }, + { xors( "panther" ), 276 }, + { xors( "stainless" ), 277 }, + { xors( "blue fissure" ), 278 }, + { xors( "asiimov" ), 279 }, + { xors( "chameleon" ), 280 }, + { xors( "corporal" ), 281 }, + { xors( "redline" ), 282 }, + { xors( "trigon" ), 283 }, + { xors( "heat" ), 284 }, + { xors( "terrain" ), 285 }, + { xors( "antique" ), 286 }, + { xors( "pulse" ), 287 }, + { xors( "sergeant" ), 288 }, + { xors( "sandstorm" ), 289 }, + { xors( "guardian" ), 290 }, + { xors( "heaven guard" ), 291 }, + { xors( "death rattle" ), 293 }, + { xors( "green apple" ), 294 }, + { xors( "franklin" ), 295 }, + { xors( "meteorite" ), 296 }, + { xors( "tuxedo" ), 297 }, + { xors( "army sheen" ), 298 }, + { xors( "caged steel" ), 299 }, + { xors( "emerald pinstripe" ), 300 }, + { xors( "atomic alloy" ), 301 }, + { xors( "vulcan" ), 302 }, + { xors( "isaac" ), 303 }, + { xors( "slashed" ), 304 }, + { xors( "torque" ), 305 }, + { xors( "antique" ), 306 }, + { xors( "retribution" ), 307 }, + { xors( "kami" ), 308 }, + { xors( "howl" ), 309 }, + { xors( "curse" ), 310 }, + { xors( "desert warfare" ), 311 }, + { xors( "cyrex" ), 312 }, + { xors( "orion" ), 313 }, + { xors( "heaven guard" ), 314 }, + { xors( "poison dart" ), 315 }, + { xors( "jaguar" ), 316 }, + { xors( "bratatat" ), 317 }, + { xors( "road rash" ), 318 }, + { xors( "detour" ), 319 }, + { xors( "red python" ), 320 }, + { xors( "master piece" ), 321 }, + { xors( "nitro" ), 322 }, + { xors( "rust coat" ), 323 }, + { xors( "chalice" ), 325 }, + { xors( "knight" ), 326 }, + { xors( "chainmail" ), 327 }, + { xors( "hand cannon" ), 328 }, + { xors( "dark age" ), 329 }, + { xors( "briar" ), 330 }, + { xors( "royal blue" ), 332 }, + { xors( "indigo" ), 333 }, + { xors( "twist" ), 334 }, + { xors( "module" ), 335 }, + { xors( "desert-strike" ), 336 }, + { xors( "tatter" ), 337 }, + { xors( "pulse" ), 338 }, + { xors( "caiman" ), 339 }, + { xors( "jet set" ), 340 }, + { xors( "first class" ), 341 }, + { xors( "leather" ), 342 }, + { xors( "commuter" ), 343 }, + { xors( "dragon lore" ), 344 }, + { xors( "first class" ), 345 }, + { xors( "coach class" ), 346 }, + { xors( "pilot" ), 347 }, + { xors( "red leather" ), 348 }, + { xors( "osiris" ), 349 }, + { xors( "tigris" ), 350 }, + { xors( "conspiracy" ), 351 }, + { xors( "fowl play" ), 352 }, + { xors( "water elemental" ), 353 }, + { xors( "urban hazard" ), 354 }, + { xors( "desert-strike" ), 355 }, + { xors( "koi" ), 356 }, + { xors( "ivory" ), 357 }, + { xors( "supernova" ), 358 }, + { xors( "asiimov" ), 359 }, + { xors( "cyrex" ), 360 }, + { xors( "abyss" ), 361 }, + { xors( "labyrinth" ), 362 }, + { xors( "traveler" ), 363 }, + { xors( "business class" ), 364 }, + { xors( "olive plaid" ), 365 }, + { xors( "green plaid" ), 366 }, + { xors( "reactor" ), 367 }, + { xors( "setting sun" ), 368 }, + { xors( "nuclear waste" ), 369 }, + { xors( "bone machine" ), 370 }, + { xors( "styx" ), 371 }, + { xors( "nuclear garden" ), 372 }, + { xors( "contamination" ), 373 }, + { xors( "toxic" ), 374 }, + { xors( "radiation hazard" ), 375 }, + { xors( "chemical green" ), 376 }, + { xors( "hot shot" ), 377 }, + { xors( "fallout warning" ), 378 }, + { xors( "cerberus" ), 379 }, + { xors( "wasteland rebel" ), 380 }, + { xors( "grinder" ), 381 }, + { xors( "murky" ), 382 }, + { xors( "basilisk" ), 383 }, + { xors( "griffin" ), 384 }, + { xors( "firestarter" ), 385 }, + { xors( "dart" ), 386 }, + { xors( "urban hazard" ), 387 }, + { xors( "cartel" ), 388 }, + { xors( "fire elemental" ), 389 }, + { xors( "highwayman" ), 390 }, + { xors( "cardiac" ), 391 }, + { xors( "delusion" ), 392 }, + { xors( "tranquility" ), 393 }, + { xors( "cartel" ), 394 }, + { xors( "man-o'-war" ), 395 }, + { xors( "urban shock" ), 396 }, + { xors( "naga" ), 397 }, + { xors( "chatterbox" ), 398 }, + { xors( "catacombs" ), 399 }, + { xors( "dragon king" ), 400 }, + { xors( "system lock" ), 401 }, + { xors( "malachite" ), 402 }, + { xors( "deadly poison" ), 403 }, + { xors( "muertos" ), 404 }, + { xors( "serenity" ), 405 }, + { xors( "grotto" ), 406 }, + { xors( "quicksilver" ), 407 }, + { xors( "tiger tooth" ), 409 }, + { xors( "damascus steel" ), 410 }, + { xors( "damascus steel" ), 411 }, + { xors( "marble fade" ), 413 }, + { xors( "rust coat" ), 414 }, + { xors( "doppler" ), 415 }, + { xors( "doppler" ), 416 }, + { xors( "doppler" ), 417 }, + { xors( "doppler" ), 418 }, + { xors( "doppler" ), 419 }, + { xors( "doppler" ), 420 }, + { xors( "doppler" ), 421 }, + { xors( "elite build" ), 422 }, + { xors( "armor core" ), 423 }, + { xors( "worm god" ), 424 }, + { xors( "bronze deco" ), 425 }, + { xors( "valence" ), 426 }, + { xors( "monkey business" ), 427 }, + { xors( "eco" ), 428 }, + { xors( "djinn" ), 429 }, + { xors( "hyper beast" ), 430 }, + { xors( "heat" ), 431 }, + { xors( "man-o'-war" ), 432 }, + { xors( "neon rider" ), 433 }, + { xors( "origami" ), 434 }, + { xors( "pole position" ), 435 }, + { xors( "grand prix" ), 436 }, + { xors( "twilight galaxy" ), 437 }, + { xors( "chronos" ), 438 }, + { xors( "hades" ), 439 }, + { xors( "icarus fell" ), 440 }, + { xors( "minotaur's labyrinth" ), 441 }, + { xors( "asterion" ), 442 }, + { xors( "pathfinder" ), 443 }, + { xors( "daedalus" ), 444 }, + { xors( "hot rod" ), 445 }, + { xors( "medusa" ), 446 }, + { xors( "duelist" ), 447 }, + { xors( "pandora's box" ), 448 }, + { xors( "poseidon" ), 449 }, + { xors( "moon in libra" ), 450 }, + { xors( "sun in leo" ), 451 }, + { xors( "shipping forecast" ), 452 }, + { xors( "emerald" ), 453 }, + { xors( "para green" ), 454 }, + { xors( "akihabara accept" ), 455 }, + { xors( "hydroponic" ), 456 }, + { xors( "bamboo print" ), 457 }, + { xors( "bamboo shadow" ), 458 }, + { xors( "bamboo forest" ), 459 }, + { xors( "aqua terrace" ), 460 }, + { xors( "counter terrace" ), 462 }, + { xors( "terrace" ), 463 }, + { xors( "neon kimono" ), 464 }, + { xors( "orange kimono" ), 465 }, + { xors( "crimson kimono" ), 466 }, + { xors( "mint kimono" ), 467 }, + { xors( "midnight storm" ), 468 }, + { xors( "sunset storm" ), 469 }, + { xors( "sunset storm" ), 470 }, + { xors( "daybreak" ), 471 }, + { xors( "impact drill" ), 472 }, + { xors( "seabird" ), 473 }, + { xors( "aquamarine revenge" ), 474 }, + { xors( "hyper beast" ), 475 }, + { xors( "yellow jacket" ), 476 }, + { xors( "neural net" ), 477 }, + { xors( "rocket pop" ), 478 }, + { xors( "bunsen burner" ), 479 }, + { xors( "evil daimyo" ), 480 }, + { xors( "nemesis" ), 481 }, + { xors( "ruby poison dart" ), 482 }, + { xors( "loudmouth" ), 483 }, + { xors( "ranger" ), 484 }, + { xors( "handgun" ), 485 }, + { xors( "elite build" ), 486 }, + { xors( "cyrex" ), 487 }, + { xors( "riot" ), 488 }, + { xors( "torque" ), 489 }, + { xors( "frontside misty" ), 490 }, + { xors( "dualing dragons" ), 491 }, + { xors( "survivor z" ), 492 }, + { xors( "flux" ), 493 }, + { xors( "stone cold" ), 494 }, + { xors( "wraiths" ), 495 }, + { xors( "nebula crusader" ), 496 }, + { xors( "golden coil" ), 497 }, + { xors( "rangeen" ), 498 }, + { xors( "cobalt core" ), 499 }, + { xors( "special delivery" ), 500 }, + { xors( "wingshot" ), 501 }, + { xors( "green marine" ), 502 }, + { xors( "big iron" ), 503 }, + { xors( "kill confirmed" ), 504 }, + { xors( "scumbria" ), 505 }, + { xors( "point disarray" ), 506 }, + { xors( "ricochet" ), 507 }, + { xors( "fuel rod" ), 508 }, + { xors( "corinthian" ), 509 }, + { xors( "retrobution" ), 510 }, + { xors( "the executioner" ), 511 }, + { xors( "royal paladin" ), 512 }, + { xors( "power loader" ), 514 }, + { xors( "imperial" ), 515 }, + { xors( "shapewood" ), 516 }, + { xors( "yorick" ), 517 }, + { xors( "outbreak" ), 518 }, + { xors( "tiger moth" ), 519 }, + { xors( "avalanche" ), 520 }, + { xors( "teclu burner" ), 521 }, + { xors( "fade" ), 522 }, + { xors( "amber fade" ), 523 }, + { xors( "fuel injector" ), 524 }, + { xors( "elite build" ), 525 }, + { xors( "photic zone" ), 526 }, + { xors( "kumicho dragon" ), 527 }, + { xors( "cartel" ), 528 }, + { xors( "valence" ), 529 }, + { xors( "triumvirate" ), 530 }, + { xors( "royal legion" ), 532 }, + { xors( "the battlestar" ), 533 }, + { xors( "lapis gator" ), 534 }, + { xors( "praetorian" ), 535 }, + { xors( "impire" ), 536 }, + { xors( "hyper beast" ), 537 }, + { xors( "necropos" ), 538 }, + { xors( "jambiya" ), 539 }, + { xors( "lead conduit" ), 540 }, + { xors( "fleet flock" ), 541 }, + { xors( "judgement of anubis" ), 542 }, + { xors( "red astor" ), 543 }, + { xors( "ventilators" ), 544 }, + { xors( "orange crash" ), 545 }, + { xors( "firefight" ), 546 }, + { xors( "spectre" ), 547 }, + { xors( "chantico's fire" ), 548 }, + { xors( "bioleak" ), 549 }, + { xors( "oceanic" ), 550 }, + { xors( "asiimov" ), 551 }, + { xors( "fubar" ), 552 }, + { xors( "atlas" ), 553 }, + { xors( "ghost crusader" ), 554 }, + { xors( "re-entry" ), 555 }, + { xors( "primal saber" ), 556 }, + { xors( "black tie" ), 557 }, + { xors( "lore" ), 558 }, + { xors( "lore" ), 559 }, + { xors( "lore" ), 560 }, + { xors( "lore" ), 561 }, + { xors( "lore" ), 562 }, + { xors( "black laminate" ), 563 }, + { xors( "black laminate" ), 564 }, + { xors( "black laminate" ), 565 }, + { xors( "black laminate" ), 566 }, + { xors( "black laminate" ), 567 }, + { xors( "gamma doppler" ), 568 }, + { xors( "gamma doppler" ), 569 }, + { xors( "gamma doppler" ), 570 }, + { xors( "gamma doppler" ), 571 }, + { xors( "gamma doppler" ), 572 }, + { xors( "autotronic" ), 573 }, + { xors( "autotronic" ), 574 }, + { xors( "autotronic" ), 575 }, + { xors( "autotronic" ), 576 }, + { xors( "autotronic" ), 577 }, + { xors( "bright water" ), 578 }, + { xors( "bright water" ), 579 }, + { xors( "freehand" ), 580 }, + { xors( "freehand" ), 581 }, + { xors( "freehand" ), 582 }, + { xors( "aristocrat" ), 583 }, + { xors( "phobos" ), 584 }, + { xors( "violent daimyo" ), 585 }, + { xors( "wasteland rebel" ), 586 }, + { xors( "mecha industries" ), 587 }, + { xors( "desolate space" ), 588 }, + { xors( "carnivore" ), 589 }, + { xors( "exo" ), 590 }, + { xors( "imperial dragon" ), 591 }, + { xors( "iron clad" ), 592 }, + { xors( "chopper" ), 593 }, + { xors( "harvester" ), 594 }, + { xors( "reboot" ), 595 }, + { xors( "limelight" ), 596 }, + { xors( "bloodsport" ), 597 }, + { xors( "aerial" ), 598 }, + { xors( "ice cap" ), 599 }, + { xors( "neon revolution" ), 600 }, + { xors( "syd mead" ), 601 }, + { xors( "imprint" ), 602 }, + { xors( "directive" ), 603 }, + { xors( "roll cage" ), 604 }, + { xors( "scumbria" ), 605 }, + { xors( "ventilator" ), 606 }, + { xors( "weasel" ), 607 }, + { xors( "petroglyph" ), 608 }, + { xors( "airlock" ), 609 }, + { xors( "dazzle" ), 610 }, + { xors( "grim" ), 611 }, + { xors( "powercore" ), 612 }, + { xors( "triarch" ), 613 }, + { xors( "fuel injector" ), 614 }, + { xors( "briefing" ), 615 }, + { xors( "slipstream" ), 616 }, + { xors( "doppler" ), 617 }, + { xors( "doppler" ), 618 }, + { xors( "doppler" ), 619 }, + { xors( "ultraviolet" ), 620 }, + { xors( "ultraviolet" ), 621 }, + { xors( "polymer" ), 622 }, + { xors( "ironwork" ), 623 }, + { xors( "dragonfire" ), 624 }, + { xors( "royal consorts" ), 625 }, + { xors( "mecha industries" ), 626 }, + { xors( "cirrus" ), 627 }, + { xors( "stinger" ), 628 }, + { xors( "black sand" ), 629 }, + { xors( "sand scale" ), 630 }, + { xors( "flashback" ), 631 }, + { xors( "buzz kill" ), 632 }, + { xors( "sonar" ), 633 }, + { xors( "gila" ), 634 }, + { xors( "turf" ), 635 }, + { xors( "shallow grave" ), 636 }, + { xors( "cyrex" ), 637 }, + { xors( "wasteland princess" ), 638 }, + { xors( "bloodsport" ), 639 }, + { xors( "fever dream" ), 640 }, + { xors( "jungle slipstream" ), 641 }, + { xors( "blueprint" ), 642 }, + { xors( "xiangliu" ), 643 }, + { xors( "decimator" ), 644 }, + { xors( "oxide blaze" ), 645 }, + { xors( "capillary" ), 646 }, + { xors( "crimson tsunami" ), 647 }, + { xors( "emerald poison dart" ), 648 }, + { xors( "akoben" ), 649 }, + { xors( "ripple" ), 650 }, + { xors( "last dive" ), 651 }, + { xors( "scaffold" ), 652 }, + { xors( "neo-noir" ), 653 }, + { xors( "seasons" ), 654 }, + }; + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_form.h b/cheat/internal_rewrite/ui_form.h new file mode 100644 index 0000000..9dbe68e --- /dev/null +++ b/cheat/internal_rewrite/ui_form.h @@ -0,0 +1,187 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_form : public base_item { + public: + c_form( int x, int y, int w, int h, const char* name, int max_h = 0, bool collapse = false, bool default_collapsed = false ) : + base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ), m_collapse( collapse ), m_open( !default_collapsed ) { }; + + virtual int x( ) const override { + return m_x + 10; + } + + virtual int y( ) const override { + return m_y + m_scroll_offset + 9; + } + + virtual bool is_form( ) const override { + return true; + } + + virtual bool is_hovered( ) override { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ); + int y = get_relative_y( ); + + return mouse_x > x && mouse_x < x + w( ) + && mouse_y > y && mouse_y < y + h( ); + } + + bool is_collapse_hovered( ) { + if( !m_collapse ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ) + m_width - 8; + int y = get_relative_y( ) + 2; + + return mouse_x >= x && mouse_x <= x + 5 + && mouse_y >= y && mouse_y <= y + 7; + } + + bool is_collapsed( ) { + return ( m_collapse && !m_open ); + } + + inline void update_size( ) { + if ( !m_dynamic ) return; + + int total_height{ ITEM_OFFSET * 2 }; + for ( auto& it : m_items ) { + if ( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + if( m_max_height && total_height + item_height > m_max_height ) { + total_height = m_max_height; + break; + } + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + m_height = total_height; + } + + virtual int get_total_height( ) const override { + if( !m_open && m_collapse ) return 18; + return m_height + 5; + } + + int get_total_item_height( ) { + int total_height{ ITEM_OFFSET * 2 }; + for( auto& it : m_items ) { + if( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + return total_height; + } + + void input( ) { + if( m_collapse ) { + bool hovered = is_collapse_hovered( ); + bool clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + if( hovered && clicked ) { + if( !m_was_pressed ) { + m_open ^= 1; + } + m_was_pressed = true; + } + else { + m_was_pressed = false; + } + } + + if( m_max_height && get_total_item_height( ) > m_max_height ) { + if( !m_disabled && is_hovered( ) ) { + auto scroll_state = g_input.get_scroll_state( ); + if( !!scroll_state && m_was_hovered ) { + scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; + } + } + m_scroll_offset = std::min< int >( std::max< int >( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ) ), 0 ); + } + else { + m_scroll_offset = 0; + } + } + + virtual void render( ) override { + update_size( ); + input( ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int text_w, text_h; + ui_get_text_size( text_w, text_h, m_text ); + + if( m_collapse ) { + if( !m_open && m_collapse ) { + ui_draw_outlined_rect( x, y, m_width, 14, ui_get_accent_col( ) ); + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "+" ); + return; + } + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); + } + + ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_max_height && get_total_item_height( ) > m_height ) { + const size_t height = get_total_height( ) - 20; + const float delta = ( float )( get_total_item_height( ) - height + 1 ); + const float slider_step = ( ( float )( height ) / delta ); + const float slider_height = slider_step * 13.f; + + size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); + ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); + ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); + } + + if( is_hovered( ) != m_was_hovered ) { + bool backup = m_disabled; + if( !backup ) { + set_disabled( !is_hovered( ) ); + } + m_disabled = backup; + } + + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + if( m_collapse ) { + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "-" ); + } + + m_was_hovered = is_hovered( ); + } + + protected: + bool m_dynamic{ }; + bool m_was_hovered{ }; + int m_max_height{ }; + int m_scroll_offset{ }; + bool m_was_pressed{ }; + bool m_collapse{ }; + bool m_open{ true }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_itemlist.h b/cheat/internal_rewrite/ui_itemlist.h new file mode 100644 index 0000000..e692746 --- /dev/null +++ b/cheat/internal_rewrite/ui_itemlist.h @@ -0,0 +1,127 @@ +#pragma once +#include "ui_base_item.h" +#include "ui_dropdown_item.h" + +#include + +namespace ui +{ + template < typename t, size_t size > + class c_itemlist : public base_item { + public: + static constexpr size_t ITEM_SIZE = 18; + + c_itemlist( int x, int y, int width, const char* name, std::vector< dropdowns::dropdown_item_t< t > >* dropdowns, t* setting ) + : base_item( x, y, width, 20, name ), m_items( dropdowns ), m_setting( setting ) { } + + void text_input( ); + bool is_textbox_hovered( ) { + if( m_disabled ) + return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + + int mx, my; + ui_get_cursor_pos( mx, my ); + + return mx >= x && my >= y + && mx <= x + m_width && my <= y + ITEM_SIZE; + } + + void input( ) { + text_input( ); + } + + virtual int get_total_height( ) const override { + size_t total_items = 0; + + if( strlen( m_search_text ) ) { + for( size_t i{ }; i < m_items->size( ); ++i ) { + if( !strstr( m_items->at( i ).m_name, m_search_text ) ) + continue; + + ++total_items; + } + } + else + total_items = m_items->size( ); + + return 12 + 20 + total_items * 20; + } + + bool is_item_hovered( int x, int y ) { + if( m_disabled ) + return false; + + int mx, my; + ui_get_cursor_pos( mx, my ); + + return mx >= x && mx <= x + m_width + && my >= y && my <= y + ITEM_SIZE; + } + + void draw_items( int x, int y ) { + int max_y = INT_MAX; + + auto parent = get_parent( ); + if( parent->is_form( ) ) { + max_y = parent->get_relative_y( ) + parent->get_total_height( ) + ITEM_SIZE; + } + + std::string search_str( m_search_text ); + std::transform( search_str.begin( ), search_str.end( ), search_str.begin( ), [ ]( char c ) { return tolower( c ); } ); + + int text_len = strlen( m_search_text ); + for( size_t i{ }; i < m_items->size( ); ++i ) { + if( y > max_y ) + break; + + auto& item = m_items->at( i ); + + if( !strstr( item.m_name, m_search_text ) ) + continue; + + ui_draw_rect( x - 1, y - 1, m_width + 2, ITEM_SIZE + 2, + is_item_hovered( x, y ) || *m_setting == item.m_value + ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + ui_draw_rect( x, y, m_width, ITEM_SIZE, ui_get_disabled_col( ) ); + + ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), item.m_name ); + + if( g_input.is_key_pressed( KEYS_MOUSE1 ) && is_item_hovered( x, y ) ) + *m_setting = item.m_value; + + y += ITEM_SIZE + 2; + } + } + + virtual void render( ) override { + input( ); + + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + + ui_draw_rect( x - 1, y + 12, m_width + 2, ITEM_SIZE + 2, is_textbox_hovered( ) || m_box_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + if( is_textbox_hovered( ) ) { + ui_draw_rect( x, y + 13, m_width, ITEM_SIZE, ui_get_text_col( ) ); + } + ui_draw_rect( x + 1, y + 14, m_width - 2, ITEM_SIZE - 2, ui_get_disabled_col( ) ); + ui_draw_string( x + 3, y + 17, false, ui_get_text_col( ), m_box_active ? "%s_" : "%s", m_search_text ); + + draw_items( x, y + 14 + ITEM_SIZE ); + } + + private: + std::vector< dropdowns::dropdown_item_t< t > >* m_items; + bool m_box_active{ }; + bool m_was_held{ }; + char m_search_text[ size ]{ }; + float m_last_key_input[ KEYS_LAST ]{ }; + uint8_t m_key_states[ 256 ]{ }; + t* m_setting{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_itemlist_def.h b/cheat/internal_rewrite/ui_itemlist_def.h new file mode 100644 index 0000000..fd64f12 --- /dev/null +++ b/cheat/internal_rewrite/ui_itemlist_def.h @@ -0,0 +1,61 @@ +#include "ui_itemlist.h" +#include + +namespace ui +{ + template < typename t, size_t size > + void c_itemlist< t, size >::text_input( ) { + if( is_textbox_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if( !m_was_held ) { + m_box_active ^= 1; + } + m_was_held = true; + } + else { + m_was_held = false; + } + + if( m_box_active ) { + if( !is_textbox_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_box_active = false; + } + + float current_time = GetTickCount( ) * 0.001f; + size_t length = strlen( m_search_text ); + + for( size_t i{ }; i < 0xfe; ++i ) { + if( g_input.is_key_pressed( i ) ) { + float delta_time = current_time - m_last_key_input[ i ]; + if( fabs( delta_time ) > 0.2f ) { + if( i == KEYS_BACK ) { + m_search_text[ length - 1 ] = 0; + m_last_key_input[ i ] = current_time; + continue; + } + + m_key_states[ i ] = 0xf0; + wchar_t pressed_char; + const auto scan = MapVirtualKeyA( i, 2 ); + auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); + + if( ret == 1 ) { + if( length < size ) { + m_search_text[ length ] = ( char )( pressed_char ); + m_search_text[ length + 1 ] = 0; + } + } + m_last_key_input[ i ] = current_time; + } + } + else { + m_last_key_input[ i ] = 0.f; + m_key_states[ i ] = 0; + } + } + + if( g_input.is_key_pressed( KEYS_RETURN ) ) { + m_box_active = false; + } + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_key_picker.h b/cheat/internal_rewrite/ui_key_picker.h new file mode 100644 index 0000000..dea681c --- /dev/null +++ b/cheat/internal_rewrite/ui_key_picker.h @@ -0,0 +1,164 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_key_picker : public base_item { + public: + c_key_picker( int x, int y, int w, const char* name, int* setting ) : + base_item( x, y, w, 16, name ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 12; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), + g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); + } + + protected: + int* m_setting{ }; + bool m_active{ }; + bool m_mouse_held{ }; + }; + + //skEeT PiCkErS + class c_key_picker_small : public base_item { + public: + c_key_picker_small( int x, int y, int* setting ) : + base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } + + virtual int get_total_height( ) const override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int w, h; + ui_get_text_size( w, h, name ); + + return h; + } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + int mouse_x, mouse_y; + int w, h; + + ui_get_text_size( w, h, "[%s]", name ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= x - w && mouse_x <= x + && mouse_y >= y && mouse_y <= y + h; + } + + void input( ) { + + bool active_backup = m_active; + bool active_changed = false; + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int w, h; + ui_get_text_size( w, h, "[%s]", name ); + + input( ); + + ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? + ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); + } + + protected: + int* m_setting; + bool m_active{ }; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_label.h b/cheat/internal_rewrite/ui_label.h new file mode 100644 index 0000000..712b547 --- /dev/null +++ b/cheat/internal_rewrite/ui_label.h @@ -0,0 +1,18 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_label : public base_item { + public: + c_label( int x, int y, const char* text ) : + base_item( x, y, 0, 16, text ) { } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); + } + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_menu.h b/cheat/internal_rewrite/ui_menu.h new file mode 100644 index 0000000..37b16f9 --- /dev/null +++ b/cheat/internal_rewrite/ui_menu.h @@ -0,0 +1,89 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_menu : public base_item { + public: + c_menu( int start_x, int start_y, int width, + int height, const char* name, const char* right_text = nullptr ) : + base_item( start_x, start_y, width, height, name ), + m_right_text( right_text ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= m_x && mouse_x <= m_x + w( ) + && mouse_y >= m_y && mouse_y <= m_y + 19; + } + + virtual int y( ) const override { + return m_y + 19; + } + + inline void input( ) { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) ) { + m_mouse_held = true; + } + + if ( !mouse_clicked ) { + m_mouse_held = is_hovered( ); + } + + if ( m_mouse_held && !mouse_clicked ) { + m_drag_offset_y = mouse_y - m_y; + m_drag_offset_x = mouse_x - m_x; + } + + if ( m_mouse_held && mouse_clicked ) { + m_x = mouse_x - m_drag_offset_x; + m_y = mouse_y - m_drag_offset_y; + } + } + + virtual void render( ) override { + constexpr auto top_height = 19; + + input( ); + + //draw a c00l shadow + ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); + + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); + if( is_hovered( ) ) { + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); + } + ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_right_text ) { + ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); + + int width, height; + ui_get_text_size( width, height, m_right_text ); + + ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); + } + else { + ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); + } + } + + protected: + int m_drag_offset_x{ }; + int m_drag_offset_y{ }; + bool m_mouse_held{ }; + const char* m_right_text{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_render.h b/cheat/internal_rewrite/ui_render.h new file mode 100644 index 0000000..1f10223 --- /dev/null +++ b/cheat/internal_rewrite/ui_render.h @@ -0,0 +1,63 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + //recursively render all items + static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { + if( !item->get_visible( ) ) return; + + item->reset( ); + item->render( ); + bool reset = false; + RECT original; + + if( allow_rect && item->is_form( ) ) { + auto device = g_d3d.get_device( ); + device->GetScissorRect( &original ); + + auto x = item->get_relative_x( ); + auto y = item->get_relative_y( ); + + RECT new_rect{ + x, + y + 4, + x + item->w( ), + y + item->get_total_height( ) - 7 + }; + + device->SetScissorRect( &new_rect ); + reset = true; + } + + bool draw = true; + if( item->is_form( ) ) { + auto form_cast = static_cast< c_form* >( item ); + draw = !form_cast->is_collapsed( ); + } + + if( item->get_items( ).size( ) && draw ) { + //madr0fl + int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); + int cur_offset = 0; + for( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { + auto& cur_item = item->get_items( )[ i ]; + height_offset[ i ] = cur_offset; + cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; + } + + int i{ }; + for( auto& it : item->get_items( ) ) { + item->set_y_offset( height_offset[ i ] ); + render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); + ++i; + } + } + + if( reset ) { + auto device = g_d3d.get_device( ); + device->SetScissorRect( &original ); + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_slider.h b/cheat/internal_rewrite/ui_slider.h new file mode 100644 index 0000000..8f54b3c --- /dev/null +++ b/cheat/internal_rewrite/ui_slider.h @@ -0,0 +1,175 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + template < typename t > + class c_slider : public base_item { + public: + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + if( !m_has_text ) { + x += 4; + return mouse_x >= x && mouse_x <= x + m_width - 8 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + void input( ) { + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + bool hovered = is_hovered( ); + float progress = 0.f; + int x = get_relative_x( ); + int y = get_relative_y( ) + 2; + int mouse_x, mouse_y; + + *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + if ( hovered && mouse_clicked ) { + + float progress{ }; + + if( m_has_text ) { + progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); + } + else { + progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); + } + + *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); + } + + if( !m_has_text ) { + bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; + + bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; + bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; + + if( mouse_clicked ) { + if( !m_mouse_held ) { + if( !std::is_floating_point< t >::value ) { + if( minus_hovered ) *m_setting -= ( t )1; + if( plus_hovered ) *m_setting += ( t )1; + } + else if( m_max - m_min <= 2.0f ) { + if( minus_hovered ) *m_setting -= ( t )0.1f; + if( plus_hovered ) *m_setting += ( t )0.1f; + } + } + + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + }; + + void draw_slider( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + } + + void draw_slider_small( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + x -= 1; //i couldnt be fucked + + ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + + ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); + ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); + + char val_str[ 12 ]; + if( m_suffix ) + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + int text_h, text_w; + ui_get_text_size( text_w, text_h, val_str ); + ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ), y + 2, false, ui_get_text_col( ), val_str ); + } + + virtual int get_total_height( ) const override { + return m_height + ( m_has_text ? 12 : 6 ); + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + int text_w, text_h; + char val[ 12 ]; + + input( ); + + //weird hacky fix for floating point vars + if ( m_suffix ) + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + if( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_get_text_size( text_w, text_h, val ); + ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); + draw_slider( x, y + 12 ); + } + else { + draw_slider_small( x, y + 2 ); + } + } + + void set_min( float min ) { + m_min = min; + } + + void set_max( float max ) { + m_max = max; + } + + + protected: + t* m_setting; + t m_full; + float m_min; + float m_max; + bool m_has_text = true; + const char* m_suffix; + bool m_mouse_held = false; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_tab_manager.h b/cheat/internal_rewrite/ui_tab_manager.h new file mode 100644 index 0000000..293d48b --- /dev/null +++ b/cheat/internal_rewrite/ui_tab_manager.h @@ -0,0 +1,227 @@ +#pragma once +#include "ui_base_item.h" + + + +namespace ui +{ + namespace { + constexpr int BUTTON_WIDTH = 120; + constexpr int BUTTON_HEIGHT = 80; + + constexpr int SUBTAB_HEIGHT = 25; + } + + class c_tab_sheet : public base_item { + public: + c_tab_sheet( const char* tab_name ) : + base_item( 0, 0, 0, 0, tab_name ), + m_fade_progress( 0 ) { }; + + c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : + base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), + m_fade_progress( 0.f ) { }; + + virtual void render( ) override { }; + virtual bool is_hovered( ) override { + return false; + }; + + public: + float m_fade_progress{ }; + d3d::c_sprite* m_sprite{ }; + }; + + + class c_tab_manager : public base_item { + public: + c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, + xors( "TAB_MANAGER" ) ) { }; + + virtual bool is_hovered( ) override { + return false; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto text = item->get_text( ); + auto parent_x = m_parent->x( ) + 5; + auto parent_y = m_parent->y( ) + 5; + int item_height = BUTTON_HEIGHT; + + scale_button_fade( item, hovered ); + + ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, + item_height + 1, ui_get_bg_col( ) ); + + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_disabled_col( ) ); + + if( hovered ) { + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); + } + + if( item->m_sprite ) { + auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); + item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, + parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); + } + else { + g_con->log( "sprite is null" ); + } + } + + inline bool is_button_hovered( int start ) { + auto item_x = m_parent->x( ) + 5; + auto item_y = m_parent->y( ) + 5 + start; + int item_height = BUTTON_HEIGHT; + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 + && mouse_y >= item_y && mouse_y <= item_y + item_height; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int cur_y{ 10 }; + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( cur_y ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); + cur_y += BUTTON_HEIGHT + 4; + } + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + + protected: + decltype( m_parent ) m_selected_tab{ }; + }; + + + class c_subtab_manager : public base_item { + public: + c_subtab_manager( ) : base_item( 0, 35, 0, 5, + xors( "SUBTAB_MANAGER" ) ) { } + + virtual bool is_hovered( ) override { return false; } + + int get_button_width( ) { + int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; + + if ( !m_items.empty( ) ) + return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); + + return width; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void render_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto item_x = get_relative_x( ) + start - 2; + auto item_y = get_relative_y( ) + 3 - m_y; + auto width = get_button_width( ); + + scale_button_fade( item, hovered ); + clr_t tab_clr = ui_get_disabled_col( ); + + //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); + if ( hovered ) { + clr_t col = ui_get_accent_col( ); + col.a( ) *= item->m_fade_progress; + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); + } + + ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); + } + + bool is_button_hovered( decltype( m_parent )& button, int start ) { + int item_x = get_relative_x( ) + start - 2; + int item_y = get_relative_y( ) + 3 - m_y - 3; + int item_w = get_button_width( ); + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + item_w && + mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int start = 2; + int width = get_button_width( ); + + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( it, start ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + render_button( it, start, hovered || it == m_selected_tab ); + start += width; + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + } + + protected: + decltype( m_parent ) m_selected_tab; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_text_input.cpp b/cheat/internal_rewrite/ui_text_input.cpp new file mode 100644 index 0000000..f2c3530 --- /dev/null +++ b/cheat/internal_rewrite/ui_text_input.cpp @@ -0,0 +1,83 @@ +#include "ui_text_input.h" +#include + +void ui::c_text_input::render( ) { + if( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if( !m_was_held ) { + m_active ^= 1; + } + m_was_held = true; + } + else { + m_was_held = false; + } + + if( m_active ) { + if( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_active = false; + } + + float current_time = GetTickCount( ) * 0.001f; + size_t length = strlen( m_text_ptr ); + + for( size_t i{ }; i < 0xfe; ++i ) { + if( g_input.is_key_pressed( i ) ) { + float delta_time = current_time - m_last_key_input[ i ]; + if( fabs( delta_time ) > 0.2f ) { + if( i == KEYS_BACK ) { + m_text_ptr[ length - 1 ] = 0; + m_last_key_input[ i ] = current_time; + continue; + } + + if( i == KEYS_RETURN ) { + m_active = false; + break; + } + + m_key_states[ i ] = 0xf0; + wchar_t pressed_char; + const auto scan = MapVirtualKeyA( i, 2 ); + auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); + + if( ret == 1 ) { + if( length < m_text_len ) { + m_text_ptr[ length ] = ( char )( pressed_char ); + m_text_ptr[ length + 1 ] = 0; + } + } + m_last_key_input[ i ] = current_time; + } + } + else { + m_last_key_input[ i ] = 0.f; + m_key_states[ i ] = 0; + } + } + + if( g_input.is_key_pressed( KEYS_RETURN ) ) { + m_active = false; + } + } + + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + y += 12; + + ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, + ( is_hovered( ) || m_active ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + if( !m_hidden ) + ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), m_active ? "%s_" : "%s", m_text_ptr ); + else { + std::string str; + str.append( "*", strlen( m_text_ptr ) ); + if( m_active ) + str += '_'; + + ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), str.c_str( ) ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/ui_text_input.h b/cheat/internal_rewrite/ui_text_input.h new file mode 100644 index 0000000..243c40b --- /dev/null +++ b/cheat/internal_rewrite/ui_text_input.h @@ -0,0 +1,38 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_text_input : public base_item { + public: + c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str, bool hidden = false ) : + base_item( x, y, w, 16, name ), m_text_len( max_chars ), m_text_ptr( str ), m_hidden( hidden ) { + } + + virtual bool is_hovered( ) override { + int cursor_x, cursor_y; + ui_get_cursor_pos( cursor_x, cursor_y ); + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + + return cursor_x >= x && cursor_x <= x + m_width + && cursor_y >= y && cursor_y <= y + m_height; + } + + virtual int get_total_height( ) const override { + return m_height + 12; + } + + virtual void render( ) override; + + protected: + bool m_was_held{ }; + char* m_text_ptr{ }; + size_t m_text_len{ }; + bool m_active{ }; + float m_last_key_input[ KEYS_LAST ]{ }; + uint8_t m_key_states[ 256 ]{ }; + bool m_hidden{ }; + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/update_clientside_animation.cpp b/cheat/internal_rewrite/update_clientside_animation.cpp new file mode 100644 index 0000000..201d100 --- /dev/null +++ b/cheat/internal_rewrite/update_clientside_animation.cpp @@ -0,0 +1,48 @@ +#include "hooks.hpp" +#include "context.hpp" +#include "base_cheat.hpp" + +void __fastcall hooks::update_clientside_animation( void* ecx_, void* edx_ ) { + static bool first_update = true; + + auto old_func = update_clientside_animation_o; + + if( ecx_ != g_ctx.m_local ) + return old_func( ecx_, 0 ); + + auto ent = ( c_base_player* )( ecx_ ); + + static float last_update; + static float last_spawntime = 0.f; + + // Arbitrary number much. + if( !g_settings.rage.anti_aim || !g_ctx.m_local->is_valid( ) || std::abs( last_update - g_csgo.m_globals->m_curtime ) > TICKS_TO_TIME( 20 ) || last_spawntime != ent->m_flSpawnTime( ) ) { + last_update = g_csgo.m_globals->m_curtime; + first_update = true; + + if( last_spawntime != ent->m_flSpawnTime( ) ) + last_spawntime = ent->m_flSpawnTime( ); + + return old_func( ecx_, edx_ ); + } + + last_update = g_csgo.m_globals->m_curtime; + + ent->get_animstate( )->m_iLastClientSideAnimationUpdateFramecount = g_csgo.m_globals->m_framecount; + old_func( ecx_, edx_ ); + + if( !first_update ) { + g_ctx.m_local->restore_anim_data( true ); + + ent->set_abs_angles( vec3_t( 0, g_ctx.m_absyaw, 0 ) ); + bool backup = ent->get_animstate( )->m_bOnGround; + ent->get_animstate( )->m_bOnGround = false; + + ent->invalidate_bone_cache( ); + ent->ce( )->SetupBones( nullptr, 128, BONE_USED_BY_ANYTHING, 0.f ); + + ent->get_animstate( )->m_bOnGround = backup; + } + + first_update = false; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/util.cpp b/cheat/internal_rewrite/util.cpp new file mode 100644 index 0000000..1d19f9a --- /dev/null +++ b/cheat/internal_rewrite/util.cpp @@ -0,0 +1,575 @@ +#include "util.hpp" + +#include "interface.hpp" +#include "c_base_player.hpp" +#include "pattern.hpp" +#include "context.hpp" +#include "settings.hpp" +#include "math.hpp" +#include "base_cheat.hpp" + +float TICK_INTERVAL( ) { + return g_csgo.m_globals->m_interval_per_tick; +} + +int TIME_TO_TICKS( float dt ) { + return static_cast< int >( 0.5f + dt / TICK_INTERVAL( ) ); +} + +float TICKS_TO_TIME( int tick ) { + return tick * TICK_INTERVAL( ); +} + +bool util::is_low_fps( ) { + return g_csgo.m_globals->m_frametime > g_csgo.m_globals->m_interval_per_tick; +} + +int util::get_closest_player( bool dist ) { + float cur_fov = FLT_MAX; + int ret{ -1 }; + vec3_t viewangles{ }; + vec3_t local_pos{ }; + + bool friendlies = g_settings.rage.active ? + g_settings.rage.friendlies : g_settings.legit.friendlies; + + local_pos = g_ctx.m_local->get_eye_pos( ); + g_csgo.m_engine( )->GetViewAngles( viewangles ); + + for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent ) continue; + if( ent == g_ctx.m_local ) continue; + if( !ent->is_valid( ) ) continue; + int team = ent->m_iTeamNum( ); + if( team == g_ctx.m_local->m_iTeamNum( ) && !friendlies ) { + continue; + } + + float distance = 0.f; + if( dist ) { + distance = g_ctx.m_local->m_vecOrigin( ).dist_to( ent->m_vecOrigin( ) ); + } + else { + auto ang = math::vector_angles( local_pos, ent->get_hitbox_pos( 0 ) ); + ang.clamp( ); + distance = ( viewangles - ang ).clamp( ).length2d( ); + } + + if( distance < cur_fov ) { + ret = i; + cur_fov = distance; + } + } + + return ret; +} + +void util::clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* tr ) { + CGameTrace player_trace; + Ray_t ray; + float smallest_fraction = tr->fraction; + + ray.Init( src, end ); + + if ( !filter->ShouldHitEntity( player, mask ) ) { + return; + } + + g_csgo.m_trace( )->ClipRayToEntity( ray, mask | CONTENTS_HITBOX, player, &player_trace ); + + if ( player_trace.fraction < smallest_fraction ) { + *tr = player_trace; + smallest_fraction = player_trace.fraction; + } +} + +std::string util::hitgroup_to_string( int hitgroup ) { + switch( hitgroup ) { + case HITGROUP_CHEST: + return xors( "chest" ); + case HITGROUP_HEAD: + return xors( "head" ); + case HITGROUP_LEFTARM: + return xors( "left arm" ); + case HITGROUP_LEFTLEG: + return xors( "left leg" ); + case HITGROUP_RIGHTARM: + return xors( "right arm" ); + case HITGROUP_RIGHTLEG: + return xors( "right leg" ); + case HITGROUP_STOMACH: + return xors( "stomach" ); + default: + return xors( "generic" ); + } +} + +bool util::trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ) { + CGameTrace tr; + Ray_t ray; + CTraceFilter filter; + + filter.pSkip = a; + + ray.Init( start, end ); + + g_csgo.m_trace( )->TraceRay( ray, 0x46004003 | CONTENTS_HITBOX, &filter, &tr ); + clip_trace_to_player( b, start, end, ( unsigned )0x46004003, &filter, &tr ); + + return tr.m_pEnt == b || tr.fraction > 0.98f; +} + +void util::set_random_seed( int seed ) { + using fn = int( __cdecl* )( int ); + fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomSeed" ) ) ); + + fn_ptr( seed ); +} + +float util::get_random_float( float min, float max ) { + using fn = float( *)( float, float ); + fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomFloat" ) ) ); + + return fn_ptr( min, max ); +} + +std::array< util::hitchance_data_t, 256 > hitchance_data; +void util::calculate_spread_runtime( ) { + constexpr float pi_2 = 2.0f * ( float ) M_PI; + + for ( size_t n { }; n < 256; ++n ) { + set_random_seed( n ); + + const float rand_a = get_random_float( 0.0f, 1.0f ); + const float rand_pi_a = get_random_float( 0.0f, pi_2 ); + const float rand_b = get_random_float( 0.0f, 1.0f ); + const float rand_pi_b = get_random_float( 0.0f, pi_2 ); + + hitchance_data [ n ] = { + { rand_a, rand_b }, + { std::cos( rand_pi_a ), std::sin( rand_pi_a ) }, + { std::cos( rand_pi_b ), std::sin( rand_pi_b ) } + }; + } +} + +// This is gay, I didn't want to fuck up the project. +vec3_t util::get_spread_dir( void *weapon, float inaccuracy, float spread, vec3_t angles, int seed ) { + const int rnsd = ( seed & 0xFF ); + const auto *data = &hitchance_data [ rnsd ]; + auto *wpn = ( c_base_weapon * ) weapon; + + if ( !wpn ) + return vec3_t{ }; + + float rand_a = data->m_random[ 0 ]; + float rand_b = data->m_random[ 1 ]; + + const uint16_t item_def = wpn->m_iItemDefinitionIndex( ); + + // Because fuck you. + if ( item_def == WEAPON_NEGEV ) { + const int recoil_seed = wpn->get_wpn_info( )->recoil_seed; + + if ( recoil_seed < 3 ) { + // Shoutouts to toast for the epic simplified math :^) + rand_a = 1.0f - std::powf( rand_a, ( 3 - recoil_seed ) + 1 ); + rand_b = 1.0f - std::powf( rand_b, ( 3 - recoil_seed ) + 1 ); + } + } + + // Calculate spread. + const float rand_inacc = rand_a * g_ctx.m_weapon_inaccuracy; + const float rand_spread = rand_b * g_ctx.m_weapon_spread; + + const float spread_x = data->m_inaccuracy [ 0 ] * rand_inacc + data->m_spread [ 0 ] * rand_spread; + const float spread_y = data->m_inaccuracy [ 1 ] * rand_inacc + data->m_spread [ 1 ] * rand_spread; + + // Transform angle to direction. + vec3_t forward, right, up; + math::angle_vectors( angles, &forward, &right, &up ); + + return forward + right * spread_x + up * spread_y; +} + +bool __vectorcall util::intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ) { + auto dist = math::dist_segment_to_segment( eye_pos, end_pos, min, max ); + + return ( dist < radius ); +} + +// Note: abuse this as much as you can to achieve the full potential it offers. +bool util::hitchance( int target, const vec3_t& angles, int percentage, int hitbox ) { + if( g_settings.rage.compensate_spread ) + return true; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( target ); + + if ( !ent ) return false; + if ( percentage <= 1 ) return true; + + int hits_needed = percentage * 256 / 100; + int hits = 0; + + auto wep = g_ctx.m_local->get_weapon( ); + if ( !wep ) return false; + + vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); + auto wpn_info = wep->get_wpn_info( ); + if( !wpn_info ) return false; + + float length = wpn_info->range; + + float inaccuracy = g_ctx.m_weapon_inaccuracy; + float spread = g_ctx.m_weapon_spread; + + if( g_settings.rage.active->m_spread_limit( ) ) { + bool crouched = g_ctx.m_local->m_vecViewOffset( ).z < 50.f; + bool alt_inaccuracy = wep->is_sniper( ) || wep->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER; + float min_accuracy = crouched ? ( alt_inaccuracy ? wpn_info->inaccuracy_crouch_alt : wpn_info->inaccuracy_crouch ) + : ( alt_inaccuracy ? wpn_info->inaccuracy_stand_alt : wpn_info->inaccuracy_stand ); + + float max_accuracy = alt_inaccuracy ? wpn_info->inaccuracy_move_alt : wpn_info->inaccuracy_move; + min_accuracy += 0.0005f; + + float spread_accuracy_fraction = -( g_settings.rage.active->m_spread_limit_min( ) * 0.01f - 1.0f ); + float spread_accuracy_tolerance = max_accuracy * spread_accuracy_fraction; + min_accuracy += spread_accuracy_tolerance; + + if( wep->m_iItemDefinitionIndex( ) == WEAPON_SSG08 && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + min_accuracy = 0.008750f; + } + + if( min_accuracy >= inaccuracy ) + return true; + } + + struct hitbox_data_t { + hitbox_data_t( const vec3_t& min, const vec3_t& max, float radius ) { + m_min = min; + m_max = max; + m_radius = radius; + } + + vec3_t m_min{ }; + vec3_t m_max{ }; + float m_radius{ }; + }; + + std::vector< hitbox_data_t > m_hitbox_data; + + auto model = ent->ce( )->GetModel( ); + if( !model ) return false; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !hdr ) return false; + + matrix3x4 bone_matrix[ 128 ]; + memcpy( bone_matrix, + ent->m_CachedBoneData( ).GetElements( ), + ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); + + auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); + if( !set ) return false; + + if( hitbox == -1 ) { + for( int hitbox{ }; hitbox < set->numhitboxes; ++hitbox ) { + auto box = set->pHitbox( hitbox ); + if( !box ) continue; + + auto min = math::vector_transform( box->bbmin, bone_matrix[ box->bone ] ); + auto max = math::vector_transform( box->bbmax, bone_matrix[ box->bone ] ); + auto radius = box->m_flRadius; + + if( radius == -1.f ) { + radius = min.dist_to( max ); + } + + m_hitbox_data.push_back( hitbox_data_t( min, max, radius ) ); + } + } + else { + auto box = set->pHitbox( hitbox ); + if( !box ) return false; + + auto min = math::vector_transform( box->bbmin, bone_matrix[ box->bone ] ); + auto max = math::vector_transform( box->bbmax, bone_matrix[ box->bone ] ); + auto radius = box->m_flRadius; + + if( radius == -1.f ) { + radius = min.dist_to( max ); + } + + m_hitbox_data.push_back( hitbox_data_t( min, max, radius ) ); + } + + if( m_hitbox_data.empty( ) ) + return false; + + for ( int i{ }; i < 256; i ++ ) { + vec3_t spread_dir = get_spread_dir( wep, inaccuracy, spread, angles, i ); + + //Ray_t ray; + //vec3_t end_pos = eye_pos + spread_dir * length; + //ray.Init( eye_pos, end_pos ); + // + // + //CGameTrace tr; + //g_csgo.m_trace( )->ClipRayToEntity( ray, 0x46004003, ent->ce( ), &tr ); + + vec3_t end_pos = eye_pos + ( spread_dir * length ); + + for( const auto& hitbox : m_hitbox_data ) { + if( intersects_hitbox( eye_pos, end_pos, hitbox.m_min, hitbox.m_max, hitbox.m_radius ) ) { + hits++; + break; // cannot hit more than one hitbox + } + } + + if ( hits >= hits_needed ) + return true; + } + + return false; +} + + +float util::get_total_latency( ) { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + + if ( nci ) { + float latency = nci->GetLatency( 0 ) + nci->GetLatency( 1 ); + return latency; + } + + return 0.f; +} + +float util::get_lerptime( ) { + static cvar_t* cl_interpolate = g_csgo.m_cvar( )->FindVar( xors( "cl_interpolate" ) ); + static cvar_t* cl_interp = g_csgo.m_cvar( )->FindVar( xors( "cl_interp" ) ); + static cvar_t* cl_updaterate = g_csgo.m_cvar( )->FindVar( xors( "cl_updaterate" ) ); + static cvar_t* cl_interp_ratio = g_csgo.m_cvar( )->FindVar( xors( "cl_interp_ratio" ) ); + + if( cl_interp && cl_interpolate && cl_updaterate && cl_interp_ratio ) { + bool interpolate = cl_interpolate->get_int( ); + if( interpolate ) { + float interp = cl_interp->get_float( ); + float interp_ratio = cl_interp_ratio->get_float( ); + float updaterate = cl_updaterate->get_float( ); + + return std::max< float >( interp, interp_ratio / updaterate ); + } + } + + return 0.f; +} + +bool util::is_tick_valid( int tickcount ) { + + float latency = get_total_latency( ); + float correct = std::clamp( latency + get_lerptime( ), 0.f, *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ? 0.2f : 1.0f ); + float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) ); + + if( g_settings.rage.enabled ) { + return delta > -0.2f + TICK_INTERVAL( ) * 2.f && delta < 0.2f; + } + + return std::abs( delta ) < 0.2f; +} + +void util::disable_pvs( ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_valid( ) ) + continue; + + if( ent == g_ctx.m_local ) + continue; + + *( int* )( uintptr_t( ent ) + 0xa30 ) = g_csgo.m_globals->m_framecount; + *( int* )( uintptr_t( ent ) + 0xa28 ) = 0; + } +} + +vec2_t util::screen_transform( vec3_t world ) { + vec2_t screen; + auto w2s = [ &world, &screen ]( ) -> bool { + static uintptr_t view_matrix = 0; + if( !view_matrix ) { + view_matrix = pattern::first_code_match( g_csgo.m_chl.dll( ), + xors( "0F 10 05 ? ? ? ? 8D 85 ? ? ? ? B9" ) ); + + view_matrix = *reinterpret_cast< uintptr_t* >( view_matrix + 0x3 ) + 176; + } + + const matrix3x4& matrix = *( matrix3x4* )view_matrix; + screen.x = matrix[ 0 ][ 0 ] * world[ 0 ] + matrix[ 0 ][ 1 ] * world[ 1 ] + matrix[ 0 ][ 2 ] * world[ 2 ] + matrix[ 0 ][ 3 ]; + screen.y = matrix[ 1 ][ 0 ] * world[ 0 ] + matrix[ 1 ][ 1 ] * world[ 1 ] + matrix[ 1 ][ 2 ] * world[ 2 ] + matrix[ 1 ][ 3 ]; + + float w = matrix[ 3 ][ 0 ] * world[ 0 ] + matrix[ 3 ][ 1 ] * world[ 1 ] + matrix[ 3 ][ 2 ] * world[ 2 ] + matrix[ 3 ][ 3 ]; + + if( w < 0.001f ) { + //screen.x *= 100000.f; + //screen.y *= 100000.f; + return true; + } + + float invw = 1.0f / w; + screen.x *= invw; + screen.y *= invw; + + return false; + }; + + w2s( ); + //if ( !w2s( ) ) { + int w, h; + g_csgo.m_engine( )->GetScreenSize( w, h ); + + screen.x = ( w * .5f ) + ( screen.x * w ) * .5f; + screen.y = ( h * .5f ) - ( screen.y * h ) * .5f; + + return screen; + //} + + return vec2_t{ }; +} + +int util::hitbox_to_hitgroup( int hitbox ) { + switch( hitbox ) { + case HITBOX_HEAD: + case HITBOX_NECK: + return HITGROUP_HEAD; + case HITBOX_BODY: + case HITBOX_CHEST: + case HITBOX_THORAX: + case HITBOX_PELVIS: + return HITGROUP_STOMACH; + case HITBOX_LEFT_CALF: + case HITBOX_LEFT_THIGH: + case HITBOX_LEFT_FOOT: + return HITGROUP_RIGHTLEG; + case HITBOX_RIGHT_CALF: + case HITBOX_RIGHT_THIGH: + case HITBOX_RIGHT_FOOT: + return HITGROUP_LEFTLEG; + case HITBOX_LEFT_HAND: + case HITBOX_LEFT_FOREARM: + case HITBOX_LEFT_UPPER_ARM: + return HITGROUP_LEFTARM; + case HITBOX_RIGHT_HAND: + case HITBOX_RIGHT_FOREARM: + case HITBOX_RIGHT_UPPER_ARM: + return HITGROUP_RIGHTARM; + default: + return HITGROUP_GENERIC; + } +} + +const char* util::definition_index_to_name( int index ) { + index = std::clamp( index, 0, 65 ); + + switch( index ) { + case 0: + return xors( "knife" ); + case WEAPON_DEAGLE: + return xors( "deagle" ); + case WEAPON_ELITE: + return xors( "elite" ); + case WEAPON_FIVESEVEN: + return xors( "five seven" ); + case WEAPON_GLOCK: + return xors( "glock" ); + case WEAPON_AK47: + return xors( "ak47" ); + case WEAPON_AUG: + return xors( "aug" ); + case WEAPON_AWP: + return xors( "awp" ); + case WEAPON_FAMAS: + return xors( "famas" ); + case WEAPON_G3SG1: + return xors( "g3sg1" ); + case WEAPON_GALILAR: + return xors( "galil" ); + case WEAPON_M249: + return xors( "m249" ); + case WEAPON_M4A1: + return xors( "m4a4" ); + case WEAPON_MAC10: + return xors( "mac10" ); + case WEAPON_P90: + return xors( "p90" ); + case WEAPON_UMP45: + return xors( "ump45" ); + case WEAPON_XM1014: + return xors( "xm1014" ); + case WEAPON_BIZON: + return xors( "bizon" ); + case WEAPON_MAG7: + return xors( "mag7" ); + case WEAPON_NEGEV: + return xors( "negev" ); + case WEAPON_SAWEDOFF: + return xors( "sawed-off" ); + case WEAPON_TEC9: + return xors( "tec9" ); + case WEAPON_TASER: + return xors( "zeus" ); + case WEAPON_HKP2000: + return xors( "p2000" ); + case WEAPON_MP7: + return xors( "mp7" ); + case WEAPON_MP9: + return xors( "mp9" ); + case WEAPON_NOVA: + return xors( "nova" ); + case WEAPON_P250: + return xors( "p250" ); + case WEAPON_SCAR20: + return xors( "scar20" ); + case WEAPON_SG556: + return xors( "sg556" ); + case WEAPON_SSG08: + return xors( "ssg08" ); + case WEAPON_KNIFEGG: + return xors( "golden knife" ); // for the gun game hackers + case WEAPON_KNIFE: + return xors( "knife" ); + case WEAPON_FLASHBANG: + return xors( "flash" ); + case WEAPON_HEGRENADE: + return xors( "nade" ); + case WEAPON_SMOKEGRENADE: + return xors( "smoke" ); + case WEAPON_MOLOTOV: + return xors( "molotov" ); + case WEAPON_DECOY: + return xors( "decoy" ); + case WEAPON_INCGRENADE: + return xors( "incendiary" ); + case WEAPON_C4: + return xors( "c4" ); + case WEAPON_KNIFE_T: + return xors( "knife" ); + case WEAPON_M4A1_SILENCER: + return xors( "M4A1" ); + case WEAPON_USP_SILENCER: + return xors( "usp" ); + case WEAPON_CZ75A: + return xors( "cz75" ); + case WEAPON_R8REVOLVER: + return xors( "revolver" ); + default: + return xors( "none" ); + } +} diff --git a/cheat/internal_rewrite/util.hpp b/cheat/internal_rewrite/util.hpp new file mode 100644 index 0000000..ba7c779 --- /dev/null +++ b/cheat/internal_rewrite/util.hpp @@ -0,0 +1,111 @@ +#pragma once +#include +#include +#include "strings.hpp" + +//#define COMIC_SANS + +#define NAMESPACE_REGION( x ) namespace x { +#define END_REGION } + +extern int TIME_TO_TICKS( float dt ); +extern float TICKS_TO_TIME( int tick ); +extern float TICK_INTERVAL( ); + +//WEE WOO WEE WOO ITS THE DWORD POLICE +using ulong_t = unsigned long; +using uword_t = unsigned short; + +class IClientEntity; +class CTraceFilter; +class CGameTrace; +class vec3_t; +class vec2_t; + +NAMESPACE_REGION( util ) + +template < typename t > +struct reverse_iterable { + reverse_iterable( t&& it ) : + iterable( it ) { } + + t& iterable; + inline auto begin( ) { + return std::rbegin( iterable ); + } + + inline auto end( ) { + return std::rend( iterable ); + } +}; + +struct hitchance_data_t { + float m_random[ 2 ]; + float m_inaccuracy [ 2 ]; + float m_spread[ 2 ]; +}; + +template< typename t > +reverse_iterable< t > +reverse_iterator( t&& iter ) { + return reverse_iterable< t >{ iter }; +} + +template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { + if ( !classbase ) return fn{ }; + return ( fn )( *( uintptr_t** )classbase )[ index ]; +} + +template < size_t index, typename ret, class ... args_ > +__forceinline ret get_vfunc( void* thisptr, args_... args ) { + using fn = ret( __thiscall* )( void*, args_... ); + + auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; + return fn_ptr( thisptr, args... ); +} + +__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { + std::string ascii_str( unicode.begin( ), unicode.end( ) ); + return ascii_str; +} + +__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { + std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); + return unicode_str; +} + +template < typename integer > +__forceinline auto to_hex_str( const integer& w, + size_t hex_len = sizeof( integer ) << 1 ) { + constexpr char* hex_digits = xors( "0123456789abcdef" ); + std::string rc( hex_len, 0 ); + + for( size_t i{ }, j{ ( hex_len - 1 ) * 4 } ; i < hex_len; ++i, j -= 4 ) + rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; + + return rc; +} + +extern void clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* trace ); + +extern bool trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ); +extern bool is_low_fps( ); +extern bool is_tick_valid( int tickcount ); +extern void set_random_seed( int seed ); +extern vec3_t get_spread_dir( void *weapon, float inaccuracy, float spread, vec3_t angles, int seed ); +extern float get_random_float( float min, float max ); +extern bool __vectorcall intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ); +extern bool hitchance( int target, const vec3_t& angles, int percentage, int hitbox = -1 ); +extern void calculate_spread_runtime( ); + +extern float get_total_latency( ); +extern float get_lerptime( ); +extern int get_closest_player( bool distance = false ); +extern vec2_t screen_transform( vec3_t world ); +extern const char* definition_index_to_name( int index ); +extern void disable_pvs( ); +extern int hitbox_to_hitgroup( int hitbox ); +extern std::string hitgroup_to_string( int hitgroup ); + +END_REGION \ No newline at end of file diff --git a/cheat/internal_rewrite/vector.hpp b/cheat/internal_rewrite/vector.hpp new file mode 100644 index 0000000..4fef1b7 --- /dev/null +++ b/cheat/internal_rewrite/vector.hpp @@ -0,0 +1,334 @@ +#pragma once +#include +#include + + +class vec2_t { +public: + vec2_t( ) { + x = y = 0.0f; + } + + vec2_t( float X, float Y ) { + x = X; y = Y; + } + + vec2_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const vec2_t& v ) { + x = v.x; y = v.y; + } + + vec2_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec2_t& operator+=( const vec2_t& v ) { + x += v.x; y += v.y; return *this; + } + + vec2_t& operator-=( const vec2_t& v ) { + x -= v.x; y -= v.y; return *this; + } + + vec2_t& operator*=( const vec2_t& v ) { + x *= v.x; y *= v.y; return *this; + } + + vec2_t& operator/=( const vec2_t& v ) { + x /= v.x; y /= v.y; return *this; + } + + vec2_t& operator+=( float v ) { + x += v; y += v; return *this; + } + + vec2_t& operator-=( float v ) { + x -= v; y -= v; return *this; + } + + vec2_t& operator*=( float v ) { + x *= v; y *= v; return *this; + } + + vec2_t& operator/=( float v ) { + x /= v; y /= v; return *this; + } + + vec2_t operator+( const vec2_t& v ) const { + return vec2_t( x + v.x, y + v.y ); + } + + vec2_t operator-( const vec2_t& v ) const { + return vec2_t( x - v.x, y - v.y ); + } + + vec2_t operator*( const vec2_t& v ) const { + return vec2_t( x * v.x, y * v.y ); + } + + vec2_t operator/( const vec2_t& v ) const { + return vec2_t( x / v.x, y / v.y ); + } + + vec2_t operator+( float v ) const { + return vec2_t( x + v, y + v ); + } + + vec2_t operator-( float v ) const { + return vec2_t( x - v, y - v ); + } + + vec2_t operator*( float v ) const { + return vec2_t( x * v, y * v ); + } + + vec2_t operator/( float v ) const { + return vec2_t( x / v, y / v ); + } + + void set( float X = 0.0f, float Y = 0.0f ) { + x = X; y = Y; + } + + float length( void ) const { + return sqrtf( x * x + y * y ); + } + + float lengthsqr( void ) const { + return ( x * x + y * y ); + } + + float dist_to( const vec2_t& v ) const { + return ( *this - v ).length( ); + } + + float dist_to_sqr( const vec2_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + float dot( const vec2_t& v ) const { + return ( x * v.x + y * v.y ); + } + + bool is_zero( void ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON ); + } + + operator bool( ) const noexcept { + return !is_zero( ); + } + +public: + float x, y; +}; + +class vec3_t { +public: + vec3_t( ) { + x = y = z = 0.0f; + } + + vec3_t( float X, float Y, float Z ) { + x = X; y = Y; z = Z; + } + + vec3_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; + } + + vec3_t( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; + } + + __forceinline vec3_t& operator=( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; return *this; + } + + __forceinline vec3_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + __forceinline float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec3_t& operator+=( const vec3_t& v ) { + x += v.x; y += v.y; z += v.z; return *this; + } + + vec3_t& operator-=( const vec3_t& v ) { + x -= v.x; y -= v.y; z -= v.z; return *this; + } + + vec3_t& operator*=( const vec3_t& v ) { + x *= v.x; y *= v.y; z *= v.z; return *this; + } + + vec3_t& operator/=( const vec3_t& v ) { + x /= v.x; y /= v.y; z /= v.z; return *this; + } + + vec3_t& operator+=( float v ) { + x += v; y += v; z += v; return *this; + } + + vec3_t& operator-=( float v ) { + x -= v; y -= v; z -= v; return *this; + } + + vec3_t& operator*=( float v ) { + x *= v; y *= v; z *= v; return *this; + } + + vec3_t& operator/=( float v ) { + x /= v; y /= v; z /= v; return *this; + } + + __forceinline vec3_t operator+( const vec3_t& v ) const { + return vec3_t( x + v.x, y + v.y, z + v.z ); + } + + __forceinline vec3_t operator-( const vec3_t& v ) const { + return vec3_t( x - v.x, y - v.y, z - v.z ); + } + + __forceinline vec3_t operator*( const vec3_t& v ) const { + return vec3_t( x * v.x, y * v.y, z * v.z ); + } + + __forceinline vec3_t operator/( const vec3_t& v ) const { + return vec3_t( x / v.x, y / v.y, z / v.z ); + } + + __forceinline vec3_t operator+( float v ) const { + return vec3_t( x + v, y + v, z + v ); + } + + __forceinline vec3_t operator-( float v ) const { + return vec3_t( x - v, y - v, z - v ); + } + + __forceinline vec3_t operator*( float v ) const { + return vec3_t( x * v, y * v, z * v ); + } + + __forceinline vec3_t operator/( float v ) const { + return vec3_t( x / v, y / v, z / v ); + } + + __forceinline float length( ) const { + return sqrtf( x * x + y * y + z * z ); + } + + __forceinline float lengthsqr( ) const { + return ( x * x + y * y + z * z ); + } + + __forceinline float length2d( ) const { + return sqrtf( x * x + y * y ); + } + + __forceinline float length2dsqr( ) const { + return ( x * x + y * y ); + } + + __forceinline float dist_to( const vec3_t& v ) const { + return ( *this - v ).length( ); + } + + __forceinline float dist_to_sqr( const vec3_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + __forceinline float dot( const vec3_t& v ) const { + return ( x * v.x + y * v.y + z * v.z ); + } + + __forceinline float fov_to( const vec3_t& to ) { + const float from_length = length( ); + const float to_length = to.length( ); + + if( from_length && to_length ) { + return acos( dot( to ) / from_length * to_length ); + } + + return 0.f; + } + + vec3_t cross( const vec3_t& v ) const { + return vec3_t( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); + } + + bool is_zero( ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON && + z > -FLT_EPSILON && z < FLT_EPSILON ); + } + + operator bool( ) const { + return !is_zero( ); + } + + inline void normalize_vector( ) { + vec3_t& v = *this; + + float iradius = 1.f / ( this->length( ) + FLT_EPSILON ); //FLT_EPSILON + + v.x *= iradius; + v.y *= iradius; + v.z *= iradius; + } + + vec3_t abs( ) const { + return vec3_t{ std::abs( x ), std::abs( y ), std::abs( z ) }; + } + + vec3_t clamp( ) { + for ( size_t axis{ }; axis < 2; axis++ ) { + auto &cur_axis = operator[]( axis ); + if ( !std::isfinite( cur_axis ) ) { + cur_axis = 0.f; + } + } + + x = std::clamp( x, -89.f, 89.f ); + y = std::clamp( std::remainder( y, 360.f ), -180.f, 180.f ); + z = 0.f; + return *this; + } + +public: + float x, y, z; +}; + +__forceinline vec3_t operator*( float f, const vec3_t& v ) { + return v * f; +} diff --git a/cheat/internal_rewrite/visual.hpp b/cheat/internal_rewrite/visual.hpp new file mode 100644 index 0000000..4d0e996 --- /dev/null +++ b/cheat/internal_rewrite/visual.hpp @@ -0,0 +1,126 @@ +#pragma once +#include +#include "vector.hpp" +#include "color.hpp" +#include +#include "strings.hpp" +#include "IVRenderView.hpp" +#include "context.hpp" + +class c_base_player; + +enum HitFlag_t { + HIT_NONE = 0, + HIT_ALERT = 1, + HIT_1W = 2 +}; + +namespace features +{ + class c_visuals { + private: + static const clr_t esp_green( uint8_t alpha = 255 ) { + return clr_t( 110, 200, 20, alpha ); + } + static const clr_t esp_red( uint8_t alpha = 255 ) { + return clr_t( 240, 0, 0, alpha ); + } + static const clr_t esp_blue( uint8_t alpha = 255 ) { + return clr_t( 84, 173, 247, alpha ); + } + + void draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ); + void draw_line( int x, int y, int x1, int y1, const clr_t& clr ); + void draw_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_filled_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_circle( int x, int y, int r, const clr_t& clr, int res = 48 ); + + void draw_really_big_string( int x, int y, const clr_t& clr, const char* msg, ... ); + void draw_string( int x, int y, int align, bool big, const clr_t& clr, const char* msg, ... ); + + + void draw_local( ); + void draw_players( ); + void draw_world( ); + + void draw_hits( ); + void spectator_list( ); + void grenade_prediction( ); + void draw_firegrenade( ); + + struct tracer_t { + float m_time; + vec3_t m_start; + vec3_t m_end; + bool m_local; + }; + + struct hit_t { + int m_ent; + char m_name[ 32 ]; + matrix3x4 m_matrix[ 128 ]; + vec3_t m_pos; + bool m_dead; + float m_time; + }; + + //you should always store the entity index rather than the ptr + struct sound_t { + float m_time; + vec3_t m_pos; + int m_ent; + }; + + struct firegrenade_t { + float m_time; + vec3_t m_pos; + int m_ent; + }; + + struct shot_t { + float time; + vec3_t pos; + bool hit; + }; + + std::vector< firegrenade_t > m_firegrenades; + std::vector< shot_t > m_shots; + std::vector< sound_t > m_sounds; + std::vector< tracer_t > m_tracers; + std::vector< hit_t > m_hits; + + vec3_t m_stored_pos[ 65 ]{ }; + float m_anim_progress[ 65 ]{ }; + bool m_has_seen[ 65 ]{ }; + float m_last_hit{ }; + int m_ent_dmg[ 65 ]{ }; + int m_teamdmg{ 0 }; + int m_hit_flag[ 65 ]{ }; + float m_last_roundstart{ }; + public: + void update_glow( ); + void world_modulate( ); + void update_position( int index, const vec3_t& pos ); + void reset_position( ); + void store_tracer( int ent_index, vec3_t shot ); + void store_sound( int ent, vec3_t origin ); + void store_firegrenades( int ent, vec3_t origin ); + void draw_autowall( ); + void draw_spread( ); + void out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ); + void update_positions( ); + void store_hit( ); + void radar( ); + void draw_tracers( ); + void store_ent_dmg( int, int, int ); + void store_shot( vec3_t pos, bool hit = false ); + void draw_shots( ); + void reset_local_dmg( ); + void draw_skeletons( ); + void on_round_start( ); + void draw_sound( ); + void update_hit_flags( ); + void store_hit( context::shot_data_t* shot ); + void operator()( ); + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/visual_draw.cpp b/cheat/internal_rewrite/visual_draw.cpp new file mode 100644 index 0000000..8636af2 --- /dev/null +++ b/cheat/internal_rewrite/visual_draw.cpp @@ -0,0 +1,94 @@ +#include "d3d.hpp" +#include "interface.hpp" +#include "renderer.hpp" +#include "visual.hpp" +#include "settings.hpp" + +namespace features +{ + void c_visuals::draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_line( clr, a.x, a.y, b.x, b.y ); + else + g_renderer.draw_line( a, b, clr ); + } + + void c_visuals::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_line( clr, x, y, x1, y1 ); + else + g_renderer.draw_line( x, y, x1, y1, clr ); + } + + void c_visuals::draw_rect( int x, int y, int w, int h, const clr_t& clr ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_rect( clr, x, y, w, h ); + else + g_renderer.draw_box( x, y, w, h, clr ); + } + + void c_visuals::draw_filled_rect( int x, int y, int w, int h, const clr_t& col ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_filled_rect( col, x, y, w, h ); + else + g_renderer.draw_rect( x, y, w, h, col ); + } + + void c_visuals::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_circle( col, x, y, r, res ); + else + g_renderer.draw_circle( x, y, r, col, res ); + } + + void c_visuals::draw_string( int x, int y, int align, bool big, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + switch( align ) { + case ALIGN_CENTER: + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_CENTER >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, D3DFONTFLAG_DROPSHADOW, buffer ); + else + g_renderer.draw_string< ALIGN_CENTER >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); + + break; + case ALIGN_LEFT: + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_LEFT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, D3DFONTFLAG_DROPSHADOW, buffer ); + else + g_renderer.draw_string< ALIGN_LEFT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); + + break; + case ALIGN_RIGHT: + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_RIGHT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, D3DFONTFLAG_DROPSHADOW, buffer ); + else + g_renderer.draw_string< ALIGN_RIGHT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); + + break; + } + } + + void c_visuals::draw_really_big_string( int x, int y, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_LEFT >( ::d3d::fonts.f_18, col, x, y, D3DFONTFLAG_OUTLINE, buffer ); + else + g_renderer.draw_string< ALIGN_LEFT >( g_fonts.f_bold, x, y, col, msg ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/visual_local.cpp b/cheat/internal_rewrite/visual_local.cpp new file mode 100644 index 0000000..119c352 --- /dev/null +++ b/cheat/internal_rewrite/visual_local.cpp @@ -0,0 +1,661 @@ +#include + +#include "visual.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.hpp" + +namespace features +{ + void c_visuals::draw_local( ) { + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + draw_shots( ); + grenade_prediction( ); + draw_spread( ); + spectator_list( ); + + const int offset = 21; + + + if( g_ctx.m_local->is_valid( ) ) { + //isvalveds + + if( g_settings.misc.team_dmg( ) && *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ) { + const float kick = 300.f; + float percentage = m_teamdmg / kick; + + clr_t col = clr_t::blend( esp_green( ), esp_red( ), std::clamp( percentage, 0.f, 1.f ) ); + + draw_really_big_string( 10, cur_pos += offset, col, xors( "DMG: %d" ), m_teamdmg ); + } + + static float incoming_latency; + if( g_settings.misc.net_fakelag ) { + float desired_latency = incoming_latency + 0.15f; + if( g_settings.misc.net_fakelag == 4 ) + desired_latency = 1.0f; + + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float cur_latency = nci->GetLatency( 1 ); + float percentage = cur_latency / desired_latency; + percentage = std::clamp( percentage + 0.1f, 0.f, 1.f ); + + clr_t col = clr_t::blend( esp_red( ), esp_green( ), percentage ); + + //bool visible = g_settings.misc.net_fakeping_active; + //if( g_settings.misc.net_fakelag == 4 ) + //visible = true; + + if( percentage > 0.35f ) { + draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "PING" ) ); + draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "PING" ) ); + draw_really_big_string( 10, cur_pos, col, xors( "PING" ) ); + } + } + } + else { + auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + incoming_latency = nci->GetLatency( 1 ); + } + } + + if( g_settings.rage.anti_aim( ) ) { + static float last_lby = 0.f; + static float last_update = 0.f; + float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); + if( lby != last_lby ) { + last_update = g_csgo.m_globals->m_curtime; + last_lby = lby; + } + + float lby_delta = std::abs( std::remainderf( lby - g_ctx.m_thirdperson_angle.y, 360.f ) ); + float time_delta = g_csgo.m_globals->m_curtime - last_update; + + bool breaking = lby_delta > 35.f && time_delta > 0.2f; + + if( g_cheat.m_ragebot.m_antiaim->is_edging( ) ) { + draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "EDGE" ) ); + draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "EDGE" ) ); + draw_really_big_string( 10, cur_pos, esp_green( ), xors( "EDGE" ) ); + } + + if( g_settings.rage.break_lby( ) ) { + draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "LBY" ) ); + draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "LBY" ) ); + draw_really_big_string( 10, cur_pos, breaking ? esp_green( ) : esp_red( ), xors( "LBY" ) ); + + auto animstate = g_ctx.m_local->get_animstate( ); + if( animstate && animstate->m_velocity < 0.1f && animstate->m_bOnGround ) { + draw_filled_rect( 11, ( cur_pos += 4 ) + 18, 36, 3, clr_t( 0, 0, 0, 170 ) ); + + float progress = ( float )g_cheat.m_ragebot.m_antiaim->get_next_update( ) / TIME_TO_TICKS( 1.1f ); + + if( progress <= 1.f ) + draw_filled_rect( 11, cur_pos + 19, 34 * progress, 1, esp_green( ) ); + } + } + + if( g_settings.rage.preserve_fps && g_settings.rage.enabled && util::is_low_fps( ) ) { + draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "FPS" ) ); + draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "FPS" ) ); + draw_really_big_string( 10, cur_pos, esp_red( ), xors( "FPS" ) ); + } + } + + bool onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; + bool air_lag = g_settings.rage.fakelag.in_air; + bool move_lag = g_settings.rage.fakelag.in_move; + + bool should_lag = ( air_lag && !onground ) || ( move_lag && onground ); + + if( g_settings.rage.fakelag.mode( ) && + g_settings.rage.fakelag.ticks( ) && + should_lag ) { + int min_dist = 64; + int max_ticks = g_settings.rage.fakelag.ticks; + max_ticks += g_settings.rage.fakelag.fluctuate * max_ticks * 0.01f; + max_ticks = std::min( max_ticks, 16 ); + + float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); + bool breaking = g_cheat.m_lagmgr.is_breaking_lc( ); + if( speed * g_csgo.m_globals->m_interval_per_tick * max_ticks > 55 && speed >= 245.f || breaking ) { + draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "LC" ) ); + draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "LC" ) ); + draw_really_big_string( 10, cur_pos, breaking ? esp_green( ) : esp_red( ), xors( "LC" ) ); + } + } + } + + if( g_settings.misc.no_scope( ) && + g_ctx.m_local->m_bIsScoped( ) ) { + int w, h; + g_csgo.m_engine( )->GetScreenSize( w, h ); + + auto wep = g_ctx.m_local->get_weapon( ); + if( wep ) { + float inacc = g_ctx.m_weapon_inaccuracy; + + int pixels = inacc * 75; + + if( pixels < 2 ) { + draw_line( 0, h / 2, w, h / 2, clr_t( 0, 0, 0 ) ); + draw_line( w / 2, 0, w / 2, h, clr_t( 0, 0, 0 ) ); + } + else { + for( int i = -pixels; i < pixels; ++i ) { + float a = 1.f - ( float )( std::abs( i ) ) / ( float )( pixels ); + + float inacc_alpha = 1.f - ( inacc * 3.f ); + inacc_alpha = std::clamp( inacc_alpha, 0.4f, 1.f ); + + draw_line( 0, h / 2 + i, w, h / 2 + i, clr_t( 0, 0, 0, 255 * a * inacc_alpha ) ); + draw_line( w / 2 + i, 0, w / 2 + i, h, clr_t( 0, 0, 0, 255 * a * inacc_alpha ) ); + } + } + } + } + + draw_autowall( ); + } + + void c_visuals::spectator_list( ) { + if( !g_settings.visuals.spec_list ) + return; + + std::vector< std::string > spec_list; + + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + if( ent && ent->is_player( ) && !ent->ce( )->IsDormant( ) ) { + auto spec_handle = ent->m_hObserverTarget( ); + auto spec_ent = g_csgo.m_entlist( )->GetClientEntityFromHandle< >( spec_handle ); + + if( spec_ent == g_ctx.m_local ) { + char player_name[ 32 ]; + ent->get_name_safe( player_name ); + spec_list.push_back( player_name ); + } + } + } + + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + if( g_settings.misc.watermark ) { + cur_pos = 20; + } + + for( auto& it : spec_list ) { + draw_string( screen_w - 3, cur_pos, ALIGN_RIGHT, true, clr_t( 255, 255, 255 ), it.c_str( ) ); + cur_pos += 10; + } + } + + void c_visuals::grenade_prediction( ) { + static auto molotov_detonate_time = g_csgo.m_cvar( )->FindVar( xors( "molotov_throw_detonate_time" ) ); + static auto molotov_detonate_slope = g_csgo.m_cvar( )->FindVar( xors( "weapon_molotov_maxdetonateslope" ) ); + static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + + if( !g_settings.visuals.grenade_prediction ) + return; + + auto is_grenade = [ ]( int defindex ) { + switch( defindex ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + case WEAPON_SMOKEGRENADE: + case WEAPON_MOLOTOV: + case WEAPON_INCGRENADE: + case WEAPON_DECOY: + return true; + default: return false; + } + }; + + auto get_detonate_time = [ ]( int defindex ) { + switch( defindex ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + return 1.5f; + case WEAPON_INCGRENADE: + case WEAPON_MOLOTOV: + return molotov_detonate_time->get_float( ); + case WEAPON_DECOY: + return 5.f; + default: return 3.f; + } + }; + + auto draw_3d_line = [ this ]( const vec3_t& start, const vec3_t& end, clr_t col, bool circle = false ) { + vec2_t start_w2s = util::screen_transform( start ); + vec2_t end_w2s = util::screen_transform( end ); + + draw_line( start_w2s, end_w2s, col ); + if( circle ) + draw_rect( end_w2s.x - 1, end_w2s.y - 1, 2, 2, clr_t( 230, 230, 230 ) ); + }; + + auto clip_velocity = [ ]( const vec3_t& in, const vec3_t& normal, vec3_t& out, float overbounce ) { + int blocked = 0; + float angle = normal[ 2 ]; + + if( angle > 0.f ) + blocked |= 1; + + if( !angle ) + blocked |= 2; + + float backoff = in.dot( normal ) * overbounce; + + for( int i{ }; i < 3; ++i ) { + out[ i ] = in[ i ] - ( normal[ i ] * backoff ); + + if( out[ i ] > -0.1f && out[ i ] < 0.1f ) { + out[ i ] = 0.f; + } + } + + return blocked; + }; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon ) return; + + int def_index = weapon->m_iItemDefinitionIndex( ); + if( !is_grenade( def_index ) || !weapon->m_bPinPulled( ) ) + return; + + auto wpn_info = weapon->get_wpn_info( ); + + vec3_t throw_ang, forward; + g_csgo.m_engine( )->GetViewAngles( throw_ang ); + throw_ang.x -= ( 90.f - abs( throw_ang.x ) ) * 0.11111111f; + throw_ang.x = std::remainderf( throw_ang.x, 360.f ); + + forward = math::angle_vectors( throw_ang ); + + float throw_strength = weapon->m_flThrowStrength( ); + float throw_velocity = std::min( std::max( wpn_info->throw_velocity * 0.9f, 15.f ), 750.f ); + + float throw_height = ( throw_strength * 12.f ) - 12.f; + float v68 = throw_velocity * ( ( 0.7f * throw_strength ) + 0.3f ); + + vec3_t start_pos = g_ctx.m_local->get_eye_pos( ) + vec3_t( 0, 0, throw_height ); + vec3_t end_pos = start_pos + ( forward * 22.f ); + + CTraceFilter filter; + filter.pSkip = g_ctx.m_local; + + CGameTrace trace; + Ray_t ray; + ray.Init( start_pos, end_pos, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + g_csgo.m_trace( )->TraceRay( ray, CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_MOVEABLE | CONTENTS_CURRENT_90, &filter, &trace ); + end_pos = trace.endpos - forward * 6.f; + vec3_t throw_pos = g_ctx.m_local->m_vecVelocity( ) * 1.25f + forward * v68; + + //draw_3d_line( start_pos, end_pos, clr_t( 255, 255, 255 ) ); + float gravity = sv_gravity->get_float( ) * 0.4f; + + player_info_t info{ }; + + for( int ticks = TIME_TO_TICKS( get_detonate_time( def_index ) ); ticks >= 0; --ticks ) { + auto throw_dir = vec3_t( throw_pos.x, throw_pos.y, ( throw_pos.z + ( throw_pos.z - ( gravity * TICK_INTERVAL( ) ) ) ) * 0.5f ); + auto temp = throw_dir * TICK_INTERVAL( ); + throw_pos.z -= gravity * TICK_INTERVAL( ); + + vec3_t src = end_pos, end = end_pos + temp; + Ray_t ray; + ray.Init( src, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + g_csgo.m_trace( )->TraceRay( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); + if( trace.allsolid ) + throw_pos = vec3_t( ); + + end_pos = trace.endpos; + draw_3d_line( src, end_pos, g_settings.visuals.grenade_pred_clr ); + + if( trace.fraction != 1.f ) { + float surf_elasticity = 1.f; + vec3_t throw_pos2{ }; + clip_velocity( throw_pos, trace.plane.normal, throw_pos2, 2.f ); + + if( trace.m_pEnt && g_csgo.m_engine( )->GetPlayerInfo( trace.m_pEnt->GetIndex( ), &info ) ) { + surf_elasticity = 0.3f; + } + + throw_pos2 *= std::clamp( surf_elasticity * 0.45f, 0.f, 0.9f ); + end = end_pos + throw_pos2 * ( ( 1.f - trace.fraction ) * TICK_INTERVAL( ) ); + + if( def_index == WEAPON_MOLOTOV || def_index == WEAPON_INCGRENADE ) { + if( trace.plane.normal.z >= cos( DEG2RAD( molotov_detonate_slope->get_float( ) ) ) ) { + return; + } + } + + ray.Init( end_pos, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + g_csgo.m_trace( )->TraceRay( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); + + draw_3d_line( end_pos, end, g_settings.visuals.grenade_pred_clr, true ); + end_pos = trace.endpos; + throw_pos = throw_pos2; + } + } + } + + void c_visuals::store_shot( vec3_t pos, bool hit ) { + if( !g_settings.visuals.target ) + return; + + m_shots.push_back( { g_csgo.m_globals->m_curtime, pos, hit } ); + } + + void c_visuals::draw_shots( ) { + if( !g_settings.visuals.target ) + return; + + for( size_t i{ }; i < m_shots.size( ) && !m_shots.empty( ); ++i ) { + if( m_shots[ i ].time + g_settings.visuals.target_time < g_csgo.m_globals->m_curtime ) { + m_shots.erase( m_shots.begin( ) + i ); + } + } + + for( auto& it : m_shots ) { + vec3_t min = it.pos - vec3_t( 3.5f, 3.5f, 3.5f ); + vec3_t max = it.pos + vec3_t( 3.5f, 3.5f, 3.5f ); + + std::array< vec3_t, 8 > points = { + vec3_t{ min.x, min.y, min.z }, + vec3_t{ min.x, max.y, min.z }, + vec3_t{ max.x, max.y, min.z }, + vec3_t{ max.x, min.y, min.z }, + vec3_t{ max.x, max.y, max.z }, + vec3_t{ min.x, max.y, max.z }, + vec3_t{ min.x, min.y, max.z }, + vec3_t{ max.x, min.y, max.z } + }; + + vec2_t + flb = util::screen_transform( points[ 3 ] ), + blb = util::screen_transform( points[ 0 ] ), + frb = util::screen_transform( points[ 2 ] ), + blt = util::screen_transform( points[ 6 ] ), + brt = util::screen_transform( points[ 5 ] ), + frt = util::screen_transform( points[ 4 ] ), + brb = util::screen_transform( points[ 1 ] ), + flt = util::screen_transform( points[ 7 ] ); + + vec2_t lines[ 12 ][ 2 ]; + + lines[ 0 ][ 0 ] = { flb.x, flb.y }; + lines[ 0 ][ 1 ] = { frb.x, frb.y }; + lines[ 1 ][ 0 ] = { frb.x, frb.y }; + lines[ 1 ][ 1 ] = { brb.x, brb.y }; + lines[ 2 ][ 0 ] = { brb.x, brb.y }; + lines[ 2 ][ 1 ] = { blb.x, blb.y }; + lines[ 3 ][ 0 ] = { blb.x, blb.y }; + lines[ 3 ][ 1 ] = { flb.x, flb.y }; + + // top + lines[ 4 ][ 0 ] = { flt.x, flt.y }; + lines[ 4 ][ 1 ] = { frt.x, frt.y }; + lines[ 5 ][ 0 ] = { frt.x, frt.y }; + lines[ 5 ][ 1 ] = { brt.x, brt.y }; + lines[ 6 ][ 0 ] = { brt.x, brt.y }; + lines[ 6 ][ 1 ] = { blt.x, blt.y }; + lines[ 7 ][ 0 ] = { blt.x, blt.y }; + lines[ 7 ][ 1 ] = { flt.x, flt.y }; + + //bottom to top + lines[ 8 ][ 0 ] = { flb.x, flb.y }; + lines[ 8 ][ 1 ] = { flt.x, flt.y }; + lines[ 9 ][ 0 ] = { frb.x, frb.y }; + lines[ 9 ][ 1 ] = { frt.x, frt.y }; + lines[ 10 ][ 0 ] = { brb.x, brb.y }; + lines[ 10 ][ 1 ] = { brt.x, brt.y }; + lines[ 11 ][ 0 ] = { blb.x, blb.y }; + lines[ 11 ][ 1 ] = { blt.x, blt.y }; + + for( size_t i{ }; i < 12; ++i ) { + draw_line( lines[ i ][ 0 ], lines[ i ][ 1 ], it.hit ? esp_blue( 160 ) : esp_red( 160 ) ); + } + } + } + + void c_visuals::draw_autowall( ) { + if( !g_settings.visuals.autowall_crosshair ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( !weapon || weapon->is_knife( ) || weapon->is_grenade( ) ) + return; + + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + auto wpn_data = weapon->get_wpn_info( ); + + vec3_t angles{ }; + g_csgo.m_engine( )->GetViewAngles( angles ); + + fire_bullet_data_t data{ }; + data.src = g_ctx.m_local->get_eye_pos( ); + vec3_t end = data.src; + end += math::angle_vectors( angles ) * wpn_data->range; + + data.filter.pSkip = g_ctx.m_local; + data.current_damage = wpn_data->damage; + data.penetrate_count = 1; + data.travel_range = ( end - data.src ).length( ); + data.traveled = 0.f; + data.to_travel = data.travel_range; + + data.direction = math::angle_vectors( angles ); + + data.direction.normalize_vector( ); + + CTraceFilter filter; + Ray_t ray; + + filter.pSkip = g_ctx.m_local; + ray.Init( data.src, end ); + g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT | CONTENTS_GRATE, &filter, &data.enter_trace ); + + bool can_penetrate = g_cheat.m_autowall.handle_bullet_penetration( wpn_data, data ); + + draw_line( screen_w / 2 - 1, screen_h / 2, screen_w / 2 + 2, screen_h / 2, + can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ) ); + + draw_line( screen_w / 2, screen_h / 2 - 1, screen_w / 2, screen_h / 2 + 2, + can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ) ); + +#ifdef _DEBUG + static con_var< bool > dbg_awall{ &data::holder_, fnv( "dbg_awall" ) }; + + if( dbg_awall( ) ) { + draw_string( screen_w / 2 + 5, screen_h / 2 + 5, ALIGN_LEFT, true, + can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ), "%d", ( int )data.current_damage ); + } +#endif + } + + void c_visuals::draw_spread( ) { + if( !g_settings.visuals.draw_spread ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + if( weapon ) { + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + int cross_x = screen_w / 2, cross_y = screen_h / 2; + + float recoil_step = screen_h / g_ctx.m_fov; + + cross_x -= ( int )( g_ctx.m_local->m_aimPunchAngle( ).y * recoil_step ); + cross_y += ( int )( g_ctx.m_local->m_aimPunchAngle( ).x * recoil_step ); + + weapon->update_accuracy_penalty( ); + float inaccuracy = weapon->get_inaccuracy( ); + float spread = weapon->get_spread( ); + + float cone = inaccuracy * spread; + cone *= screen_h * 0.7f; + cone *= 90.f / g_ctx.m_fov; + + for( int seed{ }; seed < 256; ++seed ) { + util::set_random_seed( math::random_number( 0, 255 ) + 1 ); + float rand_a = util::get_random_float( 0.f, 1.0f ); + float pi_rand_a = util::get_random_float( 0.f, 2.0f * M_PI ); + float rand_b = util::get_random_float( 0.0f, 1.0f ); + float pi_rand_b = util::get_random_float( 0.f, 2.f * M_PI ); + + float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); + float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); + + float max_x = cos( pi_rand_a ) * cone + cos( pi_rand_b ) * cone; + float max_y = sin( pi_rand_a ) * cone + sin( pi_rand_b ) * cone; + + float step = screen_h / g_ctx.m_fov * 90.f; + int screen_spread_x = ( int )( spread_x * step * 0.7f ); + int screen_spread_y = ( int )( spread_y * step * 0.7f ); + + float percentage = ( rand_a * inaccuracy + rand_b * spread ) / ( inaccuracy + spread ); + + draw_filled_rect( cross_x + screen_spread_x, cross_y + screen_spread_y, 1, 1, + clr_t( 255, 255, 255, 255 * ( 0.4f + percentage * 0.6f ) ) * ( 0.1f + percentage * 0.9f ) ); + } + } + } + + + void c_visuals::store_tracer( int index, vec3_t pos ) { + static float last_time[ 65 ]{ }; + tracer_t new_tracer; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); + if( ent && ent->is_valid( ) ) { + bool valid = ent == g_ctx.m_local; + float time = g_csgo.m_globals->m_curtime; + auto ent_pos = ent->get_hitbox_pos( 0 ); + + if( ent != g_ctx.m_local && g_ctx.m_local->is_valid( ) && + ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.visuals.friendlies( ) ) ) { + vec3_t ang = math::vector_angles( ent_pos, pos ); + vec3_t local_pos = g_ctx.m_local->get_hitbox_pos( 0 ); + float dist = local_pos.dist_to( ent_pos ); + + vec3_t local_ang = math::vector_angles( ent_pos, local_pos ); + + constexpr float max_delta_sqr = 30.f * 30.f; + + float pitch_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).x ) ) ) * dist; + float yaw_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).y ) ) ) * dist; + float delta_sqr = ( yaw_delta * yaw_delta + pitch_delta * pitch_delta ); + + if( delta_sqr > max_delta_sqr ) return; + + vec3_t vec = math::angle_vectors( ang ); + vec *= dist; + vec += ent_pos; + + pos = vec; + + valid = true; + } + + if( valid ) { + float delta = std::abs( g_csgo.m_globals->m_curtime - last_time[ index ] ); + if( delta > g_csgo.m_globals->m_interval_per_tick ) { + new_tracer.m_time = time; + new_tracer.m_start = ent_pos; + new_tracer.m_end = pos; + new_tracer.m_local = ent == g_ctx.m_local; + m_tracers.emplace_back( new_tracer ); + + last_time[ index ] = g_csgo.m_globals->m_curtime; + } + } + } + } + + void c_visuals::draw_tracers( ) { + if( !g_settings.visuals.active ) return; + float time = g_csgo.m_globals->m_curtime; + + if( m_tracers.empty( ) ) + return; + + for( size_t i{ }; i < m_tracers.size( ) && !m_tracers.empty( ); ++i ) { + auto& tr = m_tracers[ i ]; + + float delta = time - tr.m_time; + if( delta > 1.0f || std::abs( delta ) > 5.f ) m_tracers.erase( m_tracers.begin( ) + i ); + } + + if( !m_tracers.empty( ) ) { + for( auto& it : m_tracers ) { + + float delta = time - it.m_time; + clr_t col = it.m_local ? clr_t::from_hsb( delta, 1.0f, 1.0f ) : clr_t( 255, 15, 46 ); + col.a( ) = 1.0f - delta * 255; + auto w2s_begin = util::screen_transform( it.m_start ); + auto w2s_end = util::screen_transform( it.m_end ); + + + switch( g_settings.visuals.bullet_tracers( ) ) { + case 1: + draw_line( w2s_begin, w2s_end, col ); + break; + case 2: + if( !g_ctx.precache_model( xors( "materials/sprites/laserbeam.vmt" ) ) ) { + g_con->log( "nigga cant get" ); + break; + } + + BeamInfo_t beam_info; + + beam_info.m_nType = beam_normal; + beam_info.m_pszModelName = xors( "materials/sprites/laserbeam.vmt" ); + beam_info.m_nModelIndex = g_csgo.m_model_info( )->GetModelIndex( xors( "materials/sprites/laserbeam.vmt" ) ); + beam_info.m_flHaloScale = 0.0f; + beam_info.m_flLife = 0.09f; //0.09 + beam_info.m_flWidth = .6f; + beam_info.m_flEndWidth = .75f; + beam_info.m_flFadeLength = 3.0f; + beam_info.m_flAmplitude = 0.f; + beam_info.m_flBrightness = ( col.a( ) - 255.f ) * 0.8f; + beam_info.m_flSpeed = 1.f; + beam_info.m_nStartFrame = 1; + beam_info.m_flFrameRate = 60; + beam_info.m_flRed = col.r( ); + beam_info.m_flGreen = col.g( ); + beam_info.m_flBlue = col.b( ); + beam_info.m_nSegments = 4; + beam_info.m_bRenderable = true; + beam_info.m_nFlags = 0; + + beam_info.m_vecStart = it.m_start; + beam_info.m_vecEnd = it.m_end; + + Beam_t* beam = g_csgo.m_beams( )->CreateBeamPoints( beam_info ); + + if( beam ) { + g_csgo.m_beams( )->DrawBeam( beam ); + } + + break; + } + } + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/visual_player.cpp b/cheat/internal_rewrite/visual_player.cpp new file mode 100644 index 0000000..f14a0d7 --- /dev/null +++ b/cheat/internal_rewrite/visual_player.cpp @@ -0,0 +1,1174 @@ +#include + +#include "visual.hpp" +#include "context.hpp" +#include "base_cheat.hpp" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.hpp" + +#undef PlaySound + +//2k lines of code here +int screen_w, screen_h; +con_var< bool > dbg_anims{ &data::holder_, fnv( "dbg_anims" ), false }; + +namespace features +{ + void c_visuals::update_position( int index, const vec3_t& pos ) { + m_stored_pos[ index ] = pos; + if( m_anim_progress[ index ] > 0.f && m_anim_progress[ index ] <= 0.3f + && m_has_seen[ index ] && g_settings.visuals.dormant ) { + m_anim_progress[ index ] = 0.3f; + } + } + + void c_visuals::reset_position( ) { + for( size_t i{ }; i < 65; ++i ) { + m_anim_progress[ i ] = 0.f; + m_has_seen[ i ] = false; + } + } + + void c_visuals::store_hit( ) { + if( !g_settings.visuals.hitmarkers ) + return; + + g_csgo.m_surface( )->PlaySound( xors( "buttons\\arena_switch_press_02.wav" ) ); + m_last_hit = g_csgo.m_globals->m_curtime; + } + + void c_visuals::radar( ) { + if( !g_settings.visuals.radar( ) ) + return; + + for( int i = 0; i < 32; i++ ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); + if( !ent || !ent->is_valid( ) ) + continue; + + ent->m_bSpotted( ) = true; + } + } + + void c_visuals::draw_hits( ) { + if( !g_settings.visuals.hitmarkers || !g_ctx.run_frame( ) ) + return; + + float delta = ( g_csgo.m_globals->m_curtime - m_last_hit ) * 1.5f; + if( std::abs( delta ) > 1.0f ) return; + + clr_t col = g_settings.menu.menu_color; + if( delta > 0.75f ) { + col.a( ) = 255 * ( 1.0f - delta ) * 4.f; + } + + auto get_rotated_point = [ ]( vec2_t point, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + + point.x += sin( rad ) * distance; + point.y += cos( rad ) * distance; + + return point; + }; + + + for( size_t i{ }; i < 2; ++i ) { + float rotation = 135.f + i * 90.f; + + vec2_t center = { screen_w * 0.5f, screen_h * 0.5f }; + + for( size_t dist = 7; dist < 14; ++dist ) { + vec2_t start = get_rotated_point( center, rotation, dist ); + vec2_t end = get_rotated_point( center, rotation, dist + 1 ); + + vec2_t rot_start = get_rotated_point( center, rotation - 180.f, dist ); + vec2_t rot_end = get_rotated_point( center, rotation - 180.f, dist + 1 ); + + int point = dist - 6; + float percentage = point / 7; + + percentage = 1.f - percentage; + percentage *= std::clamp( delta + 0.75f, 0.f, 1.f ); + + clr_t draw = col; + draw.a( ) *= percentage; + + draw_line( start, end, draw ); + draw_line( rot_start, rot_end, draw ); + } + } + } + + struct box_t { + int x, y, w, h; + }; + + box_t get_box( c_base_player* ent, vec3_t stored_origin ) { + const matrix3x4& matrix = ent->m_CoordinateFrame( ); + + vec2_t min_corner{ FLT_MAX, FLT_MAX }; + vec2_t max_corner{ FLT_MIN, FLT_MIN }; + + vec3_t min_pos; + vec3_t max_pos; + + matrix3x4 bone_matrix[ 128 ]; + memcpy( bone_matrix, ent->m_CachedBoneData( ).GetElements( ), ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); + + for( size_t i{ }; i < hdr->numbones; ++i ) { + auto bone = hdr->GetBone( i ); + + if( bone && bone->parent != -1 && bone->flags & 0x100 ) { + auto& matrix = bone_matrix[ i ]; + vec3_t hitbox = vec3_t( matrix[ 0 ][ 3 ], matrix[ 1 ][ 3 ], matrix[ 2 ][ 3 ] ); + hitbox -= ent->ce( )->GetRenderOrigin( ); + hitbox += stored_origin; + + + vec2_t pos = util::screen_transform( hitbox ); + + if( pos.x < min_corner.x ) + min_corner.x = pos.x; + + if( pos.x > max_corner.x ) + max_corner.x = pos.x; + + if( pos.y < min_corner.y ) + min_corner.y = pos.y; + + if( pos.y > max_corner.y ) + max_corner.y = pos.y; + } + } + + vec2_t origin = util::screen_transform( stored_origin ); + if( max_corner.y > 1 && max_corner.x > 1 && min_corner.y < screen_h && min_corner.x < screen_w ) { + vec3_t origin_zoffset = stored_origin; + origin_zoffset.z += 10; + + vec2_t delta = util::screen_transform( origin_zoffset ) - origin; + + min_corner.x += delta.y; + max_corner.x -= delta.y; + + min_corner.y += delta.y; + max_corner.y -= delta.y; + } + else { + return { -100, -100, 0, 0 }; + } + + int x = ( int )min_corner.x; + int w = ( int )( max_corner.x - min_corner.x ); + + int y = ( int )min_corner.y; + int h = ( int )( max_corner.y - min_corner.y ); + + return { x, y, w, h }; + } + + void c_visuals::out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ) { + vec2_t screen; + vec2_t circle; + + auto find_point = [ ]( vec2_t& point, float deg_x, float deg_y ) { + float x2 = screen_w / 2.f; + float y2 = screen_h / 2.f; + + float d = sqrt( pow( point.x - x2, 2 ) + pow( point.y - y2, 2 ) ); + float r_x = deg_x / d; + float r_y = deg_y / d; + + point.x = r_x * point.x + ( 1.f - r_x ) * x2; + point.y = r_y * point.y + ( 1.f - r_y ) * y2; + }; + + auto get_screen_point = [ ]( vec2_t& screen, const vec3_t& delta ) { + decltype( auto ) w2s_matrix = g_csgo.m_engine( )->WorldToScreenMatrix( ); + float x; + float w; + float y; + + screen.x = w2s_matrix[ 0 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 0 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 0 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 0 ][ 3 ]; + screen.y = w2s_matrix[ 1 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 1 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 1 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 1 ][ 3 ]; + w = w2s_matrix[ 3 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 3 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 3 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 3 ][ 3 ]; + + if( w < 0.001f ) { + float invw = -1.0f / w; + screen.x *= invw; + screen.y *= invw; + } + else { + float invw = 1.0f / w; + screen.x *= invw; + screen.y *= invw; + } + + x = float( screen_w ) / 2.f; + y = float( screen_h ) / 2.f; + x += 0.5f * screen.x * screen_w + 0.5f; + y -= 0.5f * screen.y * screen_h + 0.5f; + screen.x = x; + screen.y = y; + }; + + screen = util::screen_transform( pos );//get_screen_point( screen, pos ); + circle = util::screen_transform( pos );// get_screen_point( circle, pos ); + + float radius = g_settings.visuals.out_of_pov_radius * 0.49f; + + float ratio = g_settings.visuals.out_of_pov_radius; + + float w = screen_w * ratio + screen_h * ( 1.0f - ratio ); + + find_point( screen, w * radius, + float( screen_h ) * radius ); + + auto min = std::min< int >( screen_w, screen_h ) * radius; + find_point( circle, float( min ), float( min ) ); + + auto rot_around_center = [ ]( vec2_t start, float rot ) { + float rad = rot * ( M_PI / 180.f ); + + start.x += sin( rad ) * float( g_settings.visuals.out_of_pov_size ); + start.y += cos( rad ) * float( g_settings.visuals.out_of_pov_size ); + + return start; + }; + + float delta_x = ( float( screen_w / 2 ) - circle.x ); + float delta_y = ( float( screen_h / 2 ) - circle.y ); + + auto hyp = sqrt( delta_x * delta_x + delta_y * delta_y ); + + float cos_ = delta_x / hyp; + + float deg = RAD2DEG( acos( cos_ ) ); + + if( screen.y < screen_h / 2 ) { + deg *= -1.f; + } + + auto rotated_pos_1 = rot_around_center( screen, deg + 115 ); + auto rotated_pos_2 = rot_around_center( screen, deg + 65 ); + + col.a( ) *= 0.8f; + + vertex_t v[ ] = { + { screen }, + { rotated_pos_1 }, + { rotated_pos_2 } + }; + + if( !g_settings.misc.hide_from_obs ) + g_renderer.draw_polygon( 3, v, col ); + else { + draw_line( screen, rotated_pos_1, col ); + draw_line( screen, rotated_pos_2, col ); + draw_line( rotated_pos_1, rotated_pos_2, col ); + } + } + + void c_visuals::update_glow( ) { + if( !g_settings.visuals.active || g_settings.misc.hide_from_obs ) + return; + +#ifdef HEADER_MODULE + static auto manager_ptr = g_header.patterns.glow_manager + 0x3; +#else + static auto manager_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "0F 11 05 00 00 00 00 83 C8 01" ), 0x3 ); +#endif + + auto glow_object_manager = *( GlowObjectManager_t** )( manager_ptr ); + auto glow_count = glow_object_manager->Count; + auto glow_objects = glow_object_manager->DataPtr; + + if( glow_count > 500 || glow_count <= 0 ) + return; + + for( int i{ }; i < glow_count; ++i ) { + auto& object = glow_objects[ i ]; + + auto ent = object.m_pEntity->as< c_base_player >( ); + if( !ent ) continue; + + if( ent->is_player( ) ) { + if( g_settings.visuals.glow && + ent->is_valid( ) && ent->has_valid_anim( ) && ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || + g_settings.visuals.friendlies || g_settings.visuals.chams.friendlies ) ) { + + clr_t clr = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? + g_settings.visuals.glow_friendly : g_settings.visuals.glow_enemy; + + object.color = clr.to_fclr( ); + object.m_bRenderWhenOccluded = true; + object.m_bRenderWhenUnoccluded = false; + object.m_flBloomAmount = 0.85f; + } + } + else { + auto ce = ent->ce( ); + auto client_class = ce->GetClientClass( ); + if( !client_class ) continue; + int class_id = client_class->m_class_id; + if( class_id != CBaseWeaponWorldModel && ( strstr( client_class->m_name, xors( "Weapon" ) ) + || class_id == CDEagle || class_id == CAK47 ) ) { + bool glow = g_settings.visuals.weapon_esp == 2 || g_settings.visuals.weapon_esp == 3; + object.color = g_settings.visuals.weapon_esp_clr( ).to_fclr( ); + object.m_bRenderWhenOccluded = true; + object.m_bRenderWhenUnoccluded = false; + object.m_flBloomAmount = glow ? 0.85f : 0.0f; + } + else { + auto model = ce->GetModel( ); + if( !model ) continue; + + bool glow = g_settings.visuals.grenade_esp( ) == 2 || g_settings.visuals.grenade_esp( ) == 3; + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) + continue; + + object.color = g_settings.visuals.grenade_esp_clr( ).to_fclr( ); + object.m_bRenderWhenOccluded = true; + object.m_bRenderWhenUnoccluded = false; + object.m_flBloomAmount = glow ? 0.85f : 0.0f; + } + } + } + } + + inline clr_t blend_clr( clr_t in, float progress ) { + static const clr_t clr_gray = { 160, 160, 160, 255 }; + int a = in.a( ); + + clr_t ret = clr_t::blend( clr_gray, in, 0.1f + progress * 0.9f ); + ret.a( ) = a; + return ret; + } + + void c_visuals::update_positions( ) { + CUtlVector< CSndInfo > sound_info{ }; + + g_csgo.m_engine_sound( )->GetActiveSounds( sound_info ); + + for( size_t i{ }; i < sound_info.GetSize( ); ++i ) { + auto& snd = sound_info.GetElements( )[ i ]; + + if( snd.origin ) { + int idx = snd.sound_source; + auto ent = g_csgo.m_entlist( )->GetClientEntity( idx ); + + if( ent && ent->is_player( ) && ent->ce( )->IsDormant( ) ) + update_position( idx, snd.origin[ 0 ] ); + } + } + } + + void c_visuals::draw_players( ) { + static constexpr float anim_rate = 1.0f / 0.5f; + static float pov_progress[ 65 ]{ }; + + auto resource = c_base_player::get_player_resource( ); + + for( int i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); + + if( !ent || !ent->is_player( ) || !ent->is_alive( ) || ent == g_ctx.m_local ) { + m_has_seen[ i ] = false; + m_anim_progress[ i ] = 0.f; + continue; + } + + if( !ent->has_valid_anim( ) ) + continue; + + if( i == ( g_ctx.m_local->m_hObserverTarget( ) & 0xfff ) ) + continue; + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && + !g_settings.visuals.friendlies( ) ) + continue; + + float rate = g_csgo.m_globals->m_frametime * anim_rate; + float& anim = m_anim_progress[ i ]; + float alpha = anim; + bool dormant = ent->ce( )->IsDormant( ); + int health = ent->m_iHealth( ); + auto origin = ent->ce( )->GetRenderOrigin( ); + int right_pos = 0; + int bottom_pos = 0; + bool too_distant = true; + if( g_ctx.m_local ) + too_distant = ent->m_vecOrigin( ).dist_to( g_ctx.m_local->m_vecOrigin( ) ) > 2000.f; + + if( !dormant ) { + update_position( i, origin ); + if( anim > 0.f ) + anim = std::clamp( anim + rate, 0.f, 1.f ); + else + anim = 0.5f; + + m_has_seen[ i ] = true; + } + else { + if( anim < 0.3f && g_settings.visuals.dormant && !too_distant ) { + rate *= 0.02f; + } + anim = std::clamp( anim -= rate, 0.f, 1.0f ); + if( m_anim_progress[ i ] <= 0.f ) { + m_has_seen[ i ] = false; + continue; + } + } + + auto box = get_box( ent, m_stored_pos[ i ] ); + + clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? + g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; + + if( dormant ) { + col = blend_clr( col, anim ); + col.a( ) *= anim; + } + + if( box.x > screen_w || box.x + box.w < 0 || + box.y > screen_h || box.y + box.h < 0 ) { + if( g_settings.visuals.out_of_pov ) { + auto& anim = pov_progress[ i ]; + + if( dormant ) + anim = std::clamp( anim -= g_csgo.m_globals->m_frametime * anim_rate, 0.f, 1.0f ); + else + anim = std::clamp( anim += g_csgo.m_globals->m_frametime * anim_rate, 0.f, 1.0f ); + + col.a( ) *= anim; + out_of_fov( ent, ent->ce( )->GetRenderOrigin( ), col ); + } + continue; + } + + pov_progress[ i ] = 0.f; + + if( g_settings.visuals.skeleton( ) && !dormant ) { + clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.skeleton_friendly : g_settings.visuals.skeleton_enemy; + col.a( ) *= alpha; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); + if( hdr ) { + matrix3x4 matrix[ 128 ]; + memcpy( matrix, ent->m_CachedBoneData( ).GetElements( ), + ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); + + for( size_t bone{ }; bone < hdr->numbones; ++bone ) { + auto b = hdr->GetBone( bone ); + if( b && b->flags & 0x100 && b->parent != -1 ) { + vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; + vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; + + auto child_screen = util::screen_transform( child ); + auto parent_screen = util::screen_transform( parent ); + + draw_line( child_screen, parent_screen, col ); + } + } + } + } + + if( g_settings.visuals.box( ) ) { + auto alpha_ = col.a( ); + float percent = float( alpha_ ) / 255.f; + draw_rect( box.x + 1, box.y + 1, box.w - 2, box.h - 2, clr_t( 0, 0, 0, 180 * alpha * percent ) ); + draw_rect( box.x, box.y, box.w, box.h, col ); + } + + if( g_settings.visuals.health( ) ) { + auto fill = box.h - 1; + fill *= std::clamp( health, 0, 100 ) * 0.01f; + + auto hp_col = clr_t( + std::min< int >( 510 * ( 100 - health ) / 100, 255 ), + std::min< int >( 510 * health / 100, 255 ), + 0, + 255 * alpha ); + + draw_filled_rect( box.x - 4, box.y, 3, box.h + 1, clr_t( 0, 0, 0, 170 * alpha ) ); + draw_filled_rect( box.x - 3, box.y + box.h - fill, 1, fill, hp_col ); + + if( health != 100 ) + draw_string( box.x - 2, box.y + 1 + box.h - fill - 3, ALIGN_CENTER, false, clr_t( 255, 255, 255, 255 * alpha ), "%d", health ); + } + + if( g_settings.visuals.name( ) ) { + clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.name_friendly( ) : g_settings.visuals.name_enemy( ); + col.a( ) *= alpha; + + char name[ 32 ]; + ent->get_name_safe( name ); + + draw_string( box.x + box.w / 2, box.y - 12, ALIGN_CENTER, true, + blend_clr( col, anim ), name ); + } + + if( g_settings.visuals.money( ) ) { + int x_pos = box.x + box.w + 2; + int y_pos = box.y - 1 + right_pos; + draw_string( x_pos, y_pos, ALIGN_LEFT, false, + blend_clr( esp_green( 255 * alpha ), anim ), + xors( "%d$" ), ent->m_iAccount( ) ); + + right_pos += 9; + } + + if( g_settings.visuals.resolver_indicator && g_settings.rage.resolver && g_cheat.m_player_mgr.is_cheater( i ) && !dormant && g_ctx.m_local->is_valid( ) ) { + bool can_backtrack_lby = g_cheat.m_ragebot.m_lagcomp->can_backtrack_entity( i ) == RECORD_LBY && !ent->is_breaking_lc( ); + bool can_backtrack = !!g_cheat.m_ragebot.m_lagcomp->can_backtrack_entity( i ) && !ent->is_breaking_lc( ); + int x_pos = box.x + box.w + 3; + int y_pos = box.y - 1 + right_pos; + + bool is_fake = !can_backtrack_lby; + bool is_breaking_lc = g_cheat.m_prediction.is_breaking_lc( i ); + + if( is_breaking_lc ) { + draw_string( x_pos, y_pos, ALIGN_LEFT, false, + clr_t( 255, 255, 255, 255 * alpha ), + xors( "lc" ) ); + + right_pos += 9; + } + else if( is_fake && g_ctx.m_local->is_valid( ) ) { + if( ent->m_fFlags( ) & FL_ONGROUND && ent->get_anim_velocity( ).length2d( ) < 0.1f && !dormant && !g_settings.misc.hide_from_obs ) { + float update = g_cheat.m_ragebot.m_lagcomp->get_flick_time( i ); + float delta = ( ent->m_flSimulationTime( ) - update ) * 0.9f; + + if( delta >= 0.f && delta <= 1.f ) { + + //don't allocate 20000000 bytes on the stack thx + static vertex_t v[ 48 ]; + + float radius = box.w / 5.f; + + radius = std::clamp( radius, 4.f, 8.f ); + + right_pos += radius * 2; + + v[ 0 ].init( x_pos + radius / 2 + 2, y_pos + radius / 2 + 2 ); + + int progress = ( 1.f - delta ) * 48; + + + const float step = ( M_PI * 2.f ) / 48.f; + + for( int r = 1; r < progress; ++r ) { + float s = sin( step * r ) * radius; + float c = cos( step * r ) * radius; + + + v[ r ].init( x_pos + radius / 2 + c + 2, y_pos + s + radius / 2 + 2 ); + } + + g_renderer.draw_filled_circle( x_pos + radius / 2 + 2, y_pos + radius / 2 + 2, radius + 1, clr_t( 0, 0, 0, 170 * alpha ) ); + g_renderer.draw_polygon( progress, v, g_settings.visuals.lby_bar_clr ); + } + } + else { + draw_string( x_pos, y_pos, ALIGN_LEFT, false, + clr_t( 255, 255, 255, 255 * alpha ), + xors( "fake" ) ); + + right_pos += 9; + } + } + + if( !!g_cheat.m_ragebot.m_resolver->get_state( i ) && !dormant && g_ctx.m_local->is_valid( ) && g_settings.misc.hide_from_obs( ) ) { + float update = g_cheat.m_ragebot.m_lagcomp->get_flick_time( i ); + float delta = ( ent->m_flSimulationTime( ) - update ) * 0.9f; + if( delta >= 0.f && delta <= 1.f ) { + float max = box.w - 2.f; + float fill = max * std::clamp( delta, 0.f, 1.f ); + + draw_filled_rect( box.x, box.y + box.h + 3 + bottom_pos, + box.w, 3, clr_t( 0, 0, 0, 180 * alpha ) ); + + clr_t col = g_settings.visuals.lby_bar_clr; + col.a( ) *= alpha; + + draw_filled_rect( box.x + 1, box.y + box.h + 4 + bottom_pos, + fill, 1, blend_clr( col, anim ) ); + + bottom_pos += 4; + } + } + } + + if( g_settings.visuals.ping( ) ) { + auto ping = ent->get_ping( ); + + if( ping > 310 ) { + int x_pos = box.x + box.w + 3; + int y_pos = box.y - 1 + right_pos; + + draw_string( x_pos, y_pos, ALIGN_LEFT, false, + blend_clr( esp_blue( 255 * alpha ), anim ), + xors( "ping" ) ); + + right_pos += 9; + } + } + + if( g_settings.visuals.weapon( ) ) { + auto weapon = ent->get_weapon( ); + if( weapon ) { //magic font + auto weapon_info = weapon->get_wpn_info( ); + int max = weapon_info->max_clip_ammo; + + if( g_settings.visuals.ammo && max > 1 ) { + auto progress = float( weapon->m_iClip1( ) ) / max; + float fill = box.w - 2.f; + float percent = fill * progress; + + draw_filled_rect( box.x, box.y + box.h + 3 + bottom_pos, + box.w, 3, clr_t( 0, 0, 0, 180 * alpha ) ); + + clr_t col = g_settings.visuals.ammo_bar_clr; + col.a( ) *= alpha; + + draw_filled_rect( box.x + 1, box.y + box.h + 4 + bottom_pos, + percent, 1, blend_clr( col, anim ) ); + + if( progress < 0.25f ) { + draw_string( + box.x + percent, box.y + box.h + bottom_pos, ALIGN_LEFT, false, + clr_t( 255, 255, 255, 180 * alpha ), "%d", weapon->m_iClip1( ) ); + } + + bottom_pos += 4; + } + + + char wep_str[ 64 ]; + sprintf_s< 64 >( wep_str, "%s", util::definition_index_to_name( weapon->m_iItemDefinitionIndex( ) ) ); + + draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, false, + clr_t( 255, 255, 255, alpha * 255 ), wep_str ); + } + } + + if( g_settings.visuals.flags( ) ) { + int x_pos = box.x + box.w + 3; + int y_pos = box.y - 1; + + if( ent->m_bIsScoped( ) && right_pos < box.h ) { + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "scope" ) ); + right_pos += 9; + } + + if( ent->is_flashed( ) && right_pos < box.h ) { + const float step = M_PI * 2.f / 6; + + float radius = std::clamp( box.w / 5.f, 4.f, 8.f ); + + for( int i = 0; i < 6; ++i ) { + float c = cos( step * i + DEG2RAD( 30.f ) ); + float s = sin( step * i + DEG2RAD( 30.f ) ); + + float off = 0; + + if( i == 5 || i == 0 ) + off = 0.25f; + + draw_line( x_pos + c * radius / 2 + radius / 2 + 2, y_pos + right_pos + s * radius / 2 + radius / 2 + 3, + x_pos + c * ( radius + off ) + radius / 2 + off + 2, y_pos + s * ( radius + off ) + right_pos + radius / 2 + 3, + blend_clr( esp_blue( 255 * alpha ), anim ) ); + } + + //draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, blend_clr( esp_blue( 255 * alpha ), anim ), xors( "flash" ) ); + right_pos += radius * 2.3f; + } + + if( !( util::is_low_fps( ) && g_settings.rage.preserve_fps( ) ) ) { + if( m_hit_flag[ i ] && g_ctx.m_local->is_valid( ) && i != g_cheat.m_ragebot.get_target( ) && g_settings.rage.enabled ) { + clr_t col = m_hit_flag[ i ] == HIT_1W ? clr_t( 255, 255, 255, 255 * alpha ) : esp_red( alpha * 255 ); + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, blend_clr( col, anim ), xors( "hit" ) ); + right_pos += 9; + } + } + + if( ent->is_reloading( ) && right_pos < box.h ) { + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "rel" ) ); + right_pos += 9; + } + } + + + + static con_var< bool > dbg_multipoint{ &data::holder_, fnv( "dbg_multipoint" ), false }; + if( dbg_multipoint( ) ) { + auto should_multipoint = [ ]( int hitbox, bool moving ) -> bool { + auto& setting = g_settings.rage.multipoint; + + switch( hitbox ) { + case HITBOX_HEAD: + return setting.head; + case HITBOX_PELVIS: + case HITBOX_BODY: + return setting.stomach; + //case HITBOX_CHEST: + case HITBOX_UPPER_CHEST: + case HITBOX_THORAX: + return setting.chest; + case HITBOX_RIGHT_THIGH: + case HITBOX_LEFT_THIGH: + if( moving && g_settings.rage.ignore_limbs_moving ) + return false; + + if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) + return false; + + return setting.thighs; + + case HITBOX_LEFT_CALF: + case HITBOX_RIGHT_CALF: + if( moving && g_settings.rage.ignore_limbs_moving ) + return false; + + if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) + return false; + + return setting.calves; + default: + return false; + } + }; + + bool moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ); + + matrix3x4 bone_matrix[ 128 ]; + ent->ce( )->SetupBones( bone_matrix, 128, BONE_USED_BY_HITBOX, 0.f ); + + for( int hitbox = 0; hitbox < HITBOX_MAX; ++hitbox ) { + if( should_multipoint( hitbox, moving ) ) { + const auto model = ent->ce( )->GetModel( ); + if( !model ) continue; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !hdr ) continue; + + auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); + if( !set ) continue; + + //literally 20000 iq, the best multipoint + //im an actual fucking retard jesus christ + auto box = set->pHitbox( hitbox ); + if( !box ) continue; + + vec3_t center = ( box->bbmax + box->bbmin ) * 0.5f; + + float dist = box->m_flRadius; + + if( box->m_flRadius == -1.f ) + dist = center.dist_to( box->bbmin ) * 0.85f; + vec3_t min_dir = math::angle_vectors( math::vector_angles( center, box->bbmin ) ); + vec3_t min = center + min_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; + + if( box->m_flRadius == -1.f ) + dist = center.dist_to( box->bbmax ) * 0.85f; + vec3_t max_dir = math::angle_vectors( math::vector_angles( center, box->bbmax ) ); + vec3_t max = center + max_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; + + std::vector< vec3_t > points; + + points.push_back( center ); + + if( g_settings.rage.multipoint_enable( ) == 1 || + hitbox == HITBOX_LEFT_CALF || hitbox == HITBOX_RIGHT_CALF || + hitbox == HITBOX_LEFT_THIGH || hitbox == HITBOX_RIGHT_THIGH ) { + points.push_back( vec3_t{ min.x, min.y, center.z } ); + points.push_back( vec3_t{ max.x, min.y, center.z } ); + points.push_back( vec3_t{ min.x, max.y, center.z } ); + points.push_back( vec3_t{ max.x, max.y, center.z } ); + } + else if( g_settings.rage.multipoint_enable( ) == 2 ) { + points.push_back( vec3_t{ max.x, max.y, max.z } ); + points.push_back( vec3_t{ min.x, max.y, max.z } ); + points.push_back( vec3_t{ max.x, min.y, max.z } ); + points.push_back( vec3_t{ min.x, min.y, max.z } ); + + points.push_back( vec3_t{ max.x, max.y, min.z } ); + points.push_back( vec3_t{ min.x, max.y, min.z } ); + points.push_back( vec3_t{ max.x, min.y, min.z } ); + points.push_back( vec3_t{ min.x, min.y, min.z } ); + } + else if( g_settings.rage.multipoint_enable( ) == 3 ) { + points.push_back( vec3_t{ min.x, min.y, center.z } ); + points.push_back( vec3_t{ max.x, min.y, center.z } ); + points.push_back( vec3_t{ min.x, max.y, center.z } ); + points.push_back( vec3_t{ max.x, max.y, center.z } ); + + points.push_back( vec3_t{ max.x, max.y, max.z } ); + points.push_back( vec3_t{ min.x, max.y, max.z } ); + points.push_back( vec3_t{ max.x, min.y, max.z } ); + points.push_back( vec3_t{ min.x, min.y, max.z } ); + + points.push_back( vec3_t{ max.x, max.y, min.z } ); + points.push_back( vec3_t{ min.x, max.y, min.z } ); + points.push_back( vec3_t{ max.x, min.y, min.z } ); + points.push_back( vec3_t{ min.x, min.y, min.z } ); + } + + for( size_t i1 = 0; i1 < points.size( ); i1++ ) { + auto& it = points.at( i1 ); + + auto trans = math::vector_transform( it, bone_matrix[ box->bone ] ); + auto w2s_box = util::screen_transform( trans ); + + draw_circle( ( int )w2s_box.x, ( int )w2s_box.y, 3, esp_blue( ), 16 ); + } + } + } + } + +#ifdef _DEBUG + static con_var< bool > dbg_bt{ &data::holder_, fnv( "dbg_bt" ), false }; + if( dbg_bt( ) && i == g_cheat.m_ragebot.get_shot_target( ) ) { + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); + if( hdr ) { + auto matrix = g_cheat.m_ragebot.get_shot_matrix( ); + for( size_t bone{ }; bone < hdr->numbones; ++bone ) { + auto b = hdr->GetBone( bone ); + if( b && b->flags & 0x100 && b->parent != -1 ) { + vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; + vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; + + auto child_screen = util::screen_transform( child ); + auto parent_screen = util::screen_transform( parent ); + + draw_line( child_screen, parent_screen, clr_t( 255, 255, 255, 200 ) ); + } + } + } + } + + static con_var< bool > dbg_pose{ &data::holder_, fnv( "dbg_pose" ) }; + if( dbg_pose( ) ) { + for( size_t i{ }; i < 24; ++i ) { + int x = box.x + box.w + 15; + int y = box.y + 11 * i; + + draw_string( x, y, ALIGN_LEFT, false, clr_t( 255, 255, 255 ), "%d %f", i, ent->m_flPoseParameter( )[ i ] ); + } + } + + static con_var< bool > dbg_anim{ &data::holder_, fnv( "dbg_anim" ) }; + if( dbg_anim( ) ) { + draw_string( box.x - 14, box.y - 15, ALIGN_RIGHT, false, clr_t( 255, 255, 255 ), "%f", ent->get_animdata( ).m_last_velocity.length2d( ) ); + draw_string( box.x - 14, box.y, ALIGN_RIGHT, false, clr_t( 255, 255, 255 ), "%f", ent->get_animdata( ).m_anim_velocity.length2d( ) ); + for( size_t i{ }; i < 13; ++i ) { + int x = box.x - 15; + int y = box.y + 11 * ( i + 2 ); + + draw_string( x, y, ALIGN_RIGHT, false, clr_t( 255, 255, 255 ), "%d %f", i, ent->m_AnimOverlay( ).GetElements( )[ i ].m_flCycle ); + } + + auto ent_origin = ent->m_vecOrigin( ); + auto ent_origin_vel = origin + ent->get_animdata( ).m_anim_velocity; + ent_origin_vel.z = ent_origin.z; + + draw_line( util::screen_transform( ent_origin ), util::screen_transform( ent_origin_vel ), esp_blue( ) ); + } +#endif + } + } + + void c_visuals::store_sound( int index, vec3_t origin ) { + if( !g_settings.visuals.sound ) + return; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); + if( ent && ent->is_player( ) && ent->is_alive( ) && ent != g_ctx.m_local ) { + if( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || ( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && g_settings.visuals.friendlies( ) ) ) { + sound_t new_sound; + new_sound.m_time = g_csgo.m_globals->m_curtime; + new_sound.m_ent = index; + new_sound.m_pos = origin; + new_sound.m_pos.z += 5.f; + m_sounds.emplace_back( new_sound ); + } + } + } + + void c_visuals::store_hit( context::shot_data_t* shot ) { + if( !g_settings.visuals.hits ) + return; + + hit_t new_hit; + + auto ent = g_csgo.m_entlist( )->GetClientEntity( shot->m_enemy_index ); + + new_hit.m_ent = shot->m_enemy_index; + ent->get_name_safe( new_hit.m_name ); + + memcpy( new_hit.m_matrix, + shot->m_matrix, + sizeof( matrix3x4 ) * 128 ); + + new_hit.m_pos = shot->m_enemy_pos; + new_hit.m_time = g_csgo.m_globals->m_curtime; + + m_hits.push_back( new_hit ); + } + + void c_visuals::draw_skeletons( ) { + if( !g_settings.visuals.hits ) + return; + + for( size_t i{ }; i < m_hits.size( ) && !m_hits.empty( ); ++i ) { + auto& hit = m_hits[ i ]; + + float delta = g_csgo.m_globals->m_curtime - hit.m_time; + if( std::abs( delta ) > g_settings.visuals.target_time ) + m_hits.erase( m_hits.begin( ) + i ); + } + + for( auto& it : m_hits ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_ent ); + + if( !ent || !ent->is_player( ) ) + continue; + + if( !ent->is_alive( ) ) + it.m_dead = true; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); + + auto matrix = it.m_matrix; + vec3_t pos = it.m_pos; + float delta = g_csgo.m_globals->m_curtime - it.m_time; + + float total = g_settings.visuals.target_time; + float threshold = total * 0.5f; + + float fade = total - delta < threshold ? ( total - delta ) / ( total * 0.5f ) : 1.f; + + float dist_fade = 1.f; + if( ent->is_valid( ) && !it.m_dead ) { + dist_fade = 300.f - std::clamp( ent->ce( )->GetRenderOrigin( ).dist_to( pos ), 1.f, 300.f ) / 300.f; + } + + clr_t col = clr_t( 255, 255, 255, 100 * dist_fade * fade ); + + clr_t outer_col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? + g_settings.visuals.glow_friendly : + g_settings.visuals.glow_enemy; + + outer_col.a( ) *= 0.65f; + outer_col.a( ) *= ( fade * dist_fade ); + + for( size_t bone{ }; bone < hdr->numbones; ++bone ) { + auto b = hdr->GetBone( bone ); + if( b && b->flags & 0x100 && b->parent != -1 ) { + vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; + vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; + + auto child_screen = util::screen_transform( child ); + auto parent_screen = util::screen_transform( parent ); + + draw_line( child_screen - vec2_t( 1, 1 ), parent_screen - vec2_t( 1, 1 ), outer_col ); + draw_line( child_screen, parent_screen, col ); + + draw_line( child_screen + vec2_t( 1, 1 ), parent_screen + vec2_t( 1, 1 ), outer_col ); + } + } + } + } + + void c_visuals::update_hit_flags( ) { + if( !g_settings.visuals.flags || !g_settings.rage.enabled ) + return; + + if( util::is_low_fps( ) && g_settings.rage.preserve_fps ) + return; + + auto weapon = g_ctx.m_local->get_weapon( ); + + for( size_t i{ }; i < 65; ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); + + if( !ent || !ent->is_valid( ) || !ent->has_valid_anim( ) || + ( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) + || ent->m_bGunGameImmunity( ) ) { + m_hit_flag[ i ] = HIT_NONE; + continue; + } + + vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); + vec3_t enemy_pos = ent->get_hitbox_pos( 0 ); + + auto local_wep = g_ctx.m_local->get_weapon( ); + auto enemy_wep = ent->get_weapon( ); + + if( !local_wep || !enemy_wep || local_wep->is_knife( ) || enemy_wep->is_knife( ) || local_wep->is_grenade( ) || enemy_wep->is_grenade( ) ) { + m_hit_flag[ i ] = HIT_NONE; + continue; + } + + float local_dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, enemy_pos, false ); + float enemy_dmg = g_cheat.m_autowall.run( ent, g_ctx.m_local, g_ctx.m_local->get_hitbox_pos( 0 ), false ); + + auto min_dmg = g_cheat.m_ragebot.get_min_dmg( ent ); + + if( enemy_dmg < 5.f && local_dmg > g_cheat.m_ragebot.get_min_dmg( ent ) ) + m_hit_flag[ i ] = HIT_1W; + else if( enemy_dmg > 15.f && local_dmg < g_cheat.m_ragebot.get_min_dmg( ent ) ) + m_hit_flag[ i ] = HIT_ALERT; + else + m_hit_flag[ i ] = HIT_NONE; + } + } + + void c_visuals::store_ent_dmg( int attacker, int entindex, int dmg ) { + if( entindex == g_ctx.m_local->ce( )->GetIndex( ) ) + return; + + bool dead = false; + int hp = 100 - m_ent_dmg[ entindex ]; + + if( hp - dmg < 0 ) { + dmg = hp; + dead = true; + } + + m_ent_dmg[ entindex ] += dmg; + + auto ent = g_csgo.m_entlist( )->GetClientEntity( entindex ); + if( attacker == g_csgo.m_engine( )->GetLocalPlayer( ) && ent && ent->is_player( ) && ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && g_ctx.m_local->is_valid( ) ) { + m_teamdmg += ( g_csgo.m_globals->m_curtime - m_last_roundstart > 10.f ) || dead ? dmg : dmg * 2; + } + } + + void c_visuals::on_round_start( ) { + reset_position( ); + + m_last_roundstart = g_csgo.m_globals->m_curtime; + for( size_t i{ }; i < 65; ++i ) { + m_ent_dmg[ i ] = 0.f; + } + } + + void c_visuals::reset_local_dmg( ) { + m_teamdmg = 0; + } + + void c_visuals::draw_sound( ) { + if( !g_settings.visuals.active ) return; + if( g_settings.misc.hide_from_obs ) return; + + float time = g_csgo.m_globals->m_curtime; + + if( m_sounds.empty( ) ) + return; + + + for( size_t i{ }; i < m_sounds.size( ) && !m_sounds.empty( ); ++i ) { + auto& tr = m_sounds[ i ]; + + float delta = g_csgo.m_globals->m_curtime - tr.m_time; + if( delta > 0.001f || std::abs( delta ) > 0.001f ) m_sounds.erase( m_sounds.begin( ) + i ); + } + + if( !m_sounds.empty( ) ) { + for( auto& it : m_sounds ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_ent ); + if( !ent || !ent->is_player( ) ) + continue; + + clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; + float delta = time - it.m_time; + if( !g_ctx.precache_model( xors( "materials/sprites/laserbeam.vmt" ) ) ) { + g_con->log( "nigga cant get" ); + continue; + } + + BeamInfo_t beam_info; + + beam_info.m_nType = beam_ring_point; + beam_info.m_pszModelName = xors( "materials/sprites/laserbeam.vmt" ); + beam_info.m_nModelIndex = g_csgo.m_model_info( )->GetModelIndex( xors( "materials/sprites/laserbeam.vmt" ) ); + beam_info.m_flHaloScale = 0.0f; + beam_info.m_flLife = 0.75f; //0.09 + beam_info.m_flWidth = 1.5f; + beam_info.m_flEndWidth = 1.5f; + beam_info.m_flFadeLength = 1.0f; + beam_info.m_flAmplitude = 0.f; + beam_info.m_flBrightness = col.a( ); + beam_info.m_flSpeed = 2.f; + beam_info.m_nStartFrame = 0; + beam_info.m_flFrameRate = 60; + beam_info.m_flRed = col.r( ); + beam_info.m_flGreen = col.g( ); + beam_info.m_flBlue = col.b( ); + beam_info.m_nSegments = 1; + beam_info.m_bRenderable = true; + beam_info.m_nFlags = 0; + + beam_info.m_vecCenter = it.m_pos; + beam_info.m_flStartRadius = 0.f; + beam_info.m_flEndRadius = ( float )g_settings.visuals.sound_range( ); + + Beam_t* beam = g_csgo.m_beams( )->CreateBeamRingPoint( beam_info ); + + if( beam ) { + g_csgo.m_beams( )->DrawBeam( beam ); + } + } + } + } + + void c_visuals::operator()( ) { + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + if( g_ctx.run_frame( ) ) { + draw_local( ); + } + + if( !g_ctx.m_local ) + return; + + switch( g_settings.visuals.activation_type( ) ) { + case 0: + g_settings.visuals.active = false; + break; + case 1: + g_settings.visuals.active = true; + break; + case 2: + g_settings.visuals.active = g_input.is_key_pressed( g_settings.visuals.key ); + break; + case 3: { + static bool held = false; + bool pressed = g_input.is_key_pressed( g_settings.visuals.key ); + if( pressed ) { + if( !held ) + g_settings.visuals.active ^= 1; + held = true; + } + else held = false; + } + break; + default: + g_settings.visuals.active = false; + break; + } + + if( g_settings.visuals.active ) { + update_positions( ); + draw_players( ); + draw_skeletons( ); + } + + draw_world( ); + draw_tracers( ); + draw_hits( ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/visual_world.cpp b/cheat/internal_rewrite/visual_world.cpp new file mode 100644 index 0000000..ea3d31d --- /dev/null +++ b/cheat/internal_rewrite/visual_world.cpp @@ -0,0 +1,415 @@ +#include +#include +#include "context.hpp" +#include "visual.hpp" +#include "interface.hpp" +#include "renderer.hpp" +#include "base_cheat.hpp" +namespace features +{ + void fix_static_props( ) { + static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) ); + static bool fixed{ }; + if( !fixed ) { + cvar->m_flags |= 0; + cvar->set_value( 1 ); + + fixed = true; + } + } + + void c_visuals::store_firegrenades( int index, vec3_t pos ) { + firegrenade_t new_grenade; + + auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); + if( !ent || !ent->is_player( ) ) + return; + + + new_grenade.m_time = g_csgo.m_globals->m_curtime; + new_grenade.m_ent = index; + new_grenade.m_pos = pos; + + m_firegrenades.emplace_back( new_grenade ); + } + + void c_visuals::draw_world( ) { + if( !g_settings.visuals.active ) + return; + + static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) ); + static auto c4_time = g_csgo.m_cvar( )->FindVar( xors( "mp_c4timer" ) ); + + draw_firegrenade( ); + + for( int i{ 64 }; i < g_csgo.m_entlist( )->GetHighestEntityIndex( ); ++i ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity< IClientEntity >( i ); + if( !ent ) continue; + + auto client_class = ent->GetClientClass( ); + if( !client_class ) continue; + + int class_id = client_class->m_class_id; + + if( g_settings.visuals.bomb_info && class_id == CPlantedC4 && ( strstr( client_class->m_name, xors( "Planted" ) ) ) ) { + //yea i know this is yuck i just want to get it out there for now, ill revisit it sometime in the week + //not bad at all tbh + int screen_w, screen_h; + g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); + + auto pos = ent->GetRenderOrigin( ); + auto w2s = util::screen_transform( pos ); + auto bomb = ent->as< c_base_weapon >( ); + auto to_target = pos - g_ctx.m_local->ce( )->GetRenderOrigin( ); + + float bomb_time = bomb->m_flC4Blow( ) - g_csgo.m_globals->m_curtime; + float bomb_percentage = bomb_time / c4_time->get_float( ); + float time = ( bomb_time < 0 || bomb->m_bBombDefused( ) ) ? 0.f : bomb_time; + + if( time <= 0.f ) + return; + + bool out_of_pov = w2s.x > screen_w || w2s.x < 0.f || w2s.y > screen_h || w2s.y < 0.f; + if( out_of_pov ) { + static auto safezoney = g_csgo.m_cvar( )->FindVar( xors( "safezoney" ) ); + static auto hud_scaling = g_csgo.m_cvar( )->FindVar( xors( "hud_scaling" ) ); + + w2s.x = screen_w / 2; + w2s.y = ( 45 * hud_scaling->get_float( ) ) + ( screen_h - screen_h * safezoney->get_float( ) + 1 ) * 0.5f; + } + + float bomb_damage = 500 * exp( -((to_target.length( ) * to_target.length( ) ) / ( ( ( 1750 * 0.33333334 ) * 2.f ) * ( 1750 * 0.33333334 ) ) ) ); + float damage = bomb_damage; + + if( g_ctx.m_local->m_ArmorValue( ) > 0 ) { + damage *= 0.5f; + float armor = ( bomb_damage - damage ) * 0.5f; + if( armor > g_ctx.m_local->m_ArmorValue( ) ) + damage = bomb_damage - ( g_ctx.m_local->m_ArmorValue( ) * ( 1.f / 0.5f ) ); + } + + int health_remaining = g_ctx.m_local->m_iHealth( ) - round(damage); + + float damage_percentage = std::clamp( round( damage ) / g_ctx.m_local->m_iHealth( ), 0.f, 1.0f ); + + clr_t bomb_col = clr_t::blend( esp_red( ), esp_green( ), bomb_percentage ); + clr_t damage_col = clr_t::blend( esp_green( ), esp_red( ), damage_percentage ); + + char health_str[ 100 ]; + + strenc::w_sprintf_s( health_str, 100, xors( "health: %d" ), health_remaining ); + + if( health_remaining <= 0 ) { + strenc::w_sprintf_s( health_str, 100, xors( "dead" ) ); + damage_percentage = 100.f; + } + + draw_string( w2s.x, w2s.y + 20, ALIGN_CENTER, false, damage_col, health_str ); + + auto draw_timer = [ & ]( const char* text, float progress, bool red = false ) { + clr_t col = red ? esp_red( ) : clr_t::blend( esp_green( ), esp_red( ), progress ); + + const float full = 78.f; + float fill = full * progress; + + draw_filled_rect( w2s.x - 40, w2s.y, 80, 18, clr_t( 0, 0, 0, 170 ) ); + draw_filled_rect( w2s.x - 39, w2s.y + 1, fill, 16, col ); + + draw_string( w2s.x, w2s.y + 3, ALIGN_CENTER, false, clr_t( 255, 255, 255 ), text ); + }; + + if( bomb->m_hBombDefuser( ) != ULONG_MAX ) { + auto defuser = g_csgo.m_entlist( )->GetClientEntity( bomb->m_hBombDefuser( ) & 0xfff ); + + float defuse_time = std::clamp( bomb->m_flDefuseCountDown( ) - g_csgo.m_globals->m_curtime, 0.f, 10.f ); + float defuse_percentage = defuser->m_bHasDefuser( ) ? defuse_time / 5.f : defuse_time / 10.f; + + char defuse_str[ 32 ]; + strenc::w_sprintf_s( defuse_str, 32, xors( "defuse: %.1f" ), defuse_time ); + + draw_timer( defuse_str, 1.f - defuse_percentage, defuse_time > bomb_time ); + } + else { + char bomb_str[ 32 ]; + strenc::w_sprintf_s( bomb_str, 32, xors( "bomb: %.1f" ), bomb_time ); + + draw_timer( bomb_str, 1.f - bomb_percentage ); + } + } + + if( class_id != CBaseWeaponWorldModel && ( strstr( client_class->m_name, xors( "Weapon" ) ) + || class_id == CDEagle || class_id == CAK47 ) ) { + auto owner = ( int )ent->as< c_base_weapon >( )->m_hOwner( ) & 0xfff; + if( owner <= 0 || owner > 64 ) { + auto origin = ent->GetRenderOrigin( ); + if( origin ) { + bool draw = g_settings.visuals.weapon_esp( ) == 1; + bool glow = g_settings.visuals.weapon_esp( ) == 2; + + if( draw || g_settings.visuals.weapon_esp == 3 ) { + if( !glow && !g_settings.misc.hide_from_obs ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false; + } + + auto w2s = util::screen_transform( origin ); + auto def_index = ent->as< c_base_weapon >( )->m_iItemDefinitionIndex( ); + auto name = util::definition_index_to_name( def_index ); + + auto dist = g_ctx.m_local->m_vecOrigin( ).dist_to( origin ); + + clr_t col = g_settings.visuals.weapon_esp_clr; + if( dist > 250.f ) { + col.a( ) *= std::clamp( ( 750.f - ( dist - 250.f ) ) / 750.f, 0.f, 1.f ); + }; + + draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, + col, name ); + } + if( ( glow || g_settings.visuals.weapon_esp == 3 ) && !g_settings.misc.hide_from_obs ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + } + } + } + else { + if( g_settings.visuals.grenade_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) { + auto model = ent->GetModel( ); + if( !model ) continue; + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); + if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) + continue; + + bool fade = false; + + std::string name = xors( "nade" ); + if( strstr( hdr->name, xors( "flash" ) ) ) { + name = xors( "flash" ); + fade = true; + } + else if( strstr( hdr->name, xors( "smoke" ) ) ) { + name = xors( "smoke" ); + fade = true; + } + else if( strstr( hdr->name, xors( "decoy" ) ) ) { + name = xors( "decoy" ); + fade = true; + } + else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) { + name = xors( "molotov" ); + } + + if( ( g_settings.visuals.grenade_esp == 2 || g_settings.visuals.grenade_esp == 3 ) && !g_settings.misc.hide_from_obs ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + + if( g_settings.visuals.grenade_esp == 1 || g_settings.visuals.grenade_esp == 3 ) { + auto pos = ent->GetRenderOrigin( ); + auto w2s = util::screen_transform( pos ); + auto cutie = g_csgo.m_entlist( )->GetClientEntityFromHandle( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); + + auto dist = g_ctx.m_local->m_vecOrigin( ).dist_to( pos ); + + clr_t col = g_settings.visuals.grenade_esp_clr( ); + if( dist > 250.f && fade ) { + col.a( ) *= std::max( ( 1000.f - ( dist - 250.f ) ) / 1000.f, 0.f ); + } + + draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, + col, name.c_str( ) ); + + char name[ 32 ]; + cutie->get_name_safe( name ); + + if( g_settings.visuals.grenade_owner( ) ) + draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, col, name ); + } + } + } + } + } + + void c_visuals::draw_firegrenade( ) { + static auto life_span = g_csgo.m_cvar( )->FindVar( xors( "inferno_flame_lifetime" ) ); + float time = g_csgo.m_globals->m_curtime; + + if( m_firegrenades.empty( ) ) + return; + + for( size_t i{ }; i < m_firegrenades.size( ) && !m_firegrenades.empty( ); ++i ) { + auto& tr = m_firegrenades[ i ]; + + float delta = g_csgo.m_globals->m_curtime - tr.m_time; + if( std::abs( delta ) > life_span->get_float( ) ) m_firegrenades.erase( m_firegrenades.begin( ) + i ); + } + + if( !m_firegrenades.empty( ) ) { + for( auto& it : m_firegrenades ) { + auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_ent ); + if( !ent || !ent->is_player( ) ) + continue; + + clr_t col = g_settings.visuals.grenade_esp_clr; + + vec3_t text_pos = it.m_pos; + text_pos.z += 5.f; + + auto w2s = util::screen_transform( text_pos ); + + float delta = g_csgo.m_globals->m_curtime - it.m_time; + + if( g_ctx.m_local->is_valid( ) && ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || ent == g_ctx.m_local ) ) { + vec3_t last_pos; + + const float fill = ( life_span->get_float( ) - delta ) / ( life_span->get_float( ) ) * 180.f; + + for( float rot = -fill; rot <= fill; rot += 3.f ) { + auto rotation = rot + delta * 90.f; + + while( rotation > 360.f ) + rotation -= 360.f; + + vec3_t rotated_pos = it.m_pos; + + rotated_pos.z -= 5.f; + + const auto radius = 50.f; + rotated_pos.x += cos( DEG2RAD( rotation ) ) * radius; + rotated_pos.y += sin( DEG2RAD( rotation ) ) * radius; + + if( rot != -fill ) { + auto w2s_new = util::screen_transform( rotated_pos ); + auto w2s_old = util::screen_transform( last_pos ); + auto alpha = 1.f - ( std::abs( rot ) / fill ); + + float threshold = life_span->get_float( ) * 0.2f; + + if( life_span->get_float( ) - delta < threshold ) { + float diff = ( life_span->get_float( ) - delta ) / ( life_span->get_float( ) ) * 5.f; + + alpha *= diff; + } + + clr_t col = g_settings.visuals.grenade_esp_clr; + + col.a( ) *= alpha; + + draw_line( w2s_old, w2s_new, col ); + } + + last_pos = rotated_pos; + } + } + + draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, col, xors( "molotov" ) ); + if( g_settings.visuals.grenade_owner ) + draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, col, ent->get_info( ).name ); + } + } + } + + void c_visuals::world_modulate( ) { + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials; + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2; + static c_base_player* local_player = nullptr; + static auto night_mode = false; + static bool modulated = false; + static bool alpha = false; + + if( !g_settings.visuals.world_modulate || !g_csgo.m_engine( )->IsInGame( ) || g_settings.misc.hide_from_obs ) { + modulated = false; + if( !world_materials2.empty( ) ) { + for( auto& it : world_materials2 ) { + auto mat = g_csgo.m_mat_system( )->GetMaterial( it.first ); + if( !mat ) continue; + + auto original_col = it.second; + mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) ); + mat->AlphaModulate( original_col.a( ) ); + } + + world_materials.clear( ); + world_materials2.clear( ); + } + + return; + } + + if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) { + fix_static_props( ); + + if( local_player == g_ctx.m_local && + night_mode == g_settings.visuals.night_mode( ) && + alpha == g_settings.visuals.transparent_props( ) && + modulated == g_settings.visuals.world_modulate( ) ) + return; + + + for( auto i = g_csgo.m_mat_system( )->FirstMaterial( ); + i != g_csgo.m_mat_system( )->InvalidMaterial( ); + i = g_csgo.m_mat_system( )->NextMaterial( i ) ) { + + auto mat = g_csgo.m_mat_system( )->GetMaterial( i ); + if( !mat ) continue; + + const char* group = mat->GetTextureGroupName( ); + bool is_world = strstr( group, xors( "World" ) ); + bool is_sky = strstr( group, xors( "Sky" ) ); + bool is_prop = strstr( group, xors( "StaticProp" ) ); + + if( is_world || is_sky || is_prop ) { + const char* name = mat->GetName( ); + if( world_materials.find( i ) == world_materials.end( ) ) { + fclr_t clr; + + mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) ); + clr.a( ) = mat->GetAlphaModulation( ); + + world_materials.emplace( i, clr ); + world_materials2.emplace( i, clr ); + } + + fclr_t new_color; + + new_color = world_materials2.find( i )->second; + bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate; + + if( is_world ) { + if( apply ) { + new_color.r( ) *= 0.15f; + new_color.g( ) *= 0.15f; + new_color.b( ) *= 0.15f; + } + } + else if( is_prop ) { + if( apply ) { + new_color.r( ) *= 0.3f; + new_color.g( ) *= 0.3f; + new_color.b( ) *= 0.3f; + } + if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) { + new_color.a( ) *= 0.6f; + } + } + else if( is_sky ) { + if( apply ) { + new_color = fclr_t( 0.f, 0.f, 0.f ); + } + } + + if( !( world_materials.at( i ) == new_color ) ) { + mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) ); + mat->AlphaModulate( new_color.a( ) ); + + world_materials.at( i ) = new_color; + } + } + } + + modulated = g_settings.visuals.world_modulate; + night_mode = g_settings.visuals.night_mode; + alpha = g_settings.visuals.transparent_props; + local_player = g_ctx.m_local; + } + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/vmt.hpp b/cheat/internal_rewrite/vmt.hpp new file mode 100644 index 0000000..03409ce --- /dev/null +++ b/cheat/internal_rewrite/vmt.hpp @@ -0,0 +1,95 @@ +#pragma once +#include +#include "util.hpp" + +// todo - dex; rewrite this, VirtualQuery (except for custom codeptr / readptr) and VirtualProtect shouldnt be used +// and we need to copy rtti over too or stuff will break later on + +// correct me if im wrong, but the vtable isnt replaced, instead the original is edited during hooking, rtti should be intact and accessable by game +// class could definetly do with a rewrite tho! + +// ^ you're corrct, but changing page rights and replacing ptrs direclty in rdata (or usually the heap, since thats where vmts go) is not a safe solution +// copying table + aligning it to compensate for rtti is safer +// vac loves scanning memory regions but it doesnt really do much outside of game servers (only loads some shit for checking DEP and stuff) + +// trash + +//llama is a fucking nigger +//true + +namespace hooks +{ + //we in 2017 still + + class c_vmt { + uintptr_t* m_table; + uintptr_t* m_original; + bool m_copied; + std::vector< uintptr_t > m_new; + public: + int count( ) { + int vfunc_count{ }; + + while ( m_original[ vfunc_count ] ) { + vfunc_count++; + }; + + return vfunc_count; + } + + c_vmt( void* table ) { + if ( !table ) { + return; + } + + this->m_table = reinterpret_cast< uintptr_t* >( table ); + this->m_original = *reinterpret_cast< uintptr_t** >( this->m_table ); + + for ( int i = -1; i < this->count( ); ++i ) { + this->m_new.push_back( this->m_original[ i ] ); + } + + m_copied = false; + } + + ~c_vmt( ) { } + + template< typename T = uintptr_t > T get_function( int index ) { + return( ( T )( this->m_new.at( index + 1 ) ) ); + } + + template< typename T = uintptr_t > T get_old_function( int index ) { + return( ( T )( this->m_original[ index ] ) ); + } + + void hook( int index, uintptr_t new_func ) { + if( !m_copied ) { + auto data = this->m_new.data( ); + *this->m_table = uintptr_t( &data[ 1 ] ); + + m_copied = true; + } + + this->m_new.at( index + 1 ) = new_func; + } + + void unhook( int index ) { + this->m_new.at( index + 1 ) = this->m_original[ index ]; + } + + void hook( int index, void* new_func ) { + if( !m_copied ) { + auto data = this->m_new.data( ); + *this->m_table = uintptr_t( &data[ 1 ] ); + + m_copied = true; + } + + hook( index, reinterpret_cast< uintptr_t >( new_func ) ); + } + + void restore( ) const { + *this->m_table = uintptr_t( m_original ); + } + }; +} \ No newline at end of file diff --git a/cheat/internal_rewrite/window_procedure.cpp b/cheat/internal_rewrite/window_procedure.cpp new file mode 100644 index 0000000..ffe9ccb --- /dev/null +++ b/cheat/internal_rewrite/window_procedure.cpp @@ -0,0 +1,58 @@ +#include "hooks.hpp" +#include "input_system.hpp" +#include "settings.hpp" + +decltype( &hooks::window_procedure ) hooks::window_procedure_o; +long __stdcall hooks::window_procedure( HWND hwnd, uint32_t msg, uint32_t wparam, long lparam ) { + if ( g_csgo.m_panic ) { + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); + } + + if ( msg == WM_ACTIVATE && wparam == WA_INACTIVE ) { + g_input.clear_keys( ); + } + + if ( msg == WM_MOUSEMOVE ) { + g_input.capture_mouse_move( lparam ); + g_con->get_input( )->capture_mouse_move( lparam ); + } + + static auto con_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_HOME ) ) { + if( !con_pressed ) { + if( !g_con->m_open ) { + g_con->m_consuming_input = true; + } + + g_con->m_open ^= 1; + } + + con_pressed = true; + } + else con_pressed = false; + + if( g_con->get_input( )->register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) ) { + if( g_con->m_open ) return false; + } + + if( !g_con->m_open ) { + static bool was_pressed = false; + if( g_input.is_key_pressed( KEYS_INSERT ) ) { + if( !was_pressed ) { + g_settings.menu.open ^= 1; + + was_pressed = true; + } + } + else { + was_pressed = false; + } + + if( g_input.register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) + && g_settings.menu.open ) { + return false; + } + } + + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); +} \ No newline at end of file diff --git a/cheat/internal_rewrite/wipe.hpp b/cheat/internal_rewrite/wipe.hpp new file mode 100644 index 0000000..dfb72a8 --- /dev/null +++ b/cheat/internal_rewrite/wipe.hpp @@ -0,0 +1,70 @@ +#pragma once + +#include "util.hpp" +#include + +#ifdef HEADER_MODULE + #define EXPAND( x,y )x##y + + #define BEGIN___( MARKER_BEGIN )MARKER_BEGIN: + + #define DEL_END___( MARKER_BEGIN, MARKER_END )__asm { __asm PUSH MARKER_END __asm PUSH MARKER_BEGIN __asm CALL antidebug::erase } \ + MARKER_END: + + #define BEGIN__( x, y ) BEGIN___( EXPAND2( MARKER_BEGIN_, x, y ) ) + #define END__( x, y ) DEL_END___( EXPAND2( MARKER_BEGIN_, x, y ), EXPAND2( MARKER_END_, x, y ) ) + + #define DELETE_START( x ) BEGIN___( EXPAND( MARKER_BEGIN_, x ) ) + #define DELETE_END( x ) DEL_END___( EXPAND( MARKER_BEGIN_, x ), EXPAND( MARKER_END_, x ) ) +#else + #define DELETE_START( x ) + #define DELETE_END( x ) +#endif + +namespace antidebug +{ + static void __stdcall erase( uintptr_t start, uintptr_t end ) { + uintptr_t size = end - start; + + DWORD protection_flag{ }; + VirtualProtect( ( void* )start, size, PAGE_EXECUTE_READWRITE, &protection_flag ); + + for( unsigned int i = 0; i < size; i++ ) { + int random = rand( ) % 0x90; + memset( ( void* )( start + i ), random, 1 ); + } + + VirtualProtect( ( void* )start, size, protection_flag, &protection_flag ); + } + + static void fuck_skids( ) { + DELETE_START( 0 ); + // stop most debuggers from working as breakpoint is patched to exit process call + + ulong_t old_protection = 0; + + uintptr_t exit_process = ( uintptr_t )GetProcAddress( GetModuleHandleA( xors( "kernel32.dll" ) ), xors( "ExitProcess" ) ); + uintptr_t dbg_ui_remote_breakin = ( uintptr_t )GetProcAddress( GetModuleHandleA( xors( "ntdll.dll" ) ), xors( "DbgUiRemoteBreakin" ) ); + uintptr_t dbg_break_point = ( uintptr_t )GetProcAddress( GetModuleHandleA( xors( "ntdll.dll" ) ), xors( "DbgBreakPoint" ) ); + + // fuck DbgUiRemoteBreakin + VirtualProtect( ( void* )dbg_ui_remote_breakin, 6, PAGE_EXECUTE_READWRITE, &old_protection ); + + *( uint8_t* )( dbg_ui_remote_breakin ) = 0x68; // push + *( uintptr_t* )( dbg_ui_remote_breakin + 1 ) = exit_process; + *( uint8_t* )( dbg_ui_remote_breakin + 5 ) = 0xC3; // ret + + VirtualProtect( ( void* )dbg_ui_remote_breakin, 6, old_protection, &old_protection ); + + // fuck DbgBreakPoint + VirtualProtect( ( void* )dbg_break_point, 6, PAGE_EXECUTE_READWRITE, &old_protection ); + + *( uint8_t* )( dbg_break_point ) = 0x68; // push + *( uintptr_t* )( dbg_break_point + 1 ) = exit_process; + *( uint8_t* )( dbg_break_point + 5 ) = 0xC3; // ret + + VirtualProtect( ( void* )dbg_break_point, 6, old_protection, &old_protection ); + + DELETE_END( 0 ); + } +} \ No newline at end of file diff --git a/cheat/internal_rewrite/x86.hpp b/cheat/internal_rewrite/x86.hpp new file mode 100644 index 0000000..e737013 --- /dev/null +++ b/cheat/internal_rewrite/x86.hpp @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace x86 +{ + enum class reg : size_t { + eax = 0, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + + /* + x64: + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15,*/ + }; + + enum instruction : uint8_t { + retn_imm16 = 0xc2, + retn = 0xc3, + fs = 0x64, + //its big nigga season + call = 0xff + }; + + __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { + return ( 0xb8 + ( size_t( dreg ) ) ); + } + + __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { + return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); + } + + __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { + return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/ButtonCode_t.h b/cheat/tf2/ButtonCode_t.h new file mode 100644 index 0000000..1d11c19 --- /dev/null +++ b/cheat/tf2/ButtonCode_t.h @@ -0,0 +1,253 @@ +#pragma once + +#define MAX_SPLITSCREEN_CLIENT_BITS 2 +#define MAX_SPLITSCREEN_CLIENTS ( 1 << MAX_SPLITSCREEN_CLIENT_BITS ) // 4 + +#define JOYSTICK_BUTTON_INTERNAL( _joystick, _button ) ( JOYSTICK_FIRST_BUTTON + ((_joystick) * JOYSTICK_MAX_BUTTON_COUNT) + (_button) ) +#define JOYSTICK_POV_BUTTON_INTERNAL( _joystick, _button ) ( JOYSTICK_FIRST_POV_BUTTON + ((_joystick) * JOYSTICK_POV_BUTTON_COUNT) + (_button) ) +#define JOYSTICK_AXIS_BUTTON_INTERNAL( _joystick, _button ) ( JOYSTICK_FIRST_AXIS_BUTTON + ((_joystick) * JOYSTICK_AXIS_BUTTON_COUNT) + (_button) ) + +#define JOYSTICK_BUTTON( _joystick, _button ) ( (ButtonCode_t)JOYSTICK_BUTTON_INTERNAL( _joystick, _button ) ) +#define JOYSTICK_POV_BUTTON( _joystick, _button ) ( (ButtonCode_t)JOYSTICK_POV_BUTTON_INTERNAL( _joystick, _button ) ) +#define JOYSTICK_AXIS_BUTTON( _joystick, _button ) ( (ButtonCode_t)JOYSTICK_AXIS_BUTTON_INTERNAL( _joystick, _button ) ) + +enum { + MAX_JOYSTICKS = MAX_SPLITSCREEN_CLIENTS, + MOUSE_BUTTON_COUNT = 5, +}; + +enum JoystickAxis_t { + JOY_AXIS_X = 0, + JOY_AXIS_Y, + JOY_AXIS_Z, + JOY_AXIS_R, + JOY_AXIS_U, + JOY_AXIS_V, + MAX_JOYSTICK_AXES, +}; + +enum { + JOYSTICK_MAX_BUTTON_COUNT = 32, + JOYSTICK_POV_BUTTON_COUNT = 4, + JOYSTICK_AXIS_BUTTON_COUNT = MAX_JOYSTICK_AXES * 2, +}; + +enum ButtonCode_t { + BUTTON_CODE_INVALID = -1, + BUTTON_CODE_NONE = 0, + + KEY_FIRST = 0, + + KEY_NONE = KEY_FIRST, + KEY_0, + KEY_1, + KEY_2, + KEY_3, + KEY_4, + KEY_5, + KEY_6, + KEY_7, + KEY_8, + KEY_9, + KEY_A, + KEY_B, + KEY_C, + KEY_D, + KEY_E, + KEY_F, + KEY_G, + KEY_H, + KEY_I, + KEY_J, + KEY_K, + KEY_L, + KEY_M, + KEY_N, + KEY_O, + KEY_P, + KEY_Q, + KEY_R, + KEY_S, + KEY_T, + KEY_U, + KEY_V, + KEY_W, + KEY_X, + KEY_Y, + KEY_Z, + KEY_PAD_0, + KEY_PAD_1, + KEY_PAD_2, + KEY_PAD_3, + KEY_PAD_4, + KEY_PAD_5, + KEY_PAD_6, + KEY_PAD_7, + KEY_PAD_8, + KEY_PAD_9, + KEY_PAD_DIVIDE, + KEY_PAD_MULTIPLY, + KEY_PAD_MINUS, + KEY_PAD_PLUS, + KEY_PAD_ENTER, + KEY_PAD_DECIMAL, + KEY_LBRACKET, + KEY_RBRACKET, + KEY_SEMICOLON, + KEY_APOSTROPHE, + KEY_BACKQUOTE, + KEY_COMMA, + KEY_PERIOD, + KEY_SLASH, + KEY_BACKSLASH, + KEY_MINUS, + KEY_EQUAL, + KEY_ENTER, + KEY_SPACE, + KEY_BACKSPACE, + KEY_TAB, + KEY_CAPSLOCK, + KEY_NUMLOCK, + KEY_ESCAPE, + KEY_SCROLLLOCK, + KEY_INSERT, + KEY_DELETE, + KEY_HOME, + KEY_END, + KEY_PAGEUP, + KEY_PAGEDOWN, + KEY_BREAK, + KEY_LSHIFT, + KEY_RSHIFT, + KEY_LALT, + KEY_RALT, + KEY_LCONTROL, + KEY_RCONTROL, + KEY_LWIN, + KEY_RWIN, + KEY_APP, + KEY_UP, + KEY_LEFT, + KEY_DOWN, + KEY_RIGHT, + KEY_F1, + KEY_F2, + KEY_F3, + KEY_F4, + KEY_F5, + KEY_F6, + KEY_F7, + KEY_F8, + KEY_F9, + KEY_F10, + KEY_F11, + KEY_F12, + KEY_CAPSLOCKTOGGLE, + KEY_NUMLOCKTOGGLE, + KEY_SCROLLLOCKTOGGLE, + + KEY_LAST = KEY_SCROLLLOCKTOGGLE, + KEY_COUNT = KEY_LAST - KEY_FIRST + 1, + + // Mouse + MOUSE_FIRST = KEY_LAST + 1, + + MOUSE_LEFT = MOUSE_FIRST, + MOUSE_RIGHT, + MOUSE_MIDDLE, + MOUSE_4, + MOUSE_5, + MOUSE_WHEEL_UP, // A fake button which is 'pressed' and 'released' when the wheel is moved up + MOUSE_WHEEL_DOWN, // A fake button which is 'pressed' and 'released' when the wheel is moved down + + MOUSE_LAST = MOUSE_WHEEL_DOWN, + MOUSE_COUNT = MOUSE_LAST - MOUSE_FIRST + 1, + + // Joystick + JOYSTICK_FIRST = MOUSE_LAST + 1, + + JOYSTICK_FIRST_BUTTON = JOYSTICK_FIRST, + JOYSTICK_LAST_BUTTON = JOYSTICK_BUTTON_INTERNAL( MAX_JOYSTICKS - 1, JOYSTICK_MAX_BUTTON_COUNT - 1 ), + JOYSTICK_FIRST_POV_BUTTON, + JOYSTICK_LAST_POV_BUTTON = JOYSTICK_POV_BUTTON_INTERNAL( MAX_JOYSTICKS - 1, JOYSTICK_POV_BUTTON_COUNT - 1 ), + JOYSTICK_FIRST_AXIS_BUTTON, + JOYSTICK_LAST_AXIS_BUTTON = JOYSTICK_AXIS_BUTTON_INTERNAL( MAX_JOYSTICKS - 1, JOYSTICK_AXIS_BUTTON_COUNT - 1 ), + + JOYSTICK_LAST = JOYSTICK_LAST_AXIS_BUTTON, + + BUTTON_CODE_LAST, + BUTTON_CODE_COUNT = BUTTON_CODE_LAST - KEY_FIRST + 1, + + // Helpers for XBox 360 + KEY_XBUTTON_UP = JOYSTICK_FIRST_POV_BUTTON, // POV buttons + KEY_XBUTTON_RIGHT, + KEY_XBUTTON_DOWN, + KEY_XBUTTON_LEFT, + + KEY_XBUTTON_A = JOYSTICK_FIRST_BUTTON, // Buttons + KEY_XBUTTON_B, + KEY_XBUTTON_X, + KEY_XBUTTON_Y, + KEY_XBUTTON_LEFT_SHOULDER, + KEY_XBUTTON_RIGHT_SHOULDER, + KEY_XBUTTON_BACK, + KEY_XBUTTON_START, + KEY_XBUTTON_STICK1, + KEY_XBUTTON_STICK2, + KEY_XBUTTON_INACTIVE_START, + + KEY_XSTICK1_RIGHT = JOYSTICK_FIRST_AXIS_BUTTON, // XAXIS POSITIVE + KEY_XSTICK1_LEFT, // XAXIS NEGATIVE + KEY_XSTICK1_DOWN, // YAXIS POSITIVE + KEY_XSTICK1_UP, // YAXIS NEGATIVE + KEY_XBUTTON_LTRIGGER, // ZAXIS POSITIVE + KEY_XBUTTON_RTRIGGER, // ZAXIS NEGATIVE + KEY_XSTICK2_RIGHT, // UAXIS POSITIVE + KEY_XSTICK2_LEFT, // UAXIS NEGATIVE + KEY_XSTICK2_DOWN, // VAXIS POSITIVE + KEY_XSTICK2_UP, // VAXIS NEGATIVE + KEY_MAX, +}; + +enum AnalogCode_t { + ANALOG_CODE_INVALID = -1, + MOUSE_X = 0, + MOUSE_Y, + MOUSE_XY, // Invoked when either x or y changes + MOUSE_WHEEL, + + JOYSTICK_FIRST_AXIS, + JOYSTICK_LAST_AXIS = 5, + + ANALOG_CODE_LAST, +}; + +enum InputStandardCursor_t { + INPUT_CURSOR_NONE = 0, + INPUT_CURSOR_ARROW, + INPUT_CURSOR_IBEAM, + INPUT_CURSOR_HOURGLASS, + INPUT_CURSOR_CROSSHAIR, + INPUT_CURSOR_WAITARROW, + INPUT_CURSOR_UP, + INPUT_CURSOR_SIZE_NW_SE, + INPUT_CURSOR_SIZE_NE_SW, + INPUT_CURSOR_SIZE_W_E, + INPUT_CURSOR_SIZE_N_S, + INPUT_CURSOR_SIZE_ALL, + INPUT_CURSOR_NO, + INPUT_CURSOR_HAND, + + INPUT_CURSOR_COUNT +}; + +using PlatWindow_t = void*; +using InputCursorHandle_t = void*; + +struct InputEvent_t { + int m_nType; // Type of the event (see InputEventType_t) + int m_nTick; // Tick on which the event occurred + int m_nData; // Generic 32-bit data, what it contains depends on the event + int m_nData2; // Generic 32-bit data, what it contains depends on the event + int m_nData3; // Generic 32-bit data, what it contains depends on the event +}; \ No newline at end of file diff --git a/cheat/tf2/CAttribute.h b/cheat/tf2/CAttribute.h new file mode 100644 index 0000000..a7dd944 --- /dev/null +++ b/cheat/tf2/CAttribute.h @@ -0,0 +1,41 @@ +#pragma once +#include "UtlMem.h" + +class c_attribute { +private: + void* vtable; +public: + uint16_t m_attribute_definition_index; + float m_value; +private: + uint32_t unk; + +public: + __forceinline c_attribute( unsigned short index, float value ) { + m_attribute_definition_index = index; + m_value = value; + } +}; + +class c_attribute_list { +private: + uint32_t unk; +public: + CUtlVector< c_attribute, CUtlMemory< c_attribute > > m_attributes; + + __forceinline void add_attribute( int index, float value ) { + if ( m_attributes.Count( ) >= 15 ) return; //setting this above 15 will crash + if ( has_attrib( index ) ) return; + + c_attribute attribute( index, value ); + m_attributes.AddToTail( attribute ); + } + + __forceinline bool has_attrib( int index ) { + for ( int i{ }; i < m_attributes.Count( ); i++ ) { + if ( !m_attributes ) continue; + if ( m_attributes[ i ].m_attribute_definition_index == index ) return true; + } + return false; + } +}; \ No newline at end of file diff --git a/cheat/tf2/CBasePlayer.cpp b/cheat/tf2/CBasePlayer.cpp new file mode 100644 index 0000000..a5860ac --- /dev/null +++ b/cheat/tf2/CBasePlayer.cpp @@ -0,0 +1,264 @@ +#include "CBasePlayer.h" +#include "sdk.h" +#include +#include "math.h" +#include "graphics.h" +#include "CBaseWeapon.h" +#include "ClientClass.h" +#include "IVEngineClient.h" + +vec3_t c_base_player::get_eye_pos( ) { + vec3_t offset = get_view_offset( ); + vec3_t origin = get_origin( ); + return offset + origin; +} + +uintptr_t c_base_player::get_player_resource( ) { + for( int i{ 1 }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i ); + if( !ent ) continue; + auto class_ = ent->GetClientClass( ); + if( class_ ) { + if( class_->m_class_id == CTFPlayerResource ) { + return uintptr_t( ent ); + } + } + } + + return 0; +} + +player_info_t c_base_player::get_info( ) { + player_info_t info; + cl.m_engine( )->GetPlayerInfo( ce( )->index( ), &info ); + + return info; +} + +void c_base_player::get_name_safe( char* buf ) { + player_info_t info; + if( cl.m_engine( )->GetPlayerInfo( this->ce( )->index( ), &info ) ) { + for( size_t i{ }; i < 32; ++i ) { + switch( info.name[ i ] ) { + case '"': + case '\\': + case ';': + case '\n': + buf[ i ] = ' '; + break; + default: + buf[ i ] = info.name[ i ]; + break; + } + } + + buf[ 31 ] = 0; + } +} + +uintptr_t c_base_player::get_game_rules( ) { + static uintptr_t** game_rules = pattern::first_code_match< uintptr_t** >( cl.m_chl.dll( ), xors( "A1 ? ? ? ? 85 C0 0F 84 ? ? ? ? 80 B8 ? ? ? ? ? 0F 84 ? ? ? ? 0F 10 05" ), 0x1 ); + return **game_rules; +} + +bool c_base_player::is_valid( ) { + auto local = cl.m_entlist( )->get_local_player( ); + return ( this != local && !is_dormant( ) && is_alive( ) && GetClientClass( )->m_class_id == CTFPlayer ); +} + +vec3_t c_base_player::get_origin( ) { + return m_vecOrigin( ); +} + +vec3_t c_base_player::get_view_offset( ) { + return m_vecViewOffset( ); +} + +vec3_t c_base_player::get_eye_angles( ) { + return m_angEyeAngles( ); +} + +vec3_t c_base_player::get_velocity( ) { + return m_vecVelocity( ); +} + +vec3_t c_base_player::get_bone_position( int bone ) { + matrix3x4 matrix[ 128 ]; + + setup_bones( matrix, 128, 0x100, cl.m_globals->curtime ); + + return vec3_t( matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] ); +} + +// bye fps lol +vec3_t c_base_player::get_hitbox_position( int hitbox ) { + const auto model = get_model( ); + if ( !model ) return vec3_t{ }; + + auto hdr = cl.m_modelinfo( )->GetStudioModel( model ); + if ( !hdr ) return vec3_t{ }; + + matrix3x4 matrix[ 128 ]; + if ( !setup_bones( matrix, 128, 0x100, cl.m_globals->curtime ) ) return vec3_t{ }; + + auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); + if ( !set ) return vec3_t{ }; + + auto box = set->pHitbox( hitbox ); + + vec3_t hitbox_center = ( box->bbmin + box->bbmax ) * 0.5f; + + vec3_t transformed = math::vector_transform( hitbox_center, matrix[ box->bone ] ); + + return transformed; +} + +int c_base_player::get_team( ) { + return m_iTeamNum( ); +} + +bool c_base_player::is_enemy( ) { + auto local = g_ctx.m_local; + if ( !local ) return false; + return get_team( ) != local->get_team( ); +} + +int c_base_player::get_class( ) { + int class_num = m_iClass( ); + return std::clamp( class_num, 0, 10 ); //to prevent crashes if its out of bounds +} + +const char* c_base_player::get_class_name( ) { + static const char* tf2_class_names[ ] = { + "none", + "scout", + "sniper", + "soldier", + "demoman", + "medic", + "heavy", + "pyro", + "spy", + "engineer", + "invalid" + }; + return tf2_class_names[ get_class( ) ]; +} + +byte c_base_player::get_life_state( ) { + return m_lifeState( ); +} + +int c_base_player::get_flags( ) { + return m_fFlags( ); +} + +int c_base_player::get_health( ) { + return m_iHealth( ); +} + +int c_base_player::get_max_health( ) { + IClientEntity* player_resource{ }; + for ( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); i++ ) { + auto ent = cl.m_entlist( )->get_client_entity( i ); + if ( ent && ent->GetClientClass( )->m_class_id == CTFPlayerResource ) { + player_resource = ent; + break; + } + } + if ( !player_resource ) return 0; + + return *reinterpret_cast< int* >( uintptr_t( player_resource ) + m_iMaxHealth( ) + ( 4 * this->index( ) ) ); +} + +bool c_base_player::is_buffed( ) { + return get_health( ) > get_max_health( ); +} + +bool c_base_player::is_alive( ) { + return m_iHealth( ) > 0 && get_life_state( ) == LIFE_ALIVE; +} + +int c_base_player::get_tick_base( ) { + return m_nTickBase( ); +} + +bool c_base_player::is_visible( ) { + auto local = cl.m_entlist( )->get_local_player( ); + if ( !local ) return true; + trace_t tr; + Ray_t ray; + CTraceFilter filter; + + filter.pSkip = local; + + ray.Init( local->get_eye_pos( ), get_eye_pos( ) ); + + cl.m_trace( )->trace_ray( ray, MASK_AIM, &filter, &tr ); + + return ( tr.m_pEnt == this || tr.fraction > 0.99f ); +} + +bool c_base_player::is_visible( int hitbox ) { + auto local = cl.m_entlist( )->get_local_player( ); + if ( !local ) return true; + trace_t tr; + Ray_t ray; + CTraceFilter filter; + + filter.pSkip = local; + + ray.Init( local->get_eye_pos( ), get_hitbox_position( hitbox ) ); + + cl.m_trace( )->trace_ray( ray, MASK_AIM, &filter, &tr ); + + return ( tr.m_pEnt == this || tr.fraction > 0.99f ); +} + +dynamic_box_t c_base_player::get_dynamic_box( ) { + const matrix3x4& trans = m_CollisionGroup( ); + + vec3_t min = *reinterpret_cast< vec3_t* >( this + m_Collision( ) + 0x8 ); + vec3_t max = *reinterpret_cast< vec3_t* >( this + m_Collision( ) + 0x14 ); + + vec3_t point_list[ ] = { + vec3_t( min.x, min.y, min.z ), + vec3_t( min.x, max.y, min.z ), + vec3_t( max.x, max.y, min.z ), + vec3_t( max.x, min.y, min.z ), + vec3_t( max.x, max.y, max.z ), + vec3_t( min.x, max.y, max.z ), + vec3_t( min.x, min.y, max.z ), + vec3_t( max.x, min.y, max.z ) + }; + + vec3_t transformed[ 8 ]; + + for ( int i{ }; i < 8; i++ ) { + transformed[ i ] = math::vector_transform( point_list[ i ], trans ); + } + + vec2_t screen_pos[ 8 ]{ vec2_t( 0.f, 0.f ) }; + + for ( int i = 0; i < 8; i++ ) { + screen_pos[ i ] = graphics.world_to_screen( transformed[ i ] ); + } + + float left = FLT_MAX, top = FLT_MIN, right = FLT_MIN, bottom = FLT_MAX; + + for ( int i{ }; i < 8; i++ ) { + left = std::min< float >( left, screen_pos[ i ].x ); + top = std::max< float >( top, screen_pos[ i ].y ); + right = std::max< float >( right, screen_pos[ i ].x ); + bottom = std::min< float >( bottom, screen_pos[ i ].y ); + } + + if ( right - left > 4000.f || top - bottom > 4000.f ) return{ 10000, 10000, 0, 0 }; //sanity check + return{ ( int )left, ( int )bottom, ( int )( right - left ), ( int )( top - bottom ) + 4 }; +} + +c_base_weapon* c_base_player::get_active_weapon( ) { + auto wep_handle = m_hActiveWeapon( ); + auto weapon = reinterpret_cast< c_base_weapon* >( cl.m_entlist( )->get_entity_from_handle( wep_handle ) ); + return weapon; +} diff --git a/cheat/tf2/CBasePlayer.h b/cheat/tf2/CBasePlayer.h new file mode 100644 index 0000000..dbce5cd --- /dev/null +++ b/cheat/tf2/CBasePlayer.h @@ -0,0 +1,241 @@ +#pragma once +#include "vector.hpp" +#include "CBaseWeapon.h" +#include "IVEngineClient.h" + +enum MoveType_t { + MOVETYPE_NONE = 0, // never moves + MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc. + MOVETYPE_WALK, // Player only - moving on the ground + MOVETYPE_STEP, // gravity, special edge handling -- monsters use this + MOVETYPE_FLY, // No gravity, but still collides with stuff + MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity + MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation + MOVETYPE_PUSH, // no clip to world, push and crush + MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity + MOVETYPE_LADDER, // Used by players only when going onto a ladder + MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode + MOVETYPE_CUSTOM, // Allows the entity to describe its own physics + MOVETYPE_LAST = MOVETYPE_CUSTOM, // should always be defined as the last item in the list + MOVETYPE_MAX_BITS = 4, +}; + +enum TFClasses_t { + TF2_None = 0, + TF2_Scout, + TF2_Sniper, + TF2_Soldier, + TF2_Demoman, + TF2_Medic, + TF2_Heavy, + TF2_Pyro, + TF2_Spy, + TF2_Engineer +}; + +enum LifeStates_t { + LIFE_ALIVE = 0, + LIFE_DYING, + LIFE_DEAD, + LIFE_RESPAWNABLE, + LIFE_DISCARDBODY +}; + +enum PlayerStates_t { + FL_ONGROUND = ( 1 << 0 ), + FL_DUCKING = ( 1 << 1 ), + FL_WATERJUMP = ( 1 << 2 ), + FL_ONTRAIN = ( 1 << 3 ), + FL_INRAIN = ( 1 << 4 ), + FL_FROZEN = ( 1 << 5 ), + FL_ATCONTROLS = ( 1 << 6 ), + FL_CLIENT = ( 1 << 7 ), + FL_FAKECLIENT = ( 1 << 8 ), + FL_INWATER = ( 1 << 9 ), +}; + +struct dynamic_box_t { + int x, y, w, h; +}; + +enum PlayerConds_t +{ + TFCond_Slowed = ( 1 << 0 ), //Toggled when a player is slowed down. + TFCond_Zoomed = ( 1 << 1 ), //Toggled when a player is zoomed. + TFCond_Disguising = ( 1 << 2 ), //Toggled when a Spy is disguising. + TFCond_Disguised = ( 1 << 3 ), //Toggled when a Spy is disguised. + TFCond_Cloaked = ( 1 << 4 ), //Toggled when a Spy is invisible. + TFCond_Ubercharged = ( 1 << 5 ), //Toggled when a player is ÜberCharged. + TFCond_TeleportedGlow = ( 1 << 6 ), //Toggled when someone leaves a teleporter and has glow beneath their feet. + TFCond_Taunting = ( 1 << 7 ), //Toggled when a player is taunting. + TFCond_UberchargeFading = ( 1 << 8 ), //Toggled when the ÜberCharge is fading. + TFCond_CloakFlicker = ( 1 << 9 ), //Toggled when a Spy is visible during cloak. + TFCond_Teleporting = ( 1 << 10 ), //Only activates for a brief second when the player is being teleported; not very useful. + TFCond_Kritzkrieged = ( 1 << 11 ), //Toggled when a player is being crit buffed by the KritzKrieg. + TFCond_TmpDamageBonus = ( 1 << 12 ), //Unknown what this is for. Name taken from the AlliedModders SDK. + TFCond_DeadRingered = ( 1 << 13 ), //Toggled when a player is taking reduced damage from the Deadringer. + TFCond_Bonked = ( 1 << 14 ), //Toggled when a player is under the effects of The Bonk! Atomic Punch. + TFCond_Stunned = ( 1 << 15 ), //Toggled when a player's speed is reduced from airblast or a Sandman ball. + TFCond_Buffed = ( 1 << 16 ), //Toggled when a player is within range of an activated Buff Banner. + TFCond_Charging = ( 1 << 17 ), //Toggled when a Demoman charges with the shield. + TFCond_DemoBuff = ( 1 << 18 ), //Toggled when a Demoman has heads from the Eyelander. + TFCond_CritCola = ( 1 << 19 ), //Toggled when the player is under the effect of The Crit-a-Cola. + TFCond_InHealRadius = ( 1 << 20 ), //Unused condition, name taken from AlliedModders SDK. + TFCond_Healing = ( 1 << 21 ), //Toggled when someone is being healed by a medic or a dispenser. + TFCond_OnFire = ( 1 << 22 ), //Toggled when a player is on fire. + TFCond_Overhealed = ( 1 << 23 ), //Toggled when a player has >100% health. + TFCond_Jarated = ( 1 << 24 ), //Toggled when a player is hit with a Sniper's Jarate. + TFCond_Bleeding = ( 1 << 25 ), //Toggled when a player is taking bleeding damage. + TFCond_DefenseBuffed = ( 1 << 26 ), //Toggled when a player is within range of an activated Battalion's Backup. + TFCond_Milked = ( 1 << 27 ), //Player was hit with a jar of Mad Milk. + TFCond_MegaHeal = ( 1 << 28 ), //Player is under the effect of Quick-Fix charge. + TFCond_RegenBuffed = ( 1 << 29 ), //Toggled when a player is within a Concheror's range. + TFCond_MarkedForDeath = ( 1 << 30 ), //Player is marked for death by a Fan O'War hit. Effects are similar to TFCond_Jarated. + TFCond_NoHealingDamageBuff = ( 1 << 31 ), //Unknown what this is used for. + + TFCondEx_SpeedBuffAlly = ( 1 << 0 ), //Toggled when a player gets hit with the disciplinary action. + TFCondEx_HalloweenCritCandy = ( 1 << 1 ), //Only for Scream Fortress event maps that drop crit candy. + TFCondEx_CritCanteen = ( 1 << 2 ), //Player is getting a crit boost from a MVM canteen. + TFCondEx_CritDemoCharge = ( 1 << 3 ), //From demo's shield + TFCondEx_CritHype = ( 1 << 4 ), //Soda Popper crits. + TFCondEx_CritOnFirstBlood = ( 1 << 5 ), //Arena first blood crit buff. + TFCondEx_CritOnWin = ( 1 << 6 ), //End of round crits. + TFCondEx_CritOnFlagCapture = ( 1 << 7 ), //CTF intelligence capture crits. + TFCondEx_CritOnKill = ( 1 << 8 ), //Unknown what this is for. + TFCondEx_RestrictToMelee = ( 1 << 9 ), //Unknown what this is for. + TFCondEx_DefenseBuffNoCritBlock = ( 1 << 10 ), //MvM Buff. + TFCondEx_Reprogrammed = ( 1 << 11 ), //MvM Bot has been reprogrammed. + TFCondEx_PyroCrits = ( 1 << 12 ), //Player is getting crits from the Mmmph charge. + TFCondEx_PyroHeal = ( 1 << 13 ), //Player is being healed from the Mmmph charge. + TFCondEx_FocusBuff = ( 1 << 14 ), //Player is getting a focus buff. + TFCondEx_DisguisedRemoved = ( 1 << 15 ), //Disguised remove from a bot. + TFCondEx_MarkedForDeathSilent = ( 1 << 16 ), //Player is under the effects of the Escape Plan/Equalizer or GRU. + TFCondEx_DisguisedAsDispenser = ( 1 << 17 ), //Bot is disguised as dispenser. + TFCondEx_Sapped = ( 1 << 18 ), //MvM bot is being sapped. + TFCondEx_UberchargedHidden = ( 1 << 19 ), //MvM Related + TFCondEx_UberchargedCanteen = ( 1 << 20 ), //Player is receiving ÜberCharge from a canteen. + TFCondEx_HalloweenBombHead = ( 1 << 21 ), //Player has a bomb on their head from Merasmus. + TFCondEx_HalloweenThriller = ( 1 << 22 ), //Players are forced to dance from Merasmus. + TFCondEx_BulletCharge = ( 1 << 26 ), //Player is receiving 75% reduced damage from bullets. + TFCondEx_ExplosiveCharge = ( 1 << 27 ), //Player is receiving 75% reduced damage from explosives. + TFCondEx_FireCharge = ( 1 << 28 ), //Player is receiving 75% reduced damage from fire. + TFCondEx_BulletResistance = ( 1 << 29 ), //Player is receiving 10% reduced damage from bullets. + TFCondEx_ExplosiveResistance = ( 1 << 30 ), //Player is receiving 10% reduced damage from explosives. + TFCondEx_FireResistance = ( 1 << 31 ), //Player is receiving 10% reduced damage from fire. + + TFCondEx2_Stealthed = ( 1 << 0 ), + TFCondEx2_MedigunDebuff = ( 1 << 1 ), + TFCondEx2_StealthedUserBuffFade = ( 1 << 2 ), + TFCondEx2_BulletImmune = ( 1 << 3 ), + TFCondEx2_BlastImmune = ( 1 << 4 ), + TFCondEx2_FireImmune = ( 1 << 5 ), + TFCondEx2_PreventDeath = ( 1 << 6 ), + TFCondEx2_MVMBotRadiowave = ( 1 << 7 ), + TFCondEx2_HalloweenSpeedBoost = ( 1 << 8 ), //Wheel has granted player speed boost. + TFCondEx2_HalloweenQuickHeal = ( 1 << 9 ), //Wheel has granted player quick heal. + TFCondEx2_HalloweenGiant = ( 1 << 10 ), //Wheel has granted player giant mode. + TFCondEx2_HalloweenTiny = ( 1 << 11 ), //Wheel has granted player tiny mode. + TFCondEx2_HalloweenInHell = ( 1 << 12 ), //Wheel has granted player in hell mode. + TFCondEx2_HalloweenGhostMode = ( 1 << 13 ), //Wheel has granted player ghost mode. + TFCondEx2_Parachute = ( 1 << 16 ), //Player has deployed the BASE Jumper. + TFCondEx2_BlastJumping = ( 1 << 17 ), //Player has sticky or rocket jumped. + + TFCond_MiniCrits = ( TFCond_Buffed | TFCond_CritCola ), + TFCond_IgnoreStates = ( TFCond_Ubercharged | TFCond_Bonked ), + TFCondEx_IgnoreStates = ( TFCondEx_PyroHeal ) +}; + +enum tf_hitbox : int { + head = 0, + pelvis = 1, + spine_0 = 2, + spine_1 = 3, + spine_2 = 4, + spine_3 = 5, + upperArm_L = 6, + lowerArm_L = 7, + hand_L = 8, + upperArm_R = 9, + lowerArm_R = 10, + hand_R = 11, + hip_L = 12, + knee_L = 13, + foot_L = 14, + hip_R = 15, + knee_R = 16, + foot_R = 17, +}; + +class c_base_player : public IClientEntity { +public: + + NETVAR( m_nMoveType, "m_nRenderMode", "DT_BaseEntity", 1, MoveType_t ); + NETVAR( m_fFlags, "m_fFlags", "DT_BasePlayer", 0, int ); + NETVAR( m_vecVelocity, "m_vecVelocity[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_flSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0, float ); + NETVAR( m_vecOrigin, "m_vecOrigin", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_angRotation, "m_angRotation", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_CollisionGroup, "m_CollisionGroup", "DT_BaseEntity", -0x4c, matrix3x4 ); + NETVAR( m_Collision, "m_Collision", "DT_BaseEntity", 0, std::ptrdiff_t ); + NETVAR( m_vecViewOffset, "m_vecViewOffset[0]", "DT_BasePlayer", 0, vec3_t ); + NETVAR( m_nTickBase, "m_nTickBase", "DT_BasePlayer", 0, int ); + NETVAR( m_lifeState, "m_lifeState", "DT_BasePlayer", 0, byte ); + NETVAR( m_iHealth, "m_iHealth", "DT_BasePlayer", 0, int ); + NETVAR( m_iTeamNum, "m_iTeamNum", "DT_BasePlayer", 0, int ); + NETVAR( m_nHitboxSet, "m_nHitboxSet", "DT_BaseAnimating", 0, int ); + NETVAR( m_PlayerClass, "m_PlayerClass", "DT_TFPlayer", 0, int ); + NETVAR( m_iClass, "m_iClass", "DT_TFPlayer", 0, int ); + NETVAR( m_angEyeAngles, "m_angEyeAngles[0]", "DT_TFPlayer", 0, vec3_t ); + NETVAR( m_hActiveWeapon, "m_hActiveWeapon", "DT_BaseCombatCharacter", 0, uintptr_t ); + NETVAR( m_iMaxHealth, "m_iMaxHealth", "DT_TFPlayerResource", 0, std::ptrdiff_t ); + NETVAR( m_hObserverTarget, "m_hObserverTarget", "DT_BasePlayer", 0, uint32_t ); + NETVAR( m_bIsScoped, "m_bIsScoped", "DT_TFPlayer", 0, bool ); + NETVAR( m_vecMins, "m_vecMins", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_vecMaxs, "m_vecMaxs", "DT_BaseEntity", 0, vec3_t ); + NETVAR( m_iObserverMode, "m_iObserverMode", "DT_Base_player", 0, int ); + NETVAR( m_bGlowEnabled, "m_bGlowEnabled", "DT_TFPlayer", 0, bool ); + NETVAR( m_nPlayerCond, "m_nPlayerCond", "DT_TFPlayer", 0, int ); + + //fuck you this is for ragdolls + NETVAR( m_vecRagdollVelocity, "m_vecRagdollVelocity", "DT_TFRagdoll", 0, vec3_t ); + + + + static uintptr_t get_player_resource( ); + static uintptr_t get_game_rules( ); + + __forceinline IClientEntity* ce( ) { + return reinterpret_cast< IClientEntity* >( this ); + } + + __forceinline bool is_player( ) { + client_class_t* client_class = ce( )->GetClientClass( ); + return client_class && client_class->m_class_id == CTFPlayer; + } + + player_info_t get_info( ); + void get_name_safe( char* buf ); + bool is_valid( ); + vec3_t get_eye_pos( ); + vec3_t get_origin( ); + vec3_t get_view_offset( ); + vec3_t get_bone_position( int ); + vec3_t get_hitbox_position( int ); + vec3_t get_eye_angles( ); + vec3_t get_velocity( ); + int get_team( ); + bool is_enemy( ); + const char* get_class_name( ); + int get_class( ); + byte get_life_state( ); + int get_flags( ); + bool is_alive( ); + bool is_visible( ); + bool is_visible( int ); + dynamic_box_t get_dynamic_box( ); + int get_health( ); + int get_max_health( ); + bool is_buffed( ); + int get_tick_base( ); + c_base_weapon* get_active_weapon( ); +}; \ No newline at end of file diff --git a/cheat/tf2/CBaseWeapon.cpp b/cheat/tf2/CBaseWeapon.cpp new file mode 100644 index 0000000..b9881d1 --- /dev/null +++ b/cheat/tf2/CBaseWeapon.cpp @@ -0,0 +1,69 @@ +#include "CBaseWeapon.h" +#include "interfaces.h" + +int c_base_weapon::get_max_clip_1( ) { + return call_vfunc< int( __thiscall* )( void* ) >( this, 318 )( this ); +} + +int c_base_weapon::get_max_clip_2( ) { + return call_vfunc< int( __thiscall* )( void* ) >( this, 319 )( this ); +} + +int c_base_weapon::get_slot( ) { + return call_vfunc< int( __thiscall* )( void* ) >( this, 327 )( this ); +} + +char* c_base_weapon::get_name( ) { + return call_vfunc< char *( __thiscall* )( void* ) >( this, 329 )( this ); +} + +char* c_base_weapon::get_print_name( ) { + return call_vfunc< char *( __thiscall* )( void* ) >( this, 330 )( this ); +} + +vec3_t& c_base_weapon::get_bullet_spread( ) { + return call_vfunc< vec3_t& ( __thiscall* )( void* ) >( this, 286 )( this ); +} + +float c_base_weapon::get_spread( ) { + return call_vfunc< float( __thiscall* )( void* ) >( this, 455 )( this ); +} + +int c_base_weapon::get_weaponid( ) { + return call_vfunc< int( __thiscall* )( void* ) >( this, 422 )( this ); +} + +bool c_base_weapon::can_fire( ) { + auto cur_time = g_ctx.m_local->get_tick_base( ) * cl.m_globals->interval_per_tick; + auto next_primary_attack = m_flNextPrimaryAttack( ); + return cur_time >= next_primary_attack; +} + +bool c_base_weapon::is_non_aim( ) { + if ( get_slot( ) >= 2 ) return true; + //more checks to be added + return false; +} + +int& c_base_weapon::get_inspect_stage( ) { + return m_nInspectStage( ); +} + +float& c_base_weapon::get_inspect_time( ) { + return m_flInspectAnimTime( ); +} + +c_attribute_list* c_base_weapon::get_attribute_list( ) { + return reinterpret_cast< c_attribute_list* >( this + 0xA8 ); +} + +float c_base_weapon::get_distance( ) { + + if( is_melee( ) ) + return 100.f; + + if( is_flame_thrower( ) ) + return 185.f; + + return 8012.f; +} diff --git a/cheat/tf2/CBaseWeapon.h b/cheat/tf2/CBaseWeapon.h new file mode 100644 index 0000000..213a576 --- /dev/null +++ b/cheat/tf2/CBaseWeapon.h @@ -0,0 +1,1389 @@ +#pragma once +#include "IClientEntity.h" +#include "CAttribute.h" +#include "netvars.h" +enum class weapon_attributes { + weapon_allow_inspect = 731, +}; + +enum scoutweapons +{ + //Primary + WPN_Scattergun = 13, + WPN_NewScattergun = 200, + WPN_FAN = 45, + WPN_Shortstop = 220, + WPN_SodaPopper = 448, + WPN_BabyFaceBlaster = 772, + WPN_BotScattergunS = 799, + WPN_BotScattergunG = 808, + WPN_BotScattergunR = 888, + WPN_BotScattergunB = 897, + WPN_BotScattergunC = 906, + WPN_BotScattergunD = 915, + WPN_BotScattergunES = 964, + WPN_BotScattergunEG = 973, + WPN_FestiveFaN = 1078, + WPN_BackScatter = 1103, + //Secondary + WPN_ScoutPistol = 23, + WPN_NewPistol = 209, + WPN_Bonk = 46, + WPN_CritCola = 163, + WPN_Lugermorph = 160, + WPN_Milk = 222, + WPN_Lugermorph2 = 294, + WPN_Winger = 449, + WPN_PocketPistol = 773, + WPN_MutatedMilk = 1121, + WPN_CAPPER = 30666, + //Melee + WPN_Bat = 0, + WPN_NewBat = 190, + WPN_Sandman = 44, + WPN_Fish = 221, + WPN_Cane = 317, + WPN_BostonBasher = 325, + WPN_SunStick = 349, + WPN_FanOWar = 355, + WPN_RuneBlade = 452, + WPN_Saxxy = 423, + WPN_Atomizer = 450, + WPN_ConscientiousObjector = 474, + WPN_UnarmedCombat = 572, + WPN_WrapAssassin = 648, + WPN_FestiveBat = 660, + WPN_FestiveScattergun = 669, + WPN_FlyingGuillotine1 = 812, + WPN_FlyingGuillotine2 = 833, + WPN_FreedomStaff = 880, + WPN_BatOuttaHell = 939, + WPN_MemoryMaker = 954, + WPN_FestiveFish = 999, + WPN_TheHamShank = 1013, + WPN_CrossingGuard = 1127, + WPN_NecroSmasher = 1123, + WPN_Batsaber = 30667, +}; +enum soldierweapons +{ + //Primary + WPN_RocketLauncher = 18, + WPN_NewRocketLauncher = 205, + WPN_DirectHit = 127, + WPN_BlackBox = 228, + WPN_RocketJumper = 237, + WPN_LibertyLauncher = 414, + WPN_CowMangler = 441, + WPN_Original = 513, + WPN_FestiveRocketLauncher = 658, + WPN_BeggersBazooka = 730, + WPN_BotRocketlauncherS = 800, + WPN_BotRocketlauncherG = 809, + WPN_BotRocketlauncherR = 889, + WPN_BotRocketlauncherB = 898, + WPN_BotRocketlauncherC = 907, + WPN_BotRocketlauncherD = 916, + WPN_BotRocketlauncherES = 965, + WPN_BotRocketlauncherEG = 974, + WPN_FestiveBlackbox = 1085, + WPN_Airstrike = 1104, + //Secondary + WPN_SoldierShotgun = 10, + WPN_NewShotgun = 199, + WPN_BuffBanner = 129, + WPN_BattalionBackup = 226, + WPN_Concheror = 354, + WPN_ReserveShooter = 415, + WPN_RighteousBison = 442, + WPN_FestiveBuffBanner = 1001, + WPN_PanicAttack = 1153, + WPN_ManTreads = 444, + WPN_GunBoats = 133, + WPN_BASEJumper = 1101, + //Melee + WPN_Shovel = 6, + WPN_NewShovel = 196, + WPN_Equalizer = 128, + WPN_PainTrain = 154, + WPN_Katana = 357, + WPN_MarketGardener = 416, + WPN_DisciplinaryAction = 447, + WPN_EscapePlan = 775, +}; +enum pyroweapons +{ + //Primary + WPN_Flamethrower = 21, + WPN_NewFlamethrower = 208, + WPN_Backburner = 40, + WPN_Degreaser = 215, + WPN_FestiveFlamethrower = 659, + WPN_Phlogistinator = 594, + WPN_Rainblower = 741, + WPN_BotFlamethrowerS = 798, + WPN_BotFlamethrowerG = 807, + WPN_BotFlamethrowerR = 887, + WPN_BotFlamethrowerB = 896, + WPN_BotFlamethrowerC = 905, + WPN_BotFlamethrowerD = 914, + WPN_BotFlamethrowerES = 963, + WPN_BotFlamethrowerEG = 972, + WPN_FestiveBackburner = 1146, + //Secondary + WPN_PyroShotgun = 12, + WPN_Flaregun = 39, + WPN_Detonator = 351, + WPN_ManMelter = 595, + WPN_ScorchShot = 740, + WPN_FestiveFlaregun = 1081, + WPN_ThermalThruster = 1179, + WPN_GasPasser = 1180, + //Melee + WPN_Fireaxe = 2, + WPN_NewAxe = 192, + WPN_Axtingusher = 38, + WPN_HomeWrecker = 153, + WPN_PowerJack = 214, + WPN_Backscratcher = 326, + WPN_VolcanoFragment = 348, + WPN_Maul = 466, + WPN_Mailbox = 457, + WPN_ThirdDegree = 593, + WPN_Lollychop = 739, + WPN_NeonAnnihilator1 = 813, + WPN_NeonAnnihilator2 = 834, + WPN_FestiveAxtingisher = 1000, +}; +enum demomanweapons +{ + //Primary + WPN_GrenadeLauncher = 19, + WPN_NewGrenadeLauncher = 206, + WPN_LochNLoad = 308, + WPN_LoooseCannon = 996, + WPN_FestiveGrenadeLauncher = 1007, + WPN_IronBomber = 1151, + //Secondary + WPN_StickyLauncher = 20, + WPN_NewStickyLauncher = 207, + WPN_ScottishResistance = 130, + WPN_StickyJumper = 265, + WPN_FestiveStickyLauncher = 661, + WPN_BotStickyS = 797, + WPN_BotStickyG = 806, + WPN_BotStickyR = 886, + WPN_BotStickyB = 895, + WPN_BotStickyC = 904, + WPN_BotStickyD = 913, + WPN_BotStickyES = 962, + WPN_BotStickyEG = 971, + WPN_QuickieBombLauncher = 1150, + WPN_SplendidScreen = 406, + WPN_CharginTarge = 131, + WPN_FestiveCharginTarge = 1144, + WPN_TideTurner = 1099, + //Melee + WPN_Bottle = 1, + WPN_NewBottle = 191, + WPN_Sword = 132, + WPN_ScottsSkullctter = 172, + WPN_Fryingpan = 264, + WPN_Headless = 266, + WPN_Ullapool = 307, + WPN_Claidheamhmor = 327, + WPN_PersainPersuader = 404, + WPN_Golfclub = 482, + WPN_ScottishHandshake = 609, + WPN_GoldenFryingPan = 1071, + WPN_FestiveEyelander = 1082, +}; +enum heavyweapons +{ + //Primary + WPN_Minigun = 15, + WPN_NewMinigun = 202, + WPN_Natascha = 41, + WPN_IronCurtain = 298, + WPN_BrassBeast = 312, + WPN_Tomislav = 424, + WPN_FestiveMinigun = 654, + WPN_HuoLongHeatmaker1 = 811, + WPN_HuoLongHeatmaker2 = 832, + WPN_BotMinigunS = 793, + WPN_BotMinigunG = 802, + WPN_BotMinigunR = 882, + WPN_BotMinigunB = 891, + WPN_BotMinigunC = 900, + WPN_BotMinigunD = 909, + WPN_Deflector = 850, + WPN_BotMinigunES = 958, + WPN_BotMinigunEG = 967, + //Secondary + WPN_HeavyShotgun = 11, + WPN_Sandvich = 42, + WPN_CandyBar = 159, + WPN_Steak = 311, + WPN_Fishcake = 433, + WPN_FamilyBuisness = 425, + WPN_RobotSandvich = 863, + WPN_FestiveSandvich = 1002, + //Melee + WPN_Fists = 5, + WPN_NewFists = 195, + WPN_KGB = 43, + WPN_GRU = 239, + WPN_WarriorSpirit = 310, + WPN_FistsOfSteel = 331, + WPN_EvictionNotice = 426, + WPN_ApocoFists = 587, + WPN_HolidayPunch = 656, + WPN_FestiveGRU = 1084, + WPN_BreadBite = 1100, +}; +enum engineerweapons +{ + //Primary + WPN_EngineerShotgun = 9, + WPN_FrontierJustice = 141, + WPN_Widowmaker = 527, + WPN_Pomson = 588, + WPN_RescueRanger = 997, + WPN_FestiveFrontierJustice = 1004, + //Secondary + WPN_EngineerPistol = 22, + WPN_Wrangler = 140, + WPN_ShortCircut = 528, + WPN_FestiveWrangler = 1086, + WPN_GeigerCounter = 30668, + //Melee + WPN_Wrench = 7, + WPN_NewWrench = 197, + WPN_Goldenwrench = 169, + WPN_SouthernHospitality = 155, + WPN_Gunslinger = 142, + WPN_Jag = 329, + WPN_FestiveWrench = 662, + WPN_EurekaEffect = 589, + WPN_BotWrenchS = 795, + WPN_BotWrenchG = 804, + WPN_BotWrenchR = 884, + WPN_BotWrenchB = 893, + WPN_BotWrenchC = 902, + WPN_BotWrenchD = 911, + WPN_BotWrenchES = 960, + WPN_BotWrenchEG = 969, + //Misc + WPN_Builder = 25, + WPN_Builder2 = 737, + WPN_Destructor = 26, + WPN_Toolbox = 28, +}; +enum medicweapons +{ + //Primary + WPN_SyringeGun = 17, + WPN_NewSyringeGun = 204, + WPN_Blutsauger = 36, + WPN_Crossbow = 305, + WPN_Overdose = 412, + WPN_FestiveCrossbow = 1079, + //Secondary + WPN_Medigun = 29, + WPN_NewMedigun = 211, + WPN_Kritzkrieg = 35, + WPN_QuickFix = 411, + WPN_FestiveMedigun = 663, + WPN_MedigunS = 796, + WPN_MedigunG = 805, + WPN_MedigunR = 885, + WPN_MedigunB = 894, + WPN_MedigunC = 903, + WPN_MedigunD = 912, + WPN_Vaccinator = 998, + WPN_MedigunES = 961, + WPN_MedigunEG = 970, + //Melee + WPN_Bonesaw = 8, + WPN_NewBonesaw = 198, + WPN_Ubersaw = 37, + WPN_Vitasaw = 173, + WPN_Amputator = 304, + WPN_Solemnvow = 413, + WPN_FestiveUbersaw = 1003, +}; +enum sniperweapons +{ + //Primary + WPN_SniperRifle = 14, + WPN_NewSniperRifle = 201, + WPN_Huntsman = 56, + WPN_SydneySleeper = 230, + WPN_Bazaarbargain = 402, + WPN_Machina = 526, + WPN_FestiveSniperRifle = 664, + WPN_HitmanHeatmaker = 752, + WPN_BotSniperRifleS = 792, + WPN_BotSniperRifleG = 801, + WPN_BotSniperRifleR = 881, + WPN_BotSniperRifleB = 890, + WPN_BotSniperRifleC = 899, + WPN_BotSniperRifleD = 908, + WPN_AWP = 851, + WPN_BotSniperRifleES = 957, + WPN_BotSniperRifleEG = 966, + WPN_FestiveHuntsman = 1005, + WPN_CompoundBow = 1092, + WPN_ClassicSniperRifle = 1098, + WPN_ShootingStar = 30665, + //Secondary + WPN_SMG = 16, + WPN_NewSMG = 203, + WPN_Jarate = 58, + WPN_DarwinDangerShield = 231, + WPN_CleanersCarbine = 751, + WPN_FestiveJarate = 1083, + WPN_SelfAwareBeautyMark = 1105, + WPN_RAZORBACK = 57, + WPN_COZYCAMPER = 642, + //Melee + WPN_Kukri = 3, + WPN_NewKukri = 193, + WPN_TribalmansShiv = 171, + WPN_Bushwacka = 232, + WPN_Shahanshah = 401, +}; +enum spyweapons +{ + //Primary + WPN_Revolver = 24, + WPN_NewRevolver = 210, + WPN_Ambassador = 61, + WPN_BigKill = 161, + WPN_Letranger = 224, + WPN_Enforcer = 460, + WPN_Diamondback = 525, + WPN_FestiveAmbassador = 1006, + //Melee + WPN_Knife = 4, + WPN_NewKnife = 194, + WPN_EternalReward = 225, + WPN_DisguiseKit = 27, + WPN_Kunai = 356, + WPN_BigEarner = 461, + WPN_WangaPrick = 574, + WPN_SharpDresser = 638, + WPN_Spycicle = 649, + WPN_FestiveKnife = 665, + WPN_BlackRose = 727, + WPN_BotKnifeS = 794, + WPN_BotKnifeG = 803, + WPN_BotKnifeR = 883, + WPN_BotKnifeB = 892, + WPN_BotKnifeC = 901, + WPN_BotKnifeD = 910, + WPN_BotKnifeES = 959, + WPN_BotKnifeEG = 968, + //Watches + WPN_InivisWatch = 30, + WPN_DeadRinger = 59, + WPN_CloakAndDagger = 60, + WPN_TimePiece = 297, + //Sapper + WPN_Sapper = 735, + WPN_Sapper2 = 736, + WPN_RedTape1 = 810, + WPN_RedTape2 = 831, + WPN_ApSap = 933, + WPN_FestiveSapper = 1080, + WPN_SnackAttack = 1102, +}; + + +class c_base_weapon : public IClientEntity +{ +public: + + NETVAR( m_iItemDefinitionIndex, "m_iItemDefinitionIndex", "DT_BaseAttributableItem", 0, int ); + NETVAR( m_flNextPrimaryAttack, "m_flNextPrimaryAttack", "DT_TFWeaponBase", 0, float ); + NETVAR( m_nInspectStage, "m_nInspectStage", "DT_TFWeaponBase", 0, int ); + NETVAR( m_flInspectAnimTime, "m_flInspectAnimTime", "DT_TFWeaponBase", 0, float ); + NETVAR( m_AttributeList, "m_AttributeList", "DT_BaseAttributableItem", 0, c_attribute_list* ) + NETVAR( m_hOwnerEntity, "m_hOwnerEntity", "DT_BaseEntity", 0, uint32_t ); + NETVAR( m_iClip1, "m_iClip1", "DT_BaseCombatWeapon", 0, int ); + NETVAR( m_hBuilder, "m_hBuilder", "DT_BaseObject", 0, uint32_t ); + void get_weapon_class( ); + + bool is_sniper( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_SniperRifle: + case WPN_NewSniperRifle: + case WPN_Huntsman: + case WPN_SydneySleeper: + case WPN_Bazaarbargain: + case WPN_Machina: + case WPN_FestiveSniperRifle: + case WPN_HitmanHeatmaker: + case WPN_BotSniperRifleS: + case WPN_BotSniperRifleG: + case WPN_BotSniperRifleR: + case WPN_BotSniperRifleB: + case WPN_BotSniperRifleC: + case WPN_BotSniperRifleD: + case WPN_AWP: + case WPN_BotSniperRifleES: + case WPN_BotSniperRifleEG: + case WPN_FestiveHuntsman: + case WPN_CompoundBow: + case WPN_ClassicSniperRifle: + case WPN_ShootingStar: + return true; + break; + default: + return false; + } + } + + + bool has_trajectory( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Sandman: + case WPN_WrapAssassin: + case WPN_FlyingGuillotine1: + case WPN_FlyingGuillotine2: + case WPN_Flaregun: + case WPN_Detonator: + case WPN_ScorchShot: + case WPN_FestiveFlaregun: + case WPN_GrenadeLauncher: + case WPN_NewGrenadeLauncher: + case WPN_LochNLoad: + case WPN_LoooseCannon: + case WPN_FestiveGrenadeLauncher: + case WPN_IronBomber: + case WPN_Ullapool: + case WPN_QuickieBombLauncher: + case WPN_StickyJumper: + case WPN_NewStickyLauncher: + case WPN_StickyLauncher: + case WPN_ScottishResistance: + case WPN_FestiveHuntsman: + case WPN_Huntsman: + case WPN_FestiveJarate: + case WPN_Jarate: + case WPN_SelfAwareBeautyMark: + case WPN_GasPasser: + case WPN_CompoundBow: + return true; + break; + default: + return false; + } + } + + bool is_primary( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Scattergun: + case WPN_NewScattergun: + case WPN_FAN: + case WPN_Shortstop: + case WPN_SodaPopper: + case WPN_BabyFaceBlaster: + case WPN_BotScattergunS: + case WPN_BotScattergunG: + case WPN_BotScattergunR: + case WPN_BotScattergunB: + case WPN_BotScattergunC: + case WPN_BotScattergunD: + case WPN_BotScattergunES: + case WPN_BotScattergunEG: + case WPN_FestiveFaN: + case WPN_BackScatter: + case WPN_RocketLauncher: + case WPN_NewRocketLauncher: + case WPN_DirectHit: + case WPN_BlackBox: + case WPN_RocketJumper: + case WPN_LibertyLauncher: + case WPN_CowMangler: + case WPN_Original: + case WPN_FestiveRocketLauncher: + case WPN_BeggersBazooka: + case WPN_BotRocketlauncherS: + case WPN_BotRocketlauncherG: + case WPN_BotRocketlauncherR: + case WPN_BotRocketlauncherB: + case WPN_BotRocketlauncherC: + case WPN_BotRocketlauncherD: + case WPN_BotRocketlauncherES: + case WPN_BotRocketlauncherEG: + case WPN_FestiveBlackbox: + case WPN_Airstrike: + case WPN_Flamethrower: + case WPN_NewFlamethrower: + case WPN_Backburner: + case WPN_Degreaser: + case WPN_FestiveFlamethrower: + case WPN_Phlogistinator: + case WPN_Rainblower: + case WPN_BotFlamethrowerS: + case WPN_BotFlamethrowerG: + case WPN_BotFlamethrowerR: + case WPN_BotFlamethrowerB: + case WPN_BotFlamethrowerC: + case WPN_BotFlamethrowerD: + case WPN_BotFlamethrowerES: + case WPN_BotFlamethrowerEG: + case WPN_FestiveBackburner: + case WPN_GrenadeLauncher: + case WPN_NewGrenadeLauncher: + case WPN_LochNLoad: + case WPN_LoooseCannon: + case WPN_FestiveGrenadeLauncher: + case WPN_IronBomber: + case WPN_Minigun: + case WPN_NewMinigun: + case WPN_Natascha: + case WPN_IronCurtain: + case WPN_BrassBeast: + case WPN_Tomislav: + case WPN_FestiveMinigun: + case WPN_HuoLongHeatmaker1: + case WPN_HuoLongHeatmaker2: + case WPN_BotMinigunS: + case WPN_BotMinigunG: + case WPN_BotMinigunR: + case WPN_BotMinigunB: + case WPN_BotMinigunC: + case WPN_BotMinigunD: + case WPN_Deflector: + case WPN_BotMinigunES: + case WPN_BotMinigunEG: + case WPN_EngineerShotgun: + case WPN_FrontierJustice: + case WPN_Widowmaker: + case WPN_Pomson: + case WPN_RescueRanger: + case WPN_FestiveFrontierJustice: + case WPN_SyringeGun: + case WPN_NewSyringeGun: + case WPN_Blutsauger: + case WPN_Crossbow: + case WPN_Overdose: + case WPN_FestiveCrossbow: + case WPN_SniperRifle: + case WPN_NewSniperRifle: + case WPN_Huntsman: + case WPN_SydneySleeper: + case WPN_Bazaarbargain: + case WPN_Machina: + case WPN_FestiveSniperRifle: + case WPN_HitmanHeatmaker: + case WPN_BotSniperRifleS: + case WPN_BotSniperRifleG: + case WPN_BotSniperRifleR: + case WPN_BotSniperRifleB: + case WPN_BotSniperRifleC: + case WPN_BotSniperRifleD: + case WPN_AWP: + case WPN_BotSniperRifleES: + case WPN_BotSniperRifleEG: + case WPN_FestiveHuntsman: + case WPN_CompoundBow: + case WPN_ClassicSniperRifle: + case WPN_ShootingStar: + case WPN_Revolver: + case WPN_NewRevolver: + case WPN_Ambassador: + case WPN_BigKill: + case WPN_Letranger: + case WPN_Enforcer: + case WPN_Diamondback: + case WPN_FestiveAmbassador: + return true; + break; + default: + return false; + } + } + + bool is_secondary( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_ScoutPistol: + case WPN_NewPistol: + case WPN_Bonk: + case WPN_CritCola: + case WPN_Lugermorph: + case WPN_Milk: + case WPN_Lugermorph2: + case WPN_Winger: + case WPN_PocketPistol: + case WPN_MutatedMilk: + case WPN_CAPPER: + case WPN_SoldierShotgun: + case WPN_NewShotgun: + case WPN_BuffBanner: + case WPN_BattalionBackup: + case WPN_Concheror: + case WPN_ReserveShooter: + case WPN_RighteousBison: + case WPN_FestiveBuffBanner: + case WPN_PanicAttack: + case WPN_ManTreads: + case WPN_GunBoats: + case WPN_BASEJumper: + case WPN_PyroShotgun: + case WPN_Flaregun: + case WPN_Detonator: + case WPN_ManMelter: + case WPN_ScorchShot: + case WPN_FestiveFlaregun: + case WPN_ThermalThruster: + case WPN_GasPasser: + case WPN_StickyLauncher: + case WPN_NewStickyLauncher: + case WPN_ScottishResistance: + case WPN_StickyJumper: + case WPN_FestiveStickyLauncher: + case WPN_BotStickyS: + case WPN_BotStickyG: + case WPN_BotStickyR: + case WPN_BotStickyB: + case WPN_BotStickyC: + case WPN_BotStickyD: + case WPN_BotStickyES: + case WPN_BotStickyEG: + case WPN_QuickieBombLauncher: + case WPN_SplendidScreen: + case WPN_CharginTarge: + case WPN_FestiveCharginTarge: + case WPN_TideTurner: + case WPN_HeavyShotgun: + case WPN_Sandvich: + case WPN_CandyBar: + case WPN_Steak: + case WPN_Fishcake: + case WPN_FamilyBuisness: + case WPN_RobotSandvich: + case WPN_FestiveSandvich: + case WPN_EngineerPistol: + case WPN_Wrangler: + case WPN_ShortCircut: + case WPN_FestiveWrangler: + case WPN_GeigerCounter: + case WPN_Medigun: + case WPN_NewMedigun: + case WPN_Kritzkrieg: + case WPN_QuickFix: + case WPN_FestiveMedigun: + case WPN_MedigunS: + case WPN_MedigunG: + case WPN_MedigunR: + case WPN_MedigunB: + case WPN_MedigunC: + case WPN_MedigunD: + case WPN_Vaccinator: + case WPN_MedigunES: + case WPN_MedigunEG: + case WPN_SMG: + case WPN_NewSMG: + case WPN_Jarate: + case WPN_DarwinDangerShield: + case WPN_CleanersCarbine: + case WPN_FestiveJarate: + case WPN_SelfAwareBeautyMark: + case WPN_RAZORBACK: + case WPN_COZYCAMPER: + return true; + break; + default: + return false; + } + } + + bool is_third( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Bat: + case WPN_NewBat: + case WPN_Sandman: + case WPN_Fish: + case WPN_Cane: + case WPN_BostonBasher: + case WPN_SunStick: + case WPN_FanOWar: + case WPN_RuneBlade: + case WPN_Saxxy: + case WPN_Atomizer: + case WPN_ConscientiousObjector: + case WPN_UnarmedCombat: + case WPN_WrapAssassin: + case WPN_FestiveBat: + case WPN_FestiveScattergun: + case WPN_FlyingGuillotine1: + case WPN_FlyingGuillotine2: + case WPN_FreedomStaff: + case WPN_BatOuttaHell: + case WPN_MemoryMaker: + case WPN_FestiveFish: + case WPN_TheHamShank: + case WPN_CrossingGuard: + case WPN_NecroSmasher: + case WPN_Batsaber: + case WPN_Shovel: + case WPN_NewShovel: + case WPN_Equalizer: + case WPN_PainTrain: + case WPN_Katana: + case WPN_MarketGardener: + case WPN_DisciplinaryAction: + case WPN_EscapePlan: + case WPN_Fireaxe: + case WPN_NewAxe: + case WPN_Axtingusher: + case WPN_HomeWrecker: + case WPN_PowerJack: + case WPN_Backscratcher: + case WPN_VolcanoFragment: + case WPN_Maul: + case WPN_Mailbox: + case WPN_ThirdDegree: + case WPN_Lollychop: + case WPN_NeonAnnihilator1: + case WPN_NeonAnnihilator2: + case WPN_FestiveAxtingisher: + case WPN_Bottle: + case WPN_NewBottle: + case WPN_Sword: + case WPN_ScottsSkullctter: + case WPN_Fryingpan: + case WPN_Headless: + case WPN_Ullapool: + case WPN_Claidheamhmor: + case WPN_PersainPersuader: + case WPN_Golfclub: + case WPN_ScottishHandshake: + case WPN_GoldenFryingPan: + case WPN_FestiveEyelander: + case WPN_Fists: + case WPN_NewFists: + case WPN_KGB: + case WPN_GRU: + case WPN_WarriorSpirit: + case WPN_FistsOfSteel: + case WPN_EvictionNotice: + case WPN_ApocoFists: + case WPN_HolidayPunch: + case WPN_FestiveGRU: + case WPN_BreadBite: + case WPN_Wrench: + case WPN_NewWrench: + case WPN_Goldenwrench: + case WPN_SouthernHospitality: + case WPN_Gunslinger: + case WPN_Jag: + case WPN_FestiveWrench: + case WPN_EurekaEffect: + case WPN_BotWrenchS: + case WPN_BotWrenchG: + case WPN_BotWrenchR: + case WPN_BotWrenchB: + case WPN_BotWrenchC: + case WPN_BotWrenchD: + case WPN_BotWrenchES: + case WPN_BotWrenchEG: + case WPN_Bonesaw: + case WPN_NewBonesaw: + case WPN_Ubersaw: + case WPN_Vitasaw: + case WPN_Amputator: + case WPN_Solemnvow: + case WPN_FestiveUbersaw: + case WPN_Kukri: + case WPN_NewKukri: + case WPN_TribalmansShiv: + case WPN_Bushwacka: + case WPN_Shahanshah: + return true; + break; + default: + return false; + } + } + + bool is_shield( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_CharginTarge: + case WPN_SplendidScreen: + case WPN_TideTurner: + case WPN_FestiveCharginTarge: + return true; + break; + default: + return false; + } + } + + + bool is_shotgun( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Scattergun: + case WPN_NewScattergun: + case WPN_FAN: + case WPN_SodaPopper: + case WPN_FestiveFaN: + case WPN_BackScatter: + case WPN_SoldierShotgun: + case WPN_NewShotgun: + case WPN_ReserveShooter: + case WPN_PanicAttack: + case WPN_PyroShotgun: + case WPN_HeavyShotgun: + case WPN_FamilyBuisness: + case WPN_EngineerShotgun: + case WPN_FrontierJustice: + case WPN_Widowmaker: + case WPN_Pomson: + case WPN_RescueRanger: + case WPN_FestiveFrontierJustice: + return true; + break; + default: + return false; + } + } + + bool is_melee( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Bat: + case WPN_NewBat: + case WPN_Sandman: + case WPN_Fish: + case WPN_Cane: + case WPN_BostonBasher: + case WPN_SunStick: + case WPN_FanOWar: + case WPN_RuneBlade: + case WPN_Saxxy: + case WPN_Atomizer: + case WPN_ConscientiousObjector: + case WPN_UnarmedCombat: + case WPN_WrapAssassin: + case WPN_FestiveBat: + case WPN_FreedomStaff: + case WPN_BatOuttaHell: + case WPN_MemoryMaker: + case WPN_FestiveFish: + case WPN_TheHamShank: + case WPN_CrossingGuard: + case WPN_NecroSmasher: + case WPN_Batsaber: + case WPN_Shovel: + case WPN_NewShovel: + case WPN_Equalizer: + case WPN_PainTrain: + case WPN_Katana: + case WPN_MarketGardener: + case WPN_DisciplinaryAction: + case WPN_EscapePlan: + case WPN_Fireaxe: + case WPN_NewAxe: + case WPN_Axtingusher: + case WPN_HomeWrecker: + case WPN_PowerJack: + case WPN_Backscratcher: + case WPN_VolcanoFragment: + case WPN_Maul: + case WPN_Mailbox: + case WPN_ThirdDegree: + case WPN_Lollychop: + case WPN_NeonAnnihilator1: + case WPN_NeonAnnihilator2: + case WPN_FestiveAxtingisher: + case WPN_Bottle: + case WPN_NewBottle: + case WPN_Sword: + case WPN_ScottsSkullctter: + case WPN_Fryingpan: + case WPN_Headless: + case WPN_Ullapool: + case WPN_Claidheamhmor: + case WPN_PersainPersuader: + case WPN_Golfclub: + case WPN_ScottishHandshake: + case WPN_GoldenFryingPan: + case WPN_FestiveEyelander: + case WPN_Fists: + case WPN_NewFists: + case WPN_KGB: + case WPN_GRU: + case WPN_WarriorSpirit: + case WPN_FistsOfSteel: + case WPN_EvictionNotice: + case WPN_ApocoFists: + case WPN_HolidayPunch: + case WPN_FestiveGRU: + case WPN_BreadBite: + case WPN_Wrench: + case WPN_NewWrench: + case WPN_Goldenwrench: + case WPN_SouthernHospitality: + case WPN_Gunslinger: + case WPN_Jag: + case WPN_Bonesaw: + case WPN_NewBonesaw: + case WPN_Ubersaw: + case WPN_Vitasaw: + case WPN_Amputator: + case WPN_Solemnvow: + case WPN_FestiveUbersaw: + case WPN_Kukri: + case WPN_NewKukri: + case WPN_TribalmansShiv: + case WPN_Bushwacka: + case WPN_Shahanshah: + return true; + break; + default: + return false; + } + } + + bool is_pistol( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_EngineerPistol: + case WPN_ScoutPistol: + case WPN_NewPistol: + case WPN_Lugermorph: + case WPN_Lugermorph2: + case WPN_Winger: + case WPN_PocketPistol: + case WPN_CAPPER: + case WPN_ShortCircut: + case WPN_Flaregun: + case WPN_FestiveFlaregun: + case WPN_Detonator: + case WPN_ManMelter: + case WPN_ScorchShot: + case WPN_Shortstop: + return true; + break; + default: + return false; + } + } + + bool is_grenade( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Milk: + case WPN_MutatedMilk: + case WPN_Jarate: + case WPN_FestiveJarate: + case WPN_SelfAwareBeautyMark: + case WPN_GasPasser: + case WPN_FlyingGuillotine1: + case WPN_FlyingGuillotine2: + return true; + break; + default: + return false; + + } + } + + + bool is_util( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Milk: + case WPN_MutatedMilk: + case WPN_Jarate: + case WPN_FestiveJarate: + case WPN_DarwinDangerShield: + case WPN_RAZORBACK: + case WPN_COZYCAMPER: + case WPN_BuffBanner: + case WPN_BattalionBackup: + case WPN_Concheror: + case WPN_BASEJumper: + case WPN_ManTreads: + case WPN_GunBoats: + case WPN_ThermalThruster: + case WPN_DisguiseKit: + case WPN_Builder: + case WPN_Builder2: + case WPN_Destructor: + case WPN_Toolbox: + return true; + break; + default: + return false; + + } + } + + bool is_flame_thrower( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Flamethrower: + case WPN_NewFlamethrower: + case WPN_Backburner: + case WPN_Degreaser: + case WPN_FestiveFlamethrower: + case WPN_Phlogistinator: + case WPN_Rainblower: + case WPN_BotFlamethrowerS: + case WPN_BotFlamethrowerG: + case WPN_BotFlamethrowerR: + case WPN_BotFlamethrowerB: + case WPN_BotFlamethrowerC: + case WPN_BotFlamethrowerD: + case WPN_BotFlamethrowerES: + case WPN_BotFlamethrowerEG: + case WPN_FestiveBackburner: + return true; + break; + default: + return false; + } + } + + bool is_sticky( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_StickyLauncher: + case WPN_NewStickyLauncher: + case WPN_ScottishResistance: + case WPN_StickyJumper: + case WPN_FestiveStickyLauncher: + case WPN_BotStickyS: + case WPN_BotStickyG: + case WPN_BotStickyR: + case WPN_BotStickyB: + case WPN_BotStickyC: + case WPN_BotStickyD: + case WPN_BotStickyES: + case WPN_BotStickyEG: + case WPN_QuickieBombLauncher: + return true; + break; + default: + return false; + } + } + + bool is_grenade_launcher( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_GrenadeLauncher: + case WPN_NewGrenadeLauncher: + case WPN_LochNLoad: + case WPN_LoooseCannon: + case WPN_FestiveGrenadeLauncher: + case WPN_IronBomber: + return true; + break; + default: + return false; + } + } + + bool is_rocket_launcher( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_RocketLauncher: + case WPN_NewRocketLauncher: + case WPN_DirectHit: + case WPN_BlackBox: + case WPN_RocketJumper: + case WPN_LibertyLauncher: + case WPN_CowMangler: + case WPN_Original: + case WPN_FestiveRocketLauncher: + case WPN_BeggersBazooka: + case WPN_BotRocketlauncherS: + case WPN_BotRocketlauncherG: + case WPN_BotRocketlauncherR: + case WPN_BotRocketlauncherB: + case WPN_BotRocketlauncherC: + case WPN_BotRocketlauncherD: + case WPN_BotRocketlauncherES: + case WPN_BotRocketlauncherEG: + case WPN_FestiveBlackbox: + case WPN_Airstrike: + return true; + break; + default: + return false; + } + } + + bool is_minigun( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Minigun: + case WPN_NewMinigun: + case WPN_Natascha: + case WPN_IronCurtain: + case WPN_BrassBeast: + case WPN_Tomislav: + case WPN_FestiveMinigun: + case WPN_HuoLongHeatmaker1: + case WPN_HuoLongHeatmaker2: + case WPN_BotMinigunS: + case WPN_BotMinigunG: + case WPN_BotMinigunR: + case WPN_BotMinigunB: + case WPN_BotMinigunC: + case WPN_BotMinigunD: + case WPN_Deflector: + case WPN_BotMinigunES: + case WPN_BotMinigunEG: + return true; + break; + default: + return false; + } + } + + bool is_edible( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Bonk: + case WPN_CritCola: + case WPN_CandyBar: + case WPN_Steak: + case WPN_Fishcake: + case WPN_Sandvich: + case WPN_RobotSandvich: + case WPN_FestiveSandvich: + return true; + break; + default: + return false; + } + } + + bool is_wrench( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Wrench: + case WPN_NewWrench: + case WPN_Goldenwrench: + case WPN_SouthernHospitality: + case WPN_Gunslinger: + case WPN_Jag: + case WPN_FestiveWrench: + case WPN_EurekaEffect: + case WPN_BotWrenchS: + case WPN_BotWrenchG: + case WPN_BotWrenchR: + case WPN_BotWrenchB: + case WPN_BotWrenchC: + case WPN_BotWrenchD: + case WPN_BotWrenchES: + case WPN_BotWrenchEG: + return true; + break; + default: + return false; + } + } + + bool is_engineer( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Builder: + case WPN_Builder2: + case WPN_Destructor: + case WPN_Toolbox: + return true; + break; + default: + return false; + } + } + + bool is_needle_gun( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_SyringeGun: + case WPN_NewSyringeGun: + case WPN_Blutsauger: + case WPN_Crossbow: + case WPN_Overdose: + case WPN_FestiveCrossbow: + return true; + break; + default: + return false; + } + } + + bool is_healing( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Medigun: + case WPN_NewMedigun: + case WPN_Kritzkrieg: + case WPN_QuickFix: + case WPN_FestiveMedigun: + case WPN_MedigunS: + case WPN_MedigunG: + case WPN_MedigunR: + case WPN_MedigunB: + case WPN_MedigunC: + case WPN_MedigunD: + case WPN_Vaccinator: + case WPN_MedigunES: + case WPN_MedigunEG: + return true; + break; + default: + return false; + } + } + + bool is_revolver( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Revolver: + case WPN_NewRevolver: + case WPN_Ambassador: + case WPN_BigKill: + case WPN_Letranger: + case WPN_Enforcer: + case WPN_Diamondback: + case WPN_FestiveAmbassador: + return true; + break; + default: + return false; + } + } + + bool is_spy_knife( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Knife: + case WPN_NewKnife: + case WPN_EternalReward: + case WPN_DisguiseKit: + case WPN_Kunai: + case WPN_BigEarner: + case WPN_WangaPrick: + case WPN_SharpDresser: + case WPN_Spycicle: + case WPN_FestiveKnife: + case WPN_BlackRose: + case WPN_BotKnifeS: + case WPN_BotKnifeG: + case WPN_BotKnifeR: + case WPN_BotKnifeB: + case WPN_BotKnifeC: + case WPN_BotKnifeD: + case WPN_BotKnifeES: + case WPN_BotKnifeEG: + return true; + break; + default: + return false; + } + } + + bool is_watch( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_InivisWatch: + case WPN_DeadRinger: + case WPN_CloakAndDagger: + case WPN_TimePiece: + return true; + break; + default: + return false; + } + } + + bool is_sapper( ) { + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Sapper: + case WPN_Sapper2: + case WPN_RedTape1: + case WPN_RedTape2: + case WPN_ApSap: + case WPN_FestiveSapper: + case WPN_SnackAttack: + return true; + break; + default: + return false; + } + } + + /*bool get_projectile_speed( float& speed ) { + speed = 0; + switch( m_iItemDefinitionIndex( ) ) { + case WPN_Milk: + case WPN_MutatedMilk: + speed = 1019.9; + break; + case WPN_FlyingGuillotine1: + case WPN_FlyingGuillotine2: + case WPN_Sandman: + case WPN_WrapAssassin: + case WPN_ManMelter: + speed = 3000; + break; + case WPN_RocketJumper: + case WPN_BlackBox: + case WPN_Original: + case WPN_BeggersBazooka: + case WPN_CowMangler: + speed = 1100; + break; + + case WPN_DirectHit: + speed = 1980; + break; + + case WPN_LibertyLauncher: + speed = 1540; + break; + + case WPN_RighteousBison: + case WPN_Pomson: + speed = 1200; + break; + + case WPN_Flaregun: + case WPN_FestiveFlaregun: + case WPN_ScorchShot: + case WPN_Detonator: + speed = 2000; + break; + + case WPN_GrenadeLauncher: + case WPN_NewGrenadeLauncher: + case WPN_FestiveGrenadeLauncher: + case WPN_IronBomber: + speed = 1216.6; + break; + + + + /* + get dynamically + + stickybomb launcher + scottish resistance + sticky jumper + quickiebomb launcher + huntman fortified compound + + + + } + return ( speed ); + }*/ + + int get_max_clip_1( ); + int get_max_clip_2( ); + int get_slot( ); + char* get_name( ); + char* get_print_name( ); + vec3_t& get_bullet_spread( ); + float get_spread( ); + int get_weaponid( ); + bool can_fire( ); + bool is_non_aim( ); + int& get_inspect_stage( ); + float& get_inspect_time( ); + c_attribute_list* get_attribute_list( ); + float get_distance( ); +}; \ No newline at end of file diff --git a/cheat/tf2/CGlobalVarsBase.h b/cheat/tf2/CGlobalVarsBase.h new file mode 100644 index 0000000..9b0d79f --- /dev/null +++ b/cheat/tf2/CGlobalVarsBase.h @@ -0,0 +1,14 @@ +#pragma once + +class CGlobalVarsBase { +public: + float realtime; + int framecount; + float absoluteframetime; + float curtime; + float frametime; + int maxclients; + int tickcount; + float interval_per_tick; + float interpolation_amount; +}; \ No newline at end of file diff --git a/cheat/tf2/CHLClient.h b/cheat/tf2/CHLClient.h new file mode 100644 index 0000000..7eadb50 --- /dev/null +++ b/cheat/tf2/CHLClient.h @@ -0,0 +1,32 @@ +#pragma once +#include "dt_common.h" +#include "dt_recv.h" +#include "VFunc.h" +#include "ClientClass.h" + +enum frame_stages_t { + FRAME_UNDEFINED = -1, // (haven't run any frames yet) + FRAME_START, + FRAME_NET_UPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_START, + FRAME_NET_UPDATE_POSTDATAUPDATE_END, + FRAME_NET_UPDATE_END, + + FRAME_RENDER_START, + FRAME_RENDER_END +}; + +class chl_client { +public: + client_class_t* GetAllClasses( ) { + return call_vfunc< client_class_t*( __thiscall* )( void* ) >( this, 8 )( this ); + } + + void in_activatemouse( ) { + call_vfunc< void( __thiscall* )( void* ) >( this, 15 )( this ); + } + + void in_deactivatemouse( ) { + call_vfunc< void( __thiscall* )( void* ) >( this, 16 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/CInput.hpp b/cheat/tf2/CInput.hpp new file mode 100644 index 0000000..3fb8bff --- /dev/null +++ b/cheat/tf2/CInput.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include "vector.hpp" +#include "IClientMode.h" + +#define MULTIPLAYER_BACKUP 150 + +struct verified_cmd_t { + user_cmd_t m_cmd; + CRC32_t m_crc; +}; + +class CInput { + void* pvftable; //0x00 +public: + bool m_fTrackIRAvailable; //0x04 + bool m_fMouseInitialized; //0x05 + bool m_fMouseActive; //0x06 + bool m_fJoystickAdvancedInit; //0x07 +private: + char pad_0x08[ 0x2C ]; //0x08 +public: + void* m_pKeys; //0x34 +private: + char pad_0x38[ 0x64 ]; //0x38 + int pad_0x41; + int pad_0x42; +public: + bool m_fCameraInterceptingMouse; //0x9C + bool m_fCameraInThirdPerson; //0x9D + bool m_fCameraMovingWithMouse; //0x9E + vec3_t m_vecCameraOffset; //0xA0 + bool m_fCameraDistanceMove; //0xAC + int m_nCameraOldX; //0xB0 + int m_nCameraOldY; //0xB4 + int m_nCameraX; //0xB8 + int m_nCameraY; //0xBC + bool m_CameraIsOrthographic; //0xC0 + vec3_t m_angPreviousViewAngles; //0xC4 + vec3_t m_angPreviousViewAnglesTilt; //0xD0 + float m_flLastForwardMove; //0xDC + int m_nClearInputState; //0xE0 +public: + user_cmd_t * m_pCommands; //0xEC + verified_cmd_t* m_pVerifiedCommands; //0xF0 + int m_hSelectedWeapon; + + user_cmd_t* GetUserCmd( int slot, int seq_num ) { + return util::get_vfunc< 8, user_cmd_t* >( this, slot, seq_num ); + } + + void CreateMove( int sequence_number, float input_sample_time, bool active ) { + return util::get_vfunc< 3, void >( this, sequence_number, input_sample_time, active ); + } +}; diff --git a/cheat/tf2/CUserCmd.h b/cheat/tf2/CUserCmd.h new file mode 100644 index 0000000..f9dd746 --- /dev/null +++ b/cheat/tf2/CUserCmd.h @@ -0,0 +1,51 @@ +#pragma once +#include "vector.hpp" + +enum PlayerControls_t { + IN_ATTACK = 1 << 0, + IN_JUMP = 1 << 1, + IN_DUCK = 1 << 2, + IN_FORWARD = 1 << 3, + IN_BACK = 1 << 4, + IN_USE = 1 << 5, + IN_CANCEL = 1 << 6, + IN_LEFT = 1 << 7, + IN_RIGHT = 1 << 8, + IN_MOVELEFT = 1 << 9, + IN_MOVERIGHT = 1 << 10, + IN_ATTACK2 = 1 << 11, + IN_RUN = 1 << 12, + IN_RELOAD = 1 << 13, + IN_ALT1 = 1 << 14, + IN_ALT2 = 1 << 15, + IN_SCORE = 1 << 16, + IN_SPEED = 1 << 17, + IN_WALK = 1 << 18, + IN_ZOOM = 1 << 19, + IN_WEAPON1 = 1 << 20, + IN_WEAPON2 = 1 << 21, + IN_BULLRUSH = 1 << 22, + IN_GRENADE1 = 1 << 23, + IN_GRENADE2 = 1 << 24, + IN_ATTACK3 = 1 << 25, +}; + +class user_cmd_t { +public: + virtual ~user_cmd_t( ) {}; + int command_number; //0 + int tick_count; //4 + vec3_t viewangles; //16 + float forwardmove; //20 + float sidemove; //24 + float upmove; //28 + int buttons; //32 + byte impulse; //33 + int weaponselect; // + int weaponsubtype; + int random_seed; + short mousedx; + short mousedy; + bool hasbeenpredicted; + int SetValue; +}; \ No newline at end of file diff --git a/cheat/tf2/ClientClass.h b/cheat/tf2/ClientClass.h new file mode 100644 index 0000000..56a1103 --- /dev/null +++ b/cheat/tf2/ClientClass.h @@ -0,0 +1,382 @@ +#pragma once +#include +#include "dt_recv.h" +typedef unsigned char byte; + +enum ClientClassIDs { + SporeExplosion = 359, + RocketTrail = 357, + SmokeTrail = 358, + CPropVehicleDriveable = 107, + ParticleSmokeGrenade = 356, + CParticleFire = 90, + MovieExplosion = 354, + CTEGaussExplosion = 154, + CEnvQuadraticBeam = 43, + CEmbers = 36, + CEnvWind = 47, + CPrecipitation = 106, + CBaseTempEntity = 17, + CWeaponIFMSteadyCam = 349, + CWeaponIFMBaseCamera = 348, + CWeaponIFMBase = 347, + CTFWearableVM = 341, + CTFWearable = 334, + CTFWearableItem = 337, + CEconWearable = 35, + CBaseAttributableItem = 3, + CEconEntity = 34, + CHandleTest = 72, + CTeamplayRoundBasedRulesProxy = 125, + CTeamRoundTimer = 126, + CSpriteTrail = 121, + CSpriteOriented = 120, + CSprite = 119, + CRagdollPropAttached = 110, + CRagdollProp = 109, + CPoseController = 105, + CGameRulesProxy = 68, + CInfoLadderDismount = 75, + CFuncLadder = 58, + CEnvDetailController = 40, + CWorld = 351, + CWaterLODControl = 346, + CWaterBullet = 345, + CVoteController = 344, + CVGuiScreen = 343, + CPropJeep = 0, + CPropVehicleChoreoGeneric = 0, + CTest_ProxyToggle_Networkable = 174, + CTesla = 169, + CTeamTrainWatcher = 127, + CBaseTeamObjectiveResource = 16, + CTeam = 124, + CSun = 123, + CParticlePerformanceMonitor = 91, + CSpotlightEnd = 118, + CSlideshowDisplay = 115, + CShadowControl = 114, + CSceneEntity = 113, + CRopeKeyframe = 112, + CRagdollManager = 108, + CPhysicsPropMultiplayer = 98, + CPhysBoxMultiplayer = 96, + CBasePropDoor = 15, + CDynamicProp = 33, + CPointCommentaryNode = 104, + CPointCamera = 103, + CPlayerResource = 102, + CPlasma = 100, + CPhysMagnet = 99, + CPhysicsProp = 97, + CPhysBox = 95, + CParticleSystem = 92, + CMaterialModifyControl = 81, + CLightGlow = 79, + CInfoOverlayAccessor = 77, + CFuncTrackTrain = 67, + CFuncSmokeVolume = 66, + CFuncRotating = 65, + CFuncReflectiveGlass = 62, + CFuncOccluder = 60, + CFuncMonitor = 59, + CFunc_LOD = 54, + CTEDust = 146, + CFunc_Dust = 53, + CFuncConveyor = 56, + CBreakableSurface = 25, + CFuncAreaPortalWindow = 55, + CFish = 51, + CEntityFlame = 38, + CFireSmoke = 49, + CEnvTonemapController = 46, + CEnvScreenEffect = 44, + CEnvScreenOverlay = 45, + CEnvProjectedTexture = 42, + CEnvParticleScript = 41, + CFogController = 52, + CEntityParticleTrail = 39, + CEntityDissolve = 37, + CDynamicLight = 32, + CColorCorrectionVolume = 30, + CColorCorrection = 29, + CBreakableProp = 24, + CBasePlayer = 13, + CBaseFlex = 8, + CBaseEntity_ = 7, + CBaseDoor = 6, + CBaseCombatCharacter = 4, + CBaseAnimatingOverlay = 2, + CBoneFollower = 20, + CBaseAnimating = 1, + CInfoLightingRelative = 76, + CAI_BaseNPC = 0, + CBeam = 19, + CBaseViewModel = 18, + CBaseProjectile = 14, + CBaseParticleEntity = 12, + CBaseGrenade = 9, + CBaseCombatWeapon = 5, + CTFWearableRazorback = 339, + CTFWearableDemoShield = 336, + CTFWearableLevelableItem = 338, + CTFWearableCampaignItem = 335, + CTFBaseRocket = 184, + CTFWeaponBaseMerasmusGrenade = 323, + CTFWeaponBaseMelee = 322, + CTFWeaponBaseGun = 321, + CTFWeaponBaseGrenadeProj = 320, + CTFWeaponBase = 319, + CTFWearableRobotArm = 340, + CTFRobotArm = 285, + CTFWrench = 342, + CTFProjectile_ThrowableBreadMonster = 277, + CTFProjectile_ThrowableBrick = 278, + CTFProjectile_ThrowableRepel = 279, + CTFProjectile_Throwable = 276, + CTFThrowable = 317, + CTFSyringeGun = 313, + CTFKatana = 224, + CTFSword = 312, + CSniperDot = 117, + CTFSniperRifleClassic = 306, + CTFSniperRifleDecap = 307, + CTFSniperRifle = 305, + CTFChargedSMG = 196, + CTFSMG = 304, + CTFSlap = 303, + CTFShovel = 302, + CTFShotgunBuildingRescue = 301, + CTFPEPBrawlerBlaster = 240, + CTFSodaPopper = 308, + CTFShotgun_Revenge = 299, + CTFScatterGun = 295, + CTFShotgun_Pyro = 298, + CTFShotgun_HWG = 297, + CTFShotgun_Soldier = 300, + CTFShotgun = 296, + CTFRocketPack = 294, + CTFCrossbow = 200, + CTFRocketLauncher_Mortar = 293, + CTFRocketLauncher_AirStrike = 291, + CTFRocketLauncher_DirectHit = 292, + CTFRocketLauncher = 290, + CTFRevolver = 284, + CTFDRGPomson = 201, + CTFRaygun = 282, + CTFPistol_ScoutSecondary = 245, + CTFPistol_ScoutPrimary = 244, + CTFPistol_Scout = 243, + CTFPistol = 242, + CTFPipebombLauncher = 241, + CTFWeaponPDA_Spy = 330, + CTFWeaponPDA_Engineer_Destroy = 329, + CTFWeaponPDA_Engineer_Build = 328, + CTFWeaponPDAExpansion_Teleporter = 332, + CTFWeaponPDAExpansion_Dispenser = 331, + CTFWeaponPDA = 327, + CTFParticleCannon = 238, + CTFParachute_Secondary = 237, + CTFParachute_Primary = 236, + CTFParachute = 235, + CTFMinigun = 233, + CTFMedigunShield = 230, + CWeaponMedigun = 350, + CTFMechanicalArm = 229, + CTFLunchBox_Drink = 228, + CTFLunchBox = 227, + CLaserDot = 78, + CTFLaserPointer = 226, + CTFKnife = 225, + CTFGasManager = 211, + CTFProjectile_JarGas = 260, + CTFJarGas = 222, + CTFProjectile_Cleaver = 253, + CTFProjectile_JarMilk = 261, + CTFProjectile_Jar = 259, + CTFCleaver = 197, + CTFJarMilk = 223, + CTFJar = 221, + CTFWeaponInvis = 326, + CTFCannon = 195, + CTFGrenadeLauncher = 215, + CTFGrenadePipebombProjectile = 216, + CTFGrapplingHook = 214, + CTFFlareGun_Revenge = 209, + CTFFlareGun = 208, + CTFFlameRocket = 206, + CTFFlameThrower = 207, + CTFFists = 204, + CTFFireAxe = 203, + CTFWeaponFlameBall = 325, + CTFCompoundBow = 199, + CTFClub = 198, + CTFBuffItem = 194, + CTFStickBomb = 310, + CTFBreakableSign = 193, + CTFBottle = 191, + CTFBreakableMelee = 192, + CTFBonesaw = 189, + CTFBall_Ornament = 181, + CTFStunBall = 311, + CTFBat_Giftwrap = 187, + CTFBat_Wood = 188, + CTFBat_Fish = 186, + CTFBat = 185, + CTFProjectile_EnergyRing = 255, + CTFDroppedWeapon = 202, + CTFWeaponSapper = 333, + CTFWeaponBuilder = 324, + C_TFWeaponBuilder = 0, + CTFProjectile_Rocket = 262, + CTFProjectile_Flare = 256, + CTFProjectile_EnergyBall = 254, + CTFProjectile_GrapplingHook = 257, + CTFProjectile_HealingBolt = 258, + CTFProjectile_Arrow = 251, + CTFTankBoss = 314, + CTFBaseBoss = 182, + CBossAlpha = 0, + NextBotCombatCharacter = 355, + CTFProjectile_SpellKartBats = 266, + CTFProjectile_SpellKartOrb = 267, + CTFHellZap = 219, + CTFProjectile_SpellLightningOrb = 268, + CTFProjectile_SpellTransposeTeleport = 275, + CTFProjectile_SpellMeteorShower = 269, + CTFProjectile_SpellSpawnBoss = 272, + CTFProjectile_SpellMirv = 270, + CTFProjectile_SpellPumpkin = 271, + CTFProjectile_SpellSpawnHorde = 273, + CTFProjectile_SpellSpawnZombie = 274, + CTFProjectile_SpellBats = 264, + CTFProjectile_SpellFireball = 265, + CTFSpellBook = 309, + CHightower_TeleportVortex = 74, + CTeleportVortex = 159, + CZombie = 352, + CMerasmusDancer = 83, + CMerasmus = 82, + CHeadlessHatman = 73, + CEyeballBoss = 48, + CTFBotHintEngineerNest = 190, + CBotNPCMinion = 0, + CBotNPC = 0, + CPasstimeGun = 94, + CTFViewModel = 318, + CRobotDispenser = 111, + CTFRobotDestruction_Robot = 286, + CTFReviveMarker = 283, + CTFPumpkinBomb = 280, + CTFProjectile_BallOfFire = 252, + CTFBaseProjectile = 183, + CTFPointManager = 249, + CBaseObjectUpgrade = 11, + CTFRobotDestructionLogic = 289, + CTFRobotDestruction_RobotGroup = 287, + CTFRobotDestruction_RobotSpawn = 288, + CTFPlayerDestructionLogic = 247, + CPlayerDestructionDispenser = 101, + CTFMinigameLogic = 232, + CTFHalloweenMinigame_FallingPlatforms = 218, + CTFHalloweenMinigame = 217, + CTFMiniGame = 231, + CTFPowerupBottle = 250, + CTFItem = 220, + CHalloweenSoulPack = 71, + CTFGenericBomb = 212, + CBonusRoundLogic = 23, + CTFGameRulesProxy = 210, + CTETFParticleEffect = 178, + CTETFExplosion = 177, + CTETFBlood = 176, + CTFFlameManager = 205, + CHalloweenGiftPickup = 69, + CBonusDuckPickup = 21, + CHalloweenPickup = 70, + CCaptureFlagReturnIcon = 27, + CCaptureFlag = 26, + CBonusPack = 22, + CTFTeam = 316, + CTFTauntProp = 315, + CTFPlayerResource = 248, + CTFPlayer = 246, + CTFRagdoll = 281, + CTEPlayerAnimEvent = 164, + CTFPasstimeLogic = 239, + CPasstimeBall = 93, + CTFObjectiveResource = 234, + CTFGlow = 213, + CTEFireBullets = 151, + CTFBuffBanner = 0, + CTFAmmoPack = 180, + CObjectTeleporter = 89, + CObjectSentrygun = 88, + CTFProjectile_SentryRocket = 263, + CObjectSapper = 87, + CObjectCartDispenser = 85, + CObjectDispenser = 86, + CMonsterResource = 84, + CFuncRespawnRoomVisualizer = 64, + CFuncRespawnRoom = 63, + CFuncPasstimeGoal = 61, + CFuncForceField = 57, + CCaptureZone = 28, + CCurrencyPack = 31, + CBaseObject = 10, + CTestTraceline = 175, + CTEWorldDecal = 179, + CTESpriteSpray = 173, + CTESprite = 172, + CTESparks = 171, + CTESmoke = 170, + CTEShowLine = 168, + CTEProjectedDecal = 166, + CTEPlayerDecal = 165, + CTEPhysicsProp = 163, + CTEParticleSystem = 162, + CTEMuzzleFlash = 161, + CTELargeFunnel = 158, + CTEKillPlayerAttachments = 157, + CTEImpact = 156, + CTEGlowSprite = 155, + CTEShatterSurface = 167, + CTEFootprintDecal = 153, + CTEFizz = 152, + CTEExplosion = 150, + CTEEnergySplash = 149, + CTEEffectDispatch = 148, + CTEDynamicLight = 147, + CTEDecal = 145, + CTEClientProjectile = 144, + CTEBubbleTrail = 143, + CTEBubbles = 142, + CTEBSPDecal = 141, + CTEBreakModel = 140, + CTEBloodStream = 139, + CTEBloodSprite = 138, + CTEBeamSpline = 137, + CTEBeamRingPoint = 136, + CTEBeamRing = 135, + CTEBeamPoints = 134, + CTEBeamLaser = 133, + CTEBeamFollow = 132, + CTEBeamEnts = 131, + CTEBeamEntPoint = 130, + CTEBaseBeam = 129, + CTEArmorRicochet = 128, + CTEMetalSparks = 160, + CSteamJet = 122, + CSmokeStack = 116, + DustTrail = 353, + CFireTrail = 50, +}; + +class client_class_t { + byte _chpadding[ 8 ]; +public: + char* m_name; + RecvTable* m_rt_table; + client_class_t* m_next; + int m_class_id; +}; \ No newline at end of file diff --git a/cheat/tf2/GlowObject.h b/cheat/tf2/GlowObject.h new file mode 100644 index 0000000..00dce81 --- /dev/null +++ b/cheat/tf2/GlowObject.h @@ -0,0 +1,43 @@ +#pragma once +#include "UtlMem.h" +#include +#include "color.hpp" + +static const int END_OF_FREE_LIST = -1; +static const int ENTRY_IN_USE = -2; + +struct GlowObject_t { + uintptr_t ent_ptr; + fclr_t glow_color; + + bool render_when_occluded; + bool render_when_unoccluded; + int pad; + + int next_free_slot; +}; + +struct GlowObjectManager_t { + CUtlVector< GlowObject_t > data; + int first_slot; + + int RegisterGlowObject( IClientEntity* ent ) { + for( int i{ }; i < data.Count( ); i++ ) { + if( data[ i ].ent_ptr == ent->get_ehandle( ) ) return 0; + } + int index{ }; + if( first_slot == -1 ) index = data.AddToTail( ); + else { + index = first_slot; + first_slot = data[ index ].next_free_slot; + } + data[ index ].ent_ptr = ent->get_ehandle( ); + data[ index ].glow_color = clr_t( 255, 255, 255, 255 ).to_fclr( ); + data[ index ].render_when_occluded = true; + data[ index ].render_when_unoccluded = true; + data[ index ].pad = -1; + data[ index ].next_free_slot = -2; + + return index; + } +}; \ No newline at end of file diff --git a/cheat/tf2/IAppSystem.h b/cheat/tf2/IAppSystem.h new file mode 100644 index 0000000..84af8c2 --- /dev/null +++ b/cheat/tf2/IAppSystem.h @@ -0,0 +1,31 @@ +#pragma once + +class AppSystemInfo_t; + +enum InitReturnVal_t; + +enum AppSystemTier_t { + APP_SYSTEM_TIER0 = 0, + APP_SYSTEM_TIER1, + APP_SYSTEM_TIER2, + APP_SYSTEM_TIER3, + + APP_SYSTEM_TIER_OTHER, +}; + +using CreateInterfaceFn = void*( *)( const char*, int* ); + +class IAppSystem { +public: + // Here's where the app systems get to learn about each other + virtual bool Connect( CreateInterfaceFn factory ) = 0; + virtual void Disconnect( ) = 0; + + // Here's where systems can access other interfaces implemented by this object + // Returns NULL if it doesn't implement the requested interface + virtual void *QueryInterface( const char *pInterfaceName ) = 0; + + // Init, shutdown + virtual InitReturnVal_t Init( ) = 0; + virtual void Shutdown( ) = 0; +}; \ No newline at end of file diff --git a/cheat/tf2/IClientEntity.h b/cheat/tf2/IClientEntity.h new file mode 100644 index 0000000..0ba0807 --- /dev/null +++ b/cheat/tf2/IClientEntity.h @@ -0,0 +1,154 @@ +#pragma once +#include "vector.hpp" +#include "VFunc.h" +#include "dt_common.h" +#include "dt_recv.h" +#include "search.h" +#include "util.hpp" +#include "ClientClass.h" + +using matrix3x4 = float[ 3 ][ 4 ]; +class bf_read; + +class ICollideable; +class IClientNetworkable; +class IClientRenderable; +class IClientThinkable; +class IClientEntity; +class IClientAlphaProperty; + +class IClientUnknown { +public: + virtual ICollideable* GetCollideable( ) = 0; + virtual IClientNetworkable* GetClientNetworkable( ) = 0; + virtual IClientRenderable* GetClientRenderable( ) = 0; + virtual IClientEntity* GetIClientEntity( ) = 0; + virtual IClientEntity* GetBaseEntity( ) = 0; + virtual IClientThinkable* GetClientThinkable( ) = 0; + //virtual IClientModelRenderable* GetClientModelRenderable() = 0; + virtual IClientAlphaProperty* GetClientAlphaProperty( ) = 0; +}; + +class IClientNetworkable { +public: + virtual IClientUnknown* GetIClientUnknown( ) = 0; + virtual void Release( ) = 0; + virtual client_class_t* GetClientClass( ) = 0; + virtual void NotifyShouldTransmit( int state ) = 0; + virtual void OnPreDataChanged( int updateType ) = 0; + virtual void OnDataChanged( int updateType ) = 0; + virtual void PreDataUpdate( int updateType ) = 0; + virtual void PostDataUpdate( int updateType ) = 0; + virtual void OnDataUnchangedInPVS( void ) = 0; + virtual bool IsDormant( void ) = 0; + virtual int EntIndex( void ) const = 0; + virtual void ReceiveMessage( int classID, bf_read& msg ) = 0; + virtual void* GetDataTableBasePtr( ) = 0; + virtual void SetDestroyedOnRecreateEntities( void ) = 0; +}; + +class IClientEntity { +public: + void* get_client_renderable( ) { + return reinterpret_cast< void* >( this + 0x4 ); + } + + IClientNetworkable* get_client_networkable( ) { + return reinterpret_cast< IClientNetworkable* >( this + 0x8 ); + } + +public: + uintptr_t get_ehandle( ) { + return call_vfunc< uintptr_t( __thiscall* )( void* ) >( this, 1 )( this ); + } + + bool setup_bones( matrix3x4* bonetoworld, int maxbones, long bonemask, float curtime ) { + return call_vfunc< bool( __thiscall* )( void*, matrix3x4*, int, long, float ) >( get_client_renderable( ), 16 )( get_client_renderable( ), bonetoworld, maxbones, bonemask, curtime ); + } + + int DrawModel( int flags, uint8_t alpha ) { + using fn = int( __thiscall* )( void*, int, uint8_t ); + return util::get_vfunc< fn >( this->get_client_renderable( ), 9 )( this->get_client_renderable( ), flags, alpha ); + } + + vec3_t& get_render_origin( ) { + using fn = vec3_t & ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 10 )( this ); + } + + vec3_t& get_abs_origin( ) { + return call_vfunc< vec3_t&( __thiscall* )( void* ) >( this, 9 )( this ); + } + + vec3_t& get_abs_angles( ) { + return call_vfunc< vec3_t&( __thiscall* )( void* ) >( this, 10 )( this ); + } + + void* get_model( ) { + return call_vfunc< void*( __thiscall* )( void* ) >( get_client_renderable( ), 9 )( get_client_renderable( ) ); + } + + client_class_t* get_client_class( ) { + return call_vfunc< client_class_t*( __thiscall* )( void* ) >( get_client_networkable( ), 2 )( get_client_networkable( ) ); + } + + bool is_dormant( ) { + return call_vfunc< bool( __thiscall * )( void * ) >( get_client_networkable( ), 8 )( get_client_networkable( ) ); + } + + int index( ) { + return call_vfunc< int( __thiscall* )( void* ) >( get_client_networkable( ), 9 )( get_client_networkable( ) ); + } + + void update_glow_effect( ) { + //static auto fn = pattern::first_code_match< void( __thiscall* )( void* ) >( GetModuleHandleA( "client.dll" ), "8B 06 8D 4D F4 57 51 8D 4D F8", -0x2c ); + //if ( fn ) fn( this ); + return call_vfunc< void( __thiscall* )( void* ) >( this, 226 )( this ); + } + + void destroy_glow_effect( ) { + //static auto fn_offset = pattern::first_code_match< intptr_t >( GetModuleHandleA( "client.dll" ), "E8 ? ? ? ? 8B 9F ? ? ? ? 85 DB 74 3D 8B 33" ); + //static auto fn = reinterpret_cast< void( __thiscall* )( void* ) >( fn_offset + 5 + *( intptr_t* )( fn_offset + 1 ) ); + //if ( fn ) fn( this ); + return call_vfunc< void( __thiscall* )( void* ) >( this, 227 )( this ); + } + + client_class_t* GetClientClass( ) { + using fn = client_class_t* ( __thiscall* )( void* ); + return util::get_vfunc< fn >( get_client_networkable( ), 2 )( this ); + /* + try { + return get_client_networkable( )->GetClientClass( ); + } + catch( ... ) { + return 0; + }*/ + } + +public: + template< typename T = uintptr_t > + __forceinline T& get( std::ptrdiff_t offset = 0 ) { + return( *reinterpret_cast< T* >( ( uintptr_t )this + offset ) ); + } + + template< std::ptrdiff_t offset, typename T = uintptr_t > + __forceinline T& get( ) { + return( *reinterpret_cast< T* >( ( uintptr_t )this + offset ) ); + } + + template< typename T = uintptr_t > + __forceinline T at( std::ptrdiff_t offset = 0 ) { + return( reinterpret_cast< T >( uintptr_t( this ) + offset ) ); + } + + template< std::ptrdiff_t offset, typename T = uintptr_t > + __forceinline T at( ) { + return( reinterpret_cast< T >( uintptr_t( this ) + offset ) ); + } + + template < typename t > + t* as( ) { + return reinterpret_cast< t* >( this ); + } + +}; \ No newline at end of file diff --git a/cheat/tf2/IClientEntityList.h b/cheat/tf2/IClientEntityList.h new file mode 100644 index 0000000..18b4371 --- /dev/null +++ b/cheat/tf2/IClientEntityList.h @@ -0,0 +1,24 @@ +#pragma once +#include "VFunc.h" + +class IClientEntity; +class c_base_player; +using model_t = uintptr_t; +class client_ent_list { +public: + template< typename T = IClientEntity > T* get_client_entity( int index ) { + return call_vfunc< T* ( __thiscall* )( void*, int ) >( this, 3 )( this, index ); + } + + template< typename T = IClientEntity > T* get_entity_from_handle( uintptr_t handle ) { + return call_vfunc< T*( __thiscall* )( void*, uintptr_t ) >( this, 4 )( this, handle ); + } + + int get_highest_entity_index( ) { + return call_vfunc< int( __thiscall* )( void* ) >( this, 6 )( this ); + } + + template< typename T = c_base_player > __forceinline T* get_local_player( ) { + return get_client_entity< T >( cl.m_engine( )->GetLocalPlayer( ) ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/IClientMode.h b/cheat/tf2/IClientMode.h new file mode 100644 index 0000000..f528f3d --- /dev/null +++ b/cheat/tf2/IClientMode.h @@ -0,0 +1,174 @@ +#pragma once + +#include "checksum_crc.h" + +#include "util.hpp" +#include "vector.hpp" + +enum player_controls_t { + IN_ATTACK = 1 << 0, + IN_JUMP = 1 << 1, + IN_DUCK = 1 << 2, + IN_FORWARD = 1 << 3, + IN_BACK = 1 << 4, + IN_USE = 1 << 5, + IN_CANCEL = 1 << 6, + IN_LEFT = 1 << 7, + IN_RIGHT = 1 << 8, + IN_MOVELEFT = 1 << 9, + IN_MOVERIGHT = 1 << 10, + IN_ATTACK2 = 1 << 11, + IN_RUN = 1 << 12, + IN_RELOAD = 1 << 13, + IN_ALT1 = 1 << 14, + IN_ALT2 = 1 << 15, + IN_SCORE = 1 << 16, + IN_SPEED = 1 << 17, + IN_WALK = 1 << 18, + IN_ZOOM = 1 << 19, + IN_WEAPON1 = 1 << 20, + IN_WEAPON2 = 1 << 21, + IN_BULLRUSH = 1 << 22, + IN_GRENADE1 = 1 << 23, + IN_GRENADE2 = 1 << 24, + IN_ATTACK3 = 1 << 25, +}; + +class user_cmd_t { +public: + virtual ~user_cmd_t( ) { }; + + int m_cmd_nr; // 0x04 For matching server and client commands for debugging + int m_tick_count; // 0x08 the tick the client created this command + vec3_t m_viewangles; // 0x0C Player instantaneous view angles. + float m_forwardmove; // 0x24 + float m_sidemove; // 0x28 + float m_upmove; // 0x2C + int m_buttons; // 0x30 Attack button states + uint8_t m_impulse; // 0x34 + int m_weaponselect; // 0x38 Current weapon id + int m_weaponsubtype; // 0x3C + int m_random_seed; // 0x40 For shared random functions + short m_mousedx; // 0x44 mouse accum in x from create move + short m_mousedy; // 0x46 mouse accum in y from create move + bool m_predicted; // 0x48 Client only, tracks whether we've predicted this command at least once + vec3_t headangles; // 0x49 + vec3_t headoffset; // 0x55 + + __forceinline user_cmd_t clamp( bool angles = true ) { + if( angles ) + m_viewangles.clamp( ); + + m_forwardmove = std::clamp( m_forwardmove, -450.f, 450.f ); + m_sidemove = std::clamp( m_sidemove, -450.f, 450.f ); + m_upmove = std::clamp( m_upmove, -450.f, 450.f ); + + return *this; + } + + CRC32_t get_check_sum( ) { + CRC32_t crc; + CRC32_Init( &crc ); + + CRC32_ProcessBuffer( &crc, &m_cmd_nr, sizeof( m_cmd_nr ) ); + CRC32_ProcessBuffer( &crc, &m_tick_count, sizeof( m_tick_count ) ); + CRC32_ProcessBuffer( &crc, &m_viewangles, sizeof( m_viewangles ) ); + CRC32_ProcessBuffer( &crc, &m_forwardmove, sizeof( m_forwardmove ) ); + CRC32_ProcessBuffer( &crc, &m_sidemove, sizeof( m_sidemove ) ); + CRC32_ProcessBuffer( &crc, &m_upmove, sizeof( m_upmove ) ); + CRC32_ProcessBuffer( &crc, &m_buttons, sizeof( m_buttons ) ); + CRC32_ProcessBuffer( &crc, &m_impulse, sizeof( m_impulse ) ); + CRC32_ProcessBuffer( &crc, &m_weaponselect, sizeof( m_weaponselect ) ); + CRC32_ProcessBuffer( &crc, &m_weaponsubtype, sizeof( m_weaponsubtype ) ); + CRC32_ProcessBuffer( &crc, &m_random_seed, sizeof( m_random_seed ) ); + CRC32_ProcessBuffer( &crc, &m_mousedx, sizeof( m_mousedx ) ); + CRC32_ProcessBuffer( &crc, &m_mousedy, sizeof( m_mousedy ) ); + + CRC32_Final( &crc ); + return crc; + } + +private: + + //char pad_0x4C[ 0x18 ]; // 0x4C Current sizeof( usercmd ) = 100 = 0x64 +}; + +class CHudChat { +public: + void ChatPrintf( int iPlayerIndex, int iFilter, const char* fmt ) { + using fn = void( __cdecl* )( void*, int, int, const char* ); + util::get_vfunc< fn >( this, 26 )( this, iPlayerIndex, iFilter, fmt ); + } +}; + +class CViewSetup { +public: + int m_x; + int m_oldX; + int m_y; + int m_oldY; + int m_width; + int m_oldWidth; + int m_height; + int m_oldHeight; + + bool m_bOrtho; + float m_OrthoLeft; + float m_OrthoTop; + float m_OrthoRight; + float m_OrthoBottom; + +private: + char pad1[ 0x7C ]; + +public: + float m_flFov; + float m_flFovViewmodel; + vec3_t m_vecOrigin; + vec3_t m_vecAngles; + + float zNear; + float zFar; + float zNearViewmodel; + float zFarViewmodel; + + float m_flAspectRatio; + float m_flNearBlurDepth; + float m_flNearFocusDepth; + float m_flFarFocusDepth; + float m_flFarBlurDepth; + float m_flNearBlurRadius; + float m_flFarBlurRadius; + int m_nDoFQuality; + int m_nMotionBlurMode; + + float m_flShutterTime; + vec3_t m_vShutterOpenPosition; + vec3_t m_shutterOpenAngles; + vec3_t m_vShutterClosePosition; + vec3_t m_shutterCloseAngles; + + float m_flOffCenterTop; + float m_flOffCenterBottom; + float m_flOffCenterLeft; + float m_flOffCenterRight; + + bool m_bOffCenter : 1; + bool m_bRenderToSubrectOfLargerScreen : 1; + bool m_bDoBloomAndToneMapping : 1; + bool m_bDoDepthOfField : 1; + bool m_bHDRTarget : 1; + bool m_bDrawWorldNormal : 1; + bool m_bCullFrontFaces : 1; + bool m_bCacheFullSceneState : 1; + bool m_bRenderFlashlightDepthTranslucents : 1; +private: + char pad2[ 0x40 ]; +}; + +class IClientMode { +public: + char _pad[ 28 ]; + + CHudChat* m_pChatElement; //0x2A +}; \ No newline at end of file diff --git a/cheat/tf2/ICvar.h b/cheat/tf2/ICvar.h new file mode 100644 index 0000000..19cb55f --- /dev/null +++ b/cheat/tf2/ICvar.h @@ -0,0 +1,201 @@ +#pragma once +#include "IAppSystem.h" +#include "util.hpp" +#include "color.hpp" + +using CVarDLLIdentifier_t = int; +class IConVar; +using FnChangeCallback_t = void( *)( IConVar *var, const char *pOldValue, float flOldValue ); +class ConCommandBase; +class ConCommand; +class ICvarQuery; + +class IConsoleDisplayFunc { +public: + virtual void ColorPrint( const uint8_t* clr, const char *pMessage ) = 0; + virtual void Print( const char *pMessage ) = 0; + virtual void DPrint( const char *pMessage ) = 0; +}; + +#define FCVAR_NONE 0 + +// Command to ConVars and ConCommands +// ConVar Systems +#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. +#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined. +#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL +#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL +#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out. + +// ConVar only +#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value +#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. +#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc +#define FCVAR_NOTIFY (1<<8) // notifies players when changed +#define FCVAR_USERINFO (1<<9) // changes the client's info string +#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats + +#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). +#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log +#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar + +// It's a ConVar that's shared between the client and the server. +// At signon, the values of all such ConVars are sent from the server to the client (skipped for local +// client, of course ) +// If a change is requested it must come from the console (i.e., no remote client changes) +// If a value is changed while a server is active, it's replicated to all connected clients +#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time +#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file +#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles +#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload +#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload + +#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server +#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread +#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox + +#define FCVAR_ACCESSIBLE_FROM_THREADS (1<<25) // used as a debugging tool necessary to check material system thread convars + +#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd. +#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue). +#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command. + + +class cvar_t { +public: + void set_value( const char* value ) { + using fn = void( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 14 )( this, value ); + } + + void set_value( float value ) { + using fn = void( __thiscall* )( void*, float ); + return util::get_vfunc< fn >( this, 15 )( this, value ); + } + + void set_value( int value ) { + using fn = void( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 16 )( this, value ); + } + + char* get_name( ) { + using fn = char*( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 5 )( this ); + } + + char* get_default( ) { + return m_default; + } + + const char* get_string( ) { + return m_string; + } + + float get_float( ) { + //return call_vfunc< float( __thiscall* )( void* ) >( this, 12 )( this ); + return m_parent->m_flvalue; + } //crash no idea why + + int get_int( ) { + using fn = int( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 13 )( this ); + } + +private: + char pad_0x0000[ 0x4 ]; //0x0000 +public: + cvar_t * m_next; //0x0004 + __int32 m_registered; //0x0008 + char* m_name; //0x000C + char* m_help_str; //0x0010 + __int32 m_flags; //0x0014 +private: + char pad_0x0018[ 0x4 ]; //0x0018 +public: + cvar_t * m_parent; //0x001C + char* m_default; //0x0020 + char* m_string; //0x0024 + __int32 m_str_len; //0x0028 + float m_flvalue; //0x002C + __int32 m_nvalue; //0x0030 + __int32 m_has_min; //0x0034 + float m_min; //0x0038 + __int32 m_hax_max; //0x003C + float m_max; //0x0040 + void* m_change_callback; //0x0044 +};//Size=0x0048 + +class ICVar : public IAppSystem +{ +public: + // Allocate a unique DLL identifier + virtual CVarDLLIdentifier_t AllocateDLLIdentifier( ) = 0; + + // Register, unregister commands + virtual void RegisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommand( ConCommandBase *pCommandBase ) = 0; + virtual void UnregisterConCommands( CVarDLLIdentifier_t id ) = 0; + + // If there is a + on the command line, this returns the value. + // Otherwise, it returns NULL. + virtual const char* GetCommandLineValue( const char *pVariableName ) = 0; + + // Try to find the cvar pointer by name + virtual ConCommandBase* FindCommandBase( const char *name ) = 0; + virtual const ConCommandBase* FindCommandBase( const char *name ) const = 0; + virtual cvar_t *FindVar( const char *var_name ) = 0; + virtual const cvar_t *FindVar( const char *var_name ) const = 0; + virtual ConCommand *FindCommand( const char *name ) = 0; + virtual const ConCommand *FindCommand( const char *name ) const = 0; + + + + // Install a global change callback (to be called when any convar changes) + virtual void InstallGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void RemoveGlobalChangeCallback( FnChangeCallback_t callback ) = 0; + virtual void CallGlobalChangeCallbacks( cvar_t *var, const char *pOldString, float flOldValue ) = 0; + + // Install a console printer + virtual void InstallConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void RemoveConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; + virtual void ConsoleColorPrintf( const clr_t& clr, const char *pFormat, ... ) const = 0; + virtual void ConsolePrintf( const char *pFormat, ... ) const = 0; + virtual void ConsoleDPrintf( const char *pFormat, ... ) const = 0; + + // Reverts cvars which contain a specific flag + virtual void RevertFlaggedConVars( int nFlag ) = 0; + + // Method allowing the engine ICvarQuery interface to take over + // A little hacky, owing to the fact the engine is loaded + // well after ICVar, so we can't use the standard connect pattern + virtual void InstallCVarQuery( ICvarQuery *pQuery ) = 0; + + + virtual void SetMaxSplitScreenSlots( int nSlots ) = 0; + virtual int GetMaxSplitScreenSlots( ) const = 0; + + virtual void AddSplitScreenConVars( ) = 0; + virtual void RemoveSplitScreenConVars( CVarDLLIdentifier_t id ) = 0; + + virtual int GetConsoleDisplayFuncCount( ) const = 0; + virtual void GetConsoleText( int nDisplayFuncIndex, char *pchText, size_t bufSize ) const = 0; + + // Utilities for convars accessed by the material system thread + virtual bool IsMaterialThreadSetAllowed( ) const = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, const char *pValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, int nValue ) = 0; + virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, float flValue ) = 0; + virtual bool HasQueuedMaterialThreadConVarSets( ) const = 0; + virtual int ProcessQueuedMaterialThreadConVarSets( ) = 0; + + class ICVarIteratorInternal + { + public: + virtual void SetFirst( ) = 0; + virtual void Next( ) = 0; + virtual bool IsValid( ) = 0; + virtual ConCommandBase *Get( ) = 0; + }; + + virtual ICVarIteratorInternal* FactoryInternalIterator( ) = 0; +}; \ No newline at end of file diff --git a/cheat/tf2/IEngineTrace.h b/cheat/tf2/IEngineTrace.h new file mode 100644 index 0000000..7fb317d --- /dev/null +++ b/cheat/tf2/IEngineTrace.h @@ -0,0 +1,268 @@ +#pragma once +#include "vector.hpp" +#include "VFunc.h" + +enum trace_type_t { + TRACE_EVERYTHING = 0, + TRACE_WORLD_ONLY, + TRACE_ENTITIES_ONLY, + TRACE_EVERYTHING_FILTER_PROPS, +}; + +enum SurfaceFlags_t { + DISPSURF_FLAG_SURFACE = ( 1 << 0 ), + DISPSURF_FLAG_WALKABLE = ( 1 << 1 ), + DISPSURF_FLAG_BUILDABLE = ( 1 << 2 ), + DISPSURF_FLAG_SURFPROP1 = ( 1 << 3 ), + DISPSURF_FLAG_SURFPROP2 = ( 1 << 4 ), +}; + +struct csurface_t { + const char *name; + short surfaceProps; + unsigned short flags; +}; + +struct cplane_t { + vec3_t normal; + float dist; + byte type; + byte signbits; + byte pad[ 2 ]; +}; + +class ITraceFilter { +public: + virtual bool ShouldHitEntity( void *pEntity, int contentsMask ) = 0; + virtual trace_type_t GetTraceType( ) const = 0; +}; + +class CTraceFilter : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) { + return !( pEntityHandle == pSkip ); + } + virtual trace_type_t GetTraceType( ) const { + return TRACE_EVERYTHING; + } + + void* pSkip; +}; + +class CTraceFilterWorldAndPropsOnly : public ITraceFilter { +public: + bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { + return false; + } + + trace_type_t GetTraceType( ) const override { + return TRACE_EVERYTHING; + } +}; + +class CTraceFilterSkipTwoEntities : public ITraceFilter { +public: + CTraceFilterSkipTwoEntities( void* pPassEnt1, void* pPassEnt2 ) + { + passentity1 = pPassEnt1; + passentity2 = pPassEnt2; + } + + virtual bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) { + return !( pEntityHandle == passentity1 || pEntityHandle == passentity2 ); + } + + virtual trace_type_t GetTraceType( ) const { + return TRACE_EVERYTHING; + } + + void* passentity1; + void* passentity2; +}; + +class __declspec( align( 16 ) )VectorAligned : public vec3_t { +public: + VectorAligned& operator=( const vec3_t &vOther ) { + x = vOther.x; + y = vOther.y; + z = vOther.z; + return *this; + } + + VectorAligned& operator=( const float &other ) { + *this = { other, other, other }; + return *this; + } + float w; +}; + +struct Ray_t { + VectorAligned m_Start; + VectorAligned m_Delta; + VectorAligned m_StartOffset; + VectorAligned m_Extents; + + bool m_IsRay; + bool m_IsSwept; + + void Init( vec3_t& start, vec3_t& end ) { + m_Delta = end - start; + + m_IsSwept = ( m_Delta.lengthsqr( ) != 0 ); + + m_Extents = 0.f; + m_IsRay = true; + + m_StartOffset = 0.f; + m_Start = start; + } + + void Init( vec3_t& start, vec3_t& end, vec3_t& mins, vec3_t& maxs ) { + m_Delta = end - start; + + m_IsSwept = ( m_Delta.lengthsqr( ) != 0 ); + + m_Extents = maxs - mins; + m_Extents *= 0.5f; + m_IsRay = ( m_Extents.lengthsqr( ) < 1e-6 ); + + m_StartOffset = mins + maxs; + m_StartOffset *= 0.5f; + m_Start = start - m_StartOffset; + m_StartOffset *= -1.0f; + } +}; + +class CBaseTrace { +public: + bool IsDispSurface( void ) { return ( ( dispFlags & DISPSURF_FLAG_SURFACE ) != 0 ); } //not in csgo + bool IsDispSurfaceWalkable( void ) { return ( ( dispFlags & DISPSURF_FLAG_WALKABLE ) != 0 ); } + bool IsDispSurfaceBuildable( void ) { return ( ( dispFlags & DISPSURF_FLAG_BUILDABLE ) != 0 ); } + bool IsDispSurfaceProp1( void ) { return ( ( dispFlags & DISPSURF_FLAG_SURFPROP1 ) != 0 ); } + bool IsDispSurfaceProp2( void ) { return ( ( dispFlags & DISPSURF_FLAG_SURFPROP2 ) != 0 ); } + +public: + vec3_t startpos; + vec3_t endpos; + cplane_t plane; + + float fraction; + + int contents; + unsigned short dispFlags; + + bool allsolid; + bool startsolid; + + CBaseTrace( ) {} + +private: + CBaseTrace( const CBaseTrace& vOther ); +}; + +class CGameTrace : public CBaseTrace { +public: + bool DidHitWorld( ) const; + + bool DidHitNonWorldEntity( ) const; + + int GetEntityIndex( ) const; + + bool DidHit( ) const { + return fraction < 1 || allsolid || startsolid; + } + +public: + float fractionleftsolid; + csurface_t surface; + + int hitgroup; + + short physicsbone; + + IClientEntity* m_pEnt; + int hitbox; + + CGameTrace( ) {} + CGameTrace( const CGameTrace& vOther ); +}; + +typedef CGameTrace trace_t; + +class IEngineTrace { +public: + void clip_ray_to_ent( const Ray_t& ray, unsigned int fMask, IClientEntity* pEnt, trace_t* pTrace ) { + return call_vfunc< void( __thiscall* )( void*, const Ray_t&, unsigned int, IClientEntity*, trace_t* ) >( this, 2 )( this, ray, fMask, pEnt, pTrace ); + } + + void trace_ray( const Ray_t& ray, unsigned int fMask, ITraceFilter* pTraceFilter, trace_t* pTrace ) { + return call_vfunc< void( __thiscall* )( void*, const Ray_t&, unsigned int, ITraceFilter*, trace_t* ) >( this, 4 )( this, ray, fMask, pTraceFilter, pTrace ); + } +}; + + +#define CONTENTS_EMPTY 0 /**< No contents. */ +#define CONTENTS_SOLID 0x1 /**< an eye is never valid in a solid . */ +#define CONTENTS_WINDOW 0x2 /**< translucent, but not watery (glass). */ +#define CONTENTS_AUX 0x4 +#define CONTENTS_GRATE 0x8 /**< alpha-tested "grate" textures. Bullets/sight pass through, but solids don't. */ +#define CONTENTS_SLIME 0x10 +#define CONTENTS_WATER 0x20 +#define CONTENTS_MIST 0x40 +#define CONTENTS_OPAQUE 0x80 /**< things that cannot be seen through (may be non-solid though). */ +#define LAST_VISIBLE_CONTENTS 0x80 +#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1)) +#define CONTENTS_TESTFOGVOLUME 0x100 +#define CONTENTS_UNUSED5 0x200 +#define CONTENTS_UNUSED6 0x4000 +#define CONTENTS_TEAM1 0x800 /**< per team contents used to differentiate collisions. */ +#define CONTENTS_TEAM2 0x1000 /**< between players and objects on different teams. */ +#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 /**< ignore CONTENTS_OPAQUE on surfaces that have SURF_NODRAW. */ +#define CONTENTS_MOVEABLE 0x4000 /**< hits entities which are MOVETYPE_PUSH (doors, plats, etc) */ +#define CONTENTS_AREAPORTAL 0x8000 /**< remaining contents are non-visible, and don't eat brushes. */ +#define CONTENTS_PLAYERCLIP 0x10000 +#define CONTENTS_MONSTERCLIP 0x20000 + +/** +* @section currents can be added to any other contents, and may be mixed +*/ +#define CONTENTS_CURRENT_0 0x40000 +#define CONTENTS_CURRENT_90 0x80000 +#define CONTENTS_CURRENT_180 0x100000 +#define CONTENTS_CURRENT_270 0x200000 +#define CONTENTS_CURRENT_UP 0x400000 +#define CONTENTS_CURRENT_DOWN 0x800000 + +/** +* @endsection +*/ + +#define CONTENTS_ORIGIN 0x1000000 /**< removed before bsping an entity. */ +#define CONTENTS_MONSTER 0x2000000 /**< should never be on a brush, only in game. */ +#define CONTENTS_DEBRIS 0x4000000 +#define CONTENTS_DETAIL 0x8000000 /**< brushes to be added after vis leafs. */ +#define CONTENTS_TRANSLUCENT 0x10000000 /**< auto set if any surface has trans. */ +#define CONTENTS_LADDER 0x20000000 +#define CONTENTS_HITBOX 0x40000000 /**< use accurate hitboxes on trace. */ + +/** +* @section Trace masks. +*/ +#define MASK_ALL (0xFFFFFFFF) +#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< everything that is normally solid */ +#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< everything that blocks player movement */ +#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< blocks npc movement */ +#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) /**< water physics in these contents */ +#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) /**< everything that blocks line of sight for AI, lighting, etc */ +#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) /**< everything that blocks line of sight for AI, lighting, etc, but with monsters added. */ +#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) /**< everything that blocks line of sight for players */ +#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) /**< everything that blocks line of sight for players, but with monsters added. */ +#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) /**< bullets see these as solid */ +#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) /**< non-raycasted weapons see this as solid (includes grates) */ +#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW) /**< hits solids (not grates) and passes through everything else */ +#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) /**< everything normally solid, except monsters (world+brush only) */ +#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) /**< everything normally solid for player movement, except monsters (world+brush only) */ +#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) /**< everything normally solid for npc movement, except monsters (world+brush only) */ +#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) /**< just the world, used for route rebuilding */ +#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) /**< These are things that can split areaportals */ +#define MASK_AIM ( 0x200400B | CONTENTS_HITBOX ) //this fixes the aimbot not shooting through shit like invis gates diff --git a/cheat/tf2/IEngineVGui.h b/cheat/tf2/IEngineVGui.h new file mode 100644 index 0000000..091c565 --- /dev/null +++ b/cheat/tf2/IEngineVGui.h @@ -0,0 +1,26 @@ +#pragma once + +enum VGuiPanel_t { + PANEL_ROOT = 0, + PANEL_GAMEUIDLL, + PANEL_CLIENTDLL, + PANEL_TOOLS, + PANEL_INGAMESCREENS, + PANEL_GAMEDLL, + PANEL_CLIENTDLL_TOOLS +}; + +enum PaintMode_t { + PAINT_UIPANELS = ( 1 << 0 ), + PAINT_INGAMEPANELS = ( 1 << 1 ), + PAINT_CURSOR = ( 1 << 2 ), // software cursor, if appropriate +}; + +class IEngineVGui { +public: + virtual ~IEngineVGui( void ) { } + + virtual unsigned int GetPanel( VGuiPanel_t type ) = 0; + + virtual bool IsGameUIVisible( ) = 0; +}; \ No newline at end of file diff --git a/cheat/tf2/IGameEventManager.h b/cheat/tf2/IGameEventManager.h new file mode 100644 index 0000000..f2e7c25 --- /dev/null +++ b/cheat/tf2/IGameEventManager.h @@ -0,0 +1,77 @@ +#pragma once +#include "util.hpp" + +class IGameEvent +{ +public: + const char* GetName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + int GetInt( const char* szKeyName, int nDefault = 0 ) { + return util::get_vfunc< 6, int >( this, szKeyName, nDefault ); + } + + float GetFloat( const char* name, float default_ = 0 ) { + return util::get_vfunc< 8, float >( this, name, default_ ); + } + + const char* GetString( const char* szKeyName ) { + return util::get_vfunc< 9, const char* >( this, szKeyName, 0 ); + } + + void SetString( const char* szKeyName, const char* szValue ) { + return util::get_vfunc< 16, void >( this, szKeyName, szValue ); + } +}; + +class IGameEventListener2 { +public: + virtual ~IGameEventListener2( void ) {}; + + // FireEvent is called by EventManager if event just occured + // KeyValue memory will be freed by manager if not needed anymore + virtual void FireGameEvent( IGameEvent* event ) = 0; + + virtual int GetEventDebugID( void ) = 0; +}; + +class IGameEventManager2 { +public: + virtual ~IGameEventManager2( void ) {}; + + // load game event descriptions from a file eg "resource\gameevents.res" + virtual int LoadEventsFromFile( const char* filename ) = 0; + + // removes all and anything + virtual void Reset( ) = 0; + + // adds a listener for a particular event + virtual bool AddListener( IGameEventListener2* listener, const char* name, bool bServerSide ) = 0; + + // returns true if this listener is listens to given event + virtual bool FindListener( IGameEventListener2* listener, const char* name ) = 0; + + // removes a listener + virtual void RemoveListener( IGameEventListener2* listener ) = 0; + + // create an event by name, but doesn't fire it. returns NULL is event is not + // known or no listener is registered for it. bForce forces the creation even if no listener is active + virtual IGameEvent* CreateEvent( const char* name, bool bForce = false, int* pCookie = nullptr ) = 0; + + // fires a server event created earlier, if bDontBroadcast is set, event is not send to clients + virtual bool FireEvent( IGameEvent* event, bool bDontBroadcast = false ) = 0; + + // fires an event for the local client only, should be used only by client code + virtual bool FireEventClientSide( IGameEvent* event ) = 0; + + // create a new copy of this event, must be free later + virtual IGameEvent* DuplicateEvent( IGameEvent* event ) = 0; + + // if an event was created but not fired for some reason, it has to bee freed, same UnserializeEvent + virtual void FreeEvent( IGameEvent* event ) = 0; + + // write/read event to/from bitbuffer + virtual bool SerializeEvent( IGameEvent* event, int* buf ) = 0; + virtual IGameEvent* UnserializeEvent( void* buf ) = 0; // create new KeyValues, must be deleted +}; \ No newline at end of file diff --git a/cheat/tf2/IGameMovement.h b/cheat/tf2/IGameMovement.h new file mode 100644 index 0000000..26b5244 --- /dev/null +++ b/cheat/tf2/IGameMovement.h @@ -0,0 +1,118 @@ +#pragma once +#pragma once + +#include "vector.hpp" + +using CBaseEntity = uintptr_t; +class CUserCmd; + +typedef int EntityHandle_t, soundlevel_t; +class CGameTrace; + +typedef CGameTrace trace_t; + +#define MAX_CLIMB_SPEED 200.0 + +class CMoveData +{ +public: + bool m_bFirstRunOfFunctions : 1; + bool m_bGameCodeMovedPlayer : 1; + + EntityHandle_t m_nPlayerHandle; + + int m_nImpulseCommand; + vec3_t m_vecViewAngles; + vec3_t m_vecAbsViewAngles; + int m_nButtons; + int m_nOldButtons; + float m_flForwardMove; + float m_flSideMove; + float m_flUpMove; + + float m_flMaxSpeed; + float m_flClientMaxSpeed; + + vec3_t m_vecVelocity; + vec3_t m_vecAngles; + vec3_t m_vecOldAngles; + float m_outStepHeight; + vec3_t m_outWishVel; + vec3_t m_outJumpVel; + + vec3_t m_vecConstraintCenter; + float m_flConstraintRadius; + float m_flConstraintWidth; + float m_flConstraintSpeedFactor; + + vec3_t m_vecAbsOrigin; +}; + +class IGameMovement +{ +public: + virtual ~IGameMovement( void ) {} + virtual void ProcessMovement( CBaseEntity *pPlayer, CMoveData *pMove ) = 0; + virtual void StartTrackPredictionErrors( CBaseEntity *pPlayer ) = 0; + virtual void FinishTrackPredictionErrors( CBaseEntity *pPlayer ) = 0; + virtual void DiffPrint( char const *fmt, ... ) = 0; + virtual vec3_t GetPlayerMins( bool ducked ) const = 0; + virtual vec3_t GetPlayerMaxs( bool ducked ) const = 0; + virtual vec3_t GetPlayerViewOffset( bool ducked ) const = 0; +}; + +class IMoveHelper +{ +public: + virtual char const* GetName( EntityHandle_t handle ) const = 0; + virtual void ResetTouchList( void ) = 0; + virtual bool AddToTouched( const CGameTrace& tr, const vec3_t& impactvelocity ) = 0; + virtual void ProcessImpacts( void ) = 0; + virtual void Con_NPrintf( int idx, char const* fmt, ... ) = 0; + virtual void StartSound( const vec3_t& origin, int channel, char const* sample, float volume, soundlevel_t soundlevel, int fFlags, int pitch ) = 0; + virtual void StartSound( const vec3_t& origin, const char *soundname ) = 0; + virtual void PlaybackEventFull( int flags, int clientindex, unsigned short eventindex, float delay, vec3_t& origin, vec3_t& angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ) = 0; + virtual bool PlayerFallingDamage( void ) = 0; + virtual void PlayerSetAnimation( int playerAnim ) = 0; + + virtual void *GetSurfaceProps( void ) = 0; + + virtual bool IsWorldEntity( const uintptr_t &handle ) = 0; + +protected: + virtual ~IMoveHelper( ) {} +}; + +class IPrediction +{ +public: + virtual ~IPrediction( void ) {}; + + virtual void Init( void ) = 0; + virtual void Shutdown( void ) = 0; + + // Run prediction + virtual void Update + ( + int startframe, // World update ( un-modded ) most recently received + bool validframe, // Is frame data valid + int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) + int outgoing_command // Last command (most recent) sent to server (un-modded) + ) = 0; + + // We are about to get a network update from the server. We know the update #, so we can pull any + // data purely predicted on the client side and transfer it to the new from data state. + virtual void PreEntityPacketReceived( int commands_acknowledged, int current_world_update_packet ) = 0; + virtual void PostEntityPacketReceived( void ) = 0; + virtual void PostNetworkDataReceived( int commands_acknowledged ) = 0; + + virtual void OnReceivedUncompressedPacket( void ) = 0; + + // The engine needs to be able to access a few predicted values + virtual void GetViewOrigin( vec3_t& org ) = 0; + virtual void SetViewOrigin( vec3_t& org ) = 0; + virtual void GetViewAngles( vec3_t& ang ) = 0; + virtual void SetViewAngles( vec3_t& ang ) = 0; + virtual void GetLocalViewAngles( vec3_t& ang ) = 0; + virtual void SetLocalViewAngles( vec3_t& ang ) = 0; +}; \ No newline at end of file diff --git a/cheat/tf2/IInputSystem.h b/cheat/tf2/IInputSystem.h new file mode 100644 index 0000000..10f8168 --- /dev/null +++ b/cheat/tf2/IInputSystem.h @@ -0,0 +1,163 @@ +#pragma once +#include "VFunc.h" +#include "IAppSystem.h" +#include "ButtonCode_t.h" + +class IInputSystem : public IAppSystem +{ +public: + // Attach, detach input system from a particular window + // This window should be the root window for the application + // Only 1 window should be attached at any given time. + virtual void AttachToWindow( void* hWnd ) = 0; + virtual void DetachFromWindow( ) = 0; + + // Enables/disables input. PollInputState will not update current + // button/analog states when it is called if the system is disabled. + virtual void EnableInput( bool bEnable ) = 0; + + // Enables/disables the windows message pump. PollInputState will not + // Peek/Dispatch messages if this is disabled + virtual void EnableMessagePump( bool bEnable ) = 0; + + // Polls the current input state + virtual void PollInputState( ) = 0; + + // Gets the time of the last polling in ms + virtual int GetPollTick( ) const = 0; + + // Is a button down? "Buttons" are binary-state input devices (mouse buttons, keyboard keys) + virtual bool IsButtonDown( ButtonCode_t code ) const = 0; + + // Returns the tick at which the button was pressed and released + virtual int GetButtonPressedTick( ButtonCode_t code ) const = 0; + virtual int GetButtonReleasedTick( ButtonCode_t code ) const = 0; + + // Gets the value of an analog input device this frame + // Includes joysticks, mousewheel, mouse + virtual int GetAnalogValue( AnalogCode_t code ) const = 0; + + // Gets the change in a particular analog input device this frame + // Includes joysticks, mousewheel, mouse + virtual int GetAnalogDelta( AnalogCode_t code ) const = 0; + + // Returns the input events since the last poll + virtual int GetEventCount( ) const = 0; + virtual const InputEvent_t* GetEventData( ) const = 0; + +private: + //22 CInputSystem::MotionControllerActive(void)const + virtual void __pad22( ) = 0; + //23 CInputSystem::GetMotionControllerOrientation(void)const + virtual void __pad23( ) = 0; + //24 CInputSystem::GetMotionControllerPosX(void)const + virtual void __pad24( ) = 0; + //25 CInputSystem::GetMotionControllerPosY(void)const + virtual void __pad25( ) = 0; + //26 CInputSystem::GetMotionControllerDeviceStatus(void)const + virtual void __pad26( ) = 0; + //27 CInputSystem::GetMotionControllerDeviceStatusFlags(void)const + virtual void __pad27( ) = 0; + //28 CInputSystem::SetMotionControllerDeviceStatus(int) + virtual void __pad28( ) = 0; + //29 CInputSystem::SetMotionControllerCalibrationInvalid(void) + virtual void __pad29( ) = 0; + //30 CInputSystem::StepMotionControllerCalibration(void) + virtual void __pad30( ) = 0; + //31 CInputSystem::ResetMotionControllerScreenCalibration(void) + virtual void __pad31( ) = 0; + +public: + // Posts a user-defined event into the event queue; this is expected + // to be called in overridden wndprocs connected to the root panel. + virtual void PostUserEvent( const InputEvent_t &event ) = 0; + + // Returns the number of joysticks + virtual int GetJoystickCount( ) const = 0; + + // Enable/disable joystick, it has perf costs + virtual void EnableJoystickInput( int nJoystick, bool bEnable ) = 0; + + // Enable/disable diagonal joystick POV (simultaneous POV buttons down) + virtual void EnableJoystickDiagonalPOV( int nJoystick, bool bEnable ) = 0; + + // Sample the joystick and append events to the input queue + virtual void SampleDevices( ) = 0; + + // FIXME: Currently force-feedback is only supported on the Xbox 360 + virtual void SetRumble( float fLeftMotor, float fRightMotor, int userId = -1 ) = 0; + virtual void StopRumble( ) = 0; + + // Resets the input state + virtual void ResetInputState( ) = 0; + + // Convert back + forth between ButtonCode/AnalogCode + strings + virtual const char *ButtonCodeToString( ButtonCode_t code ) const = 0; + virtual const char *AnalogCodeToString( AnalogCode_t code ) const = 0; + virtual ButtonCode_t StringToButtonCode( const char *pString ) const = 0; + virtual AnalogCode_t StringToAnalogCode( const char *pString ) const = 0; + + // Sleeps until input happens. Pass a negative number to sleep infinitely + virtual void SleepUntilInput( int nMaxSleepTimeMS = -1 ) = 0; + + // Convert back + forth between virtual codes + button codes + // FIXME: This is a temporary piece of code + virtual ButtonCode_t VirtualKeyToButtonCode( int nVirtualKey ) const = 0; + virtual int ButtonCodeToVirtualKey( ButtonCode_t code ) const = 0; + virtual ButtonCode_t ScanCodeToButtonCode( int lParam ) const = 0; + + // How many times have we called PollInputState? + virtual int GetPollCount( ) const = 0; + + // Sets the cursor position + virtual void SetCursorPosition( int x, int y ) = 0; + + // Tells the input system to generate UI-related events, defined + // in inputsystem/inputenums.h (see IE_FirstUIEvent) + // We could have multiple clients that care about UI-related events + // so we refcount the clients with an Add/Remove strategy. If there + // are no interested clients, the UI events are not generated + virtual void AddUIEventListener( ) = 0; + virtual void RemoveUIEventListener( ) = 0; + + // Returns the currently attached window + virtual PlatWindow_t GetAttachedWindow( ) const = 0; + + // Creates a cursor using one of the well-known cursor icons + virtual InputCursorHandle_t GetStandardCursor( InputStandardCursor_t id ) = 0; + + // Loads a cursor defined in a file + virtual InputCursorHandle_t LoadCursorFromFile( const char *pFileName, const char *pPathID = NULL ) = 0; + + // Sets the cursor icon + virtual void SetCursorIcon( InputCursorHandle_t hCursor ) = 0; + + // Gets the cursor position + virtual void GetCursorPosition( int *pX, int *pY ) = 0; + + // Mouse capture + virtual void EnableMouseCapture( PlatWindow_t hWnd ) = 0; + virtual void DisableMouseCapture( ) = 0; + + virtual void SetMouseCursorVisible( bool bVisible ) = 0; + + virtual void DisableHardwareCursor( ) = 0; + virtual void EnableHardwareCursor( ) = 0; + virtual void ResetCursorIcon( ) = 0; + virtual bool GetRawMouseAccumulators( int& accumX, int& accumY ) = 0; + + /*64 CInputSystem::GetConnectedInputDevices(void) + 65 CInputSystem::IsInputDeviceConnected(InputDevice_t) + 66 CInputSystem::SetInputDeviceConnected(InputDevice_t,bool) + 67 CInputSystem::IsOnlySingleDeviceConnected(void) + 68 CInputSystem::GetCurrentInputDevice(void) + 69 CInputSystem::IsDeviceReadingInput(InputDevice_t)const + 70 CInputSystem::SetCurrentInputDevice(InputDevice_t) + 71 CInputSystem::ResetCurrentInputDevice(void) + 72 CInputSystem::SampleInputToFindCurrentDevice(bool) + 73 CInputSystem::IsSamplingForCurrentDevice(void) + 74 CInputSystem::IsSteamControllerActive(void)const + 75 CInputSystem::SetSteamControllerMode(char const*,void const*) + 76 CInputSystem::~CInputSystem() + 77 CInputSystem::~CInputSystem()*/ +}; \ No newline at end of file diff --git a/cheat/tf2/IMaterialSystem.hpp b/cheat/tf2/IMaterialSystem.hpp new file mode 100644 index 0000000..a8a6a9e --- /dev/null +++ b/cheat/tf2/IMaterialSystem.hpp @@ -0,0 +1,222 @@ +#pragma once +#include "util.hpp" +#include "ISurface.h" + +using MaterialHandle_t = unsigned short; + +enum MaterialVarFlags_t { + MATERIAL_VAR_DEBUG = 1 << 0, + MATERIAL_VAR_NO_DEBUG_OVERRIDE = 1 << 1, + MATERIAL_VAR_NO_DRAW = 1 << 2, + MATERIAL_VAR_USE_IN_FILLRATE_MODE = 1 << 3, + MATERIAL_VAR_VERTEXCOLOR = 1 << 4, + MATERIAL_VAR_VERTEXALPHA = 1 << 5, + MATERIAL_VAR_SELFILLUM = 1 << 6, + MATERIAL_VAR_ADDITIVE = 1 << 7, + MATERIAL_VAR_ALPHATEST = 1 << 8, + MATERIAL_VAR_MULTIPASS = 1 << 9, + MATERIAL_VAR_ZNEARER = 1 << 10, + MATERIAL_VAR_MODEL = 1 << 11, + MATERIAL_VAR_FLAT = 1 << 12, + MATERIAL_VAR_NOCULL = 1 << 13, + MATERIAL_VAR_NOFOG = 1 << 14, + MATERIAL_VAR_IGNOREZ = 1 << 15, + MATERIAL_VAR_DECAL = 1 << 16, + MATERIAL_VAR_ENVMAPSPHERE = 1 << 17, + MATERIAL_VAR_NOALPHAMOD = 1 << 18, + MATERIAL_VAR_ENVMAPCAMERASPACE = 1 << 19, + MATERIAL_VAR_BASEALPHAENVMAPMASK = 1 << 20, + MATERIAL_VAR_TRANSLUCENT = 1 << 21, + MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK = 1 << 22, + MATERIAL_VAR_NEEDS_SOFTWARE_SKINNING = 1 << 23, + MATERIAL_VAR_OPAQUETEXTURE = 1 << 24, + MATERIAL_VAR_ENVMAPMODE = 1 << 25, + MATERIAL_VAR_SUPPRESS_DECALS = 1 << 26, + MATERIAL_VAR_HALFLAMBERT = 1 << 27, + MATERIAL_VAR_WIREFRAME = 1 << 28, +}; + +class ITexture { +public: + int GetActualWidth( ) { + return util::get_vfunc< 3, int >( this ); + } + + int GetActualHeight( ) { + return util::get_vfunc< 4, int >( this ); + } +}; + +struct MaterialVideoMode_t { + int m_width; + int m_height; + int m_format; + int m_hz; +}; + +struct IMaterialSystem_Config_t { + MaterialVideoMode_t m_vid_mode; + float m_monitor_gamma; + float m_monitor_max; + float m_monitor_min; + float m_monitor_exp; + bool m_gamma_enabled; + bool m_triple_buffer; + int m_aa_samples; + int m_force_anisotropic_level; + int m_skip_mip_levels; + int m_dx_level; + int m_flags; + bool m_edit_mode; + char m_proxy_test_mode; + bool m_compressed_textures; + bool m_filter_lightmaps; + bool m_filter_textures; + bool m_reverse_depth; + bool m_buffer_primitives; + bool m_draw_flat; + bool m_measure_fillrate; + bool m_visualize_fillrate; + bool m_no_transperacy; + bool m_software_lighting; + bool m_allow_cheats; + char m_show_mipmap; + bool m_low_res; + bool m_normal_mapping; + bool m_mipmap_textures; + char m_fullbright; + bool m_fast_nobumd; + bool m_supress_rendering; + bool m_drawgray; + bool m_show_specular; + bool m_show_diffuse; + int m_winsize_widthlimit; + int m_winsize_heightlimit; + int m_aa_quality; + bool m_shadow_depth_texture; + bool m_motion_blur; + bool m_flashlight; + bool m_paint_enabled; + char pad[ 0xC ]; +}; + +class IMaterial { + char pad[ 0x1C ]; +public: + int m_ref_count; + + auto GetName( ) { + return util::get_vfunc< 0, const char* >( this ); + } + + auto GetTextureGroupName( ) { + return util::get_vfunc< 1, const char* >( this ); + } + + void IncrementReferenceCount( ) { + return util::get_vfunc< 12, void >( this ); + } + + void DecrementReferenceCount( ) { + return util::get_vfunc< 13, void >( this ); + } + + void AlphaModulate( float alpha ) { + return util::get_vfunc< 27, void >( this, alpha ); + } + + void ColorModulate( float r, float g, float b ) { + return util::get_vfunc< 28, void >( this, r, g, b ); + } + + void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ) { + return util::get_vfunc< 29, void >( this, flag, on ); + } + + bool GetMaterialVarFlag( MaterialVarFlags_t flag ) { + return util::get_vfunc< 30, bool >( this, flag ); + } + + auto GetAlphaModulation( ) { + return util::get_vfunc< 44, float >( this ); + } + + void GetColorModulate( float* r, float* g, float* b ) { + return util::get_vfunc< 45, void >( this, r, g, b ); + } + + void Refresh( ) { + return util::get_vfunc< 37, void >( this ); + } +}; + +class IMaterialSystem +{ +public: + enum RenderTargetSizeMode_t { + RT_SIZE_NO_CHANGE = 0, // Only allowed for render targets that don't want a depth buffer + // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer). + RT_SIZE_DEFAULT = 1, // Don't play with the specified width and height other than making sure it fits in the framebuffer. + RT_SIZE_PICMIP = 2, // Apply picmip to the render target's width and height. + RT_SIZE_HDR = 3, // frame_buffer_width / 4 + RT_SIZE_FULL_FRAME_BUFFER = 4, // Same size as frame buffer, or next lower power of 2 if we can't do that. + RT_SIZE_OFFSCREEN = 5, // Target of specified size, don't mess with dimensions + RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP = 6 // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. + }; + + enum MaterialRenderTargetDepth_t { + MATERIAL_RT_DEPTH_SHARED = 0x0, + MATERIAL_RT_DEPTH_SEPARATE = 0x1, + MATERIAL_RT_DEPTH_NONE = 0x2, + MATERIAL_RT_DEPTH_ONLY = 0x3, + }; + + ImageFormat GetBackBufferFormat( ) { + return util::get_vfunc< 36, ImageFormat >( this ); + } + + IMaterial* CreateMaterial( const char* pMaterialName, void* pVMTKeyValues ) { + return util::get_vfunc< 70, IMaterial* >( this, pMaterialName, pVMTKeyValues ); + } + + IMaterial* FindMaterial( const char* pMaterialName, const char* pTextureGroupName = "Model textures", bool complain = true, const char* pComplainPrefix = nullptr ) { + return util::get_vfunc< 84, IMaterial* >( this, pMaterialName, pTextureGroupName, complain, pComplainPrefix ); + } + + MaterialHandle_t FirstMaterial( ) { + return util::get_vfunc< 86, MaterialHandle_t >( this ); + } + + MaterialHandle_t NextMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 87, MaterialHandle_t >( this, h ); + } + + MaterialHandle_t InvalidMaterial( ) { + return util::get_vfunc< 88, MaterialHandle_t >( this ); + } + + IMaterial* GetMaterial( MaterialHandle_t h ) { + return util::get_vfunc< 89, IMaterial* >( this, h ); + } + + void BeginRenderTargetAllocation( ) { + return util::get_vfunc< 94, void >( this ); + } + + void EndRenderTargetAllocation( ) { + return util::get_vfunc< 95, void >( this ); + } + + ITexture* CreateNamedRenderTargetTextureEx( const char* name, int w, int h, RenderTargetSizeMode_t sizeMode, + ImageFormat format, MaterialRenderTargetDepth_t depth ) + { + const int textureFlags = 0x4 | 0x8; //TEXTUREFLAGS_CLAMPS, TEXTUREFLAGS_CLAMPT + const int renderTargetFlags = 0x1; //CREATERENDERTARGETFLAGS_HDR + return util::get_vfunc< 97, ITexture* >( this, name, w, h, sizeMode, format, depth, textureFlags, renderTargetFlags ); + } + + /*void* GetRenderContext( ) { + typedef IMatRenderContext*( __thiscall* GetRenderContextFn )( void* ); + return CallVFunction( this, 115 )( this ); + }*/ +}; \ No newline at end of file diff --git a/cheat/tf2/IPanel.h b/cheat/tf2/IPanel.h new file mode 100644 index 0000000..5252642 --- /dev/null +++ b/cheat/tf2/IPanel.h @@ -0,0 +1,13 @@ +#pragma once + +class IPanel { +public: + const char* GetName( int iPanel ) { + return call_vfunc< const char*( __thiscall* )( void*, int ) >( this, 36 )( this, iPanel ); + } + + void SetMouseInputEnabled( unsigned int iPanel, bool state ) { + return call_vfunc< void( __thiscall* )( void*, unsigned int, bool ) >( this, 32 )( this, iPanel, state ); + } + +}; \ No newline at end of file diff --git a/cheat/tf2/IPlayerInfoManager.h b/cheat/tf2/IPlayerInfoManager.h new file mode 100644 index 0000000..13406b1 --- /dev/null +++ b/cheat/tf2/IPlayerInfoManager.h @@ -0,0 +1,7 @@ +#pragma once +#include "CGlobalVarsBase.h" +class IPlayerInfoManager { +public: + virtual void pad_000( ) = 0; + virtual CGlobalVarsBase* GetGlobalVars( ) = 0; +}; \ No newline at end of file diff --git a/cheat/tf2/ISurface.h b/cheat/tf2/ISurface.h new file mode 100644 index 0000000..3dbff15 --- /dev/null +++ b/cheat/tf2/ISurface.h @@ -0,0 +1,223 @@ +#pragma once +#include "VFunc.h" +#include "vector.hpp" +#include "color.hpp" + +enum FontDrawType_t { + FONT_DRAW_DEFAULT = 0, + FONT_DRAW_NONADDITIVE, + FONT_DRAW_ADDITIVE, + FONT_DRAW_TYPE_COUNT = 2, +}; + +enum FontFlags_t { + FONTFLAG_NONE, + FONTFLAG_ITALIC = 0x001, + FONTFLAG_UNDERLINE = 0x002, + FONTFLAG_STRIKEOUT = 0x004, + FONTFLAG_SYMBOL = 0x008, + FONTFLAG_ANTIALIAS = 0x010, + FONTFLAG_GAUSSIANBLUR = 0x020, + FONTFLAG_ROTARY = 0x040, + FONTFLAG_DROPSHADOW = 0x080, + FONTFLAG_ADDITIVE = 0x100, + FONTFLAG_OUTLINE = 0x200, + FONTFLAG_CUSTOM = 0x400, + FONTFLAG_BITMAP = 0x800, +}; + +enum ImageFormat { + IMAGE_FORMAT_UNKNOWN = -1, + IMAGE_FORMAT_RGBA8888 = 0, + IMAGE_FORMAT_ABGR8888, + IMAGE_FORMAT_RGB888, + IMAGE_FORMAT_BGR888, + IMAGE_FORMAT_RGB565, + IMAGE_FORMAT_I8, + IMAGE_FORMAT_IA88, + IMAGE_FORMAT_P8, + IMAGE_FORMAT_A8, + IMAGE_FORMAT_RGB888_BLUESCREEN, + IMAGE_FORMAT_BGR888_BLUESCREEN, + IMAGE_FORMAT_ARGB8888, + IMAGE_FORMAT_BGRA8888, + IMAGE_FORMAT_DXT1, + IMAGE_FORMAT_DXT3, + IMAGE_FORMAT_DXT5, + IMAGE_FORMAT_BGRX8888, + IMAGE_FORMAT_BGR565, + IMAGE_FORMAT_BGRX5551, + IMAGE_FORMAT_BGRA4444, + IMAGE_FORMAT_DXT1_ONEBITALPHA, + IMAGE_FORMAT_BGRA5551, + IMAGE_FORMAT_UV88, + IMAGE_FORMAT_UVWQ8888, + IMAGE_FORMAT_RGBA16161616F, + IMAGE_FORMAT_RGBA16161616, + IMAGE_FORMAT_UVLX8888, + IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point + IMAGE_FORMAT_RGB323232F, + IMAGE_FORMAT_RGBA32323232F, + + // Depth-stencil texture formats for shadow depth mapping + IMAGE_FORMAT_NV_DST16, // + IMAGE_FORMAT_NV_DST24, // + IMAGE_FORMAT_NV_INTZ, // Vendor-specific depth-stencil texture + IMAGE_FORMAT_NV_RAWZ, // formats for shadow depth mapping + IMAGE_FORMAT_ATI_DST16, // + IMAGE_FORMAT_ATI_DST24, // + IMAGE_FORMAT_NV_NULL, // Dummy format which takes no video memory + + // Compressed normal map formats + IMAGE_FORMAT_ATI2N, // One-surface ATI2N / DXN format + IMAGE_FORMAT_ATI1N, // Two-surface ATI1N format + + NUM_IMAGE_FORMATS +}; + +struct vertex_t { + vertex_t( ) {} + + vertex_t( const vec2_t& pos, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = pos; + m_tex_coord = coord; + } + + void init( float x, float y, const vec2_t& coord = vec2_t( 0, 0 ) ) { + m_position = vec2_t( x, y ); + m_tex_coord = coord; + } + + vec2_t m_position; + vec2_t m_tex_coord; +}; + +using HFont = unsigned long; +using VPANEL = unsigned long; +class IntRect; +class IHTMLEvents; +class IHTML; +using HCursor = unsigned long; +using HTexture = unsigned long; +class CharRenderInfo; +class IVguiMatInfo; +class IImage; +class DrawTexturedRectParms_t; +class IHTMLChromeController; + +enum GradientType_t { + GRADIENT_HORIZONTAL = 0, + GRADIENT_VERTICAL = 1 +}; + +class ISurface { +public: + void DrawSetColor( clr_t clr ) { + return call_vfunc< void( __thiscall* )( void*, int , int , int, int ) >( this, 11 )( this, clr.r( ), clr.g( ), clr.b( ), clr.a( ) ); + } + + void DrawFilledRect( int x, int y, int w, int h ) { + return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 12 )( this, x, y, w, h ); + } + + void DrawOutlinedRect( int x, int y, int w, int h ) { + return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 14 )( this, x, y, w, h ); + } + + void DrawLine( int x0, int y0, int x1, int y1 ) { + return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 15 )( this, x0, y0, x1, y1 ); + } + + void DrawPolyLine( int* x, int* y, int n ) { + return call_vfunc< void( __thiscall* )( void*, int*, int*, int ) >( this, 16 )( this, x, y, n ); + } + + void DrawSetTextFont( unsigned long index ) { + return call_vfunc< void( __thiscall* )( void*, unsigned long ) >( this, 17 )( this, index ); + } + + void DrawSetTextColor( clr_t clr ) { + return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 19 )( this, clr.r( ), clr.g( ), clr.b( ), clr.a( ) ); + } + + void DrawSetTextPos( int x, int y ) { + return call_vfunc< void( __thiscall* )( void*, int, int ) >( this, 20 )( this, x, y ); + } + + void DrawPrintText( const wchar_t* text, int length, FontDrawType_t drawtype = FontDrawType_t::FONT_DRAW_DEFAULT ) { + return call_vfunc< void( __thiscall* )( void*, const wchar_t*, int, FontDrawType_t ) >( this, 22 )( this, text, length, drawtype ); + } + + void DrawSetTextureRGBA( int id, const unsigned char* rgba, int w, int h ) { + return call_vfunc< void( __thiscall* )( void*, int, const unsigned char*, int, int, int, bool ) >( this, 31 )( this, id, rgba, w, h, 0, true ); + } + + void DrawSetTexture( int id ) { + return call_vfunc< void( __thiscall* )( void*, int ) >( this, 32 )( this, id ); + } + + int CreateNewTextureID( bool procedural ) { + return call_vfunc< int( __thiscall* )( void*, bool ) >( this, 37 )( this, procedural ); + } + + void SetCursorAlwaysVis( bool vis ) { + return call_vfunc< void( __thiscall* )( void*, bool ) >( this, 52 )( this, vis ); + } + + unsigned long CreateFnt( ) { + return call_vfunc< unsigned long( __thiscall* )( void* ) >( this, 66 )( this ); + } + + void UnlockCursor( ) { + return call_vfunc< void( __thiscall* )( void* ) >( this, 61 )( this ); + } + + void LockCursor( ) { + return call_vfunc< void( __thiscall* )( void* ) >( this, 62 )( this ); + } + + void SetFontGlyphSet( unsigned long font, const char* windowsFontName, int tall, int weight, int blur, int scanlines, int flags, int nRangeMin = 0, int nRangeMax = 0 ) { + return call_vfunc< void( __thiscall* )( void*, unsigned long, const char*, int, int, int, int, int, int, int ) >( this, 67 )( this, font, windowsFontName, tall, weight, blur, scanlines, flags, nRangeMin, nRangeMax ); + } + + void GetTextSize( unsigned long font, const wchar_t* text, int& wide, int& tall ) { + return call_vfunc< void( __thiscall* )( void*, unsigned long, const wchar_t*, int&, int& ) >( this, 75 )( this, font, text, wide, tall ); + } + + void play_sound( const char* fileName ) { + return call_vfunc< void( __thiscall* )( void*, const char* ) >( this, 82 )( this, fileName ); + } + + void GetCursorPosition( int &x, int &y ) { + return call_vfunc< void( __thiscall* )( void*, int&, int& ) >( this, 96 )( this, x, y ); + } + + void DrawOutlinedCircle( int x, int y, int radius, int segments ) { + return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 99 )( this, x, y, radius, segments ); + } + + void DrawTexturedPolygon( int n, vertex_t* pVertice, bool bClipVertices = true ) { + return call_vfunc< void( __thiscall* )( void*, int, vertex_t*, bool ) >( this, 102 )( this, n, pVertice, bClipVertices ); + } + + void DrawGradient( int x, int y, int w, int h, clr_t first, clr_t second, GradientType_t type ) + { + clr_t present_draw_clr = { }; + + auto draw_filled_rect_gradient = [ & ]( bool reversed ) -> void { + call_vfunc< void( __thiscall* )( void*, int, int, int, int, unsigned, unsigned, bool ) >( this, 118 ) + ( this, x, y, w, h, reversed ? 255 : 0, reversed ? 0 : 255, type == GRADIENT_HORIZONTAL ); + }; + + DrawSetColor( clr_t::blend( first, second, 0.5f ) ); + DrawFilledRect( x, y, w, h ); + + DrawSetColor( first ); + present_draw_clr = first; + draw_filled_rect_gradient( true ); + + DrawSetColor( second ); + present_draw_clr = second; + draw_filled_rect_gradient( false ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/IVDebugOverlay.h b/cheat/tf2/IVDebugOverlay.h new file mode 100644 index 0000000..664b356 --- /dev/null +++ b/cheat/tf2/IVDebugOverlay.h @@ -0,0 +1,10 @@ +#pragma once +#include "VFunc.h" + +class vec3_t; +class IVDebugOverlay { +public: + int ScreenPosition( const vec3_t& point, vec3_t& screen ) { + return call_vfunc< int( __thiscall* )( void*, const vec3_t&, vec3_t& ) >( this, 10 )( this, point, screen ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/IVEngineClient.h b/cheat/tf2/IVEngineClient.h new file mode 100644 index 0000000..a45e839 --- /dev/null +++ b/cheat/tf2/IVEngineClient.h @@ -0,0 +1,192 @@ +#pragma once +#include "VFunc.h" + +typedef float matrix3x4[ 3 ][ 4 ]; +typedef struct player_info_s { + char name[ 32 ]; + int userID; + char guid[ 33 ]; + unsigned long friendsID; + char friendsName[ 32 ]; + bool fakeplayer; + bool ishltv; + unsigned long customFiles[ 4 ]; + byte filesDownloaded; +} player_info_t; + +class INetChannelInfo +{ +public: + + enum + { + GENERIC = 0, // must be first and is default group + LOCALPLAYER, // bytes for local player entity update + OTHERPLAYERS, // bytes for other players update + ENTITIES, // all other entity bytes + SOUNDS, // game sounds + EVENTS, // event messages + USERMESSAGES, // user messages + ENTMESSAGES, // entity messages + VOICE, // voice data + STRINGTABLE, // a stringtable update + MOVE, // client move cmds + STRINGCMD, // string command + SIGNON, // various signondata + TOTAL, // must be last and is not a real group + }; + + virtual const char *GetName( void ) const = 0; // get channel name + virtual const char *GetAddress( void ) const = 0; // get channel IP address as string + virtual float GetTime( void ) const = 0; // current net time + virtual float GetTimeConnected( void ) const = 0; // get connection time in seconds + virtual int GetBufferSize( void ) const = 0; // netchannel packet history size + virtual int GetDataRate( void ) const = 0; // send data rate in byte/sec + + virtual bool IsLoopback( void ) const = 0; // true if loopback channel + virtual bool IsTimingOut( void ) const = 0; // true if timing out + virtual bool IsPlayback( void ) const = 0; // true if demo playback + + virtual float GetLatency( int flow ) const = 0; // current latency (RTT), more accurate but jittering + virtual float GetAvgLatency( int flow ) const = 0; // average packet latency in seconds + virtual float GetAvgLoss( int flow ) const = 0; // avg packet loss[0..1] + virtual float GetAvgChoke( int flow ) const = 0; // avg packet choke[0..1] + virtual float GetAvgData( int flow ) const = 0; // data flow in bytes/sec + virtual float GetAvgPackets( int flow ) const = 0; // avg packets/sec + virtual int GetTotalData( int flow ) const = 0; // total flow in/out in bytes + virtual int GetSequenceNr( int flow ) const = 0; // last send seq number + virtual bool IsValidPacket( int flow, int frame_number ) const = 0; // true if packet was not lost/dropped/chocked/flushed + virtual float GetPacketTime( int flow, int frame_number ) const = 0; // time when packet was send + virtual int GetPacketBytes( int flow, int frame_number, int group ) const = 0; // group size of this packet + virtual bool GetStreamProgress( int flow, int *received, int *total ) const = 0; // TCP progress if transmitting + virtual float GetTimeSinceLastReceived( void ) const = 0; // get time since last recieved packet in seconds + virtual float GetCommandInterpolationAmount( int flow, int frame_number ) const = 0; + virtual void GetPacketResponseLatency( int flow, int frame_number, int *pnLatencyMsecs, int *pnChoke ) const = 0; + virtual void GetRemoteFramerate( float *pflFrameTime, float *pflFrameTimeStdDeviation ) const = 0; + + virtual float GetTimeoutSeconds( ) const = 0; +}; + +class INetChannel { +public: + char pad_0000[ 20 ]; //0x0000 + bool m_bProcessingMessages; //0x0014 + bool m_bShouldDelete; //0x0015 + char pad_0016[ 2 ]; //0x0016 + int32_t m_nOutSequenceNr; //0x0018 last send outgoing sequence number + int32_t m_nInSequenceNr; //0x001C last received incoming sequnec number + int32_t m_nOutSequenceNrAck; //0x0020 last received acknowledge outgoing sequnce number + int32_t m_nOutReliableState; //0x0024 state of outgoing reliable data (0/1) flip flop used for loss detection + int32_t m_nInReliableState; //0x0028 state of incoming reliable data + int32_t m_nChokedPackets; //0x002C number of choked packets + char pad_0030[ 1044 ]; //0x0030 + + bool transmit( bool only_reliable ) { + return util::get_vfunc< 49, bool >( this, only_reliable ); + } +}; //Size: 0x0444 + +struct INetMessage { + virtual ~INetMessage( ); +}; + +template +class CNetMessagePB : public INetMessage, public T {}; + +class CCLCMsg_Move_ { +private: + char __PAD0[ 0x8 ]; +public: + int numBackupCommands; + int numNewCommands; +}; + +using CCLCMsg_Move_t = CNetMessagePB; + +class CClientState { +public: + char pad0[ 0x9C ]; + INetChannel* netchannel; + char pad1[ 0xD4 ]; + int32_t m_nDeltaTick; //0x174 + char pad2[ 0x4B34 ]; + float m_frameTime; + int32_t lastoutgoingcommand; + int32_t chokedcommands; + int32_t last_command_ack; +}; + +class CGlobalState { +public: + uintptr_t * m_manager; + CClientState *m_def_clientstate; + + __forceinline CClientState* get_client_state( ) { + return m_def_clientstate; + } +}; + +class IVEngineClient { +public: + void GetScreenSize( int& width, int& height ) { + return call_vfunc< void( __thiscall* )( void*, int&, int& ) >( this, 5 )( this, width, height ); + } + + void ClientCmd( const char* command ) { + return call_vfunc< void( __thiscall* )( void*, const char* ) >( this, 7 )( this, command ); + } + + bool GetPlayerInfo( int index, player_info_t* info ) { + return call_vfunc< bool( __thiscall* )( void*, int, player_info_t* ) >( this, 8 )( this, index, info ); + } + + int GetPlayerForUserID( int UserID ) { + using fn = int( __thiscall* )( void*, int ); + return util::get_vfunc< fn >( this, 9 )( this, UserID ); + } + + bool Cov_IsVisible( ) { + return call_vfunc< bool( __thiscall* )( void* ) >( this, 11 )( this ); + } + + int GetLocalPlayer( ) { + return call_vfunc< int( __thiscall* )( void* ) >( this, 12 )( this ); + } + + float Time( ) { + return call_vfunc< float( __thiscall* )( void* ) >( this, 14 )( this ); + } + + void GetViewAngles( vec3_t& angles ) { + return call_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 19 )( this, angles ); + } + + void SetViewAngles( vec3_t& angles ) { + return call_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 20 )( this, angles ); + } + + const matrix3x4& GetWorldToScreenMatrix( ) { + return call_vfunc< const matrix3x4&( __thiscall* )( void* ) >( this, 36 )( this ); + } + + int GetMaxClients( ) { + return call_vfunc< int( __thiscall* )( void* ) >( this, 21 )( this ); + } + + bool IsInGame( ) { + return call_vfunc< bool( __thiscall* )( void* ) >( this, 26 )( this ); + } + + bool IsConnected( ) { + return call_vfunc< bool( __thiscall* )( void* ) >( this, 27 )( this ); + } + + void ClientCmd_Unrestricted( const char* command ) { + return call_vfunc< void( __thiscall* )( void*, const char* ) >( this, 106 )( this, command ); + } + + INetChannelInfo* GetNetChannelInfo( ) { + using fn = INetChannelInfo * ( __thiscall* )( void* ); + return util::get_vfunc< fn >( this, 72 )( this ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/IVModelInfo.h b/cheat/tf2/IVModelInfo.h new file mode 100644 index 0000000..08df897 --- /dev/null +++ b/cheat/tf2/IVModelInfo.h @@ -0,0 +1,179 @@ +#pragma once +#include "IVEngineClient.h" +#include "IClientEntityList.h" +class IMaterial; +struct mstudiobbox_t { + int bone; + int group; + vec3_t bbmin; + vec3_t bbmax; + int szhitboxnameindex; + int unused[8]; +}; + +enum OverrideType_t { + OVERRIDE_NORMAL = 0, + OVERRIDE_BUILD_SHADOWS, + OVERRIDE_DEPTH_WRITE, + OVERRIDE_SSAO_DEPTH_WRITE, +}; +struct DrawModelState_t; + +struct mstudiobone_t { + int sznameindex; + char* GetName( ) const { return reinterpret_cast< char* >( reinterpret_cast< uintptr_t >( this ) ) + sznameindex; } + int parent; + int bonecontroller[ 6 ]; + vec3_t pos; + float quat[ 4 ]; + vec3_t rot; + vec3_t posscale; + vec3_t rotscale; + matrix3x4 poseToBone; + float qAlignment[ 4 ]; + int flags; + int proctype; + int procindex; + mutable int physicsbone; + void* GetProcedure( ) const { return procindex == 0 ? nullptr : reinterpret_cast( reinterpret_cast( this ) + procindex ); }; + int surfacepropidx; + char* GetSurfaceProps( ) const { return reinterpret_cast( reinterpret_cast( this ) ) + surfacepropidx; } + int contents; + unsigned char pad[ 32 ]; +}; + +struct mstudiohitboxset_t { + int sznameindex; + inline char *const pszName(void) const { return ((char *)this) + sznameindex; } + int numhitboxes; + int hitboxindex; + mstudiobbox_t *pHitbox(int i) const { return (mstudiobbox_t *)(((BYTE *)this) + hitboxindex) + i; }; +}; + +struct studiohdr_t { + unsigned char pad00[12]; + char name[64]; + unsigned char pad01[80]; + int numbones; + int boneindex; + unsigned char pad02[12]; + int hitboxsetindex; + unsigned char pad03[228]; + + mstudiobone_t *GetBone( int i ) const { + return reinterpret_cast( uintptr_t( this ) + boneindex ) + i; + }; + + mstudiohitboxset_t *pHitboxSet(int i) const { + return (mstudiohitboxset_t *)(((unsigned char *)this) + hitboxsetindex) + i; + }; + + mstudiobbox_t *pHitbox(int i, int set) const { + const mstudiohitboxset_t *s = pHitboxSet(set); + if(!s) + return 0; + + return s->pHitbox(i); + }; + + int iHitboxCount(int set) const { + const mstudiohitboxset_t *s = pHitboxSet(set); + if(!s) + return 0; + + return s->numhitboxes; + }; +}; + +struct ModelRenderInfo_t { + vec3_t m_origin; + vec3_t m_angles; + char pad[ 0x4 ]; + void* m_renderable; + const model_t* m_model; + const matrix3x4* m_model2world; + const matrix3x4* m_light_offset; + const vec3_t* m_light_origin; + int m_flags; + int m_entity_index; + int m_skin; + int m_body; + int m_hitboxset; + uint16_t* m_instance; + + ModelRenderInfo_t( ) { + m_model2world = nullptr; + m_light_offset = nullptr; + m_light_origin = nullptr; + } +}; + +class IVModelInfo { +public: + int GetModelIndex( const char* name ) { + return call_vfunc< int( __thiscall* )( void*, const char* ) >( this, 2 )( this, name ); + } + + const char* GetModelName( const void* model ) { + return call_vfunc< const char*( __thiscall* )( void*, const void* ) >( this, 3 )( this, model ); + } + + studiohdr_t* GetStudioModel( const void* model ) { + return call_vfunc< studiohdr_t*( __thiscall* )( void*, const void* ) >( this, 28 )( this, model ); + } + + model_t* FindOrLoadModel( const char* name ) { + using fn = model_t * ( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 43 )( this, name ); + } +}; + +class IVModelRender { +public: + void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) { + using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int ); + return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk ); + } + + void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) { + using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + util::get_vfunc< fn >( this, 19 )( this, matctx, state, pInfo, pCustomBoneToWorld ); + } +}; + + +class INetworkStringTable { +public: + + virtual ~INetworkStringTable( void ) {}; + + // Table Info + virtual const char *GetTableName( void ) const = 0; + virtual int GetTableId( void ) const = 0; + virtual int GetNumStrings( void ) const = 0; + virtual int GetMaxStrings( void ) const = 0; + virtual int GetEntryBits( void ) const = 0; + + // Networking + virtual void SetTick( int tick ) = 0; + virtual bool ChangedSinceTick( int tick ) const = 0; + + // Accessors (length -1 means don't change user data if string already exits) + virtual int AddString( bool bIsServer, const char *value, int length = -1, const void *userdata = 0 ) = 0; + + virtual const char *GetString( int stringNumber ) = 0; + virtual void SetStringUserData( int stringNumber, int length, const void *userdata ) = 0; + virtual const void *GetStringUserData( int stringNumber, int *length ) = 0; + virtual int FindStringIndex( char const *string ) = 0; // returns INVALID_STRING_INDEX if not found + + // Callbacks + virtual void SetStringChangedCallback( void *object, void* changeFunc ) = 0; +}; + +class CStringTable { +public: + INetworkStringTable * FindTable( const char* table ) { + using fn = INetworkStringTable * ( __thiscall* )( void*, const char* ); + return util::get_vfunc< fn >( this, 3 )( this, table ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/IVRenderView.h b/cheat/tf2/IVRenderView.h new file mode 100644 index 0000000..b85b82d --- /dev/null +++ b/cheat/tf2/IVRenderView.h @@ -0,0 +1,185 @@ +#pragma once +#include "util.hpp" + +class Beam_t; +class C_Beam; +class c_base_player; +class ITraceFilter; + + +class IVRenderView { +public: + void SetBlend( float blend ) { + return util::get_vfunc< 4, void >( this, blend ); + } + + float GetBlend( ) { + return util::get_vfunc< 5, float >( this ); + } + + void SetColorModulation( float const* blend ) { + return util::get_vfunc< 6, void >( this, blend ); + } + + void GetColorModulation( float* blend ) { + return util::get_vfunc< 7, void >( this, blend ); + } +}; + +enum beam_types { + beam_normal = 0, + beam_disk = 2, + beam_cylinder, + beam_follow, + beam_ring, + beam_spline, + beam_ring_point, + beam_laser, + beam_tesla, +}; + +enum beam_flags { + FBEAM_STARTENTITY = 0x00000001, + FBEAM_ENDENTITY = 0x00000002, + FBEAM_FADEIN = 0x00000004, + FBEAM_FADEOUT = 0x00000008, + FBEAM_SINENOISE = 0x00000010, + FBEAM_SOLID = 0x00000020, + FBEAM_SHADEIN = 0x00000040, + FBEAM_SHADEOUT = 0x00000080, + FBEAM_ONLYNOISEONCE = 0x00000100, // Only calculate our noise once + FBEAM_NOTILE = 0x00000200, + FBEAM_USE_HITBOXES = 0x00000400, // Attachment indices represent hitbox indices instead when this is set. + FBEAM_STARTVISIBLE = 0x00000800, // Has this client actually seen this beam's start entity yet? + FBEAM_ENDVISIBLE = 0x00001000, // Has this client actually seen this beam's end entity yet? + FBEAM_ISACTIVE = 0x00002000, + FBEAM_FOREVER = 0x00004000, + FBEAM_HALOBEAM = 0x00008000, // When drawing a beam with a halo, don't ignore the segments and endwidth + FBEAM_REVERSED = 0x00010000, + NUM_BEAM_FLAGS = 17 // KEEP THIS UPDATED! +}; + +struct BeamInfo_t { + beam_types m_nType; + + // Entities + IClientEntity* m_pStartEnt; + int m_nStartAttachment; + IClientEntity* m_pEndEnt; + int m_nEndAttachment; + + // Points + vec3_t m_vecStart; + vec3_t m_vecEnd; + + int m_nModelIndex; + const char *m_pszModelName; + + int m_nHaloIndex; + const char *m_pszHaloName; + float m_flHaloScale; + + float m_flLife; + float m_flWidth; + float m_flEndWidth; + float m_flFadeLength; + float m_flAmplitude; + + float m_flBrightness; + float m_flSpeed; + + int m_nStartFrame; + float m_flFrameRate; + + float m_flRed; + float m_flGreen; + float m_flBlue; + + bool m_bRenderable; + + int m_nSegments; + + int m_nFlags; + + // Rings + vec3_t m_vecCenter; + float m_flStartRadius; + float m_flEndRadius; + + BeamInfo_t( ) + { + m_nType = beam_normal; + m_nSegments = -1; + m_pszModelName = NULL; + m_pszHaloName = NULL; + m_nModelIndex = -1; + m_nHaloIndex = -1; + m_bRenderable = true; + m_nFlags = 0; + } +}; + +class IViewRenderBeams +{ +public: + // Construction +public: + IViewRenderBeams( void ); + virtual ~IViewRenderBeams( void ); + + // Implement IViewRenderBeams +public: + virtual void InitBeams( void ); + virtual void ShutdownBeams( void ); + virtual void ClearBeams( void ); + + // Updates the state of the temp ent beams + virtual void UpdateTempEntBeams( ); + + virtual void DrawBeam( Beam_t *pbeam ); + virtual void DrawBeam( C_Beam* pbeam, ITraceFilter*pEntityBeamTraceFilter = NULL ); + + virtual void KillDeadBeams( IClientEntity *pDeadEntity ); + + virtual void CreateBeamEnts( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b, int type = -1 ); + virtual Beam_t *CreateBeamEnts( BeamInfo_t &beamInfo ); + + virtual void CreateBeamEntPoint( int nStartEntity, const vec3_t *pStart, int nEndEntity, const vec3_t* pEnd, + int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b ); + virtual Beam_t *CreateBeamEntPoint( BeamInfo_t &beamInfo ); + + virtual void CreateBeamPoints( vec3_t& start, vec3_t& end, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b ); + virtual Beam_t *CreateBeamPoints( BeamInfo_t &beamInfo ); + + virtual void CreateBeamRing( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b, int flags ); + virtual Beam_t *CreateBeamRing( BeamInfo_t &beamInfo ); + + virtual void CreateBeamRingPoint( const vec3_t& center, float start_radius, float end_radius, int modelIndex, int haloIndex, float haloScale, + float life, float width, float m_nEndWidth, float m_nFadeLength, float amplitude, + float brightness, float speed, int startFrame, + float framerate, float r, float g, float b, int flags ); + virtual Beam_t *CreateBeamRingPoint( BeamInfo_t &beamInfo ); + + virtual void CreateBeamCirclePoints( int type, vec3_t& start, vec3_t& end, + int modelIndex, int haloIndex, float haloScale, float life, float width, + float endWidth, float fadeLength, float amplitude, float brightness, float speed, + int startFrame, float framerate, float r, float g, float b ); + virtual Beam_t *CreateBeamCirclePoints( BeamInfo_t &beamInfo ); + + virtual void CreateBeamFollow( int startEnt, int modelIndex, int haloIndex, float haloScale, + float life, float width, float endWidth, float fadeLength, float r, float g, float b, + float brightness ); + virtual Beam_t *CreateBeamFollow( BeamInfo_t &beamInfo ); +}; \ No newline at end of file diff --git a/cheat/tf2/KeyValues.cpp b/cheat/tf2/KeyValues.cpp new file mode 100644 index 0000000..16ccf6e --- /dev/null +++ b/cheat/tf2/KeyValues.cpp @@ -0,0 +1,62 @@ +#include "KeyValues.h" +#include "pattern.hpp" +#include "interfaces.h" + +void* KeyValues::key_values_ptr; + +void IKeyValuesSystem::FreeKeyValuesMemory( void* memory ) { + return util::get_vfunc< 2, void >( this, memory ); +} + +int IKeyValuesSystem::GetSymbolForString( const char* str, bool create ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), xors( "FF 15 ? ? ? ? 83 C4 08 89 06 8B C6" ) ); + using fn = int( __thiscall* )( void*, const char*, bool ); + + int symbol = ( ( fn )( offset ) )( this, str, create ); + return symbol; +} + +const char* IKeyValuesSystem::GetStringForSymbol( int symbol ) { + static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), xors( "55 8B EC 8B 55 08 83 FA FF" ) ); + using fn = const char*( __thiscall* )( void*, int ); + + auto result = ( ( fn )( offset ) )( this, symbol ); + printf( "%d: %d\n", symbol, *( int* )( &result ) ); + + return result; +} + +//honestly keyvalues can suck my fucking cock while i force feeds that fucking whores ass rats to live in its cum infested shithole + + +KeyValues::KeyValues( const char* name ) { + static std::string fun_pattern = "E8 ? ? ? ? 80 7D 84 00"; + static uintptr_t function_offset = pattern::first_code_match( cl.m_chl.dll( ), fun_pattern ) + 0x13C; + static auto function = reinterpret_cast< void( __thiscall* )( void*, const char* ) >( function_offset ); + if( function ) function( this, name ); +} + +bool KeyValues::LoadFromBuffer( const char* resource_name, const char* buffer, void* file_system, const char* path_id ) { + static std::string fun_pattern = "55 8B EC 83 E4 F8 83 EC 34 53 8B 5D 0C 89 4C 24 04"; + static auto function = pattern::first_code_match< bool( __thiscall* )( void*, const char*, const char*, void*, const char*, void* ) >( cl.m_chl.dll( ), fun_pattern ); + if( function ) return function( this, resource_name, buffer, file_system, path_id, 0 ); + return false; +} + +void* KeyValues::operator new( size_t alloc_size ) { + if( !KeyValues::key_values_ptr ) { + static auto get_key_values = reinterpret_cast< void*( __cdecl* )( ) >( GetProcAddress( GetModuleHandleA( "vstdlib.dll" ), "KeyValuesSystem" ) ); + KeyValues::key_values_ptr = get_key_values( ); + } + + return call_vfunc< void*( __thiscall* )( void*, size_t ) >( KeyValues::key_values_ptr, 1 )( KeyValues::key_values_ptr, 32 ); +} + +void KeyValues::operator delete( void* mem ) { + if( !KeyValues::key_values_ptr ) { + static auto get_key_values = reinterpret_cast< void*( __cdecl* )( ) >( GetProcAddress( GetModuleHandleA( "vstdlib.dll" ), "KeyValuesSystem" ) ); + KeyValues::key_values_ptr = get_key_values( ); + } + + call_vfunc< void( __thiscall* )( void*, void* ) >( KeyValues::key_values_ptr, 2 )( KeyValues::key_values_ptr, mem ); +} diff --git a/cheat/tf2/KeyValues.h b/cheat/tf2/KeyValues.h new file mode 100644 index 0000000..1d8ed41 --- /dev/null +++ b/cheat/tf2/KeyValues.h @@ -0,0 +1,46 @@ +#pragma once +#include "util.hpp" + +class IKeyValuesSystem { +public: + void FreeKeyValuesMemory( void* memory ); + int GetSymbolForString( const char* string, bool create ); + const char* GetStringForSymbol( int symbol ); +}; + +class KeyValues +{ +public: + KeyValues( const char *setName ); + //~KeyValues( ); + + bool LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem = nullptr, const char *pPathID = nullptr ); + + const char* get_string( const char* name, const char* value ); + + int m_iKeyName; + + char *m_sValue; + wchar_t *m_wsValue; + + // we don't delete these + union { + int m_iValue; + float m_flValue; + void *m_pValue; + unsigned char m_Color[ 4 ]; + }; + + void* operator new( size_t alloc ); + void operator delete( void* mem ); + + char m_iDataType; + char m_bHasEscapeSequences; + char m_bEvaluateConditionals; + static void* key_values_ptr; + KeyValues* FindKey( const char* key_name ); + + KeyValues *m_pPeer; // pointer to next key in list + KeyValues *m_pSub; // pointer to Start of a new sub key list + KeyValues *m_pChain;// Search here if it's not in our list +}; \ No newline at end of file diff --git a/cheat/tf2/README.md b/cheat/tf2/README.md new file mode 100644 index 0000000..fa73fb9 --- /dev/null +++ b/cheat/tf2/README.md @@ -0,0 +1,3 @@ +# tf2 + +jukka = bester diff --git a/cheat/tf2/ScreenSpaceEffects.h b/cheat/tf2/ScreenSpaceEffects.h new file mode 100644 index 0000000..ec0b6e8 --- /dev/null +++ b/cheat/tf2/ScreenSpaceEffects.h @@ -0,0 +1,50 @@ +#pragma once +class KeyValues; + +class IScreenSpaceEffect { +public: + + virtual void Init( ) = 0; + virtual void Shutdown( ) = 0; + + virtual void SetParameters( KeyValues *params ) = 0; + + virtual void Render( int x, int y, int w, int h ) = 0; + + virtual void Enable( bool bEnable ) = 0; + virtual bool IsEnabled( ) = 0; +}; + +class IScreenSpaceEffectManager { +public: + + virtual void InitScreenSpaceEffects( ) = 0; + virtual void ShutdownScreenSpaceEffects( ) = 0; + + virtual IScreenSpaceEffect *GetScreenSpaceEffect( const char *pEffectName ) = 0; + + virtual void SetScreenSpaceEffectParams( const char *pEffectName, KeyValues *params ) = 0; + virtual void SetScreenSpaceEffectParams( IScreenSpaceEffect *pEffect, KeyValues *params ) = 0; + + virtual void EnableScreenSpaceEffect( const char *pEffectName ) = 0; + virtual void EnableScreenSpaceEffect( IScreenSpaceEffect *pEffect ) = 0; + + virtual void DisableScreenSpaceEffect( const char *pEffectName ) = 0; + virtual void DisableScreenSpaceEffect( IScreenSpaceEffect *pEffect ) = 0; + + virtual void DisableAllScreenSpaceEffects( ) = 0; + + virtual void RenderEffects( int x, int y, int w, int h ) = 0; +}; + +class CScreenSpaceEffectRegistration { +public: + CScreenSpaceEffectRegistration( const char *pName, IScreenSpaceEffect *pEffect ); + + const char *m_pEffectName; + IScreenSpaceEffect *m_pEffect; + + CScreenSpaceEffectRegistration *m_pNext; + + static CScreenSpaceEffectRegistration *s_pHead; +}; \ No newline at end of file diff --git a/cheat/tf2/Source.cpp b/cheat/tf2/Source.cpp new file mode 100644 index 0000000..3bd44af --- /dev/null +++ b/cheat/tf2/Source.cpp @@ -0,0 +1,42 @@ +#pragma warning (disable:4018) + +#include +#include + +#include "console.hpp" +#include "interfaces.h" +#include "search.h" +#include "hooks.h" +#include +#include "base_cheat.h" + +HMODULE g_dll; + +void main_thread( HMODULE module ) { + + cl.initialize( ); + + + + while ( !( GetAsyncKeyState( VK_END ) & 0x8000 ) ) { + std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); + } + +} + +bool __stdcall DllMain( + _In_ HINSTANCE hinstDLL, + _In_ DWORD fdwReason, + _In_ LPVOID lpvReserved ) { + if ( fdwReason == DLL_PROCESS_ATTACH /*&& ( uintptr_t )( lpvReserved ) == 20*/ ) { //nigga suck who dick? + DisableThreadLibraryCalls( hinstDLL ); + g_dll = hinstDLL; + // coca cola coca cola yayo bought me everything + + //no i did not dummy + + CreateThread( nullptr, 0, reinterpret_cast< LPTHREAD_START_ROUTINE >( main_thread ), hinstDLL, 0, nullptr ); + } + + return true; +} \ No newline at end of file diff --git a/cheat/tf2/UtlMem.h b/cheat/tf2/UtlMem.h new file mode 100644 index 0000000..df4574f --- /dev/null +++ b/cheat/tf2/UtlMem.h @@ -0,0 +1,320 @@ +#pragma once + +typedef intptr_t intp; +inline int UtlMemory_CalcNewAllocationCount( int nAllocationCount, int nGrowSize, int nNewSize, int nBytesItem ) +{ + if( nGrowSize ) + nAllocationCount = ( ( 1 + ( ( nNewSize - 1 ) / nGrowSize ) ) * nGrowSize ); + else + { + if( !nAllocationCount ) + nAllocationCount = ( 31 + nBytesItem ) / nBytesItem; + + while( nAllocationCount < nNewSize ) + nAllocationCount *= 2; + } + + return nAllocationCount; +} + +template< class T, class I = int > +class CUtlMemory +{ +public: + T & operator[]( I i ) + { + return m_pMemory[ i ]; + } + + explicit operator bool( ) const noexcept { + return !!( m_pMemory ); + } + + T *Base( ) + { + return m_pMemory; + } + + int NumAllocated( ) const + { + return m_nAllocationCount; + } + + void Grow( int num = 1 ) + { + if( IsExternallyAllocated( ) ) + return; + + int nAllocationRequested = m_nAllocationCount + num; + int nNewAllocationCount = UtlMemory_CalcNewAllocationCount( m_nAllocationCount, m_nGrowSize, nAllocationRequested, sizeof( T ) ); + + if( ( int )( I )nNewAllocationCount < nAllocationRequested ) + { + if( ( int )( I )nNewAllocationCount == 0 && ( int )( I )( nNewAllocationCount - 1 ) >= nAllocationRequested ) + --nNewAllocationCount; + else + { + if( ( int )( I )nAllocationRequested != nAllocationRequested ) + return; + + while( ( int )( I )nNewAllocationCount < nAllocationRequested ) + nNewAllocationCount = ( nNewAllocationCount + nAllocationRequested ) / 2; + } + } + + m_nAllocationCount = nNewAllocationCount; + + if( m_pMemory ) + m_pMemory = ( T * )realloc( m_pMemory, m_nAllocationCount * sizeof( T ) ); + else + m_pMemory = ( T * )malloc( m_nAllocationCount * sizeof( T ) ); + } + + bool IsExternallyAllocated( ) const + { + return m_nGrowSize < 0; + } + +protected: + T * m_pMemory; + int m_nAllocationCount; + int m_nGrowSize; +}; + +template +inline T *Construct( T *pMemory ) +{ + return ::new( pMemory ) T; +} + +template +inline T *CopyConstruct( T *pMemory, T const& src ) +{ + return( new( pMemory ) T( src ) ); +} + +template +inline void Destruct( T *pMemory ) +{ + pMemory->~T( ); +} + +template< class T > +class CUtlFixedMemory +{ +public: + // constructor, destructor + CUtlFixedMemory( int nGrowSize = 0, int nInitSize = 0 ); + ~CUtlFixedMemory( ); + + // Set the size by which the memory grows + void Init( int nGrowSize = 0, int nInitSize = 0 ); + + // here to match CUtlMemory, but only used by ResetDbgInfo, so it can just return NULL + T* Base( ) { return NULL; } + const T* Base( ) const { return NULL; } + +protected: + struct BlockHeader_t; + +public: + class Iterator_t + { + public: + Iterator_t( BlockHeader_t *p, int i ) : m_pBlockHeader( p ), m_nIndex( i ) {} + BlockHeader_t *m_pBlockHeader; + intp m_nIndex; + + bool operator==( const Iterator_t it ) const { return m_pBlockHeader == it.m_pBlockHeader && m_nIndex == it.m_nIndex; } + bool operator!=( const Iterator_t it ) const { return m_pBlockHeader != it.m_pBlockHeader || m_nIndex != it.m_nIndex; } + }; + Iterator_t First( ) const { return m_pBlocks ? Iterator_t( m_pBlocks, 0 ) : InvalidIterator( ); } + Iterator_t Next( const Iterator_t &it ) const + { + Assert( IsValidIterator( it ) ); + if( !IsValidIterator( it ) ) + return InvalidIterator( ); + + BlockHeader_t *pHeader = it.m_pBlockHeader; + if( it.m_nIndex + 1 < pHeader->m_nBlockSize ) + return Iterator_t( pHeader, it.m_nIndex + 1 ); + + return pHeader->m_pNext ? Iterator_t( pHeader->m_pNext, 0 ) : InvalidIterator( ); + } + intp GetIndex( const Iterator_t &it ) const + { + Assert( IsValidIterator( it ) ); + if( !IsValidIterator( it ) ) + return InvalidIndex( ); + + return ( intp )( HeaderToBlock( it.m_pBlockHeader ) + it.m_nIndex ); + } + bool IsIdxAfter( intp i, const Iterator_t &it ) const + { + Assert( IsValidIterator( it ) ); + if( !IsValidIterator( it ) ) + return false; + + if( IsInBlock( i, it.m_pBlockHeader ) ) + return i > GetIndex( it ); + + for( BlockHeader_t *pbh = it.m_pBlockHeader->m_pNext; pbh; pbh = pbh->m_pNext ) + { + if( IsInBlock( i, pbh ) ) + return true; + } + return false; + } + bool IsValidIterator( const Iterator_t &it ) const { return it.m_pBlockHeader && it.m_nIndex >= 0 && it.m_nIndex < it.m_pBlockHeader->m_nBlockSize; } + Iterator_t InvalidIterator( ) const { return Iterator_t( NULL, INVALID_INDEX ); } + + // element access + T& operator[]( intp i ); + const T& operator[]( intp i ) const; + T& Element( intp i ); + const T& Element( intp i ) const; + + // Can we use this index? + bool IsIdxValid( intp i ) const; + + // Specify the invalid ('null') index that we'll only return on failure + static const intp INVALID_INDEX = 0; // For use with COMPILE_TIME_ASSERT + static intp InvalidIndex( ) { return INVALID_INDEX; } + + // Size + int NumAllocated( ) const; + int Count( ) const { return NumAllocated( ); } + + // Grows memory by max(num,growsize), and returns the allocation index/ptr + void Grow( int num = 1 ); + + // Makes sure we've got at least this much memory + void EnsureCapacity( int num ); + + // Memory deallocation + void Purge( ); + +protected: + // Fast swap - WARNING: Swap invalidates all ptr-based indices!!! + void Swap( CUtlFixedMemory< T > &mem ); + + bool IsInBlock( intp i, BlockHeader_t *pBlockHeader ) const + { + T *p = ( T* )i; + const T *p0 = HeaderToBlock( pBlockHeader ); + return p >= p0 && p < p0 + pBlockHeader->m_nBlockSize; + } + + struct BlockHeader_t + { + BlockHeader_t *m_pNext; + intp m_nBlockSize; + }; + + const T *HeaderToBlock( const BlockHeader_t *pHeader ) const { return ( T* )( pHeader + 1 ); } + const BlockHeader_t *BlockToHeader( const T *pBlock ) const { return ( BlockHeader_t* )( pBlock )-1; } + + BlockHeader_t* m_pBlocks; + int m_nAllocationCount; + int m_nGrowSize; +}; + +template< class T, class A = CUtlMemory > +class CUtlVector +{ + typedef A CAllocator; + + typedef T *iterator; + typedef const T *const_iterator; +public: + T & operator[]( int i ) + { + return m_Memory[ i ]; + } + + explicit operator bool( ) const noexcept { + return !!( m_Memory ); + } + + T& Element( int i ) + { + return m_Memory[ i ]; + } + + T* Base( ) + { + return m_Memory.Base( ); + } + + int Count( ) const + { + return m_Size; + } + + void RemoveAll( ) + { + for( int i = m_Size; --i >= 0; ) + Destruct( &Element( i ) ); + + m_Size = 0; + } + + int AddToTail( const T& src ) + { + return InsertBefore( m_Size, src ); + } + + int AddToTail( ) + { + return InsertBefore( m_Size ); + } + + int InsertBefore( int elem, const T& src ) + { + Growvec3_t( ); + ShiftElementsRight( elem ); + CopyConstruct( &Element( elem ), src ); + return elem; + } + + int InsertBefore( int elem ) + { + Growvec3_t( ); + ShiftElementsRight( elem ); + Construct( &Element( elem ) ); + + return elem; + } + + iterator begin( ) { return Base( ); } + const_iterator begin( ) const { return Base( ); } + iterator end( ) { return Base( ) + Count( ); } + const_iterator end( ) const { return Base( ) + Count( ); } + +protected: + void Growvec3_t( int num = 1 ) + { + if( m_Size + num > m_Memory.NumAllocated( ) ) + m_Memory.Grow( m_Size + num - m_Memory.NumAllocated( ) ); + + m_Size += num; + ResetDbgInfo( ); + } + + void ShiftElementsRight( int elem, int num = 1 ) + { + int numToMove = m_Size - elem - num; + if( ( numToMove > 0 ) && ( num > 0 ) ) + memmove( &Element( elem + num ), &Element( elem ), numToMove * sizeof( T ) ); + } + + CAllocator m_Memory; + int m_Size; + + T *m_pElements; + + inline void ResetDbgInfo( ) + { + m_pElements = Base( ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/VFunc.h b/cheat/tf2/VFunc.h new file mode 100644 index 0000000..f5e09af --- /dev/null +++ b/cheat/tf2/VFunc.h @@ -0,0 +1,12 @@ +#pragma once +#include +#include + +template < typename Fn > __forceinline Fn call_vfunc( void* classbase, int index ) { + if ( !classbase ) return Fn{ }; + return ( Fn )( ( uintptr_t* )*( uintptr_t** )classbase )[ index ]; +} + +template < typename T > __forceinline T get_ebp( ) { + __asm mov eax, ebp +} \ No newline at end of file diff --git a/cheat/tf2/aim.cpp b/cheat/tf2/aim.cpp new file mode 100644 index 0000000..15c5e16 --- /dev/null +++ b/cheat/tf2/aim.cpp @@ -0,0 +1,321 @@ +#include "interfaces.h" +#include "input_system.hpp" +#include "ctx.hpp" +#include "aim.h" +#include "settings.h" +#include "math.h" + +namespace features +{ + int c_legitbot::get_aim_target( float fov ) { + float best_fov = fov ? fov : g_settings.legit.active->m_fov; + int target{ -1 }; + vec3_t aim_angle{ }; + vec3_t cur_angle{ }; + vec3_t local_pos{ }; + vec3_t aim_pos{ }; + + cl.m_engine( )->GetViewAngles( cur_angle ); + local_pos = g_ctx.m_local->get_eye_pos( ); + + for( int i{ 1 }; i <= cl.m_globals->maxclients; ++i ) { + auto entity = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + + if( !entity ) continue; + if( entity == g_ctx.m_local ) continue; + if( !entity->is_valid( ) ) continue; + int team = entity->get_team( ); + if( team == g_ctx.m_local->get_team( ) + && !g_settings.legit.friendlies( ) ) { + continue; + } + + bool visible = entity->is_visible( g_settings.legit.active->m_bone ); + if( !visible && g_settings.legit.backtracking_target( ) ) { + auto record = m_lagcomp.find_best_record( i ); + if( record ) { + visible = util::trace_ray( local_pos, record->m_position, + g_ctx.m_local->ce( ), entity->ce( ) ); + } + } + + if( !visible ) { + continue; + } + + aim_angle = math::vector_angles( local_pos, entity->get_hitbox_position( g_settings.legit.active->m_bone ) ); + aim_angle.clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if( fov < best_fov ) { + best_fov = fov; + target = i; + } + } + + return target; + } + + void c_legitbot::assist( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t move_ang; + vec3_t view_ang; + vec3_t enemy_pos; + vec3_t local_pos; + vec3_t view_delta; + vec3_t delta; + vec2_t pixels; + + local_pos = g_ctx.m_local->get_eye_pos( ); + enemy_pos = target->get_hitbox_position( g_settings.legit.active->m_bone ); + + aim_ang = math::vector_angles( local_pos, enemy_pos ); + + move_ang = pixels_to_angle( vec2_t( *x, *y ) ); + cl.m_engine( )->GetViewAngles( view_ang ); + + view_delta = ( aim_ang - view_ang ).clamp( ); + + move_ang *= g_settings.legit.active->m_assist_strength; + float delta_y = std::abs( move_ang.y ); + float delta_x = std::abs( move_ang.x ); + + delta.x = std::clamp( view_delta.x, -delta_x, delta_x ); + delta.y = std::clamp( view_delta.y, -delta_y, delta_y ); + + pixels = angle_to_pixels( delta ); + *x += pixels.x; *y += pixels.y; + } + + + + void c_legitbot::triggerbot( user_cmd_t* cmd ) { + static float time_at = 0.f; + + if( !g_settings.legit.triggerbot( ) ) + return; + + if( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.trigger_key( ) ) && !time_at ) // sometimes people will let go of their triggerbot key too quickly and will cause them to not shoot. + return; + + vec3_t viewangles{ }; + vec3_t forward{ }; + cl.m_engine( )->GetViewAngles( viewangles ); + + auto wep = g_ctx.m_local->get_active_weapon( ); + if( !wep ) return; + if( wep->is_non_aim( ) ) return; + + + const float length = wep->get_distance( ); + const float current_time = TICKS_TO_TIME( cl.m_globals->tickcount ); + + if( time_at && abs( current_time - time_at ) > 0.3f ) { + time_at = 0.f; // delta too big + } + + if( length > 1.0f ) { + if( !time_at ) { + + forward = math::angle_vectors( viewangles ); + forward *= length; + + vec3_t src = g_ctx.m_local->get_eye_pos( ); + vec3_t dst = src + forward; + + CTraceFilter filter{ }; + CGameTrace tr{ }; + Ray_t ray{ }; + + filter.pSkip = g_ctx.m_local; + ray.Init( src, dst ); + + cl.m_trace( )->trace_ray( ray, MASK_SHOT, &filter, &tr ); + + if( tr.m_pEnt ) { + auto ent = tr.m_pEnt->as< c_base_player >( ); + if( ent->is_valid( ) ) { + if( ent->get_team( ) != g_ctx.m_local->get_team( ) || g_settings.legit.friendlies ) { + time_at = current_time; + } + } + } + } + + if( time_at ) { + if( ( current_time - time_at ) >= g_settings.legit.trigger_delay( ) ) { + cmd->m_buttons |= IN_ATTACK; + time_at = 0.f; + } + } + } + } + + void c_legitbot::sample_angle_data( const vec3_t& cur_angles ) { + auto time = cl.m_globals->curtime; + + if( !m_aiming ) { + m_angle_samples.push_front( { cur_angles, time } ); + } + + while( m_angle_samples.size( ) > g_settings.legit.sample_size( ) ) { + m_angle_samples.pop_back( ); + } + } + + float c_legitbot::get_avg_delta( ) { + if( m_angle_samples.empty( ) ) + return 0.f; + + float avg_delta{ }; + + for( auto& it : m_angle_samples ) { + static vec3_t last_angle = it.m_viewangles; + + //doing this implements nonsticky aswell + //once you already are at the target + //after lets say a flick + //it will reduce the aim speed + //making it not "stick" to the bone + //as we dont store records when aiming + float time_delta = cl.m_globals->curtime - it.m_time; + float delta_diff = m_deltatime / ( time_delta * 2.f ); + + vec3_t angle_delta = ( last_angle - it.m_viewangles ).clamp( ); + float delta_length = angle_delta.length( ) * delta_diff; + + avg_delta += delta_length; + last_angle = it.m_viewangles; + } + + //scale the delta down + return avg_delta / float( g_settings.legit.sample_size( ) ); + } + + vec2_t c_legitbot::angle_to_pixels( const vec3_t& angle ) { + static auto m_yaw = cl.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = cl.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = angle.x / m_pitch->get_float( ); + float y = angle.y / m_yaw->get_float( ); + + return vec2_t( -y, x ); + } + + vec3_t c_legitbot::pixels_to_angle( const vec2_t& pixel ) { + static auto m_yaw = cl.m_cvar( )->FindVar( xors( "m_yaw" ) ); + static auto m_pitch = cl.m_cvar( )->FindVar( xors( "m_pitch" ) ); + + float x = pixel.x * m_pitch->get_float( ); + float y = pixel.y * m_yaw->get_float( ); + + return vec3_t( -y, x, 0.f ).clamp( ); + } + + bool c_legitbot::update_settings( ) { + if( !g_ctx.run_frame( ) ) return false; + + auto weapon = g_ctx.m_local->get_active_weapon( ); + if( !weapon ) return false; + + if( weapon->is_non_aim( ) ) { + return false; + } + + if( weapon->is_primary( ) ) { + g_settings.legit.active = &g_settings.legit.primary; + } + else if( weapon->is_secondary( ) ) { + g_settings.legit.active = &g_settings.legit.secondary; + } + else if( weapon->is_third( ) ) { + g_settings.legit.active = &g_settings.legit.melee; + } + + + return true; + } + + void c_legitbot::aim_at_target( c_base_player* target, float* x, float* y ) { + vec3_t aim_ang; + vec3_t cur_ang; + vec3_t delta; + vec2_t pixels; + vec2_t mouse; + + cl.m_engine( )->GetViewAngles( cur_ang ); + + if( g_settings.legit.backtracking( ) && m_lagcomp.find_best_record( target->ce( )->index( ) ) ) { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + m_lagcomp.get_backtracked_position( target->ce( )->index( ) ) ).clamp( ); + } + else { + aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), + target->get_hitbox_position( g_settings.legit.active->m_bone ) ).clamp( ); + } + + + delta = ( aim_ang - cur_ang ).clamp( ); + float delta_length = delta.length( ); + + if( delta_length ) { + float final_time = delta_length / ( g_settings.legit.active->m_speed( ) / 100.f ); + m_curtime += m_deltatime; + + if( m_curtime > final_time ) { + m_curtime = final_time; + } + + float aim_progress = m_curtime / final_time; + delta *= aim_progress; + aim_ang = delta; + + pixels = angle_to_pixels( delta ); + *x += pixels.x; + *y += pixels.y; + } + } + + void c_legitbot::aimbot( float* x, float* y ) { + if( !g_settings.legit.enabled( ) ) return; + if( !update_settings( ) ) return; + + m_aiming = false; + static float old_time = cl.m_globals->curtime; + float time = cl.m_globals->curtime; + + m_deltatime = time - old_time; + if( g_settings.legit.dynamic_smoothing( ) ) { + float avg_delta = get_avg_delta( ) * g_settings.legit.smooth_factor( ); + if( avg_delta > m_deltatime ) { + m_deltatime = avg_delta; + } + } + + old_time = time; + + bool in_attack = false; + if( g_settings.legit.activation_type == 0 ) + in_attack = true; + if( g_settings.legit.activation_type == 1 + && g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) { + in_attack = true; + } + + int target_index = get_aim_target( ); + auto target = cl.m_entlist( )->get_client_entity< c_base_player >( target_index ); + + if( target_index != -1 ) { + if( in_attack ) { + m_aiming = true; + aim_at_target( target, x, y ); + } + if( g_settings.legit.assist ) { + assist( target, x, y ); + } + } + else { + m_curtime = 0; + } + } +} \ No newline at end of file diff --git a/cheat/tf2/aim.h b/cheat/tf2/aim.h new file mode 100644 index 0000000..82e4943 --- /dev/null +++ b/cheat/tf2/aim.h @@ -0,0 +1,75 @@ +#pragma once +#include +#include + +#include "sdk.h" + +namespace features +{ + class c_legitbot { + public: + void operator()( float* x, float* y ) { + aimbot( x, y ); + } + + //call once per tick + void sample_angle_data( const vec3_t& angle ); + void triggerbot( user_cmd_t* cmd ); + + private: + struct aim_record_t { + vec3_t m_viewangles; + float m_time; + }; + + struct lag_record_t { + int m_tickcount{ }; + vec3_t m_position{ }; + matrix3x4 m_matrix[ 128 ]{ }; + + bool is_valid( ); + }; + class c_lagcomp { + public: + friend class c_legitbot; + using lag_deque_t = std::deque< lag_record_t >; + + lag_record_t* find_best_record( int ent_index ); + vec3_t get_backtracked_position( int ent_index ); + auto& get_records( int ent_index ) { + return m_data[ ent_index ]; + } + + void store( ); + void operator()( user_cmd_t* cmd ); + + private: + bool backtrack_entity( int ent_index ); + bool can_backtrack_entity( int ent_index ); + void store_player( int ent_index ); + + lag_deque_t m_data[ 65 ]; + user_cmd_t* m_cmd; + }; + + vec2_t angle_to_pixels( const vec3_t& angle ); + vec3_t pixels_to_angle( const vec2_t& pixel ); + void aimbot( float* x, float* y ); + void assist( c_base_player* player, float* x, float* y ); + void aim_at_target( c_base_player*, float*, float* ); + + bool update_settings( ); + float get_avg_delta( ); + int get_aim_target( float fov = 0.f ); + + private: + float m_deltatime{ }; + float m_curtime{ }; + bool m_aiming{ }; + + std::deque< aim_record_t > m_angle_samples; + + public: + c_lagcomp m_lagcomp; + }; +} \ No newline at end of file diff --git a/cheat/tf2/aim_lagcomp.cpp b/cheat/tf2/aim_lagcomp.cpp new file mode 100644 index 0000000..e3b5486 --- /dev/null +++ b/cheat/tf2/aim_lagcomp.cpp @@ -0,0 +1,150 @@ +#include "aim.h" +#include "interfaces.h" +#include "ctx.hpp" +#include "settings.h" +#include "math.h" +#include "base_cheat.h" +#include "input_system.hpp" +#include "d3d.hpp" + +namespace features +{ + bool c_legitbot::lag_record_t::is_valid( ) { + return util::is_tick_valid( m_tickcount ); + } + + void c_legitbot::c_lagcomp::store_player( int ent_index ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( ent_index ); + vec3_t pos = ent->get_hitbox_position( 0 ); + int tickcount = TIME_TO_TICKS( ent->m_flSimulationTime( ) ); + + lag_record_t new_record; + if( ent->ce( )->setup_bones( new_record.m_matrix, 128, 0x100, 0.f ) ) { + new_record.m_position = pos; + new_record.m_tickcount = tickcount; + + m_data[ ent_index ].push_front( new_record ); + } + + while( !m_data[ ent_index ].empty( ) && + ( m_data[ ent_index ].size( ) > TIME_TO_TICKS( 1.0f ) ) ) { + m_data[ ent_index ].pop_back( ); + } + } + + bool c_legitbot::c_lagcomp::can_backtrack_entity( int ent_index ) { + if( m_data[ ent_index ].empty( ) ) { + return false; + } + + for( auto& it : m_data[ ent_index ] ) { + if( it.is_valid( ) ) return true; + } + + return false; + } + + c_legitbot::lag_record_t* c_legitbot::c_lagcomp::find_best_record( int ent_index ) { + c_legitbot::lag_record_t* best_record = nullptr; + float best_fov{ g_settings.legit.backtracking_fov( ) }; + vec3_t cur_angle; + vec3_t aim_angle; + vec3_t aim_pos; + vec3_t cur_pos; + int cur_tick; + + if( m_data[ ent_index ].empty( ) ) { + return nullptr; + } + + cl.m_engine( )->GetViewAngles( cur_angle ); + cur_pos = g_ctx.m_local->get_eye_pos( ); + cur_tick = cl.m_globals->tickcount; + + for( auto& it : m_data[ ent_index ] ) { + int delta = std::abs( cur_tick - it.m_tickcount ); + + auto nci = cl.m_engine( )->GetNetChannelInfo( ); + if( nci ) { + float max_latency = g_settings.legit.backtracking_time + nci->GetLatency( 0 ); + if( delta > TIME_TO_TICKS( max_latency ) ) + continue; + } + + + if( !it.is_valid( ) ) + continue; + + aim_pos = it.m_position; + aim_angle = math::vector_angles( cur_pos, aim_pos ).clamp( ); + + float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); + if( fov < best_fov ) { + best_fov = fov; + best_record = ⁢ + } + } + + return best_record; + } + + vec3_t c_legitbot::c_lagcomp::get_backtracked_position( int ent_index ) { + if( !m_data[ ent_index ].size( ) ) return vec3_t( ); + auto lag_record = find_best_record( ent_index ); + + vec3_t last_position{ }; + for( auto& it : util::reverse_iterator( m_data[ ent_index ] ) ) { + if( it.is_valid( ) ) last_position = it.m_position; break; + } + + return lag_record ? lag_record->m_position : last_position; + } + + void c_legitbot::c_lagcomp::store( ) { + for( int i = 1; i < 65; ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + + if( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { + store_player( i ); + } + else { + m_data[ i ].clear( ); + } + } + } + + bool c_legitbot::c_lagcomp::backtrack_entity( int ent_index ) { + if( !m_cmd ) return false; + + if( !can_backtrack_entity( ent_index ) ) return false; + + auto best_record = find_best_record( ent_index ); + + if( best_record ) { + m_cmd->m_tick_count = best_record->m_tickcount; + return true; + } + + return false; + } + + void c_legitbot::c_lagcomp::operator()( user_cmd_t* cmd ) { + if( !g_settings.legit.enabled( ) || !g_settings.legit.backtracking( ) ) + return; + + m_cmd = cmd; + store( ); + + auto target = g_cheat.aim.get_aim_target( g_settings.legit.backtracking_fov( ) ); + bool active = false; + + if( g_settings.legit.activation_type( ) == 0 ) + active = true; + if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) + active = true; + + if( active && target != -1 ) { + backtrack_entity( target ); + } + } +} \ No newline at end of file diff --git a/cheat/tf2/base_cheat.h b/cheat/tf2/base_cheat.h new file mode 100644 index 0000000..832386c --- /dev/null +++ b/cheat/tf2/base_cheat.h @@ -0,0 +1,22 @@ +#pragma once +#include "aim.h" +#include "movement.h" +#include "prediction.h" +#include "visuals.hpp" +#include "chams.h" +#include "identity.h" +#include "extra.h" +namespace tf2 { + class c_base_cheat { + public: + features::c_legitbot aim; + features::c_movement movement; + features::c_prediction prediction; + features::c_visuals visuals; + features::c_chams chams; + features::c_identity identity; + features::c_extra extra; + }; +} + +static tf2::c_base_cheat g_cheat; \ No newline at end of file diff --git a/cheat/tf2/chams.cpp b/cheat/tf2/chams.cpp new file mode 100644 index 0000000..fc5c060 --- /dev/null +++ b/cheat/tf2/chams.cpp @@ -0,0 +1,321 @@ +#include "chams.h" +#include "interfaces.h" +#include "d3d.hpp" +#include "ctx.hpp" +#include "hooks.h" +#include "settings.h" + +static auto chams_mat = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white" + "$model" "1" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$envmapcontrast" ".4" + "$envmapsaturation" "1.0" + "$flat" "0" + "$nocull" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" + "$phong" "1" + "$phongexponent" "255.0" + "$normalmapalphaenvmask" "1" + "$phongboost" "6.0" + "$phongfresnelranges" "[0 0.5 1]" + "$BasemapAlphaPhongMask" "1" +})" +) ); + +static auto chams_mat_shine = xors_raw( ( + R"("VertexLitGeneric" +{ + "$basetexture" "vgui/white" + "$envmap" "env_cubemap" + "$envmaptint" "[.3 .3 .3]" + "$reflectivity" "[1.0 1.0 1.0]" + "$envmapcontrast" ".4" + "$envmapsaturation" "1.0" + "$model" "1" + "$flat" "0" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +static auto chams_mat_flat = xors_raw( ( + R"("UnlitGeneric" +{ + "$basetexture" "vgui/white" + "$model" "1" + "$flat" "1" + "$nocull" "1" + "$selfillum" "1" + "$halflambert" "1" + "$nofog" "1" + "$ignorez" "0" + "$znearer" "0" + "$wireframe" "0" +})" +) ); + +namespace features +{ + void c_materials::make_cham_buffer( char* buf, int len, int type ) { + switch( type ) { + case 1: + sprintf_s( buf, len - 1, chams_mat_flat.decrypt( ) ); + break; + case 2: + sprintf_s( buf, len - 1, chams_mat_shine.decrypt( ) ); + break; + default: + sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); + } + } + + void c_material::init( const char* name, const char* buf ) { + m_keyvalues = new KeyValues( name ); + m_keyvalues->LoadFromBuffer( name, buf ); + + // CreateMaterial already increments ref counter + m_mat = cl.m_mat_system( )->CreateMaterial( name, m_keyvalues ); + } + + void c_material::destroy( ) { + if( m_mat ) { + m_mat->DecrementReferenceCount( ); + m_mat = nullptr; + } + + if( m_keyvalues ) { + delete m_keyvalues; + m_keyvalues = nullptr; + } + } + + void c_materials::force_material( IMaterial* mat, fclr_t clr ) { + if( !mat ) return; + + float col[ ] = { clr.r( ), clr.g( ), clr.b( ) }; + cl.m_render_view( )->SetBlend( clr.a( ) ); + cl.m_render_view( )->SetColorModulation( col ); + + cl.m_model_render( )->ForcedMaterialOverride( mat ); + } + + void c_materials::initialize_materials( ) { + char buffer[ 1024 ]; + + make_cham_buffer( buffer, sizeof( buffer ), 0 ); + m_chams.init( xors( "chamsmat" ), buffer ); + memset( buffer, 0, 1024 ); + + make_cham_buffer( buffer, sizeof( buffer ), 1 ); + m_chams_flat.init( xors( "chamsmat_flat" ), buffer ); + memset( buffer, 0, 1024 ); + m_initialized = true; + } + + void c_materials::destroy_materials( ) { + m_initialized = false; + + m_chams.destroy( ); + m_chams_flat.destroy( ); + } + + void c_materials::update_materials( ) { + if( !m_initialized ) return; + if( m_chams.m_mat->m_ref_count <= 0 ) return; + + static float last_reflectivity{ }; + static float last_shine{ }; + static KeyValues* reflectivity; + static KeyValues* shine; + + if( !reflectivity ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_iDataType != 1 ) continue; + if( strstr( it->m_sValue, xors( "[.3 .3 .3]" ) ) ) { + reflectivity = it; + } + } + } + + if( !shine ) { + for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { + if( it->m_flValue == 6.0f ) + shine = it; + } + } + + if( reflectivity ) { + if( last_reflectivity != g_settings.visuals.chams.reflectivity( ) ) { + char buf[ 32 ]; + sprintf_s< 32 >( buf, xors( "[%1.1f %1.1f %1.1f]" ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ), + g_settings.visuals.chams.reflectivity( ) ); + + strcpy( reflectivity->m_sValue, buf ); + m_chams.m_mat->Refresh( ); + } + last_reflectivity = g_settings.visuals.chams.reflectivity( ); + } + + if( shine ) { + if( last_shine != g_settings.visuals.chams.shine( ) ) { + shine->m_flValue = g_settings.visuals.chams.shine( ) * 100.f; + m_chams.m_mat->Refresh( ); + } + last_shine = g_settings.visuals.chams.shine( ); + } + } + + void c_chams::d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { + static auto d3d_draw = cl.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); + + int team = ent->m_iTeamNum( ); + clr_t visible_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_visible_friendly( ) : g_settings.visuals.chams.color_visible_enemy( ); + clr_t hidden_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_hidden_friendly( ) : g_settings.visuals.chams.color_hidden_enemy( ); + + if( team == g_ctx.m_local->m_iTeamNum( ) && !g_settings.visuals.chams.friendlies ) + return; + + fclr_t fcol_vis = visible_col.to_fclr( ); + float value_vis[ 4 ] = { fcol_vis.r( ), fcol_vis.g( ), fcol_vis.b( ), fcol_vis.a( ) }; + + fclr_t fcol_hid = hidden_col.to_fclr( ); + float value_hid[ 4 ] = { fcol_hid.r( ), fcol_hid.g( ), fcol_hid.b( ), fcol_hid.a( ) }; + + float def[ 4 ] = { 1.f, 1.f, 1.f, 1.f }; + + IDirect3DBaseTexture9* prev_texture; + IDirect3DSurface9* prev_surface; + ulong_t z_enable; + + g_d3d.get_device( )->GetTexture( 0, &prev_texture ); + g_d3d.get_device( )->GetRenderTarget( 0, &prev_surface ); + g_d3d.get_device( )->GetRenderState( D3DRS_ZENABLE, &z_enable ); + + auto hr = g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); + + //printf( "hr: %08x\n", hr ); + + if( g_settings.visuals.chams.ignore_z ) { + g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, false ); + g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); + g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_hid, 1 ); + //g_d3d.get_device( )->SetTexture( 0, nullptr ); + d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); + } + + g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); + g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); + g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_vis, 1 ); + //g_d3d.get_device( )->SetTexture( 0, nullptr ); + + d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); + + g_d3d.get_device( )->SetPixelShaderConstantF( 0, def, 1 ); + g_d3d.get_device( )->SetPixelShaderConstantF( 1, def, 1 ); + g_d3d.get_device( )->SetRenderTarget( 0, prev_surface ); + g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); + + g_d3d.get_device( )->SetTexture( 0, prev_texture ); + + if( prev_texture ) + prev_texture->Release( ); + + if( prev_surface ) + prev_surface->Release( ); + } + + void c_chams::d3d_render_textures( ) { + if( !g_d3d.m_sil_txt ) + return; + + IDirect3DSurface9* backbuffer; + D3DSURFACE_DESC desc; + + g_d3d.get_device( )->GetRenderTarget( 0, &backbuffer ); + backbuffer->GetDesc( &desc ); + //backbuffer->Release( ); + + struct tex_vertex { + float x, y, z, r, h, w; + }; + + tex_vertex v[ ] = { + { 0.f, 0.f, 0.f, 1.0f, 0.f, 0.f }, + { ( float )desc.Width, 0.f, 0.f, 1.0f, 1.0f, 0.f }, + { 0.f, ( float )desc.Height, 0.f, 1.0f, 0.0f, 1.0f }, + { ( float )desc.Width, ( float )desc.Height, 0.f, 1.0f, 1.0f, 1.0f } + }; + + void* p; + + g_d3d.m_buffer->Lock( 0, 0, &p, 0 ); + memcpy( p, v, sizeof( v ) ); + g_d3d.m_buffer->Unlock( ); + + void* pixel_shader; + void* texture; + void* stream_src; + uint32_t stride; + uint32_t offset; + ulong_t fvf; + ulong_t dest_blend; + ulong_t alpha_blend; + + g_d3d.get_device( )->GetPixelShader( ( IDirect3DPixelShader9** )&pixel_shader ); + g_d3d.get_device( )->GetTexture( 0, ( IDirect3DBaseTexture9** )&texture ); + g_d3d.get_device( )->GetStreamSource( 0, ( IDirect3DVertexBuffer9** )&stream_src, &offset, &stride ); + g_d3d.get_device( )->GetFVF( &fvf ); + g_d3d.get_device( )->GetRenderState( D3DRS_DESTBLEND, &dest_blend ); + g_d3d.get_device( )->GetRenderState( D3DRS_ALPHABLENDENABLE, &alpha_blend ); + + g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); + g_d3d.get_device( )->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); + g_d3d.get_device( )->SetPixelShader( nullptr ); + g_d3d.get_device( )->SetTexture( 0, g_d3d.m_sil_txt ); + g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); + + g_d3d.get_device( )->SetStreamSource( 0, g_d3d.m_buffer, 0, sizeof( tex_vertex ) ); + g_d3d.get_device( )->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); + + //D3DXSaveSurfaceToFileA( "backbuffer_1.bmp", D3DXIFF_BMP, backbuffer, 0, 0 ); + //D3DXSaveSurfaceToFileA( "backbuffer_2.bmp", D3DXIFF_BMP, g_d3d.m_surface, 0, 0 ); + + + D3DRECT bar_rect{ }; + D3DCOLOR col{ }; + + bar_rect.x1 = 0; + bar_rect.y1 = 0; + bar_rect.x2 = desc.Width; + bar_rect.y2 = desc.Height; + + g_d3d.get_device( )->SetPixelShader( ( IDirect3DPixelShader9* )pixel_shader ); + g_d3d.get_device( )->SetTexture( 0, ( IDirect3DTexture9* )texture ); + g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, dest_blend ); + g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, alpha_blend ); + g_d3d.get_device( )->SetStreamSource( 0, ( IDirect3DVertexBuffer9* )stream_src, offset, stride ); + g_d3d.get_device( )->SetFVF( fvf ); + + //g_d3d.get_device( )->Clear( 1, &bar_rect, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, col, 0, 0 ); + g_d3d.get_device( )->SetRenderTarget( 0, backbuffer ); + backbuffer->Release( ); + + + } +} \ No newline at end of file diff --git a/cheat/tf2/chams.h b/cheat/tf2/chams.h new file mode 100644 index 0000000..4fdc74b --- /dev/null +++ b/cheat/tf2/chams.h @@ -0,0 +1,49 @@ +#pragma once + +#include "sdk.h" + +namespace features +{ + enum ChamBufferType_t { + TYPE_NORMAL, + TYPE_FLAT, + TYPE_SHINE + }; + + class c_material { + public: + c_material( ) = default; + + void init( const char* mat, const char* buf ); + void destroy( ); + + operator IMaterial*( ) { + return m_mat; + } + + public: + IMaterial * m_mat; + KeyValues* m_keyvalues; + }; + + class c_materials { + public: + c_material m_chams{ }; + c_material m_chams_flat{ }; + + void make_cham_buffer( char* buf, int len, int type ); //type, 0 = normal, 1 = flat, 2 = shine + public: + void initialize_materials( ); + void destroy_materials( ); + void force_material( IMaterial* material, fclr_t color ); + void update_materials( ); + bool m_initialized{ }; + }; + + class c_chams { + public: + c_materials m_materials; + void d3d_render_textures( ); + void d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ); + }; +} \ No newline at end of file diff --git a/cheat/tf2/checksum_crc.cpp b/cheat/tf2/checksum_crc.cpp new file mode 100644 index 0000000..a2ac9e8 --- /dev/null +++ b/cheat/tf2/checksum_crc.cpp @@ -0,0 +1,169 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Generic CRC functions +// +//=============================================================================// + + +#include "checksum_crc.h" + +#define CRC32_INIT_VALUE 0xFFFFFFFFUL +#define CRC32_XOR_VALUE 0xFFFFFFFFUL + +#define NUM_BYTES 256 +static const CRC32_t pulCRCTable[ NUM_BYTES ] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +void CRC32_Init( CRC32_t *pulCRC ) { + *pulCRC = CRC32_INIT_VALUE; +} + +void CRC32_Final( CRC32_t *pulCRC ) { + *pulCRC ^= CRC32_XOR_VALUE; +} + +CRC32_t CRC32_GetTableEntry( unsigned int slot ) { + return pulCRCTable[ ( unsigned char )slot ]; +} + +void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *pBuffer, int nBuffer ) { + CRC32_t ulCrc = *pulCRC; + unsigned char *pb = ( unsigned char * )pBuffer; + unsigned int nFront; + int nMain; + +JustAfew: + + switch( nBuffer ) { + case 7: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 6: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 5: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 4: + ulCrc ^= *( CRC32_t * )pb; + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + *pulCRC = ulCrc; + return; + + case 3: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 2: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 1: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + + case 0: + *pulCRC = ulCrc; + return; + } + + // We may need to do some alignment work up front, and at the end, so that + // the main loop is aligned and only has to worry about 8 byte at a time. + // + // The low-order two bits of pb and nBuffer in total control the + // upfront work. + // + nFront = ( ( unsigned int )pb ) & 3; + nBuffer -= nFront; + switch( nFront ) { + case 3: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + case 2: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + case 1: + ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + } + + nMain = nBuffer >> 3; + while( nMain-- ) { + ulCrc ^= *( CRC32_t * )pb; + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc ^= *( CRC32_t * )( pb + 4 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); + pb += 8; + } + + nBuffer &= 7; + goto JustAfew; +} diff --git a/cheat/tf2/checksum_crc.h b/cheat/tf2/checksum_crc.h new file mode 100644 index 0000000..d95b4c5 --- /dev/null +++ b/cheat/tf2/checksum_crc.h @@ -0,0 +1,30 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Generic CRC functions +// +// $NoKeywords: $ +//=============================================================================// +#ifndef CHECKSUM_CRC_H +#define CHECKSUM_CRC_H +#ifdef _WIN32 +#pragma once +#endif + +typedef unsigned int CRC32_t; + +void CRC32_Init( CRC32_t *pulCRC ); +void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *p, int len ); +void CRC32_Final( CRC32_t *pulCRC ); +CRC32_t CRC32_GetTableEntry( unsigned int slot ); + +inline CRC32_t CRC32_ProcessSingleBuffer( const void *p, int len ) { + CRC32_t crc; + + CRC32_Init( &crc ); + CRC32_ProcessBuffer( &crc, p, len ); + CRC32_Final( &crc ); + + return crc; +} + +#endif // CHECKSUM_CRC_H diff --git a/cheat/tf2/chl_createmove.cpp b/cheat/tf2/chl_createmove.cpp new file mode 100644 index 0000000..581ed25 --- /dev/null +++ b/cheat/tf2/chl_createmove.cpp @@ -0,0 +1,93 @@ +#include + +#include "hooks.h" +#include "mem.hpp" +#include "interfaces.h" +#include "ctx.hpp" +#include "input_system.hpp" +#include "math.h" +#include "settings.h" +#include "base_cheat.h" + +//YEA FUCK USING THIS EVEN THOUGH I HAVE IT RIGHT HERE + +//YEA VIVA LA REVOLUTION + +void __declspec( naked ) __stdcall hooks::hl_create_move_gate( int sequence_number, float input_sample_time, bool active ) { + __asm { + push ebp + mov ebp, esp + push ebx //push ebx (sendpacket) to the top of the stack + push esp //push the stack (with sendpacket on top) + push active + push input_sample_time + push sequence_number + call hl_create_move + pop ebx + pop ebp + ret 0xc + } +} + +void __fastcall hooks::hl_create_move( void* ecx_, void* edx_, int sequence_number, float input_sameple_frametime, bool active, byte& sendpacket ) { + static auto create_move_o = cl.m_chl->get_old_function< void( __fastcall* )( void*, void*, int, float, bool ) >( 21 ); + + user_cmd_t* ucmd = &cl.m_hl_input->m_pCommands[ sequence_number % MULTIPLAYER_BACKUP ]; + if( !ucmd ) + return; + + verified_cmd_t* verified_cmd = &cl.m_hl_input->m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ]; + if( !verified_cmd ) + return; + + // when switching to non automatic weapons, it will sometimes not shoot when aimbotting so we reset attack flag + bool is_switching_weapon = false; + if( cl.m_hl_input->m_hSelectedWeapon != -1 ) { + is_switching_weapon = true; + } + + cl.m_hl_input->CreateMove( sequence_number, input_sameple_frametime, active ); + //hl_create_move_o( ecx_, edx_, sequence_number, input_sample_time, active ); + + if( !ucmd->m_tick_count || !ucmd->m_cmd_nr ) + return; + + // FIX ME NAVE + // ok love + + byte* send_packet = &sendpacket; + + g_ctx.create_snapshot( ucmd ); + // soon g_cheat.m_identity( ); + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + static int last_frame = cl.m_globals->framecount; + if( last_frame != cl.m_globals->framecount ) + g_ctx.m_has_fired_this_frame = false; + + last_frame = cl.m_globals->framecount; + + g_cheat.aim.sample_angle_data( ucmd->m_viewangles ); + g_cheat.prediction.run_prediction( ucmd ); + g_cheat.movement.update( ucmd ); + + g_cheat.aim.m_lagcomp( ucmd ); + g_cheat.aim.triggerbot( ucmd ); + + } + + + if( is_switching_weapon ) { + ucmd->m_buttons &= ~IN_ATTACK; + } + + //m_bIsValveDS + if( *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ) + g_settings.menu.anti_untrusted = true; + + ucmd->clamp( g_settings.menu.anti_untrusted ); + + // crc stuff works, no double steps coming from this + verified_cmd->m_cmd = *ucmd; + verified_cmd->m_crc = ucmd->get_check_sum( ); +} \ No newline at end of file diff --git a/cheat/tf2/clientmode_createmove.cpp b/cheat/tf2/clientmode_createmove.cpp new file mode 100644 index 0000000..f86471e --- /dev/null +++ b/cheat/tf2/clientmode_createmove.cpp @@ -0,0 +1,53 @@ +#include "hooks.h" +#include "interfaces.h" +#include "search.h" +#include "base_cheat.h" +#include +#include "mem.hpp" +#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) +bool __fastcall hooks::create_move( void *ecx_, void *edx_, float input_sample_time, user_cmd_t *ucmd ) { + static auto create_move_o = cl.m_clientmode->get_old_function< decltype( hooks::create_move )* >( 21 ); + + if( cl.m_panic || !ucmd->m_cmd_nr || !ucmd->m_tick_count ) { + return create_move_o( ecx_, edx_, input_sample_time, ucmd ); + } + + // call from CInput::CreateMove, mimic what the engine does. + cl.m_engine( )->SetViewAngles( ucmd->m_viewangles ); + + // random_seed isn't generated in ClientMode::CreateMove yet (since CInput::CreateMove handles that), we must generate it ourselves. + ucmd->m_random_seed = math::md5_pseudorandom( ucmd->m_cmd_nr ) & 0x7fffffff; + + //get sendpacket off the stack + stack_t stack( get_baseptr( ) ); + byte *send_packet = stack.next( ).local< byte* >( 0x1C ); + + g_ctx.create_snapshot( ucmd ); + + cl.m_engine( )->SetViewAngles( ucmd->m_viewangles ); + g_ctx.calculate_tickbase( ); + + //bool* send_packet = ***get_ebp< bool**** >( ) - 0x1; + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + static int last_frame = cl.m_globals->framecount; + if( last_frame != cl.m_globals->framecount ) + g_ctx.m_has_fired_this_frame = false; + + last_frame = cl.m_globals->framecount; + + g_cheat.aim.sample_angle_data( ucmd->m_viewangles ); + //g_cheat.prediction.run_prediction( ucmd ); + g_cheat.movement.update( ucmd ); + + g_cheat.aim.m_lagcomp( ucmd ); + g_cheat.aim.triggerbot( ucmd ); + + + + } + + + ucmd->clamp( ); + return false; +} \ No newline at end of file diff --git a/cheat/tf2/color.hpp b/cheat/tf2/color.hpp new file mode 100644 index 0000000..5ea9454 --- /dev/null +++ b/cheat/tf2/color.hpp @@ -0,0 +1,278 @@ +#pragma once +#include +#include + +//this is a fucking mess + +class fclr_t { + float R, G, B, A; +public: + fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } + + fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + float& r( ) { return R; } + float& g( ) { return G; } + float& b( ) { return B; } + float& a( ) { return A; } + + fclr_t& operator =( fclr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + fclr_t operator+( const fclr_t& v ) const { + return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + bool operator==( fclr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; + +class clr_t { + uint8_t R, G, B, A; +public: + clr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + uint8_t& r( ) { return R; } + uint8_t& g( ) { return G; } + uint8_t& b( ) { return B; } + uint8_t& a( ) { return A; } + + clr_t& operator =( clr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + clr_t operator+( const clr_t& v ) const { + return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + clr_t operator*( float f ) { + return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + float brightness( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if( R >= max ) + out.h = static_cast( G - B ) / delta; + else if( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if( out.h < 0.0f ) + out.h += 360.0f; + + return out.v; + } + + float saturation( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if( R >= max ) + out.h = static_cast( G - B ) / delta; + else if( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if( out.h < 0.0f ) + out.h += 360.0f; + + return out.s; + } + + static clr_t from_hsb( float hue, float saturation, float brightness ) { + float h = hue == 1.0f ? 0 : hue * 6.0f; + float f = h - ( int )h; + float p = brightness * ( 1.0f - saturation ); + float q = brightness * ( 1.0f - saturation * f ); + float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); + + if( h < 1 ) { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if( h < 2 ) { + return clr_t( + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if( h < 3 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ) + ); + } + else if( h < 4 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else if( h < 5 ) { + return clr_t( + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ) + ); + } + } + + static clr_t blend( clr_t first, clr_t second, float t ) { + return clr_t( + first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), + first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), + first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), + first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) + ); + } + + float hue( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + float min, max, delta; + + min = static_cast< float >( R < G ? R : G ); + min = static_cast< float >( min < B ? min : B ); + + max = static_cast< float >( R > G ? R : G ); + max = static_cast< float >( max > B ? max : B ); + + out.v = max; + delta = max - min; + if( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if( max > 0.0f ) { + out.s = ( delta / max ); + } + else { + out.s = 0.0f; + out.h = ( float )NAN; + return out.h; + } + if( R >= max ) + out.h = static_cast< float >( G - B ) / delta; + else + if( G >= max ) + out.h = 2.0f + static_cast< float >( B - R ) / delta; + else + out.h = 4.0f + static_cast< float >( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if( out.h < 0.0f ) + out.h += 360.0f; + + return out.h; + } + + fclr_t to_fclr( ) { + return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; + } + + operator fclr_t( ) { + return this->to_fclr( ); + } + + bool operator==( clr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/con_alias.hpp b/cheat/tf2/con_alias.hpp new file mode 100644 index 0000000..c943c24 --- /dev/null +++ b/cheat/tf2/con_alias.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include +#include "simple_settings.h" + +template< typename var_type = bool > +class con_alias : public ISetting { +public: + con_alias( hash_t hash, con_var< var_type >* var ) : + m_var( var ), + m_value( var_type{ } ), + m_name( hash ), + m_is_var( true ) { }; + + con_alias( hash_t hash ) : + m_name( hash ), + m_value( 0 ), + m_var( nullptr ), + m_is_var( false ) { }; + + con_alias( hash_t hash, var_type&& rhs ) : + m_name( hash ), + m_value( rhs ), + m_var( nullptr ), + m_is_var( false ) { }; + + virtual std::string get_string( ) override { + if( m_is_var ) + return m_var->get_string( ); + else + return std::to_string( m_value ); + } + + virtual void set_value( int value ) override { + set_value_internal( value ); + } + + virtual void set_value( float value ) override { + set_value_internal( value ); + } + + virtual void set_value( ulong_t value ) override { + set_value_internal( value ); + } + +private: + template < typename t > + void set_value_internal( t&& val ) { + if( m_is_var ) + m_var->set( val ); + else + m_value = ( var_type )( val ); + } + +private: + bool m_is_var; + hash_t m_name; + var_type m_value; + con_var< var_type >* m_var; +}; \ No newline at end of file diff --git a/cheat/tf2/con_fn.hpp b/cheat/tf2/con_fn.hpp new file mode 100644 index 0000000..3c06e9b --- /dev/null +++ b/cheat/tf2/con_fn.hpp @@ -0,0 +1,172 @@ +#pragma once +#include + +#include "simple_settings.h" + +//KEEP THIS UP TO DATE!! +enum ConFnVarType_t { + TYPE_NULL = 0, + TYPE_FLOAT = 'F', + TYPE_STRING = 'S', + TYPE_INTEGER = 'D', + TYPE_HEX = 'X' +}; + +class con_fn_base { +public: + virtual bool execute( const char* str ) = 0; + virtual const char* get_syntax( ) = 0; + virtual hash_t get_hash( ) = 0; +}; + +class con_fn : public con_fn_base { +public: + con_fn( hash_t hash, std::function< void __cdecl( const char*, const char* ) > function, const char* syntax ) { + m_hash = hash; + m_function = function; + strcpy_s< 64 >( m_syntax, syntax ); + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + m_args++; + } + } + } + + static ConFnVarType_t get_var_type( size_t arg, const char* syntax ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( syntax ); ++i ) { + if( syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + template < typename t > + static t get_arg( const char* str, size_t arg_index, const char* syntax ) { + auto arg_type = get_var_type( arg_index, syntax ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + if( cur_arg++ == arg_index ) { + size_t start = i + 1; + size_t end = strlen( str ); + for( size_t i2 = start; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + break; + } + } + + std::string str( str + start, end - start ); + + char* end_ptr = ( char* )str.c_str( ) + end; + if constexpr( std::is_integral_v< t > ) { + auto radix = get_var_type( arg_index, syntax ) == TYPE_HEX ? 16 : 10; + return std::strtol( str.c_str( ), &end_ptr, radix ); + } + + if constexpr( std::is_floating_point_v< t > ) { + return std::strtof( str.c_str( ), &end_ptr ); + } + + return ( t )str.c_str( ); + } + } + } + + return t{ }; + } + + virtual const char* get_syntax( ) override { + return m_syntax; + } + + virtual hash_t get_hash( ) override { + return m_hash; + } + + ConFnVarType_t get_var_type( size_t arg ) { + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( m_syntax ); ++i ) { + if( m_syntax[ i ] == '%' ) { + if( cur_arg++ == arg ) { + return ( ConFnVarType_t )( m_syntax[ i + 1 ] ); + } + } + } + + return TYPE_NULL; + } + + //returns false on failed execution + virtual bool execute( const char* str ) override { + size_t arg_count{ }; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + arg_count++; + } + } + + if( arg_count != m_args ) { + return false; + } + + std::string pass_str( " " ); + + size_t cur_arg = 0; + for( size_t i{ }; i < strlen( str ); ++i ) { + if( str[ i ] == ' ' ) { + size_t end = strlen( str ); + for( size_t i2 = i + 2; i2 < strlen( str ); ++i2 ) { + if( str[ i2 ] == ' ' ) { + end = i2; + } + } + + char* end_ptr = ( char* )( str + i + end ); + switch( get_var_type( cur_arg ) ) { + case TYPE_FLOAT: { + pass_str += std::to_string( strtof( str + i, &end_ptr ) ); + break; + } + case TYPE_INTEGER: { + pass_str += std::to_string( strtol( str + i, &end_ptr, 10 ) ); + break; + } + case TYPE_HEX: { + char buf[ 10 ]; + sprintf_s< 10 >( buf, "%08x", strtol( str + i, &end_ptr, 16 ) ); + pass_str += buf; + break; + } + case TYPE_STRING: { + std::string add_str( str + i, end - i ); + pass_str += add_str; + break; + } + default: + return false; + } + + if( end != strlen( str ) ) { + pass_str += ' '; + } + ++cur_arg; + } + } + + m_function( pass_str.c_str( ), m_syntax ); + return true; + } + +private: + hash_t m_hash{ }; + size_t m_args{ }; + char m_syntax[ 64 ]{ }; + std::function< void( __cdecl )( const char*, const char* ) > m_function{ }; +}; \ No newline at end of file diff --git a/cheat/tf2/conditions.h b/cheat/tf2/conditions.h new file mode 100644 index 0000000..331ad6d --- /dev/null +++ b/cheat/tf2/conditions.h @@ -0,0 +1,106 @@ +#pragma once + +enum MoveType_t { + MOVETYPE_NONE = 0, + MOVETYPE_ISOMETRIC, + MOVETYPE_WALK, + MOVETYPE_STEP, + MOVETYPE_FLY, + MOVETYPE_FLYGRAVITY, + MOVETYPE_VPHYSICS, + MOVETYPE_PUSH, + MOVETYPE_NOCLIP, + MOVETYPE_LADDER, + MOVETYPE_OBSERVER, + MOVETYPE_CUSTOM, + + MOVETYPE_LAST = MOVETYPE_CUSTOM, + + MOVETYPE_MAX_BITS = 4, +}; + +enum TFConditions_t { + TFCond_Slowed = ( 1 << 0 ), + TFCond_Zoomed = ( 1 << 1 ), + TFCond_Disguising = ( 1 << 2 ), + TFCond_Disguised = ( 1 << 3 ), + TFCond_Cloaked = ( 1 << 4 ), + TFCond_Ubercharged = ( 1 << 5 ), + TFCond_TeleportedGlow = ( 1 << 6 ), + TFCond_Taunting = ( 1 << 7 ), + TFCond_UberchargeFading = ( 1 << 8 ), + TFCond_CloakFlicker = ( 1 << 9 ), + TFCond_Teleporting = ( 1 << 10 ), + TFCond_Kritzkrieged = ( 1 << 11 ), + TFCond_TmpDamageBonus = ( 1 << 12 ), + TFCond_DeadRingered = ( 1 << 13 ), + TFCond_Bonked = ( 1 << 14 ), + TFCond_Stunned = ( 1 << 15 ), + TFCond_Buffed = ( 1 << 16 ), + TFCond_Charging = ( 1 << 17 ), + TFCond_DemoBuff = ( 1 << 18 ), + TFCond_CritCola = ( 1 << 19 ), + TFCond_InHealRadius = ( 1 << 20 ), + TFCond_Healing = ( 1 << 21 ), + TFCond_OnFire = ( 1 << 22 ), + TFCond_Overhealed = ( 1 << 23 ), + TFCond_Jarated = ( 1 << 24 ), + TFCond_Bleeding = ( 1 << 25 ), + TFCond_DefenseBuffed = ( 1 << 26 ), + TFCond_Milked = ( 1 << 27 ), + TFCond_MegaHeal = ( 1 << 28 ), + TFCond_RegenBuffed = ( 1 << 29 ), + TFCond_MarkedForDeath = ( 1 << 30 ), + TFCond_NoHealingDamageBuff = ( 1 << 31 ), + + TFCondEx_SpeedBuffAlly = ( 1 << 0 ), + TFCondEx_HalloweenCritCandy = ( 1 << 1 ), + TFCondEx_CritCanteen = ( 1 << 2 ), + TFCondEx_CritDemoCharge = ( 1 << 3 ), + TFCondEx_CritHype = ( 1 << 4 ), + TFCondEx_CritOnFirstBlood = ( 1 << 5 ), + TFCondEx_CritOnWin = ( 1 << 6 ), + TFCondEx_CritOnFlagCapture = ( 1 << 7 ), + TFCondEx_CritOnKill = ( 1 << 8 ), + TFCondEx_RestrictToMelee = ( 1 << 9 ), + TFCondEx_DefenseBuffNoCritBlock = ( 1 << 10 ), + TFCondEx_Reprogrammed = ( 1 << 11 ), + TFCondEx_PyroCrits = ( 1 << 12 ), + TFCondEx_PyroHeal = ( 1 << 13 ), + TFCondEx_FocusBuff = ( 1 << 14 ), + TFCondEx_DisguisedRemoved = ( 1 << 15 ), + TFCondEx_MarkedForDeathSilent = ( 1 << 16 ), + TFCondEx_DisguisedAsDispenser = ( 1 << 17 ), + TFCondEx_Sapped = ( 1 << 18 ), + TFCondEx_UberchargedHidden = ( 1 << 19 ), + TFCondEx_UberchargedCanteen = ( 1 << 20 ), + TFCondEx_HalloweenBombHead = ( 1 << 21 ), + TFCondEx_HalloweenThriller = ( 1 << 22 ), + TFCondEx_BulletCharge = ( 1 << 26 ), + TFCondEx_ExplosiveCharge = ( 1 << 27 ), + TFCondEx_FireCharge = ( 1 << 28 ), + TFCondEx_BulletResistance = ( 1 << 29 ), + TFCondEx_ExplosiveResistance = ( 1 << 30 ), + TFCondEx_FireResistance = ( 1 << 31 ), + + TFCondEx2_Stealthed = ( 1 << 0 ), + TFCondEx2_MedigunDebuff = ( 1 << 1 ), + TFCondEx2_StealthedUserBuffFade = ( 1 << 2 ), + TFCondEx2_BulletImmune = ( 1 << 3 ), + TFCondEx2_BlastImmune = ( 1 << 4 ), + TFCondEx2_FireImmune = ( 1 << 5 ), + TFCondEx2_PreventDeath = ( 1 << 6 ), + TFCondEx2_MVMBotRadiowave = ( 1 << 7 ), + TFCondEx2_HalloweenSpeedBoost = ( 1 << 8 ), + TFCondEx2_HalloweenQuickHeal = ( 1 << 9 ), + TFCondEx2_HalloweenGiant = ( 1 << 10 ), + TFCondEx2_HalloweenTiny = ( 1 << 11 ), + TFCondEx2_HalloweenInHell = ( 1 << 12 ), + TFCondEx2_HalloweenGhostMode = ( 1 << 13 ), + TFCondEx2_Parachute = ( 1 << 16 ), + TFCondEx2_BlastJumping = ( 1 << 17 ), + + TFCond_MiniCrits = ( TFCond_Buffed | TFCond_CritCola ), + TFCond_IgnoreStates = ( TFCond_Ubercharged | TFCond_Bonked ), + TFCondEx_IgnoreStates = ( TFCondEx_PyroHeal ) +}; \ No newline at end of file diff --git a/cheat/tf2/console.cpp b/cheat/tf2/console.cpp new file mode 100644 index 0000000..121c57a --- /dev/null +++ b/cheat/tf2/console.cpp @@ -0,0 +1,324 @@ +#include "console.hpp" +#include "interfaces.h" +#include "settings.h" +#include "d3d.hpp" +#include "ui_draw.h" + +std::shared_ptr< console > g_con = std::make_shared< console >( ); + + +void console::draw_text( int x, int y, bool greyed, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, "%s", buf ); + //g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_text( int x, int y, const char* fmt, ... ) { + va_list args; + char buf[ 512 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 512 >( buf, fmt, args ); + __crt_va_end( args ); + + g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); +} + +void console::draw_rect( int x, int y, int w, int h, clr_t col ) { + g_d3d.draw_filled_rect( col, x, y, w, h ); +} + +void console::register_alias( std::shared_ptr< ISetting >& alias ) { + m_aliases.push_back( alias ); +} + +void console::capture_command( ) { + float current_time = GetTickCount( ) * 0.001f; + size_t length = strlen( m_cur_cmd ); + + for( size_t i{ }; i < 0xfe; ++i ) { + if( m_input->is_key_pressed( i ) ) { + float delta_time = current_time - m_last_key_input[ i ]; + if( fabs( delta_time ) > 0.2f ) { + if( i == KEYS_BACK ) { + m_cur_cmd[ length - 1 ] = 0; + m_last_key_input[ i ] = current_time; + continue; + } + + m_key_states[ i ] = 0xf0; + wchar_t pressed_char; + const auto scan = MapVirtualKeyA( i, 2 ); + auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); + + if( ret == 1 ) { + if( length < 200 ) { + m_cur_cmd[ length ] = ( char )( pressed_char ); + m_cur_cmd[ length + 1 ] = 0; + } + } + m_last_key_input[ i ] = current_time; + } + } + else { + m_last_key_input[ i ] = 0.f; + m_key_states[ i ] = 0; + } + } +} + +ISetting* console::find_var( hash_t var ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + if( var == setting->get_hash( ) ) { + return setting; + } + } + + return nullptr; +} + +ISetting* console::find_alias( hash_t alias ) { + for( auto& it : m_aliases ) { + if( it->get_hash( ) == alias ) + return it.get( ); + } + + return nullptr; +} + +con_fn_base* console::find_fn( hash_t name ) { + for( auto& it : m_functions ) { + if( it->get_hash( ) == name ) { + return it; + } + } + + return nullptr; +} + +std::string console::impl_alias_str( std::string str ) { + for( size_t i{ }; i < str.length( ); ++i ) { + if( str[ i ] == ' ' && str[ i + 1 ] != ' ' ) { + size_t end = 0; + for( size_t i2{ i + 1 }; i2 < str.length( ); ++i ) { + if( str[ i2 ] == ' ' ) + end = i2; + } + + if( end ) { + std::string alias_str( str.c_str( ) + i, end - i ); + auto alias = find_alias( hash::fnv1a( alias_str ) ); + if( alias ) { + str.replace( alias_str.begin( ), alias_str.end( ), alias->get_string( ) ); + } + else { + g_con->log( xors( "couldnt find alias %s" ), alias_str.c_str( ) ); + } + } + } + } + + return str; +} + +void console::execute_command( const char* cmd ) { + if( !cmd[ 0 ] ) return; + std::string first_param( cmd, strlen( cmd ) ); + + size_t end{ }; + bool one_arg = true; + for( size_t i{ }; i < strlen( cmd ); ++i ) { + if( cmd[ i ] == ' ' ) { + first_param.resize( i ); + end = i; + one_arg = false; + break; + } + } + + if( one_arg ) { + first_param.resize( first_param.length( ) - 1 ); + } + + //find a command to execute + auto fn = find_fn( hash::fnv1a( first_param ) ); + if( fn ) { + //std::string alias_cmd = impl_alias_str( cmd ); + + if( !fn->execute( cmd ) ) { + log( xors( "invalid syntax" ) ); + } + return; + } + + //command not found, we're managing vars + if( !one_arg ) { + std::string second_param = ( cmd + end + 1 ); + bool is_floating_point = second_param.find( '.' ) != std::string::npos; + auto var = find_var( hash::fnv1a( first_param ) ); + + if( var ) { + auto setting_cast = static_cast< con_var< void* >* >( var ); + if( !setting_cast->is_integral( ) && !setting_cast->is_floating_point( ) ) { + auto value = std::strtol( second_param.c_str( ), 0, 16 ); + printf( xors( "value: %08x\n" ), value ); + var->set( value ); + } + + if( is_floating_point ) { + float value = std::strtof( second_param.c_str( ), 0 ); + var->set( value ); + } + else { + int value = std::strtol( second_param.c_str( ), 0, 10 ); + var->set( value ); + } + log( xors( "%s %s\n" ), first_param.c_str( ), second_param.c_str( ) ); + return; + } + } + + + log( xors( "unknown command: %s" ), first_param.c_str( ) ); +} + +void console::input( ) { + static int drag_x, drag_y; + int cursor_x, cursor_y; + int x = m_x, y = m_y; + bool clicked = m_input->is_key_pressed( KEYS_MOUSE1 ); + static bool is_hovered{ }; + m_input->get_cursor_pos( cursor_x, cursor_y ); + + auto is_top_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + TOP_HEIGHT; + }; + + auto is_window_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y && cursor_y < y + HEIGHT; + }; + + auto is_bottom_hovered = [ &x, &y, + &cursor_x, &cursor_y ]( ) { + return cursor_x > x && cursor_x < x + WIDTH + && cursor_y > y + HEIGHT - TOP_HEIGHT + && cursor_y < y + HEIGHT; + }; + + if( clicked ) { + //m_consuming_input = is_window_hovered( ); + } + + if( !clicked && is_top_hovered( ) ) { + drag_x = cursor_x - m_x; + drag_y = cursor_y - m_y; + } + + if( clicked && is_hovered ) { + is_hovered = true; + m_x = cursor_x - drag_x; + m_y = cursor_y - drag_y; + } + else { + is_hovered = is_top_hovered( ); + } + + if( clicked ) { + m_active = is_bottom_hovered( ); + } + + if( m_active ) { + capture_command( ); + + static bool was_held{ }; + if( m_input->is_key_pressed( KEYS_RETURN ) ) { + if( !was_held ) { + execute_command( m_cur_cmd ); + m_cur_cmd[ 0 ] = 0; + } + was_held = true; + } + else was_held = false; + } +} + +void console::draw( ) { + if( !m_open ) { + m_consuming_input = false; + m_active = false; + return; + } + + static clr_t col = clr_t( 31, 31, 31, 255 ); + + input( ); + + RECT prev_rect{ }; + RECT new_rect{ m_x - 1, m_y - 1, + m_x + WIDTH + 1, m_y + HEIGHT + 1 }; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_rect( m_x - 1, m_y - 1, WIDTH + 2, HEIGHT + 2, ui::ui_get_accent_col( ) ); + draw_rect( m_x, m_y, WIDTH, HEIGHT, col ); + draw_rect( m_x + 1, m_y, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + + draw_rect( m_x + 1, m_y + HEIGHT - TOP_HEIGHT, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); + if( m_active ) { + draw_rect( m_x + 2, m_y + HEIGHT - TOP_HEIGHT + 1, WIDTH - 4, TOP_HEIGHT - 2, clr_t( 31, 31, 31 ) ); + auto fn = find_fn( hash::fnv1a( m_cur_cmd ) ); + if( fn ) { + std::string fn_str = m_cur_cmd; + fn_str += ' '; + fn_str += fn->get_syntax( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, "%s", fn_str.c_str( ) ); + } + + else { + auto var = find_var( hash::fnv1a( m_cur_cmd ) ); + if( var ) { + std::string var_str = m_cur_cmd; + var_str += ' '; + + var_str += var->get_string( ); + + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, var_str.c_str( ) ); + } + } + } + + std::string cur_cmd_str = m_cur_cmd; + if( m_active ) { + cur_cmd_str += '_'; + } + draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, cur_cmd_str.c_str( ) ); + draw_text( m_x + 3, m_y + TOP_HEIGHT / 2 - 3, xors( "console" ) ); + + int cur_y = m_y + HEIGHT - TOP_HEIGHT; + for( int i = m_logs.size( ) - 1; i >= 0; --i ) { + constexpr int LINE_HEIGHT = 14; + auto& log = m_logs.at( i ); + + if( cur_y - LINE_HEIGHT < m_y + TOP_HEIGHT ) { + m_logs.erase( m_logs.begin( ) + i ); + continue; + } + + draw_text( m_x + 2, cur_y -= LINE_HEIGHT, log.m_msg ); + } + + g_d3d.get_device( )->SetScissorRect( &prev_rect ); +} \ No newline at end of file diff --git a/cheat/tf2/console.hpp b/cheat/tf2/console.hpp new file mode 100644 index 0000000..a16ad0f --- /dev/null +++ b/cheat/tf2/console.hpp @@ -0,0 +1,125 @@ +#pragma once +#include +#include +#include +#include + +#include "con_fn.hpp" +#include "con_alias.hpp" +#include "input_system.hpp" +#include "math.h" + +#pragma warning(disable: 4996) + +class console { +public: + console( ) { + m_input = std::make_shared< util::c_input_manager >( ); + } + + static constexpr size_t TOP_HEIGHT = 22; + static constexpr size_t WIDTH = 400; + static constexpr size_t HEIGHT = 450; + + bool m_consuming_input{ }; + bool m_active{ }; + bool m_open{ }; + + struct con_log { + float m_time; + char m_msg[ 128 ]; + }; + + void draw_text( int x, int y, bool greyed, const char* msg, ... ); + void draw_text( int x, int y, const char* msg, ... ); + void draw_rect( int x, int y, int w, int h, clr_t col ); + void register_fn( con_fn_base* fn ) { m_functions.push_back( fn ); } + + void input( ); + void draw( ); + + auto& get_input( ) { + return m_input; + } + + void log( const char* fmt, ... ) { + va_list args; + char buf[ 128 ]; + + __crt_va_start( args, fmt ); + vsprintf_s< 128 >( buf, fmt, args ); + __crt_va_end( args ); + + con_log log; + log.m_time = ( float )GetTickCount( ) * 0.001f; + memcpy( log.m_msg, buf, 128 ); + + print( "%s\n", buf ); + + m_logs.push_back( log ); + } + + void print( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); + } + + void create( ) { +#ifdef _DEBUG + AllocConsole( ); + freopen( xors( "CONOUT$" ), "w", stdout ); + const char* hack_names[ ] = { + xors( "dunk hack" ), + xors( "dweeb dumpster" ), + xors( "nova killER" ), + xors( "moms credit card" ), + xors( "dad hook" ), + xors( "retard remover" ), + xors( "slam hook" ), + xors( "swoosh" ), + xors( "retard remover" ), + xors( "shotgun hack" ), + }; + + SetConsoleTitleA( hack_names[ math::random_number( 0, 9 ) ] ); +#endif + game_console_print = reinterpret_cast< msg_t >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); + } + + void destroy( ) { +#ifdef _DEBUG + FreeConsole( ); + fclose( stdout ); +#endif + } + + std::vector< con_log > m_logs; + std::vector< con_fn_base* > m_functions; + std::vector< std::shared_ptr< ISetting > > m_aliases; + + void register_alias( std::shared_ptr< ISetting >& alias ); + + using msg_t = void( __cdecl* )( const char*, ... ); + msg_t game_console_print; + +private: + ISetting * find_var( hash_t name ); + ISetting* find_alias( hash_t name ); + + std::string impl_alias_str( std::string str ); + + con_fn_base* find_fn( hash_t name ); + void capture_command( ); + void execute_command( const char* cmd ); + + int m_x{ 100 }, m_y{ 100 }; + + char m_cur_cmd[ 200 ]{ }; + uint8_t m_key_states[ 256 ]{ }; + float m_last_key_input[ 256 ]{ }; + std::shared_ptr< util::c_input_manager > m_input; +}; + +extern std::shared_ptr< console > g_con; \ No newline at end of file diff --git a/cheat/tf2/console_log.hpp b/cheat/tf2/console_log.hpp new file mode 100644 index 0000000..4659ea1 --- /dev/null +++ b/cheat/tf2/console_log.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#pragma warning(disable: 4996) + +class console { +public: + void create( ) { + AllocConsole( ); + freopen( "CONOUT$", "w", stdout ); + SetConsoleTitleA( "tf2internal" ); + + game_console_print = reinterpret_cast< decltype( game_console_print ) >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); + } + + void destroy( ) { + FreeConsole( ); + fclose( stdout ); + } + + __forceinline void log_function( const char* msg ) { + printf( "%s: %s", __FUNCTION__, msg ); + } + + using msg_t = void( __cdecl* )( const char*, ... ); + msg_t game_console_print; + + + static console *con( ) { + static console g_singleton_; + return &g_singleton_; + } +}; \ No newline at end of file diff --git a/cheat/tf2/ctx.cpp b/cheat/tf2/ctx.cpp new file mode 100644 index 0000000..37e192f --- /dev/null +++ b/cheat/tf2/ctx.cpp @@ -0,0 +1,97 @@ +#include "ctx.hpp" +#include "console.hpp" +#include "hooks.h" +#include "base_cheat.h" + +context::c_context g_ctx; + +NAMESPACE_REGION( context ) + +bool c_context::run_frame( ) { + m_local = cl.m_entlist( )->get_client_entity< c_base_player >( + cl.m_engine( )->GetLocalPlayer( ) ); + + return !!m_local; +} + + +//predicted servertime of player, use this for breaking lby etc +float c_context::pred_time( ) { + calculate_tickbase( ); + + return m_tickbase * cl.m_globals->interval_per_tick; +} + +//calculate tickbase depending on whether last ucmd was predicted +bool c_context::calculate_tickbase( ) { + if( !m_local ) { + return false; + } + + //get current tickbase + auto player_tickbase = m_local->get_tick_base( ); + + //disabled due to our engine pred being shit + m_tickbase = player_tickbase; + return true; + + if( m_snapshot.empty( ) ) { + m_tickbase = player_tickbase; + return false; + } + + //if cmd wasnt predicted increment tickbase + auto snap_cmd = &m_snapshot.front( ); + if( !snap_cmd->m_predicted ) { + if( !m_tickbase ) { + m_tickbase = player_tickbase; + } + + m_tickbase++; + snap_cmd->m_predicted = true; + } + else { + m_tickbase = player_tickbase; + } + + return true; +} + +bool c_context::precache_model( const char* model ) { + + auto cache_table = cl.m_string_table( )->FindTable( "modelprecache" ); + + if( !cache_table ) + return true; + + cl.m_modelinfo( )->FindOrLoadModel( model ); + + int string_index = cache_table->AddString( false, model ); + + if( string_index == -1 ) + return false; + + return true; +} + +//save snapshots of usercommands +bool c_context::create_snapshot( user_cmd_t* ucmd ) { + user_cmd_t ucmd_copy; + + while( m_snapshot.size( ) >= 64 ) { + m_snapshot.pop_back( ); + } + + if( !ucmd ) { + return false; + } + + memcpy( &ucmd_copy, + ucmd, + sizeof( ucmd_copy ) ); + + m_snapshot.push_front( ucmd_copy ); + return true; +} + +END_REGION \ No newline at end of file diff --git a/cheat/tf2/ctx.hpp b/cheat/tf2/ctx.hpp new file mode 100644 index 0000000..8243a19 --- /dev/null +++ b/cheat/tf2/ctx.hpp @@ -0,0 +1,68 @@ +#pragma once +#include + +#include "util.hpp" +#include "sdk.h" +NAMESPACE_REGION( context ) + +struct shot_data_t { + vec3_t m_local_pos; + vec3_t m_angle; + vec3_t m_enemy_pos; + int m_enemy_index; + int m_resolver_shots; + bool m_resolver_state; + bool m_missed{ true }; + struct { + vec3_t min; + vec3_t max; + float radius; + } m_hitbox; + int m_hitgroup; +}; + +//replacement to the old global:: namespace +class c_context { +public: + //run localplayer check, pointer, is valid etc + bool run_frame( ); + float pred_time( ); + + bool create_snapshot( user_cmd_t* ); + //calculate accurate tickbase + bool calculate_tickbase( ); + + user_cmd_t* get_last_cmd( ) { + return m_snapshot.empty( ) ? nullptr : &m_snapshot.front( ); + } + + bool precache_model( const char* model ); + +public: + c_base_player * m_local{ }; + int m_stage{ }; + //accurate tickbase + int m_tickbase{ }; + + bool m_drawing_postscreenspace{ }; + bool m_drawing_screneend{ }; + + bool m_has_fired_this_frame{ }; + + vec3_t m_thirdperson_angle{ }; + vec3_t m_last_origin{ }; + + float m_fov{ 90.f }; + +public: + + int m_last_shot_ack; + int m_last_shot; + std::array< shot_data_t, 128 > m_shot_data; +private: + std::deque< user_cmd_t > m_snapshot; +}; + +END_REGION + +extern context::c_context g_ctx; \ No newline at end of file diff --git a/cheat/tf2/d3d.cpp b/cheat/tf2/d3d.cpp new file mode 100644 index 0000000..a35f613 --- /dev/null +++ b/cheat/tf2/d3d.cpp @@ -0,0 +1,367 @@ +#include "d3d.hpp" +#include "interfaces.h" +#include "math.h" +#include "d3d_sprite.hpp" + +d3d::c_renderer g_d3d; +d3d::d3d_fonts_t d3d::fonts; + + +//theres shit still left to add like drawrect etc but thats really simple +//this is the base and it works so thats ok +//love +// - nave + +// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) +// DrawPrimitiveUP for each object will slow stuff down eventually +// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else + +namespace d3d +{ + void d3d_fonts_t::release( ) { + if( f_12 ) f_12->Release( ); + if( f_esp_small ) f_esp_small->Release( ); + if( f_16 ) f_16->Release( ); + if( f_18 ) f_18->Release( ); + if( f_menu ) f_menu->Release( ); + if( f_con ) f_con->Release( ); + + f_12 = f_esp_small = f_16 = f_18 = f_menu = f_con = nullptr; + } + + void d3d_fonts_t::create( IDirect3DDevice9* device ) { + auto create_font = [ & ]( ID3DXFont** font, const char* font_name, int width, int size, int weight ) { + //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); + + auto code = D3DXCreateFontA( device, size, width, weight, 0, false, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); + + if( code < 0 ) throw xors( "fuck d3d" ); + }; + + create_font( &f_12, xors( "Verdana" ), 0, 12, 0 ); //change this idc + create_font( &f_esp_small, xors( "Tahoma" ), 0, 11, 500 ); + create_font( &f_16, xors( "Verdana" ), 0, 16, 0 ); + create_font( &f_18, xors( "Verdana" ), 0, 18, 900 ); + create_font( &f_menu, xors( "Tahoma" ), 0, 12, 300 ); + create_font( &f_con, xors( "Consolas" ), 6, 12, 300 ); + } + + + c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { + create_objects( ); + } + + bool c_renderer::run_frame( IDirect3DDevice9* device ) { + if( cl.m_panic ) { + return false; + } + + if( !m_device ) { + m_device = device; + create_objects( ); + return false; + } + + return true; + } + + c_renderer::~c_renderer( ) { + if( !m_device ) + return; + + invalidate_objects( ); + } + + void c_renderer::on_device_lost( ) { + if( !m_device ) + return; + + invalidate_objects( ); + } + + void c_renderer::on_device_reset( ) { + if( !m_device ) + return; + + create_objects( ); + } + + void c_renderer::invalidate_objects( ) { + if( m_block ) m_block->Release( ); + fonts.release( ); + //m_buffer->Release( ); + //m_sil_txt->Release( ); + //m_surface->Release( ); + } + + void c_renderer::create_objects( ) { + D3DVIEWPORT9 viewport; + + if( !m_device ) return; + + if( m_device->GetViewport( &viewport ) < 0 ) { + return; + } + + if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { + return; + } + + if( !m_block ) { + return; + } + + // get display size. + m_width = viewport.Width; + m_height = viewport.Height; + + fonts.create( m_device ); + + /*IDirect3DSurface9* backbuffer; + D3DSURFACE_DESC desc; + + m_device->GetRenderTarget( 0, &backbuffer ); + backbuffer->GetDesc( &desc ); + backbuffer->Release( ); + + m_device->CreateTexture( desc.Width, desc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_sil_txt, 0 ); + m_sil_txt->GetSurfaceLevel( 0, &m_surface ); + + m_device->CreateVertexBuffer( 4 * 24, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &m_buffer, nullptr );*/ + } + + void c_renderer::begin( ) { + if( !m_device ) return; + + D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; + + m_device->SetViewport( &vp ); + + //m_sil_txt->GetSurfaceLevel( 0, &m_surface ); + + // set vertex stream declaration. + m_device->SetVertexShader( nullptr ); + m_device->SetPixelShader( nullptr ); + m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); + m_block->Capture( ); + + m_device->SetRenderState( D3DRS_LIGHTING, false ); + m_device->SetRenderState( D3DRS_FOGENABLE, false ); + m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + + m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); + m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); + m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_STENCILENABLE, false ); + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); + + m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); + m_device->SetRenderState( D3DRS_ALPHATESTENABLE, false ); + m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); + + //m_device->SetTexture( 0, nullptr ); + //m_device->SetTexture( 1, nullptr ); + //m_device->SetTexture( 2, nullptr ); + //m_device->SetTexture( 3, nullptr ); + m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); + m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); + m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); + m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); + + m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); + /* commented out until further notice */ + //m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + //m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + // todo - dex; if we use textures, need to set those rendering states too + } + + void c_renderer::end( ) { + m_device->SetTexture( 0, nullptr ); + //m_device->SetTexture( 1, nullptr ); + //m_device->SetTexture( 2, nullptr ); + //m_device->SetTexture( 3, nullptr ); + m_block->Apply( ); + //m_block->Release( ); + } + + void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { + d3d_vertex_t v[ 2 ] = { + d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why + d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) + }; //edit: do we wanna use z for shit? i mean we could for like menu stuff + //so it renders above other stuff + + m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); + } + + void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 5 ] = { + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); + } + + void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 6 ] = { + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); + } + + void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { + d3d_vertex_t v[ 4 ]; + + switch( type ) { + case GRADIENT_VERTICAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + case GRADIENT_HORIZONTAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + } + + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { + constexpr float PI = 3.1415926f; + const float step = PI * 2.0f / float( res ); + + int point_x = x + r, + point_y = y - r, + point_x_o{ }, + point_y_o{ }; + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + for( int i{ }; i <= res; i++ ) { + float theta = float( i ) * step; + + point_x = x + ( int )( r * cos( theta ) ); + point_y = y - ( int )( r * sin( theta ) ); + if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); + point_x_o = point_x; + point_y_o = point_y; + } + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { + d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + + v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; + } + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_text( ID3DXFont* font, clr_t color, + int x, int y, FontAlign_t align, long font_flags, const char* msg ) { + if( !msg ) return; + if( !font ) return; + + auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); + auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); + auto buf = msg; + + if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; + if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); + RECT rect{ x, y, 1000, 100 }; + + ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; + + if( font_flags & D3DFONTFLAG_DROPSHADOW ) { + RECT r{ rect }; + r.left++; + r.top++; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + + if( font_flags & D3DFONTFLAG_OUTLINE ) { + for( int i = -1; i < 2; i++ ) { + if( !i ) continue; + RECT r{ rect }; + r.left += i; + r.top += i; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + } + + font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); + } + + int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.right - temp.left ); + } + + int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.bottom - temp.top ); + } +} diff --git a/cheat/tf2/d3d.hpp b/cheat/tf2/d3d.hpp new file mode 100644 index 0000000..a927ee3 --- /dev/null +++ b/cheat/tf2/d3d.hpp @@ -0,0 +1,126 @@ +#ifndef D3D_HEADER //stackoverflow my niggas +#define D3D_HEADER + +#include +#include + +#pragma comment(lib, "d3d9.lib") +#pragma comment(lib, "d3dx9.lib") +#pragma warning(disable : 4838) + +#include +#include + +#include +#pragma comment(lib, "dwmapi.lib") + +#include "util.hpp" +#include "color.hpp" +#include "renderer.hpp" + +enum D3DFontFlags_t { + D3DFONTFLAG_OUTLINE = 0x10, + D3DFONTFLAG_DROPSHADOW = 0x100, +}; + +enum GradientType_t; + +namespace features { class c_chams; } + +//suck my dick +namespace d3d +{ + struct d3d_vertex_t { + d3d_vertex_t( float x, float y, float z, clr_t color ) : + m_x( x ), m_y( y ), m_z( z ), + m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; + + d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), + m_clr( 0 ) { }; + + float m_x; + float m_y; + float m_z; + float m_rhw = 0.f; + D3DCOLOR m_clr; + }; + + constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); + + struct d3d_fonts_t { + void release( ); + void create( IDirect3DDevice9* device ); + + ID3DXFont* f_12; + ID3DXFont* f_esp_small; + ID3DXFont* f_16; + ID3DXFont* f_18; + ID3DXFont* f_menu; + ID3DXFont* f_con; + }; + + class c_renderer { + private: + friend class features::c_chams; + + IDirect3DDevice9* m_device; + IDirect3DStateBlock9* m_block; + IDirect3DTexture9* m_chams; + IDirect3DTexture9* m_sil_txt; + IDirect3DVertexBuffer9* m_buffer; + IDirect3DSurface9* m_surface; + public: + ulong_t m_width; + ulong_t m_height; + + c_renderer( ) { }; + c_renderer( IDirect3DDevice9* device ); + ~c_renderer( ); + + void on_device_lost( ); + void on_device_reset( ); + auto get_device( ) { + return m_device; + } + + bool run_frame( IDirect3DDevice9* device ); + void begin( ); + void end( ); + + void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); + void draw_rect( clr_t color, int x, int y, int w, int h ); + void draw_filled_rect( clr_t color, int x, int y, int w, int h ); + void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); + + void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); + + template < FontAlign_t align = ALIGN_CENTER > + void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + draw_text( font, color, x, y, align, font_flags, buffer ); + } + + int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); + int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); + + private: + void invalidate_objects( ); + void create_objects( ); + }; + + extern d3d::d3d_fonts_t fonts; +} + +extern d3d::c_renderer g_d3d; + +#endif \ No newline at end of file diff --git a/cheat/tf2/d3d_sprite.cpp b/cheat/tf2/d3d_sprite.cpp new file mode 100644 index 0000000..37bbde1 --- /dev/null +++ b/cheat/tf2/d3d_sprite.cpp @@ -0,0 +1,12 @@ +#include "d3d_sprite.hpp" + +std::vector< d3d::c_sprite* > d3d::sprites; + +namespace icons +{ + d3d::c_sprite sprite_legit; + d3d::c_sprite sprite_rage; + d3d::c_sprite sprite_visuals; + d3d::c_sprite sprite_misc; + d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/tf2/d3d_sprite.hpp b/cheat/tf2/d3d_sprite.hpp new file mode 100644 index 0000000..0d26f4c --- /dev/null +++ b/cheat/tf2/d3d_sprite.hpp @@ -0,0 +1,159 @@ +#pragma once +#include "d3d.hpp" +#include "console.hpp" + + +namespace d3d +{ + class c_sprite; + + extern std::vector< c_sprite* > sprites; + + class c_sprite { + public: + size_t m_width{ }; + size_t m_height{ }; + + IDirect3DDevice9* m_device{ }; + ID3DXSprite* m_sprite{ }; + IDirect3DTexture9* m_texture{ }; + const byte* m_image{ }; + size_t m_image_size{ }; + + + public: + c_sprite::c_sprite( ) { + sprites.push_back( this ); + } + + c_sprite::~c_sprite( ) { + on_reset( ); + } + + void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { + m_width = width; + m_height = height; + + m_device = device; + m_image = file; + m_image_size = img_size; + } + + void begin( IDirect3DDevice9* device ) { + m_device = device; + + if( !m_device ) { + return; + } + + if( !m_sprite ) + D3DXCreateSprite( m_device, &m_sprite ); + + if( !m_texture ) { + auto hr = D3DXCreateTextureFromFileInMemoryEx( + m_device, m_image, m_image_size, + m_width, m_height, D3DX_DEFAULT, 0, D3DFMT_A8B8G8R8, + D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, + 0, 0, &m_texture ); + } + + if( m_sprite ) + m_sprite->Begin( D3DXSPRITE_DONOTMODIFY_RENDERSTATE ); + } + + void end( ) { + if( !m_device || !m_sprite || !m_texture ) return; + m_sprite->End( ); + } + + void on_reset( ) { + if( m_sprite && m_device && m_texture ) { + m_sprite->OnLostDevice( ); + m_texture->Release( ); + m_texture = nullptr; + } + } + + void on_reset_end( ) { + if( m_sprite && m_device ) + m_sprite->OnResetDevice( ); + } + + void draw( int x, int y, clr_t color ) { + if( !m_device || !m_texture || !m_sprite ) { + return; + } + + const float scale = 0.8f; + + ulong_t + fill_mode, + adaptive_tess, + dest_blend, + cull, + stencil, + vertex_blend, + alpha_test; + + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, &fill_mode ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, &adaptive_tess ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, &dest_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, &cull ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, &stencil ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, &vertex_blend ); + m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, &alpha_test ); + + ulong_t mag_filter; + ulong_t min_filter; + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, &mag_filter ); + m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, &min_filter ); + + m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC ); + m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, D3DFILL_SOLID ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, D3DLINECAPS_ALPHACMP ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, D3DMULTISAMPLE_4_SAMPLES ); + + + ulong_t hr; + D3DXVECTOR2 center = D3DXVECTOR2( ( m_width * scale ) * 0.5f, ( m_height * scale ) * 0.5f ); + D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); + D3DXMATRIX matrix; + D3DXVECTOR2 scale_vec( scale, scale ); + D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale_vec, ¢er, 0.f, &trans ); + + hr = m_sprite->SetTransform( &matrix ); + + auto d3dcolor = D3DCOLOR_RGBA( color.r( ), + color.g( ), color.b( ), color.a( ) ); + hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); + + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, fill_mode ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, adaptive_tess ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, dest_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, cull ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, stencil ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, vertex_blend ); + m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, alpha_test ); + + m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, mag_filter ); + //m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, min_filter ); + } + }; +} + +namespace icons +{ + extern d3d::c_sprite sprite_legit; + extern d3d::c_sprite sprite_rage; + extern d3d::c_sprite sprite_visuals; + extern d3d::c_sprite sprite_misc; + extern d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/cheat/tf2/directx.cpp b/cheat/tf2/directx.cpp new file mode 100644 index 0000000..db2d62f --- /dev/null +++ b/cheat/tf2/directx.cpp @@ -0,0 +1,233 @@ +#include + +#include "settings.h" +#include "hooks.h" +#include "ui.h" +#include "base_cheat.h" +#include "ctx.hpp" +#include "mem.hpp" + +//this shit prolly barely working rn like a toddler trying to walk but hes actually mentally slow and 25 + +using namespace d3d; + +float ui::get_tf2_frametime( ) { + return cl.m_frametime; +} + +void on_d3d( IDirect3DDevice9* device ) { + constexpr float step = 1.0f / 2.f; + constexpr float fade_step = 1.0f / 7.f; + static float anim_time{ }; + static bool flip{ }; + static int anim_progress{ }; + + static bool sprites_init{ }; + if( !sprites_init ) { + ui::setup_sprites( device ); + sprites_init = true; + } + + if( g_settings.misc.hide_from_obs ) + g_cheat.visuals( ); + + if( g_settings.menu.open ) { + if( anim_time >= 0.95f ) { + flip = true; + } + if( anim_time <= 0.05f ) { + flip = false; + } + + if( flip ) + anim_time -= fade_step * ui::ui_get_frametime( ); + else + anim_time += fade_step * ui::ui_get_frametime( ); + + anim_time = std::clamp( anim_time, 0.f, 1.0f ); + + ui::set_animtime( anim_time ); + + anim_progress += ui::ui_get_frametime( ) * step * 255; + anim_progress = std::clamp( anim_progress, 0, 50 ); + g_d3d.draw_filled_rect( clr_t( 0, 0, 0, anim_progress ), + 0, 0, g_d3d.m_width, g_d3d.m_height ); + + ui::render( ); + } + else { + anim_progress = 0; + } +} + +long __stdcall hooks::d3d::draw( IDirect3DDevice9* device, D3DPRIMITIVETYPE type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { + static auto draw_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); + + static auto ret_addr = pattern::first_code_match( GetModuleHandleA( xors( "studiorender.dll" ) ), xors( "EB 1F FF 75 F0" ), -8 ); + + std::function< void*( void** ) > find_ent; + find_ent = [ & ]( void** ebp ) -> void* { + if( !ebp ) + return nullptr; + + void** next = *( void*** )( ebp ); + if( ( uintptr_t )( ebp[ 1 ] ) == ret_addr ) + return next[ 4 ]; + + return find_ent( next ); + }; + + c_base_player* ent = ( c_base_player* )( find_ent( ( void** )( get_baseptr( ) ) ) ); + if( g_ctx.m_local && !!ent && ent->m_iHealth( ) > 0 && ent->m_iTeamNum( ) > 1 && g_settings.visuals.chams.enabled( ) && g_settings.misc.hide_from_obs ) { + //g_cheat.chams.d3d_render_chams( ent, type, v_index, min_index, num_vert, start_index, prim_count ); + return true; + } + + auto result = draw_o( device, type, v_index, min_index, num_vert, start_index, prim_count ); + return result; +} + +long __stdcall hooks::d3d::end_scene( IDirect3DDevice9* device ) { + static auto end_scene_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::end_scene ) >( 42 ); + if( cl.m_panic ) return end_scene_o( device ); + + static uintptr_t return_address = 0; + static uintptr_t gameoverlay_return_address = 0; + + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( !gameoverlay_return_address ) { + MEMORY_BASIC_INFORMATION info; + VirtualQuery( _ReturnAddress( ), &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + char mod[ MAX_PATH ]; + GetModuleFileNameA( ( HMODULE )info.AllocationBase, mod, MAX_PATH ); + + if( strstr( mod, xors( "gameoverlay" ) ) ) + gameoverlay_return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( return_address != ( uintptr_t )( _ReturnAddress( ) ) && !g_settings.misc.hide_from_obs ) + return end_scene_o( device ); + + if( gameoverlay_return_address != ( uintptr_t )( _ReturnAddress( ) ) && g_settings.misc.hide_from_obs ) + return end_scene_o( device ); + + if( !cl.m_panic && g_d3d.run_frame( device ) ) { + for( auto& it : ::d3d::sprites ) + it->begin( device ); + g_d3d.begin( ); + + //if( g_settings.misc.hide_from_obs ) + //g_cheat.m_chams.d3d_render_textures( ); + + on_d3d( device ); + + std::chrono::high_resolution_clock timer; + static auto last = timer.now( ); + auto now = timer.now( ); + + std::chrono::duration< double > delta = now - last; + last = timer.now( ); + + cl.m_frametime = delta.count( ); + + if( !g_con->m_logs.empty( ) && g_settings.menu.logs_enable ) { + auto& logs = g_con->m_logs; + float time = ( float )GetTickCount( ) * 0.001f; + + auto data = logs.data( ); + + int cur_pos = 2; + for( int i = logs.size( ) - 1; i >= 0; --i ) { + if( cur_pos > g_d3d.m_height - 200 ) { + cur_pos -= 8; + break; + } + + float delta = time - data[ i ].m_time; + if( delta >= 5.0f ) { + break; + } + + clr_t col( 255, 255, 255 ); + if( delta > 4.f ) col.a( ) *= ( 6.f - delta ); + + g_d3d.draw_text< ALIGN_RIGHT >( fonts.f_con, col, g_d3d.m_width - 5, cur_pos, D3DFONTFLAG_DROPSHADOW, data[ i ].m_msg ); + cur_pos += 10; + } + } + + if( g_settings.menu.open || g_con->m_open ) { + ui::ui_draw_cursor( ); + } + + for( auto& it : ::d3d::sprites ) + it->end( ); + g_d3d.end( ); + } + + return end_scene_o( device ); +} + +long __stdcall hooks::d3d::present( IDirect3DDevice9* device, RECT* source, RECT* dest, HWND wnd_override, RGNDATA* reg ) { + static auto present_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::present ) >( 17 ); + + static uintptr_t return_address = 0; + if( !return_address ) { + return_address = ( uintptr_t )( _ReturnAddress( ) ); + } + + if( return_address && return_address != ( uintptr_t )( _ReturnAddress( ) ) ) + return present_o( device, source, dest, wnd_override, reg ); + + if( g_d3d.run_frame( device ) ) { + g_d3d.begin( ); + if( g_settings.misc.watermark ) { + static std::string str( xors( "moneybot | " ) ); + static bool transform = false; + if( !transform ) { + str += __DATE__; + str += ", "; + str += __TIME__; + + std::transform( str.begin( ), str.end( ), str.begin( ), + [ ]( char c ) { return ::tolower( c ); } ); + transform = true; + } + + g_d3d.draw_text< ALIGN_RIGHT >( ::d3d::fonts.f_menu, + ui::ui_get_text_col( ), g_d3d.m_width - 10, 8, + D3DFONTFLAG_DROPSHADOW, str.c_str( ) ); + } + + g_con->draw( ); + if( ( g_settings.menu.open || g_con->m_open ) && !g_settings.misc.hide_from_obs ) { + ui::ui_draw_cursor( ); + } + g_d3d.end( ); + } + + return present_o( device, source, dest, wnd_override, reg ); +} + +long __stdcall hooks::d3d::reset( IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params ) { + static auto reset_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::reset ) >( 16 ); + if( cl.m_panic ) { + return reset_o( device, params ); + } + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset( ); + + g_d3d.on_device_lost( ); + long result = reset_o( device, params ); + g_d3d.on_device_reset( ); + + for( auto& sprite : ::d3d::sprites ) + sprite->on_reset_end( ); + + return result; +} \ No newline at end of file diff --git a/cheat/tf2/do_post_screen_space_effects.cpp b/cheat/tf2/do_post_screen_space_effects.cpp new file mode 100644 index 0000000..401b05e --- /dev/null +++ b/cheat/tf2/do_post_screen_space_effects.cpp @@ -0,0 +1,16 @@ +#include "hooks.h" +#include "base_cheat.h" +#include "ctx.hpp" +//whore? +bool __fastcall hooks::do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ) { + static auto old_fn = cl.m_clientmode->get_old_function< decltype( &do_post_screen_space_effects ) >( 39 ); + + g_ctx.m_drawing_postscreenspace = true; + if( cl.m_engine( )->IsInGame( ) && g_ctx.m_local ) { + } + + bool ret = old_fn( ecx_, 0, setup ); + g_ctx.m_drawing_postscreenspace = false; + + return ret; +} \ No newline at end of file diff --git a/cheat/tf2/draw_model_execute.cpp b/cheat/tf2/draw_model_execute.cpp new file mode 100644 index 0000000..1191a90 --- /dev/null +++ b/cheat/tf2/draw_model_execute.cpp @@ -0,0 +1,125 @@ +#include "hooks.h" +#include "base_cheat.h" +#include "ctx.hpp" +#include "util.hpp" +#include "settings.h" +//this is so ugly dont even look at it + +//gets called once per frame for every entity +void __fastcall hooks::draw_model_execute( IVModelInfo* ecx_, void* edx_, void* render_ctx, const DrawModelState_t& state, const ModelRenderInfo_t& info, matrix3x4* bone_to_world ) { + static auto dme_o = cl.m_model_render->get_old_function< decltype( &hooks::draw_model_execute ) >( 19 ); + + if( cl.m_panic || g_ctx.m_drawing_postscreenspace || g_settings.misc.hide_from_obs ) + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + + bool draw = true; + IMaterial* mat = g_settings.visuals.chams.flat( ) ? g_cheat.chams.m_materials.m_chams_flat : g_cheat.chams.m_materials.m_chams; + auto model_name = cl.m_modelinfo( )->GetModelName( info.m_model ); + auto local_index = cl.m_engine( )->GetLocalPlayer( ); + int local_team = 0; + if( g_ctx.m_local ) + local_team = g_ctx.m_local->m_iTeamNum( ); + int team = 0; + bool is_player = false; + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index == local_index ) { + if( g_settings.misc.thirdperson( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) + && g_ctx.m_local->m_bIsScoped( ) ) { + float clr[ ] = { 1.0f, 1.0f, 1.0f }; + cl.m_render_view( )->SetColorModulation( clr ); + cl.m_render_view( )->SetBlend( 0.5f ); + return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + } + } + + if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index ) { + auto player = cl.m_entlist( )->get_client_entity< c_base_player >( info.m_entity_index ); + + if( player && player->is_valid( ) ) { + is_player = true; + team = player->m_iTeamNum( ); + + if( g_settings.visuals.chams.enabled ) { + if( g_settings.visuals.chams.ignore_z && !g_ctx.m_drawing_screneend && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) + draw = false; + else if( !g_settings.visuals.chams.ignore_z && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) { + fclr_t clr = team != local_team ? g_settings.visuals.chams.color_visible_enemy( ) : g_settings.visuals.chams.color_visible_friendly( ); + + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + g_cheat.chams.m_materials.force_material( mat, clr ); + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + cl.m_model_render( )->ForcedMaterialOverride( nullptr ); + cl.m_render_view( )->SetBlend( 1.0f ); + draw = false; + } + } + + } + } + + if( g_settings.misc.transparent_vm && strstr( model_name, xors( "weapon" ) ) ) { + if( strstr( model_name, xors( "arms" ) ) ) { + cl.m_render_view( )->SetBlend( 0.6f ); + } + } + + if( is_player ) { + + if( g_settings.legit.backtracking_visualize( ) && ( team != local_team || g_settings.legit.friendlies( ) ) ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( info.m_entity_index ); + auto record = g_cheat.aim.m_lagcomp.find_best_record( info.m_entity_index ); + { //idk + auto records = g_cheat.aim.m_lagcomp.get_records( info.m_entity_index ); + if( records.size( ) ) { + for( auto& it : util::reverse_iterator( records ) ) { + if( it.is_valid( ) ) { + record = ⁢ + break; + } + } + } + } + + if( record && record->is_valid( ) && record->m_position.dist_to( ent->get_hitbox_position( 0 ) ) > 5.f ) { + fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + + float backup_modulation[ 3 ]{ }; + bool backup_ignorez = false; + float backup_blend = 1.0f; + + backup_blend = cl.m_render_view( )->GetBlend( ); + cl.m_render_view( )->GetColorModulation( backup_modulation ); + + //BIG ROFL + if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) + && backup_blend == clr_hid.a( ) ) { + backup_ignorez = true; + } + + if( !backup_ignorez ) { + auto flat_mat = g_cheat.chams.m_materials.m_chams_flat.m_mat; + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); + g_cheat.chams.m_materials.force_material( g_cheat.chams.m_materials.m_chams_flat, g_settings.legit.backtracking_col( ) ); + dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); + flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + } + + cl.m_render_view( )->SetBlend( backup_blend ); + cl.m_render_view( )->SetColorModulation( backup_modulation ); + cl.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && + ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); + + if( draw ) { + dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); + draw = false; + } + } + } + } + + if( draw ) { + dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); + } + + cl.m_model_render( )->ForcedMaterialOverride( nullptr ); +} \ No newline at end of file diff --git a/cheat/tf2/dt_common.h b/cheat/tf2/dt_common.h new file mode 100644 index 0000000..7f86418 --- /dev/null +++ b/cheat/tf2/dt_common.h @@ -0,0 +1,127 @@ +#pragma once + +#define MAX_DATATABLES 1024 // must be a power of 2. +#define MAX_DATATABLE_PROPS 4096 +#define MAX_ARRAY_ELEMENTS 2048 // a network array should have more that 1024 elements + +#define HIGH_DEFAULT -121121.121121f + +#define BITS_FULLRES -1 // Use the full resolution of the type being encoded. +#define BITS_WORLDCOORD -2 // Encode as a world coordinate. + +#define DT_MAX_STRING_BITS 9 +#define DT_MAX_STRING_BUFFERSIZE (1 << DT_MAX_STRING_BITS) // Maximum length of a string that can be sent. + +#define STRINGBUFSIZE(className, varName) sizeof(((className*)0)->varName) + +// Gets the size of a variable in a class. +#define PROPSIZEOF(className, varName) sizeof(((className*)0)->varName) + +// SendProp::m_Flags. +enum SPROP_FLAGS +{ + SPROP_UNSIGNED = (1<<0), // Unsigned integer data. + SPROP_COORD = (1<<1), // If this is set, the float/vector is treated like a world coordinate. + // Note that the bit count is ignored in this case. + SPROP_NOSCALE = (1<<2), // For floating point, don't scale into range, just take value as is. + SPROP_ROUNDDOWN = (1<<3), // For floating point, limit high value to range minus one bit unit + SPROP_ROUNDUP = (1<<4), // For floating point, limit low value to range minus one bit unit + SPROP_NORMAL = (1<<5), // If this is set, the vector is treated like a normal (only valid for vectors), + SPROP_EXCLUDE = (1<<6), // This is an exclude prop (not excludED, but it points at another prop to be excluded),. + SPROP_XYZE = (1<<7), // Use XYZ/Exponent encoding for vectors. + SPROP_INSIDEARRAY = (1<<8), // This tells us that the property is inside an array, so it shouldn't be put into the + // flattened property list. Its array will point at it when it needs to. + SPROP_PROXY_ALWAYS_YES = (1<<9), // Set for datatable props using one of the default datatable proxies like + // SendProxy_DataTableToDataTable that always send the data to all clients. + SPROP_CHANGES_OFTEN = (1<<10), // this is an often changed field, moved to head of sendtable so it gets a small index + SPROP_IS_A_VECTOR_ELEM = (1<<11), // Set automatically if SPROP_VECTORELEM is used. + SPROP_COLLAPSIBLE = (1<<12), // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer + // (ie: for all automatically-chained base classes),. + // In this case, it can get rid of this SendPropDataTable altogether and spare the + // trouble of walking the hierarchy more than necessary. + SPROP_COORD_MP = (1<<13), // Like SPROP_COORD, but special handling for multiplayer games + SPROP_COORD_MP_LOWPRECISION = (1<<14), // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 + SPROP_COORD_MP_INTEGRAL = (1<<15), // SPROP_COORD_MP, but coordinates are rounded to integral boundaries + + // This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are + // m_flAnimTime and m_flSimulationTime. MODs shouldn't need to mess with this probably + SPROP_ENCODED_AGAINST_TICKCOUNT = (1<<16), +}; + +#define SPROP_NUMFLAGBITS_NETWORKED 16 + +#define SPROP_NUMFLAGBITS 17 + +// Used by the SendProp and RecvProp functions to disable debug checks on type sizes. +#define SIZEOF_IGNORE -1 + +// Use this to extern send and receive datatables, and reference them. +#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} +#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} + +#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable +#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable + +class SendProp; + +typedef enum +{ + DPT_Int = 0, + DPT_Float, + DPT_Vector, + DPT_VectorXY, + DPT_String, + DPT_Array, // An array of the base types (can't be of datatables). + DPT_DataTable, + DPT_NUMSendPropTypes +} SendPropType; + +/* +class DVariant +{ +public: + union + { + float m_Float; + long m_Int; + char* m_pString; + void* m_pData; // For DataTables. + float m_Vector[3]; + }; + + SendPropType m_Type; + + DVariant() { m_Type = DPT_Float; } + + DVariant(float val) + { + m_Type = DPT_Float; + m_Float = val; + } +}; +*/ + +struct DVariant { + union { + float m_Float; + long m_Int; + char* m_pString; + void* m_pData; + float m_Vector[3]; + __int64 m_Int64; + }; + + int m_Type; +}; + +// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1. +inline int NumBitsForCount(int nMaxElements) +{ + int nBits = 0; + while(nMaxElements > 0) + { + ++nBits; + nMaxElements >>= 1; + } + return nBits; +} diff --git a/cheat/tf2/dt_recv.h b/cheat/tf2/dt_recv.h new file mode 100644 index 0000000..47f945b --- /dev/null +++ b/cheat/tf2/dt_recv.h @@ -0,0 +1,479 @@ +#pragma once + +#include "dt_common.h" + +#define ADDRESSPROXY_NONE -1 + +class RecvTable; +class RecvProp; + +/* +// This is passed into RecvProxy functions. +class CRecvProxyData +{ +public: + const RecvProp* m_pRecvProp; // The property it's receiving. + DVariant m_Value; // The value given to you to store. + int m_iElement; // Which array element you're getting. + int m_ObjectID; // The object being referred to. +}; +*/ + +struct CRecvProxyData { + const RecvProp* m_pRecvProp; + DVariant m_Value; + int m_iElement; + int m_ObjectID; +}; + +//----------------------------------------------------------------------------- +// pStruct = the base structure of the datatable this variable is in (like C_BaseEntity) +// pOut = the variable that this this proxy represents (like C_BaseEntity::m_SomeValue). +// +// Convert the network-standard-type value in m_Value into your own format in pStruct/pOut. +//----------------------------------------------------------------------------- +typedef void (*RecvVarProxyFn)(const CRecvProxyData* pData, void* pStruct, void* pOut); + +// ------------------------------------------------------------------------ // +// ArrayLengthRecvProxies are optionally used to get the length of the +// incoming array when it changes. +// ------------------------------------------------------------------------ // +typedef void (*ArrayLengthRecvProxyFn)(void* pStruct, int objectID, int currentArrayLength); + +// NOTE: DataTable receive proxies work differently than the other proxies. +// pData points at the object + the recv table's offset. +// pOut should be set to the location of the object to unpack the data table into. +// If the parent object just contains the child object, the default proxy just does *pOut = pData. +// If the parent object points at the child object, you need to dereference the pointer here. +// NOTE: don't ever return null from a DataTable receive proxy function. Bad things will happen. +typedef void (*DataTableRecvVarProxyFn)(const RecvProp* pProp, void** pOut, void* pData, int objectID); + +// This is used to fork over the standard proxy functions to the engine so it can +// make some optimizations. +class CStandardRecvProxies +{ +public: + CStandardRecvProxies(); + + RecvVarProxyFn m_Int32ToInt8; + RecvVarProxyFn m_Int32ToInt16; + RecvVarProxyFn m_Int32ToInt32; + RecvVarProxyFn m_FloatToFloat; + RecvVarProxyFn m_VectorTovec3_t; +}; + +extern CStandardRecvProxies g_StandardRecvProxies; + +class CRecvDecoder; + +class RecvProp +{ + // This info comes from the receive data table. +public: + RecvProp(); + + void InitArray(int nElements, int elementStride); + + int GetNumElements() const; + void SetNumElements(int nElements); + + int GetElementStride() const; + void SetElementStride(int stride); + + int GetFlags() const; + + const char* GetName() const; + SendPropType GetType() const; + + RecvTable* GetDataTable() const; + void SetDataTable(RecvTable* pTable); + + RecvVarProxyFn GetProxyFn() const; + void SetProxyFn(RecvVarProxyFn fn); + + DataTableRecvVarProxyFn GetDataTableProxyFn() const; + void SetDataTableProxyFn(DataTableRecvVarProxyFn fn); + + int GetOffset() const; + void SetOffset(int o); + + // Arrays only. + RecvProp* GetArrayProp() const; + void SetArrayProp(RecvProp* pProp); + + // Arrays only. + void SetArrayLengthProxy(ArrayLengthRecvProxyFn proxy); + ArrayLengthRecvProxyFn GetArrayLengthProxy() const; + + bool IsInsideArray() const; + void SetInsideArray(); + + // Some property types bind more data to the prop in here. + const void* GetExtraData() const; + void SetExtraData(const void* pData); + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char* GetParentArrayPropName(); + void SetParentArrayPropName(const char* pArrayPropName); + +public: + const char* m_pVarName; + SendPropType m_RecvType; + int m_Flags; + int m_StringBufferSize; + + bool m_bInsideArray; // Set to true by the engine if this property sits inside an array. + + // Extra data that certain special property types bind to the property here. + const void* m_pExtraData; + + // If this is an array (DPT_Array). + RecvProp* m_pArrayProp; + ArrayLengthRecvProxyFn m_ArrayLengthProxy; + + RecvVarProxyFn m_ProxyFn; + DataTableRecvVarProxyFn m_DataTableProxyFn; // For RDT_DataTable. + + RecvTable* m_pDataTable; // For RDT_DataTable. + int m_Offset; + + int m_ElementStride; + int m_nElements; + + // If it's one of the numbered "000", "001", etc properties in an array, then + // these can be used to get its array property name for debugging. + const char* m_pParentArrayPropName; +}; + +class RecvTable +{ +public: + using PropType = RecvProp; + + RecvTable(); + RecvTable(RecvProp* pProps, int nProps, const char* pNetTableName); + ~RecvTable(); + + void Construct(RecvProp* pProps, int nProps, const char* pNetTableName); + + int GetNumProps(); + RecvProp* GetProp(int i); + + const char* GetName(); + + // Used by the engine while initializing array props. + void SetInitialized(bool bInitialized); + bool IsInitialized() const; + + // Used by the engine. + void SetInMainList(bool bInList); + bool IsInMainList() const; + +public: + // Properties described in a table. + RecvProp* m_pProps; + int m_nProps; + + // The decoder. NOTE: this covers each RecvTable AND all its children (ie: its children + // will have their own decoders that include props for all their children). + CRecvDecoder* m_pDecoder; + + const char* m_pNetTableName; // The name matched between client and server. + +private: + bool m_bInitialized; + bool m_bInMainList; +}; + +inline int RecvTable::GetNumProps() +{ + return m_nProps; +} + +inline RecvProp* RecvTable::GetProp(int i) +{ + // Assert( i >= 0 && i < m_nProps ); + return &m_pProps[i]; +} + +inline const char* RecvTable::GetName() +{ + return m_pNetTableName; +} + +inline void RecvTable::SetInitialized(bool bInitialized) +{ + m_bInitialized = bInitialized; +} + +inline bool RecvTable::IsInitialized() const +{ + return m_bInitialized; +} + +inline void RecvTable::SetInMainList(bool bInList) +{ + m_bInMainList = bInList; +} + +inline bool RecvTable::IsInMainList() const +{ + return m_bInMainList; +} + +#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) +#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName) +#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName)) +#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0]) + +// Just specify the name and offset. Used for strings and data tables. +#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName) +#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName) +#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName) + +void RecvProxy_FloatToFloat(const CRecvProxyData* pData, void* pStruct, void* pOut); +void RecvProxy_VectorToVector(const CRecvProxyData* pData, void* pStruct, void* pOut); +void RecvProxy_QuaternionToQuaternion(const CRecvProxyData* pData, void* pStruct, void* pOut); +void RecvProxy_Int32ToInt8(const CRecvProxyData* pData, void* pStruct, void* pOut); +void RecvProxy_Int32ToInt16(const CRecvProxyData* pData, void* pStruct, void* pOut); +void RecvProxy_StringToString(const CRecvProxyData* pData, void* pStruct, void* pOut); +void RecvProxy_Int32ToInt32(const CRecvProxyData* pData, void* pStruct, void* pOut); + +// StaticDataTable does *pOut = pData. +void DataTableRecvProxy_StaticDataTable(const RecvProp* pProp, void** pOut, void* pData, int objectID); + +// PointerDataTable does *pOut = *((void**)pData) (ie: pData is a pointer to the object to decode into). +void DataTableRecvProxy_PointerDataTable(const RecvProp* pProp, void** pOut, void* pData, int objectID); + +RecvProp RecvPropFloat( + const char* pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_FloatToFloat +); + +RecvProp RecvPropVector( + const char* pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_VectorToVector +); + +// This is here so the RecvTable can look more like the SendTable. +#define RecvPropQAngles RecvPropVector + +RecvProp RecvPropInt( + const char* pVarName, + int offset, + int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. + int flags = 0, + RecvVarProxyFn varProxy = 0 +); + +RecvProp RecvPropString( + const char* pVarName, + int offset, + int bufferSize, + int flags = 0, + RecvVarProxyFn varProxy = RecvProxy_StringToString +); + +RecvProp RecvPropDataTable( + const char* pVarName, + int offset, + int flags, + RecvTable* pTable, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable +); + +RecvProp RecvPropArray3( + const char* pVarName, + int offset, + int sizeofVar, + int elements, + RecvProp pArrayProp, + DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable +); + +// Use the macro to let it automatically generate a table name. You shouldn't +// ever need to reference the table name. If you want to exclude this array, then +// reference the name of the variable in varTemplate. +RecvProp InternalRecvPropArray( + const int elementCount, + const int elementStride, + const char* pName, + ArrayLengthRecvProxyFn proxy +); + +// +// Use this if you want to completely manage the way the array data is stored. +// You'll need to provide a proxy inside varTemplate that looks for 'iElement' +// to figure out where to store the specified element. +// +#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \ + varTemplate, \ + InternalRecvPropArray( \ + maxArrayLength, \ + 0, \ + #propertyName, \ + arrayLengthProxy \ + ) + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( \ + sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ + #arrayName, \ + arrayLengthProxy \ + ) + +// Use this and pass the array name and it will figure out the count and stride automatically. +#define RecvPropArray( varTemplate, arrayName ) \ + RecvPropVariableLengthArray( 0, varTemplate, arrayName ) + +// Use this one to specify the element count and stride manually. +#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \ + varTemplate, \ + InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy ) + +// ---------------------------------------------------------------------------------------- // +// Inlines. +// ---------------------------------------------------------------------------------------- // + +inline void RecvProp::InitArray(int nElements, int elementStride) +{ + m_RecvType = DPT_Array; + m_nElements = nElements; + m_ElementStride = elementStride; +} + +inline int RecvProp::GetNumElements() const +{ + return m_nElements; +} + +inline void RecvProp::SetNumElements(int nElements) +{ + m_nElements = nElements; +} + +inline int RecvProp::GetElementStride() const +{ + return m_ElementStride; +} + +inline void RecvProp::SetElementStride(int stride) +{ + m_ElementStride = stride; +} + +inline int RecvProp::GetFlags() const +{ + return m_Flags; +} + +inline const char* RecvProp::GetName() const +{ + return m_pVarName; +} + +inline SendPropType RecvProp::GetType() const +{ + return m_RecvType; +} + +inline RecvTable* RecvProp::GetDataTable() const +{ + return m_pDataTable; +} + +inline void RecvProp::SetDataTable(RecvTable* pTable) +{ + m_pDataTable = pTable; +} + +inline RecvVarProxyFn RecvProp::GetProxyFn() const +{ + return m_ProxyFn; +} + +inline void RecvProp::SetProxyFn(RecvVarProxyFn fn) +{ + m_ProxyFn = fn; +} + +inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn() const +{ + return m_DataTableProxyFn; +} + +inline void RecvProp::SetDataTableProxyFn(DataTableRecvVarProxyFn fn) +{ + m_DataTableProxyFn = fn; +} + +inline int RecvProp::GetOffset() const +{ + return m_Offset; +} + +inline void RecvProp::SetOffset(int o) +{ + m_Offset = o; +} + +inline RecvProp* RecvProp::GetArrayProp() const +{ + return m_pArrayProp; +} + +inline void RecvProp::SetArrayProp(RecvProp* pProp) +{ + m_pArrayProp = pProp; +} + +inline void RecvProp::SetArrayLengthProxy(ArrayLengthRecvProxyFn proxy) +{ + m_ArrayLengthProxy = proxy; +} + +inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy() const +{ + return m_ArrayLengthProxy; +} + +inline bool RecvProp::IsInsideArray() const +{ + return m_bInsideArray; +} + +inline void RecvProp::SetInsideArray() +{ + m_bInsideArray = true; +} + +inline const void* RecvProp::GetExtraData() const +{ + return m_pExtraData; +} + +inline void RecvProp::SetExtraData(const void* pData) +{ + m_pExtraData = pData; +} + +inline const char* RecvProp::GetParentArrayPropName() +{ + return m_pParentArrayPropName; +} + +inline void RecvProp::SetParentArrayPropName(const char* pArrayPropName) +{ + m_pParentArrayPropName = pArrayPropName; +} diff --git a/cheat/tf2/emit_sound.cpp b/cheat/tf2/emit_sound.cpp new file mode 100644 index 0000000..b311b84 --- /dev/null +++ b/cheat/tf2/emit_sound.cpp @@ -0,0 +1,25 @@ +#include "base_cheat.h" +#include "hooks.h" +#include "settings.h" + +//eenie meenie miney moe i kepy this in here incase i wanted to ever do something with it i could fix it to match tf2's emitsound but yknow what? i prolly wont watadearhiugaer sorry i spilt water on my desk and smashed my face into the keyboard + +void __fastcall hooks::emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ) { + static auto emit_sound_o = cl.m_engine_sound->get_old_function< decltype( &hooks::emit_sound ) >( 5 ); + + if( !cl.m_panic && origin ) { + auto entity = cl.m_entlist( )->get_client_entity< c_base_player >( ent ); + if( entity && entity->is_player( ) && entity->ce( )->is_dormant( ) && + ent >= 0 && ent <= 64 ) + g_cheat.visuals.update_position( ent, *origin ); + } + + if( strstr( sample, xors( "weapon" ) ) && g_settings.misc.no_sound ) + volume = 0.f; + + emit_sound_o( ecx_, 0, filter, ent, channel, sound, hash, sample, + volume, attenuation, seed, flags, pitch, origin, direction, + origins, update_pos, sound_time, speaker_entry ); +} \ No newline at end of file diff --git a/cheat/tf2/extra.cpp b/cheat/tf2/extra.cpp new file mode 100644 index 0000000..894c957 --- /dev/null +++ b/cheat/tf2/extra.cpp @@ -0,0 +1,91 @@ +#include "base_cheat.h" +#include "ctx.hpp" +#include "input_system.hpp" +#include "math.h" +#include "hooks.h" +#include "interfaces.h" +#undef min +#include "extra.h" +#include "settings.h" + +namespace features +{ + //crash too lazy to fix rn will do , who wants to fly out of their body and become their own guardian angel anyway? + void c_extra::thirdperson( ) { + if( !g_ctx.m_local ) + return; + + static bool enabled = false; + static bool toggle = true; + static bool key_held = false; + + + if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.thirdperson_key( ) ) ) { + if( !key_held ) { + toggle ^= 1; + } + key_held = true; + } + else { + key_held = false; + } + + if( !g_settings.misc.thirdperson || !toggle ) { + if( enabled ) { + cl.m_hl_input->m_fCameraInThirdPerson = false; + enabled = false; + } + + return; + } + + vec3_t viewangles{ }; + if( g_ctx.m_local->is_alive( ) ) { + cl.m_engine( )->GetViewAngles( viewangles ); + cl.m_hl_input->m_fCameraInThirdPerson = true; + cl.m_hl_input->m_vecCameraOffset = vec3_t( viewangles.x, viewangles.y, 150.0f ); + + float cam_hull_offset{ 16.f }; + + vec3_t cam_hull_min( -cam_hull_offset, -cam_hull_offset, -cam_hull_offset ); + vec3_t cam_hull_max( cam_hull_offset, cam_hull_offset, cam_hull_offset ); + vec3_t cam_forward, origin = g_ctx.m_local->get_eye_pos( ); + + cam_forward = math::angle_vectors( vec3_t( viewangles.x, viewangles.y, 0.f ) ); + + CTraceFilterWorldAndPropsOnly filter; + Ray_t ray; + CGameTrace tr; + + ray.Init( origin, origin - ( cam_forward * 150.f ), cam_hull_min, cam_hull_max ); + + cl.m_trace( )->trace_ray( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, &tr ); + cl.m_hl_input->m_vecCameraOffset.z = 150.f * tr.fraction; + + enabled = true; + } + else if( cl.m_entlist( )->get_entity_from_handle< c_base_player >( g_ctx.m_local->m_hObserverTarget( ) ) ) { + cl.m_hl_input->m_fCameraInThirdPerson = false; + g_ctx.m_local->m_iObserverMode( ) = 5; + } + } + + //hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh + void c_extra::float_ragdolls( ) { + for( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i ); + if( !ent ) continue; + + auto client_class = ent->get_client_class( ); + if( !client_class ) continue; + + int class_id = client_class->m_class_id; + if( class_id != CTFRagdoll ) + return; + + ent->as< c_base_player >( )->m_vecRagdollVelocity( ) *= -1; + } + } + + +} \ No newline at end of file diff --git a/cheat/tf2/extra.h b/cheat/tf2/extra.h new file mode 100644 index 0000000..d25131c --- /dev/null +++ b/cheat/tf2/extra.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include +#include "IVEngineClient.h" +#include "vector.hpp" +#include "IClientMode.h" +namespace features +{ + class c_extra { + + public: + void thirdperson( ); + + void float_ragdolls( ); + + void disable_post_processing( ); + + private: + + }; +} \ No newline at end of file diff --git a/cheat/tf2/factory.cpp b/cheat/tf2/factory.cpp new file mode 100644 index 0000000..f8dfd42 --- /dev/null +++ b/cheat/tf2/factory.cpp @@ -0,0 +1,110 @@ +#include "factory.h" +#ifndef IFACE_DLLMAIN +#include "fnv.hpp" + +#include + +NAMESPACE_REGION( tf2 ) +NAMESPACE_REGION( interfaces ) + +//iterate all exports inside of a module and find createinterface +uintptr_t c_interface_manager::find_createinterface( void* module_ ) { + IMAGE_DOS_HEADER* dos_header; + IMAGE_NT_HEADERS* nt_headers; + uintptr_t export_address; + IMAGE_EXPORT_DIRECTORY* export_dir; + const char* export_name; + uintptr_t* names; + uintptr_t* funcs; + uint16_t* ords; + uint32_t export_hash; + + dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); + nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); + + //find addresses of functions from nt headers + export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; + export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); + + if( !export_dir->NumberOfFunctions ) + return uintptr_t{ }; + + names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); + funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); + + ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); + + if( names && funcs && ords ) { + //iterate the exports + for( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { + export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); + export_hash = hash::fnv1a( export_name ); + + if( export_hash == fnv( "CreateInterface" ) ) { + return uintptr_t( module_ ) + funcs[ ords[ i ] ]; + } + } + } + + return uintptr_t{ }; +} + +c_interface_manager::c_interface_manager( ) { + auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); + auto peb = teb->ProcessEnvironmentBlock; + + auto root = &peb->Ldr->InMemoryOrderModuleList; + //iterate module list + for( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { + PLDR_DATA_TABLE_ENTRY data_table; + HMODULE module_base; + uintptr_t create_interface_export; + uintptr_t create_interface_; + uintptr_t* list_iterator_ptr; + interface_iterator_t* list_iterator; + + data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); + module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); + create_interface_export = find_createinterface( module_base ); + + if( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { + continue; + } + + //find the createinterface function + create_interface_ = follow_createinterface_export( create_interface_export ); + if( !is_createinterface_fn( create_interface_ ) ) { + continue; + } + + //find the list iterator + list_iterator_ptr = find_list_ptr( create_interface_ ); + + //iterate the interface list + for( list_iterator = reinterpret_cast< interface_iterator_t* >( + list_iterator_ptr ); + !!list_iterator; + list_iterator = list_iterator->m_next + ) { + std::string name( list_iterator->m_name ); + std::string module_name( util::unicode_to_ascii( + std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); + + uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); + + size_t version = [ & ]( ) { + std::string ret( name ); + ret.erase( std::remove_if( ret.begin( ), ret.end( ), + [ & ]( int i ) { return !::isdigit( i ); } + ), ret.end( ) ); + return atoi( ret.c_str( ) ); + }( ); + + m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); + } + } +} + +END_REGION +END_REGION +#endif \ No newline at end of file diff --git a/cheat/tf2/factory.h b/cheat/tf2/factory.h new file mode 100644 index 0000000..d1e8027 --- /dev/null +++ b/cheat/tf2/factory.h @@ -0,0 +1,155 @@ +#pragma once +#include +#include +#include +#include +#include "vmt.h" +#include "util.hpp" +#include "x86.hpp" +#include "console.hpp" +#include "strings.hpp" +//IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran +#ifndef _DEBUG +#define IFACE_DLLMAIN +#endif + +#ifdef IFACE_DLLMAIN +#include "iface_dllmain_impl.hpp" +#else + +NAMESPACE_REGION( tf2 ) + +namespace interfaces +{ + struct interface_iterator_t { + void* m_create_fn; + char* m_name; + + interface_iterator_t* m_next; + }; + + inline auto follow_createinterface_export( uintptr_t export_ ) { + /* + .text:006F5F00 CreateInterface proc near + .text:006F5F00 push ebp + .text:006F5F01 mov ebp, esp + .text:006F5F03 pop ebp + .text:006F5F04 jmp sub_6F5E90 + */ + uintptr_t jmp = export_ + 0x4; + uintptr_t jmp_target = jmp + *( uintptr_t* )( jmp + 0x1 ) + 0x5; + + return jmp_target; + } + + inline auto find_list_ptr( uintptr_t createinterface ) { + /* + .text:006F5E90 push ebp + .text:006F5E91 mov ebp, esp + .text:006F5E93 push esi + .text:006F5E94 mov esi, dword_2EEFDE4 + .text:006F5E9A push edi + */ + auto iterator_ptr = **( uintptr_t*** )( createinterface + 0x6 ); + + return iterator_ptr; + } + + inline bool is_createinterface_export( uintptr_t export_ ) { + return *( uint8_t* )( export_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( export_ + 4 ) == 0xe9 + && *( uint8_t* )( export_ + 9 ) == 0xcc + && *( uint8_t* )( export_ + 10 ) == 0xcc; + } + + inline bool is_createinterface_fn( uintptr_t fn_ ) { + return *( uint8_t* )( fn_ ) == x86::encode_push_reg( x86::reg::ebp ) + && *( uint8_t* )( fn_ + 4 ) == 0x8b + && *( uint8_t* )( fn_ + 10 ) == x86::encode_push_reg( x86::reg::edi ); + } + + class c_interface_manager { + public: + struct interface_data_t { + std::string m_name; + std::string m_module; + size_t m_version; + uintptr_t m_ptr; + + template < typename t > __forceinline t get( ) { + return reinterpret_cast< t >( m_ptr ); + } + }; + + c_interface_manager( ); + + //iterate the interface list to find our desired version + template < typename t = void* > + t find_interface( const std::string& module_, std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += "0"; + + for( auto& it : m_interfaces ) { + if( !it.m_module.compare( module_ ) + && !it.m_name.compare( name ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + template < typename t = void* > + t find_interface( std::string name ) { + //avoid finding interfaces with matching names + if( !::isdigit( name[ name.length( ) - 1 ] ) ) + name += '0'; + + for( auto& it : m_interfaces ) { + if( strstr( it.m_name.c_str( ), name.c_str( ) ) ) { + g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), + name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + + return it.get< t >( ); + } + } + + g_con->print( xors( "%s not found\n" ), name.c_str( ) ); + + return t{ }; + } + + void dump_interface_list( ) { + for( auto& it : m_interfaces ) { + g_con->print( xors( "%s version %u in %s at 0x%08x\n" ), + it.m_name.c_str( ), + it.m_version, + it.m_module.c_str( ), + it.m_ptr ); + } + } + + private: + uintptr_t find_createinterface( void* module_ ); + + std::vector< interface_data_t > m_interfaces; + }; +} + +END_REGION +#endif + +extern HMODULE g_dll; +extern tf2::interfaces::c_interface_manager g_factory; \ No newline at end of file diff --git a/cheat/tf2/factory.hpp b/cheat/tf2/factory.hpp new file mode 100644 index 0000000..4615c34 --- /dev/null +++ b/cheat/tf2/factory.hpp @@ -0,0 +1,190 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace tf2 +{ + namespace interfaces + { + // this interface linked list iteration code is tf2 specific ! + // in the future i will write it game/engine version independent + // using a disassembly engine + + struct regs { + void *( *m_CreateFn )( ); + const char *m_pName; + regs *m_pNext; + }; + + static inline bool is_create_fn( uintptr_t m_createfn ) { + return( *( uint8_t * )( m_createfn ) == 0xB8 + && *( uint8_t * )( m_createfn + 5 ) == 0xC3 ); + } + + static inline bool is_createinterface_fn( uintptr_t m_createfn ) { + return( *( uint8_t * )( m_createfn + 4 ) == 0xE9 + && *( uint8_t * )( m_createfn + 9 ) == 0xCC ); + } + + static inline uintptr_t follow_createinterface_export( uintptr_t export_ ) { + if ( *( uint8_t * )( export_ + 4 ) != 0xE9 ) return 0; + + return( export_ + 4 + *( uintptr_t * )( export_ + 5 ) + 5 ); + } + + static inline regs *reg_from_createinterface( uintptr_t ci ) { + if ( *( short * )( ci + 4 ) != 0x358B ) return nullptr; + + return( **( regs *** )( ci + 6 ) ); + } + + static inline uintptr_t interface_from_reg( regs *reg ) { + uintptr_t reg_func = *( uintptr_t * )reg; + + if ( is_create_fn( reg_func ) ) { + return( *( uintptr_t * )( reg_func + 1 ) ); + } + + return( 0 ); + } + + + class interface_manager { + public: + struct interface_data { + public: + std::string name; + std::string module; + int version; + void *ptr; + + template< typename T > inline T get( ) { return reinterpret_cast< T >( ptr ); } + + interface_data( std::string name_T, std::string module_T, void *ptr_T, int version_T = 0 ) + : name( name_T ), module( module_T ), ptr( ptr_T ), version( version_T ) {} + }; + + interface_manager() { + auto root = &get_peb( )->Ldr->InMemoryOrderModuleList; + + for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { + auto data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); + auto module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); + auto export_ = reinterpret_cast< uintptr_t >( ::GetProcAddress( module_base, "CreateInterface" ) ); + + if ( !export_ || !interfaces::is_createinterface_fn( export_ ) ) { + continue; + } + + auto CreateInterface = interfaces::follow_createinterface_export( export_ ); + + if ( !CreateInterface ) { + continue; + } + + auto regs = interfaces::reg_from_createinterface( CreateInterface ); + + while ( regs ) { + std::string name( regs->m_pName ), temp_version( name ); + + name.erase( std::remove_if( name.begin( ), name.end( ), &isdigit ), name.end( ) ); + + temp_version.erase( + std::remove_if( temp_version.begin( ), temp_version.end( ), + [ ]( int i ) { return !isdigit( i ); } + ), temp_version.end( ) + ); + + unsigned int version{ }; + std::stringstream( temp_version ) >> version; + + sorted_list.push_back( interface_data( name, unicode_to_string( data_table->FullDllName ), reinterpret_cast< void * >( interfaces::interface_from_reg( regs ) ), version ) ); + + regs = regs->m_pNext; + } + } + + std::sort( sorted_list.begin( ), sorted_list.end( ), [ ]( const interface_data &lhs, const interface_data &rhs ) { + return( lhs.version > rhs.version ); + } ); + } + public: + template< typename T = void * > T create( std::string name ) { + std::vector< interface_data >::iterator it = std::find_if( sorted_list.begin( ), sorted_list.end( ), [ & ]( const interface_data &data ) { + return ( !data.name.compare( name ) ); + } ); + + if ( it == sorted_list.end( ) || !it->ptr ) { + return T{ }; + } + + printf( "%s\n -> 0x%X\n -> module: %s \n", name.c_str( ), reinterpret_cast< uintptr_t >( it->ptr ), it->module.c_str( ) ); + + return( ( T )( it->ptr ) ); + } + + template< typename T = void* > T create( std::string name, std::string module ) { + std::vector< interface_data >::iterator it = std::find_if( sorted_list.begin( ), sorted_list.end( ), [ & ]( const interface_data &data ) { + return ( !data.name.compare( name ) && data.module.find( module ) != std::string::npos ); + } ); + + + if ( it == sorted_list.end( ) || !it->ptr ) { + return T{ }; + } + + //#ifdef DEBUG_PRINT + printf( "%s\n -> 0x%x\n -> module: %s \n", name.c_str( ), reinterpret_cast< uintptr_t >( it->ptr ), it->module.c_str( ) ); + //#endif + + return( static_cast< T >( it->ptr ) ); + } + + template< typename T = void * > T create_from_hash( uint32_t hash ) { + std::vector< interface_data >::iterator it = std::find_if( sorted_list.begin( ), sorted_list.end( ), [ & ]( const interface_data &data ) + { + return ( !data.name.compare( name ) ); + } ); + + if ( it == sorted_list.end( ) || !it->ptr ) { + return T{ }; + } + + return( ( T )( it->ptr ) ); + } + protected: + static inline PTEB get_teb( ) { +#if defined( _M_X64 ) + auto teb = reinterpret_cast< PTEB >( __readgsqword( reinterpret_cast< uintptr_t >( &static_cast< NT_TIB * >( nullptr )->Self ) ) ); +#else + auto teb = reinterpret_cast< PTEB >( __readfsdword( reinterpret_cast< uintptr_t >( &static_cast< NT_TIB * >( nullptr )->Self ) ) ); +#endif + + + return teb; + } + + static inline PPEB get_peb( ) { + return( get_teb( )->ProcessEnvironmentBlock ); + } + + static inline std::string unicode_to_string( UNICODE_STRING wide ) { + std::wstring wide_str( wide.Buffer, wide.Length ); + return std::string( wide_str.begin( ), wide_str.end( ) ); + } + + std::vector< interface_data > sorted_list{ }; + }; + }; +} \ No newline at end of file diff --git a/cheat/tf2/fnv.hpp b/cheat/tf2/fnv.hpp new file mode 100644 index 0000000..a3f2dc9 --- /dev/null +++ b/cheat/tf2/fnv.hpp @@ -0,0 +1,64 @@ +#pragma once + +#pragma warning( disable : 4307 ) // '*': integral constant overflow +#pragma warning( disable : 4244 ) // possible loss of data + +#include +#include + +using hash_t = unsigned int; + +// used for compile-time FNV-1a 32bit hashes. +#define fnv( str ) \ + [&]() { \ + constexpr hash_t out = hash::fnv1a( str ); \ + \ + return out; \ + }() + +// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. +#define fnv_const( str ) Hash::fnv1a_32( str ) + +namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). +{ + // FNV-1a constants. + enum : hash_t { + FNV1A_PRIME = 0x1000193, + FNV1A_BASIS = 0x811C9DC5 + }; + + // compile-time strlen. + __forceinline constexpr size_t ct_strlen( const char *str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; + } + + // hash data. + __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { + hash_t out = FNV1A_BASIS; + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ data[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash c-style string. + __forceinline constexpr hash_t fnv1a( const char *str ) { + hash_t out = FNV1A_BASIS; + size_t len = ct_strlen( str ); + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ str[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash C++-style string ( runtime only ). + __forceinline hash_t fnv1a( const std::string &str ) { + return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); + } +} \ No newline at end of file diff --git a/cheat/tf2/framestagenotify.cpp b/cheat/tf2/framestagenotify.cpp new file mode 100644 index 0000000..87e91d9 --- /dev/null +++ b/cheat/tf2/framestagenotify.cpp @@ -0,0 +1,41 @@ +#include "hooks.h" +#include "interfaces.h" +#include "base_cheat.h" + +void __fastcall hooks::frame_stage_notify( void* ecx_, void* edx_, frame_stages_t stage ) { + static auto fsn_o = cl.m_chl->get_old_function< decltype( hooks::frame_stage_notify )* >( 35 ); //35 + + g_ctx.m_stage = stage; + + if ( cl.m_panic ) { + return fsn_o( ecx_, edx_, stage ); + } + + switch( stage ) { + case FRAME_NET_UPDATE_START: + g_ctx.run_frame( ); + fsn_o( ecx_, 0, stage ); + + return; + + case FRAME_NET_UPDATE_POSTDATAUPDATE_START: + g_cheat.extra.float_ragdolls( ); + //g_cheat.m_skins( ); + g_cheat.visuals.update_glow( ); + fsn_o( ecx_, 0, stage ); + + return; + + case FRAME_RENDER_START: + //g_cheat.extra.disable_post_processing( ); + util::disable_pvs( ); + break; + + case FRAME_RENDER_END: + fsn_o( ecx_, 0, stage ); + //g_cheat.chams.m_materials.update_materials( ); + return; + } + + return fsn_o( ecx_, edx_, stage ); +} diff --git a/cheat/tf2/get_viewmodel_fov.cpp b/cheat/tf2/get_viewmodel_fov.cpp new file mode 100644 index 0000000..96c4a1e --- /dev/null +++ b/cheat/tf2/get_viewmodel_fov.cpp @@ -0,0 +1,8 @@ +#include "hooks.h" +#include "settings.h" + +float __fastcall hooks::get_viewmodel_fov( void* ecx, void* edx ) { + static auto get_viewmodel_fov_o = cl.m_clientmode->get_old_function< decltype( &hooks::get_viewmodel_fov ) >( 32 ); + + return get_viewmodel_fov_o( ecx, nullptr ) + float( g_settings.misc.viewmodel_fov ); +} diff --git a/cheat/tf2/graphics.cpp b/cheat/tf2/graphics.cpp new file mode 100644 index 0000000..9670bf9 --- /dev/null +++ b/cheat/tf2/graphics.cpp @@ -0,0 +1,107 @@ +#include "graphics.h" + +tf2::c_fonts fonts; +tf2::c_graphics graphics; + +namespace tf2 +{ + void c_graphics::draw_line( int x, int y, int x1, int y1, clr_t clr ) { + cl.m_surface( )->DrawSetColor( clr ); + cl.m_surface( )->DrawLine( x, y, x1, y1 ); + } + + void c_graphics::draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::string msg ) { + std::wstring a( msg.begin( ), msg.end( ) ); + const wchar_t* wbuf = a.c_str( ); + + int w, h; get_text_size( font, msg, w, h ); + + if ( f_alignment == alignment::right ) x -= w; + + if ( f_alignment == alignment::center ) x -= w / 2; + + cl.m_surface( )->DrawSetTextFont( font ); + cl.m_surface( )->DrawSetTextColor( clr ); + cl.m_surface( )->DrawSetTextPos( x, y - h / 2 ); + cl.m_surface( )->DrawPrintText( ( wchar_t* )wbuf, wcslen( wbuf ) ); + } + + void c_graphics::draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::wstring msg ) { + int w, h; get_text_size( font, msg, w, h ); + + if ( f_alignment == alignment::right ) x -= w; + + if ( f_alignment == alignment::center ) x -= w / 2; + + cl.m_surface( )->DrawSetTextFont( font ); + cl.m_surface( )->DrawSetTextColor( clr ); + cl.m_surface( )->DrawSetTextPos( x, y - h / 2 ); + cl.m_surface( )->DrawPrintText( ( wchar_t* )msg.c_str( ), wcslen( msg.c_str( ) ) ); + } + + void c_graphics::draw_rect( int x, int y, int w, int h, clr_t clr ) { + cl.m_surface( )->DrawSetColor( clr ); + cl.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); + } + + void c_graphics::draw_rect_outlined( int x, int y, int w, int h, clr_t clr ) { + cl.m_surface( )->DrawSetColor( clr ); + cl.m_surface( )->DrawOutlinedRect( x, y, x + w, y + h ); + } + + void c_graphics::draw_circle_outlined( int x, int y, int r, clr_t clr ) { + cl.m_surface( )->DrawSetColor( clr ); + cl.m_surface( )->DrawOutlinedCircle( x, y, r, 48 ); + } + + void c_graphics::get_text_size( HFont font, std::string text, int& w, int& h ) { + std::wstring a( text.begin( ), text.end( ) ); + const wchar_t* wstr = a.c_str( ); + + cl.m_surface( )->GetTextSize( font, wstr, w, h ); + } + + void c_graphics::get_text_size( HFont font, std::wstring text, int& w, int& h ) { + const wchar_t* wstr = text.c_str( ); + + cl.m_surface( )->GetTextSize( font, wstr, w, h ); + } + + void c_graphics::draw_polygon( int count, vertex_t* vertexs, clr_t clr_t ) { + static int texture = cl.m_surface( )->CreateNewTextureID( true ); + if ( !texture ) texture = cl.m_surface( )->CreateNewTextureID( true ); + + byte buffer[ 4 ] = { 255, 255, 255, 255 }; + + cl.m_surface( )->DrawSetTextureRGBA( texture, buffer, 1, 1 ); + cl.m_surface( )->DrawSetColor( clr_t ); + cl.m_surface( )->DrawSetTexture( texture ); + + cl.m_surface( )->DrawTexturedPolygon( count, vertexs ); + } + + void c_graphics::draw_filled_circle( int x, int y, int r, clr_t clr_t ) { + static vertex_t shape[ 24 ]; + static float step = M_PI * 2.0f / 24; + + for ( int i{ }; i < 24; i++ ) { + float theta = i * step; + float x1 = x + r * cos( theta ); + float y1 = y + r * sin( theta ); + shape[ i ].init( x1, y1 ); + } + draw_polygon( 24, shape, clr_t ); + } + + vec2_t c_graphics::world_to_screen( vec3_t world_pos ) { + vec3_t tmp; cl.m_overlay( )->ScreenPosition( world_pos, tmp ); + const matrix3x4& w2s_matrix = cl.m_engine( )->GetWorldToScreenMatrix( ); + float w = w2s_matrix[ 3 ][ 3 ]; + for ( int i{ }; i < 3; i++ ) { + w += w2s_matrix[ 3 ][ i ] * world_pos[ i ]; + } + if ( w < 0.001f ) return{ 10000.f, 10000.f }; + + return{ tmp.x, tmp.y }; + } +} \ No newline at end of file diff --git a/cheat/tf2/graphics.h b/cheat/tf2/graphics.h new file mode 100644 index 0000000..c9c2ef7 --- /dev/null +++ b/cheat/tf2/graphics.h @@ -0,0 +1,80 @@ +#pragma once +#include "color.hpp" +#include "interfaces.h" +#include "math.h" +typedef unsigned long HFont; + +enum alignment { + left, + right, + center +}; + +enum alignment_vertical { + top, + bottom +}; + +enum fontflag : long { + none, + italic = 0x001, + underline = 0x002, + strikeout = 0x004, + symbol = 0x008, + antialias = 0x010, + blur = 0x020, + rotary = 0x040, + dropshadow = 0x080, + additive = 0x100, + outline = 0x200, + custom = 0x400, + bitmap = 0x800, +}; + +namespace tf2 +{ + class c_fonts { + public: + c_fonts( ) { + } + + void init( ) { + f_12 = cl.m_surface( )->CreateFnt( ); + f_14 = cl.m_surface( )->CreateFnt( ); + f_16 = cl.m_surface( )->CreateFnt( ); + f_18 = cl.m_surface( )->CreateFnt( ); + f_esp = cl.m_surface( )->CreateFnt( ); + + cl.m_surface( )->SetFontGlyphSet( f_12, "Tahoma", 12, 300, 0, 0, fontflag::outline ); + cl.m_surface( )->SetFontGlyphSet( f_14, "Tahoma", 14, 300, 0, 0, fontflag::outline ); + cl.m_surface( )->SetFontGlyphSet( f_16, "Tahoma", 16, 300, 0, 0, fontflag::outline ); + cl.m_surface( )->SetFontGlyphSet( f_18, "Tahoma", 18, 300, 0, 0, fontflag::outline ); + cl.m_surface( )->SetFontGlyphSet( f_esp, "Verdana", 13, 550, 0, 0, fontflag::dropshadow ); + } + + HFont f_12; + HFont f_14; + HFont f_16; + HFont f_18; + + HFont f_esp; + }; + + class c_graphics { + public: + void draw_line( int x, int y, int x1, int y1, clr_t clr ); + void draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::string msg ); + void draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::wstring msg ); + void draw_rect( int x, int y, int w, int h, clr_t clr ); + void draw_rect_outlined( int x, int y, int w, int h, clr_t clr ); + void draw_circle_outlined( int x, int y, int r, clr_t clr ); + void get_text_size( HFont font, std::string text, int& w, int& h ); + void get_text_size( HFont font, std::wstring text, int& w, int& h ); + void draw_polygon( int count, vertex_t* vertexs, clr_t clr_t ); + void draw_filled_circle( int x, int y, int r, clr_t clr_t ); + vec2_t world_to_screen( vec3_t world_pos ); + }; +} + +extern tf2::c_graphics graphics; +extern tf2::c_fonts fonts; \ No newline at end of file diff --git a/cheat/tf2/hooks.cpp b/cheat/tf2/hooks.cpp new file mode 100644 index 0000000..0472c6e --- /dev/null +++ b/cheat/tf2/hooks.cpp @@ -0,0 +1,41 @@ +#include "hooks.h" +#include "interfaces.h" +#include "netvars.h" + + +bool hooks::commit( tf2::client* instance ) { + while( !( instance->m_hwnd = FindWindowA( xors( "Valve001" ), 0 ) ) ) + Sleep( 100 ); + + window_procedure_o = reinterpret_cast< decltype( window_procedure_o ) >( + SetWindowLongA( instance->m_hwnd, GWLP_WNDPROC, + ( long )window_procedure ) + ); + + instance->m_clientmode->hook( 20, &hooks::override_mouse_input );//n + instance->m_clientmode->hook( 32, &hooks::get_viewmodel_fov );//n + instance->m_clientmode->hook( 39, &hooks::do_post_screen_space_effects ); //n + instance->m_clientmode->hook( 16, &hooks::override_view ); //n + instance->m_clientmode->hook( 21, &hooks::create_move ); //y + instance->m_chl->hook( 35, &hooks::frame_stage_notify ); //y + instance->m_chl->hook( 3, &hooks::shut_down ); //n + + //honestly fuck chams and keyvalues they can lick my mothers toes + + //instance->m_model_render->hook( 19, &hooks::draw_model_execute ); //n + //instance->m_render_view->hook( 9, &hooks::scene_end ); //n + + + instance->m_movement->hook( 1, &hooks::process_movement ); //y + instance->m_d3d->hook( 42, &hooks::d3d::end_scene ); //y + instance->m_d3d->hook( 16, &hooks::d3d::reset );//y + instance->m_d3d->hook( 17, &hooks::d3d::present );//y + instance->m_panel->hook( 41, &hooks::paint_traverse ); //y + + instance->m_vgui->hook( 13, &hooks::paint ); //y + + instance->m_surface->hook( 116, &hooks::on_screen_size_changed ); //n + //instance->m_engine_sound->hook( 5, &hooks::emit_sound ); //n + + return true; +} diff --git a/cheat/tf2/hooks.h b/cheat/tf2/hooks.h new file mode 100644 index 0000000..c34d71f --- /dev/null +++ b/cheat/tf2/hooks.h @@ -0,0 +1,50 @@ +#pragma once +#include + +#include "util.hpp" +#include "d3d.hpp" +#include "interfaces.h" +#include "netvar_proxy.hpp" + +namespace hooks +{ + //hook like the hooker that u are + + void __fastcall paint( void* ecx_, void* edx_, int mode ); + long __stdcall window_procedure( HWND, uint32_t, uint32_t, long ); + extern decltype( &window_procedure ) window_procedure_o; + void __fastcall process_movement( void*, void*, c_base_player*, CMoveData* ); + void __fastcall paint_traverse( void*, void*, unsigned int, bool, bool ); + bool __fastcall create_move( void*, void*, float, user_cmd_t* ); + void __stdcall hl_create_move_gate( int sequence_number, float input_sample_time, bool active ); + void __fastcall hl_create_move( void*, void*, int, float, bool, byte& ); + void __fastcall frame_stage_notify( void*, void*, frame_stages_t ); + void __fastcall override_mouse_input( void*, void*, float*, float* ); + void __fastcall draw_model_execute( IVModelInfo*, void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); + void __fastcall scene_end( void*, void* ); + float __fastcall get_viewmodel_fov( void*, void* ); + void __fastcall override_view( void* ecx_, void* edx_, CViewSetup* setup ); + void __fastcall emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, + const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, + const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ); + void __fastcall shut_down( void* ecx_, void* edx_ ); + + bool __fastcall is_connected( void* ecx_, void* edx_ ); + + bool __fastcall in_prediction( void* ecx_, void* edx_ ); + int __fastcall send_datagram( INetChannel* channel, void* edx, void* datagram ); + bool __fastcall do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ); + void __fastcall on_screen_size_changed( void* ecx_, void* edx_, int old_h, int old_w ); + + + + //do we wanna only run menu in d3d or visuals too? + namespace d3d { + long __stdcall end_scene( IDirect3DDevice9* ); + long __stdcall reset( IDirect3DDevice9*, D3DPRESENT_PARAMETERS* ); + long __stdcall present( IDirect3DDevice9*, RECT*, RECT*, HWND, RGNDATA* ); + long __stdcall draw( IDirect3DDevice9*, D3DPRIMITIVETYPE, int, uint32_t, uint32_t, uint32_t, uint32_t ); + } + + extern bool commit( tf2::client* ); +} \ No newline at end of file diff --git a/cheat/tf2/icons.hpp b/cheat/tf2/icons.hpp new file mode 100644 index 0000000..bffd94e --- /dev/null +++ b/cheat/tf2/icons.hpp @@ -0,0 +1,5 @@ +#include "icons/legit.hpp" +#include "icons/rage.hpp" +#include "icons/visuals.hpp" +#include "icons/misc.hpp" +#include "icons/config.hpp" \ No newline at end of file diff --git a/cheat/tf2/icons/config.hpp b/cheat/tf2/icons/config.hpp new file mode 100644 index 0000000..e47c75b --- /dev/null +++ b/cheat/tf2/icons/config.hpp @@ -0,0 +1,1297 @@ +/* E:\Users\admin\Desktop\stuff\icons\config.png (1/26/2018 4:19:12 AM) + StartOffset: 00000000, EndOffset: 00003C3C, Length: 00003C3D */ + +namespace icons { +static const size_t config_size = 15421; +namespace raw { +static const unsigned char config_raw[15421] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, + 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, + 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, + 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, + 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, + 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, + 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, + 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, + 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, + 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, + 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, + 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, + 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, + 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, + 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, + 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, + 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, + 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, + 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, + 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, + 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, + 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, + 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, + 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, + 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, + 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, + 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, + 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, + 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, + 0x31, 0x39, 0x3A, 0x30, 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x39, + 0x3A, 0x30, 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, + 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, + 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x39, 0x3A, 0x30, + 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, + 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, + 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, + 0x34, 0x30, 0x32, 0x65, 0x31, 0x36, 0x64, 0x39, 0x2D, 0x37, 0x38, 0x63, + 0x30, 0x2D, 0x61, 0x32, 0x34, 0x33, 0x2D, 0x39, 0x63, 0x63, 0x62, 0x2D, + 0x37, 0x32, 0x66, 0x30, 0x65, 0x38, 0x35, 0x36, 0x33, 0x65, 0x62, 0x33, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, + 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, + 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x61, 0x63, 0x34, + 0x61, 0x35, 0x32, 0x38, 0x31, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, + 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, + 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, + 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, + 0x61, 0x30, 0x31, 0x35, 0x36, 0x63, 0x64, 0x31, 0x2D, 0x34, 0x62, 0x37, + 0x62, 0x2D, 0x36, 0x31, 0x34, 0x37, 0x2D, 0x62, 0x33, 0x31, 0x64, 0x2D, + 0x35, 0x36, 0x63, 0x33, 0x63, 0x36, 0x64, 0x31, 0x34, 0x38, 0x66, 0x32, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, + 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, + 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, + 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, + 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, + 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, 0x30, 0x31, 0x35, 0x36, + 0x63, 0x64, 0x31, 0x2D, 0x34, 0x62, 0x37, 0x62, 0x2D, 0x36, 0x31, 0x34, + 0x37, 0x2D, 0x62, 0x33, 0x31, 0x64, 0x2D, 0x35, 0x36, 0x63, 0x33, 0x63, + 0x36, 0x64, 0x31, 0x34, 0x38, 0x66, 0x32, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, + 0x39, 0x3A, 0x30, 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, + 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, + 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, + 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, + 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, + 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, + 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, + 0x64, 0x3A, 0x34, 0x30, 0x32, 0x65, 0x31, 0x36, 0x64, 0x39, 0x2D, 0x37, + 0x38, 0x63, 0x30, 0x2D, 0x61, 0x32, 0x34, 0x33, 0x2D, 0x39, 0x63, 0x63, + 0x62, 0x2D, 0x37, 0x32, 0x66, 0x30, 0x65, 0x38, 0x35, 0x36, 0x33, 0x65, + 0x62, 0x33, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, + 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, + 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, + 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x39, 0x3A, 0x30, 0x39, 0x2B, + 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, + 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, + 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, + 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, + 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, + 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, + 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, + 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, + 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, + 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, + 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, + 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, + 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, + 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, + 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, + 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, + 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, + 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, + 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, + 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, + 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, + 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, + 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x8F, 0x3F, + 0x33, 0x69, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, + 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, + 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, + 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, + 0x01, 0xCB, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0xD9, 0x3F, 0x4A, + 0x03, 0x41, 0x14, 0xC7, 0xF1, 0xEF, 0xC6, 0x44, 0x08, 0x98, 0x28, 0x2A, + 0xA6, 0xB1, 0xB1, 0x13, 0x8B, 0x94, 0xA2, 0x17, 0xB0, 0x14, 0x2C, 0xBC, + 0x82, 0xB5, 0x8D, 0x37, 0xB0, 0x14, 0x53, 0xD8, 0x08, 0xE2, 0x01, 0xB4, + 0x50, 0x04, 0x2F, 0x60, 0x23, 0x01, 0x0B, 0x49, 0x29, 0xD6, 0x16, 0xDA, + 0x28, 0x0A, 0x2A, 0x89, 0x1A, 0x8B, 0xAC, 0x10, 0x06, 0x12, 0x77, 0xB3, + 0x33, 0xC9, 0xCE, 0xF2, 0x7B, 0xB0, 0x84, 0xB7, 0xB0, 0x84, 0xF9, 0xEC, + 0xCC, 0x9B, 0x3F, 0x1B, 0xB4, 0xDB, 0x6D, 0x14, 0x90, 0x13, 0x81, 0x20, + 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, + 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0xC3, 0x8A, 0x7C, 0x82, 0x67, 0xA7, + 0x80, 0x95, 0xF0, 0xB7, 0x57, 0x3C, 0x00, 0x75, 0xA0, 0x95, 0x45, 0x88, + 0x6D, 0xA0, 0x36, 0xC0, 0x73, 0xF3, 0x21, 0x4C, 0x2A, 0x23, 0x88, 0x79, + 0x42, 0x75, 0x0A, 0x6C, 0x26, 0xF8, 0xBF, 0x45, 0xE0, 0x2E, 0x0B, 0x10, + 0x36, 0xCE, 0xF5, 0x02, 0xDF, 0x8B, 0xE5, 0xB1, 0x91, 0xDF, 0x84, 0x8D, + 0xEA, 0x77, 0xE5, 0x80, 0x17, 0xE3, 0xB9, 0x1A, 0x50, 0x70, 0x78, 0x8D, + 0xB9, 0xEE, 0x11, 0x8F, 0xC0, 0xDC, 0x80, 0x6F, 0x76, 0x54, 0x27, 0xC4, + 0x5B, 0xC0, 0x91, 0x6D, 0x88, 0x67, 0x63, 0x86, 0xF0, 0x01, 0x02, 0xE0, + 0x09, 0xA8, 0x68, 0x1D, 0xD1, 0xE9, 0xC5, 0x7B, 0x69, 0xE9, 0x11, 0xB3, + 0x43, 0x6C, 0xF8, 0x04, 0x70, 0x01, 0x54, 0xE3, 0x14, 0xE9, 0x61, 0x41, + 0x8C, 0x22, 0xCE, 0x80, 0x8D, 0xAE, 0xBC, 0x00, 0x7C, 0xB9, 0x58, 0x59, + 0x36, 0x80, 0xE9, 0x94, 0x22, 0xB4, 0x80, 0xB2, 0x71, 0x6F, 0x01, 0xB8, + 0x77, 0x01, 0x51, 0xF5, 0xAC, 0x56, 0x94, 0x6C, 0x15, 0xCB, 0x62, 0x06, + 0x8A, 0xA6, 0x95, 0x1A, 0xE1, 0xFB, 0xD7, 0xE2, 0xBE, 0xD3, 0x68, 0x54, + 0x88, 0x22, 0xF0, 0x6E, 0xDC, 0x3B, 0x04, 0x4E, 0x80, 0x66, 0x0A, 0x1B, + 0x5D, 0x01, 0x76, 0x81, 0xA5, 0xA8, 0x33, 0x47, 0xD4, 0x1A, 0xB1, 0xEF, + 0xC3, 0x7E, 0xC1, 0x88, 0xF3, 0x70, 0x1A, 0x5D, 0xB7, 0xB9, 0xB2, 0x6C, + 0x18, 0xC5, 0x31, 0xF0, 0x64, 0x38, 0x94, 0x80, 0xD7, 0xAE, 0x7C, 0xBC, + 0xD7, 0xD9, 0x48, 0xD4, 0x62, 0x99, 0xF7, 0xB4, 0x2E, 0x7C, 0xBA, 0xD8, + 0x7D, 0x66, 0x3A, 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x16, 0x21, + 0x3E, 0x3C, 0x6D, 0xDF, 0xA4, 0x91, 0xFF, 0x24, 0x85, 0xB8, 0x34, 0xF2, + 0xB2, 0x27, 0x10, 0xD7, 0x46, 0xFE, 0xED, 0x62, 0xD3, 0xB5, 0x03, 0x1C, + 0xF4, 0x53, 0x1E, 0x71, 0x4F, 0xB8, 0x8A, 0xB3, 0xD7, 0x88, 0x03, 0xF1, + 0x46, 0xE7, 0x18, 0xCC, 0xD7, 0x58, 0xA6, 0xF3, 0x09, 0x22, 0x31, 0xC4, + 0xDF, 0x18, 0x0B, 0x3C, 0x44, 0xA8, 0x03, 0xAB, 0x36, 0x67, 0x8D, 0x1C, + 0x70, 0xEB, 0x19, 0xC2, 0xDA, 0x7F, 0x08, 0x83, 0xF4, 0x08, 0x73, 0xBC, + 0xCD, 0xA4, 0xB4, 0xF1, 0x4D, 0x63, 0xD7, 0x89, 0x4B, 0x08, 0x2D, 0xA8, + 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x42, 0x10, + 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, + 0xB0, 0x16, 0xBF, 0x03, 0x00, 0xF4, 0xAF, 0x63, 0xB0, 0x6A, 0xED, 0xB9, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, + 0x82 +}; +} +static const unsigned char* config_icon = raw::config_raw; +} \ No newline at end of file diff --git a/cheat/tf2/icons/legit.hpp b/cheat/tf2/icons/legit.hpp new file mode 100644 index 0000000..8e5523e --- /dev/null +++ b/cheat/tf2/icons/legit.hpp @@ -0,0 +1,1316 @@ +/* E:\Users\admin\Desktop\stuff\icons\legit.png (1/26/2018 4:18:16 AM) + StartOffset: 00000000, EndOffset: 00003D23, Length: 00003D24 */ + +namespace icons { +static const size_t legit_size = 15652; +namespace raw { +static const unsigned char legit_raw[15652] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, + 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, + 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, + 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, + 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, + 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, + 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, + 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, + 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, + 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, + 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, + 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, + 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, + 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, + 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, + 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, + 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, + 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, + 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, + 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, + 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, + 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, + 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, + 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, + 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, + 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, + 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, + 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, + 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, + 0x31, 0x38, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, + 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, + 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, + 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x31, + 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, + 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, + 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, + 0x65, 0x39, 0x33, 0x64, 0x37, 0x33, 0x38, 0x37, 0x2D, 0x31, 0x30, 0x36, + 0x39, 0x2D, 0x35, 0x64, 0x34, 0x32, 0x2D, 0x38, 0x66, 0x38, 0x63, 0x2D, + 0x63, 0x33, 0x34, 0x33, 0x37, 0x39, 0x35, 0x36, 0x35, 0x65, 0x30, 0x63, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, + 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, + 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x38, 0x62, 0x66, + 0x62, 0x37, 0x35, 0x37, 0x35, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, + 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, + 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, + 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, + 0x32, 0x35, 0x33, 0x61, 0x62, 0x33, 0x39, 0x61, 0x2D, 0x33, 0x37, 0x31, + 0x31, 0x2D, 0x35, 0x64, 0x34, 0x64, 0x2D, 0x62, 0x63, 0x33, 0x38, 0x2D, + 0x62, 0x36, 0x66, 0x30, 0x34, 0x36, 0x62, 0x62, 0x30, 0x31, 0x66, 0x34, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, + 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, + 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, + 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, + 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, + 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x32, 0x35, 0x33, 0x61, 0x62, + 0x33, 0x39, 0x61, 0x2D, 0x33, 0x37, 0x31, 0x31, 0x2D, 0x35, 0x64, 0x34, + 0x64, 0x2D, 0x62, 0x63, 0x33, 0x38, 0x2D, 0x62, 0x36, 0x66, 0x30, 0x34, + 0x36, 0x62, 0x62, 0x30, 0x31, 0x66, 0x34, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, + 0x38, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, + 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, + 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, + 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, + 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, + 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, + 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, + 0x64, 0x3A, 0x65, 0x39, 0x33, 0x64, 0x37, 0x33, 0x38, 0x37, 0x2D, 0x31, + 0x30, 0x36, 0x39, 0x2D, 0x35, 0x64, 0x34, 0x32, 0x2D, 0x38, 0x66, 0x38, + 0x63, 0x2D, 0x63, 0x33, 0x34, 0x33, 0x37, 0x39, 0x35, 0x36, 0x35, 0x65, + 0x30, 0x63, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, + 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, + 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, + 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x31, 0x34, 0x2B, + 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, + 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, + 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, + 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, + 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, + 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, + 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, + 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, + 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, + 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, + 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, + 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, + 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, + 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, + 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, + 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, + 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, + 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, + 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, + 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, + 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, + 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, + 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x56, 0x82, + 0xD6, 0xC2, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, + 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, + 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, + 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, + 0x02, 0xB2, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9B, 0x3D, 0x68, + 0x14, 0x41, 0x14, 0x80, 0xBF, 0x4D, 0x2E, 0xE4, 0x40, 0x51, 0x8C, 0x10, + 0x83, 0x0A, 0x11, 0xB4, 0x51, 0x2C, 0x44, 0xAB, 0xA4, 0x31, 0x9D, 0xD8, + 0x89, 0x60, 0x61, 0x44, 0xC4, 0x46, 0x6B, 0x8B, 0x34, 0x22, 0xD8, 0x88, + 0x82, 0x60, 0x2F, 0xDA, 0x58, 0x18, 0x41, 0x2C, 0x44, 0x84, 0x80, 0x9D, + 0x29, 0x4C, 0xA9, 0x85, 0x28, 0x41, 0x2D, 0xD4, 0xA8, 0x10, 0x11, 0x7F, + 0x88, 0x62, 0x40, 0x93, 0xB5, 0xB8, 0x39, 0x0C, 0xC3, 0xDB, 0xDC, 0xCE, + 0xDE, 0xEC, 0xEE, 0x8C, 0xBE, 0x07, 0x03, 0xB7, 0x6F, 0x6F, 0x96, 0xD9, + 0x6F, 0xDF, 0x7B, 0xF3, 0xDE, 0xDB, 0xBB, 0x24, 0x4D, 0x53, 0x54, 0xA0, + 0x47, 0x11, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, 0x10, + 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, + 0x10, 0xFF, 0x1B, 0x88, 0x8B, 0xC0, 0x1D, 0x20, 0xA9, 0x6B, 0x01, 0x8D, + 0x00, 0x20, 0xFC, 0x04, 0x9A, 0xE6, 0xF3, 0x72, 0x5D, 0x30, 0x92, 0x00, + 0x3A, 0x54, 0xF6, 0x02, 0x12, 0x8D, 0x11, 0x91, 0xC7, 0x88, 0x8D, 0xC0, + 0x4B, 0xF3, 0x64, 0x8B, 0x0C, 0xC9, 0x42, 0x8A, 0x8C, 0x2B, 0x75, 0xB9, + 0xC6, 0x0E, 0x03, 0x20, 0x34, 0x79, 0x03, 0x6C, 0xAB, 0xCA, 0x22, 0xDE, + 0x07, 0x0A, 0x01, 0x60, 0xD8, 0x58, 0xC8, 0x48, 0xD9, 0x20, 0x52, 0x60, + 0x73, 0x04, 0x6E, 0x3F, 0x03, 0x5C, 0x2E, 0x0B, 0xC4, 0x6A, 0x7E, 0xF4, + 0xC8, 0x98, 0x64, 0x52, 0xE1, 0x68, 0x00, 0x47, 0x80, 0xC5, 0x8C, 0x35, + 0x4D, 0x00, 0x67, 0x7C, 0xC7, 0x88, 0x4F, 0x26, 0x30, 0xDA, 0x72, 0x09, + 0x38, 0x1B, 0x80, 0x05, 0x34, 0x0C, 0x90, 0x5E, 0xE1, 0xDC, 0x16, 0xE0, + 0x83, 0x0F, 0x10, 0x7B, 0x80, 0x27, 0x82, 0x7E, 0x1D, 0xB0, 0x10, 0x98, + 0x4B, 0x4C, 0x02, 0xE3, 0xD2, 0xBD, 0xFA, 0x70, 0x0D, 0x09, 0xC2, 0x5A, + 0x4F, 0x10, 0x3A, 0x6D, 0xA7, 0xAE, 0x72, 0x0C, 0x98, 0x16, 0xF4, 0xE7, + 0xBB, 0xB5, 0x88, 0x5D, 0xC0, 0x33, 0x4B, 0x77, 0x1C, 0xB8, 0x19, 0x78, + 0x66, 0x99, 0xBA, 0x58, 0x45, 0x1E, 0x10, 0x0B, 0xE6, 0xE9, 0x97, 0x95, + 0x06, 0x97, 0x05, 0x62, 0x2B, 0x30, 0x67, 0xE9, 0x06, 0x80, 0x2F, 0x45, + 0x5D, 0xC3, 0x86, 0x70, 0x2E, 0x92, 0xAC, 0xF9, 0x5D, 0x46, 0xFC, 0x28, + 0x6C, 0x11, 0xA9, 0x00, 0x2F, 0xCD, 0x28, 0xA5, 0xF7, 0x16, 0x58, 0xF0, + 0x01, 0xEB, 0xF8, 0x81, 0xE3, 0xFC, 0x5F, 0x66, 0x9B, 0x9C, 0x15, 0xCE, + 0x3D, 0x05, 0x76, 0xAF, 0x38, 0xFE, 0x0D, 0xF4, 0x15, 0x01, 0xB1, 0x01, + 0xF8, 0x9C, 0xC3, 0x74, 0x43, 0xF8, 0x91, 0xC5, 0x29, 0xE0, 0xBA, 0xA5, + 0x3B, 0x01, 0xDC, 0xC8, 0xE3, 0x7A, 0x9D, 0x5C, 0xA3, 0x19, 0x51, 0x01, + 0x79, 0x55, 0xD0, 0xBD, 0xF0, 0x95, 0x59, 0x2E, 0x45, 0x04, 0xE2, 0xBE, + 0xA0, 0x1B, 0xF4, 0x59, 0x7D, 0xE6, 0x89, 0xEA, 0x6B, 0x80, 0xD7, 0xC6, + 0x95, 0x5C, 0xA5, 0xB7, 0x4B, 0xF8, 0xCB, 0x26, 0x08, 0x9E, 0x14, 0xCE, + 0x3D, 0x04, 0xF6, 0x5B, 0xF7, 0xD2, 0xE3, 0x0B, 0xC4, 0x21, 0xE0, 0x5E, + 0x04, 0xDB, 0xA7, 0x74, 0xED, 0xC7, 0xC0, 0xBE, 0xA2, 0x20, 0xA4, 0x3E, + 0x62, 0x0C, 0x79, 0x44, 0x93, 0x56, 0x3F, 0x74, 0xA5, 0xEC, 0xCC, 0xD8, + 0x5D, 0x72, 0xE5, 0x11, 0x47, 0x05, 0xDD, 0xF6, 0x08, 0x62, 0xC6, 0x57, + 0x41, 0x37, 0xDB, 0x4D, 0xAD, 0x71, 0x5B, 0xD0, 0xBD, 0x0A, 0x1C, 0xC2, + 0x38, 0xD0, 0x6F, 0xE9, 0xA6, 0x7D, 0x54, 0x9F, 0x13, 0x19, 0x4D, 0x0E, + 0x1F, 0x66, 0x3C, 0x60, 0x25, 0x39, 0xF3, 0x5D, 0x5E, 0x6F, 0xC4, 0x34, + 0x65, 0x9C, 0xD6, 0xEA, 0xD2, 0x8F, 0xC8, 0xFA, 0xE2, 0x30, 0xF0, 0x36, + 0x10, 0x4B, 0x98, 0x02, 0x0E, 0x0A, 0xFA, 0xC3, 0xC0, 0x5D, 0x1F, 0x65, + 0x38, 0x59, 0xA9, 0x29, 0xAD, 0x66, 0xE9, 0x12, 0x30, 0x56, 0x63, 0x43, + 0x66, 0xD2, 0x3C, 0x28, 0x09, 0xC2, 0xF3, 0x4E, 0x10, 0x5C, 0x2D, 0xA2, + 0x9D, 0x2F, 0x7C, 0x8F, 0x28, 0xC9, 0x9A, 0x07, 0x86, 0x7C, 0x64, 0x96, + 0xB6, 0xFC, 0x58, 0xC5, 0x32, 0x42, 0x93, 0x5B, 0x79, 0x21, 0x14, 0x01, + 0xD1, 0xAE, 0xE0, 0x12, 0xE0, 0x5A, 0xC0, 0x10, 0x36, 0xD1, 0xEA, 0x54, + 0x51, 0x26, 0x88, 0xB6, 0x9C, 0x36, 0x40, 0x2E, 0x04, 0x72, 0xF3, 0xDF, + 0xF8, 0xDB, 0x45, 0xFF, 0xE8, 0x3A, 0xD9, 0xF7, 0x4B, 0xE0, 0x7E, 0x93, + 0x6C, 0xAD, 0x77, 0x98, 0x63, 0x6F, 0x75, 0xA3, 0x0E, 0x73, 0xE7, 0x32, + 0x1A, 0x30, 0xD4, 0x0D, 0x22, 0xB4, 0x5A, 0xA3, 0x12, 0xD7, 0xF8, 0xA7, + 0x24, 0x04, 0x10, 0x7D, 0xB4, 0x1A, 0xAA, 0x8B, 0xC8, 0x2F, 0x90, 0x2A, + 0x91, 0x44, 0xFF, 0xCA, 0xA4, 0xAE, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, + 0x10, 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, + 0x50, 0x10, 0x0A, 0xA2, 0x2A, 0xF9, 0x33, 0x00, 0x85, 0x3D, 0xBB, 0x66, + 0xA5, 0x18, 0xA1, 0xED, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, + 0xAE, 0x42, 0x60, 0x82 +}; +} +static const unsigned char* legit_icon = raw::legit_raw; +} \ No newline at end of file diff --git a/cheat/tf2/icons/misc.hpp b/cheat/tf2/icons/misc.hpp new file mode 100644 index 0000000..d15e736 --- /dev/null +++ b/cheat/tf2/icons/misc.hpp @@ -0,0 +1,1313 @@ +/* E:\Users\admin\Desktop\stuff\icons\misc.png (1/26/2018 4:19:00 AM) + StartOffset: 00000000, EndOffset: 00003CFF, Length: 00003D00 */ + +namespace icons { +static const size_t misc_size = 15616; +namespace raw { +static const unsigned char misc_raw[15616] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, + 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, + 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, + 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, + 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, + 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, + 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, + 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, + 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, + 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, + 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, + 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, + 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, + 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, + 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, + 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, + 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, + 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, + 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, + 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, + 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, + 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, + 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, + 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, + 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, + 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, + 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, + 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, + 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, + 0x31, 0x38, 0x3A, 0x35, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, + 0x3A, 0x35, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, + 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, + 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x35, + 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, + 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, + 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, + 0x63, 0x36, 0x30, 0x66, 0x62, 0x37, 0x34, 0x35, 0x2D, 0x30, 0x38, 0x61, + 0x63, 0x2D, 0x35, 0x64, 0x34, 0x38, 0x2D, 0x38, 0x65, 0x39, 0x33, 0x2D, + 0x39, 0x65, 0x62, 0x38, 0x39, 0x65, 0x31, 0x32, 0x30, 0x63, 0x64, 0x35, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, + 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, + 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x39, 0x61, 0x63, + 0x30, 0x38, 0x39, 0x32, 0x64, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, + 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, + 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, + 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, + 0x38, 0x30, 0x61, 0x38, 0x30, 0x31, 0x39, 0x38, 0x2D, 0x30, 0x62, 0x66, + 0x32, 0x2D, 0x37, 0x64, 0x34, 0x62, 0x2D, 0x39, 0x65, 0x32, 0x36, 0x2D, + 0x62, 0x66, 0x39, 0x36, 0x37, 0x34, 0x36, 0x39, 0x63, 0x65, 0x34, 0x66, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, + 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, + 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, + 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, + 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, + 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x38, 0x30, 0x61, 0x38, 0x30, + 0x31, 0x39, 0x38, 0x2D, 0x30, 0x62, 0x66, 0x32, 0x2D, 0x37, 0x64, 0x34, + 0x62, 0x2D, 0x39, 0x65, 0x32, 0x36, 0x2D, 0x62, 0x66, 0x39, 0x36, 0x37, + 0x34, 0x36, 0x39, 0x63, 0x65, 0x34, 0x66, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, + 0x38, 0x3A, 0x35, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, + 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, + 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, + 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, + 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, + 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, + 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, + 0x64, 0x3A, 0x63, 0x36, 0x30, 0x66, 0x62, 0x37, 0x34, 0x35, 0x2D, 0x30, + 0x38, 0x61, 0x63, 0x2D, 0x35, 0x64, 0x34, 0x38, 0x2D, 0x38, 0x65, 0x39, + 0x33, 0x2D, 0x39, 0x65, 0x62, 0x38, 0x39, 0x65, 0x31, 0x32, 0x30, 0x63, + 0x64, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, + 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, + 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, + 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x35, 0x37, 0x2B, + 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, + 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, + 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, + 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, + 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, + 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, + 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, + 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, + 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, + 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, + 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, + 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, + 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, + 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, + 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, + 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, + 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, + 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, + 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, + 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, + 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, + 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, + 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xE2, 0x3E, + 0xB4, 0x34, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, + 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, + 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, + 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, + 0x02, 0x8E, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0xDB, 0xBF, 0x6B, + 0x14, 0x41, 0x18, 0xC6, 0xF1, 0xEF, 0xC6, 0x5C, 0xCE, 0xC3, 0x93, 0xA0, + 0x48, 0xF0, 0x07, 0x6A, 0x0A, 0x15, 0x31, 0x8D, 0x55, 0x40, 0xB0, 0xB4, + 0xD0, 0x42, 0xD0, 0xCE, 0x7F, 0x40, 0x41, 0x11, 0x04, 0x5B, 0x7B, 0x3B, + 0x11, 0xC4, 0x42, 0x05, 0xB1, 0x13, 0x04, 0x1B, 0x41, 0xAC, 0x6D, 0xAD, + 0x04, 0x41, 0xC4, 0x46, 0xB0, 0x88, 0x12, 0x41, 0xD0, 0x80, 0x07, 0x31, + 0xB9, 0x5B, 0x8B, 0x4C, 0x40, 0xD6, 0x99, 0xDD, 0xD9, 0x99, 0x59, 0xDD, + 0x95, 0x67, 0xE0, 0x8A, 0x5B, 0xDE, 0xEC, 0xED, 0x7C, 0xF6, 0x9D, 0x99, + 0x77, 0xF6, 0x72, 0x59, 0x9E, 0xE7, 0xA8, 0xC1, 0x94, 0x08, 0x04, 0x21, + 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, + 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x88, 0xFF, + 0x09, 0xE2, 0x3C, 0xB0, 0x02, 0xE4, 0xFF, 0xE8, 0xB5, 0x0A, 0xDC, 0x88, + 0xE9, 0x40, 0x16, 0xF9, 0xF0, 0xF6, 0x15, 0xB0, 0xD8, 0xB2, 0x9B, 0xFB, + 0x09, 0x38, 0x00, 0x8C, 0xFF, 0x46, 0x46, 0x1C, 0x37, 0x77, 0x62, 0xB1, + 0x85, 0x59, 0xBE, 0x17, 0x58, 0x07, 0x2E, 0x36, 0x0D, 0x71, 0x0B, 0x78, + 0xDD, 0x81, 0x61, 0xFF, 0x00, 0x78, 0xD7, 0x14, 0xC4, 0x4D, 0xE0, 0x7A, + 0xC5, 0x87, 0x1F, 0x06, 0xB6, 0x02, 0x7D, 0x8F, 0xD7, 0x7C, 0xC9, 0xB9, + 0x06, 0x85, 0xD8, 0x61, 0x49, 0xAC, 0x6B, 0x7C, 0x1F, 0x05, 0xDE, 0xA7, + 0x9E, 0x23, 0x8E, 0x94, 0x9C, 0x74, 0x1B, 0x30, 0xAA, 0x89, 0xDA, 0x03, + 0x7E, 0xBA, 0xAE, 0xAB, 0x46, 0x67, 0x67, 0x80, 0x35, 0x60, 0x1A, 0xF8, + 0x02, 0xEC, 0xB0, 0xC4, 0x5C, 0x03, 0xEE, 0xA4, 0x82, 0xB0, 0x05, 0x3E, + 0x01, 0x2E, 0x04, 0xA4, 0x6D, 0x2A, 0x84, 0x21, 0xF0, 0xC3, 0x33, 0xB6, + 0x67, 0xE6, 0x8E, 0xA8, 0xA1, 0xF1, 0xC2, 0x72, 0xEC, 0x69, 0x87, 0x10, + 0x00, 0xBE, 0xA5, 0xC8, 0x88, 0xDC, 0xF3, 0xA2, 0xDB, 0x8A, 0xB0, 0xD9, + 0xB6, 0x00, 0x93, 0xD0, 0x8C, 0x38, 0xE1, 0x98, 0x13, 0xBA, 0x86, 0x00, + 0xF0, 0x38, 0x26, 0x23, 0x96, 0xCC, 0xDA, 0x1C, 0x93, 0x0D, 0x53, 0x25, + 0x05, 0x4E, 0x53, 0x08, 0x43, 0xB3, 0x7C, 0xEE, 0xF7, 0xB9, 0x76, 0x9F, + 0x8C, 0x28, 0x22, 0xDC, 0x4D, 0x88, 0x60, 0xFB, 0xFC, 0x89, 0x23, 0x76, + 0xA7, 0x05, 0x61, 0x52, 0x01, 0x76, 0x3A, 0x65, 0x89, 0x5D, 0x0C, 0xD8, + 0x67, 0xCA, 0xD8, 0x58, 0x04, 0xDB, 0x78, 0x9D, 0x38, 0xEE, 0xD8, 0x2E, + 0xE0, 0x6B, 0x60, 0x6C, 0xEE, 0x93, 0x11, 0x21, 0x10, 0xFD, 0x92, 0xB1, + 0xDE, 0x36, 0x04, 0x6F, 0x88, 0x90, 0x12, 0xBB, 0xD7, 0x21, 0x84, 0x46, + 0xF7, 0x1A, 0xA7, 0x3A, 0x84, 0xD0, 0x4F, 0x09, 0x51, 0xEC, 0xD4, 0xBD, + 0x9A, 0xF1, 0x65, 0x08, 0xAB, 0x35, 0x3A, 0xB6, 0x1E, 0x90, 0x09, 0xB7, + 0x53, 0x42, 0x3C, 0x2C, 0xBC, 0xDF, 0x1D, 0xB0, 0xF9, 0x99, 0xB1, 0x20, + 0x8C, 0xCC, 0xF1, 0x62, 0x9B, 0xB7, 0x74, 0x6C, 0x64, 0x20, 0x7D, 0x62, + 0x7F, 0x6F, 0x97, 0x0B, 0xEF, 0x97, 0x63, 0x20, 0xAE, 0x58, 0x8E, 0x3D, + 0x0A, 0xD8, 0x14, 0x15, 0x3B, 0x36, 0x70, 0x74, 0xEC, 0x63, 0x44, 0x6C, + 0x55, 0x21, 0x78, 0x32, 0xB6, 0xC4, 0x1E, 0x5B, 0xD0, 0x66, 0xD9, 0x78, + 0x3C, 0xD7, 0x46, 0x84, 0xCC, 0x51, 0x63, 0x64, 0xB1, 0x93, 0xE5, 0x9C, + 0xE5, 0xD8, 0x77, 0x53, 0x6A, 0xB7, 0x0D, 0xC1, 0x55, 0x68, 0x9D, 0x4B, + 0xB5, 0x0D, 0x7F, 0x0B, 0x1C, 0xF3, 0x8C, 0xB5, 0x21, 0xAC, 0x00, 0xDB, + 0x1B, 0x46, 0x98, 0x73, 0xCC, 0x03, 0x79, 0xD5, 0x4D, 0xAF, 0xB3, 0x7C, + 0x2E, 0x78, 0xC6, 0x0D, 0x2C, 0x08, 0x4B, 0x0E, 0x84, 0x05, 0x4B, 0xC7, + 0x3E, 0x3B, 0x10, 0x0E, 0x95, 0x20, 0xEC, 0x31, 0x25, 0xF5, 0x72, 0xC9, + 0x8A, 0x95, 0xEC, 0x09, 0x55, 0xD9, 0xD8, 0x6B, 0x73, 0xB3, 0x6D, 0xD4, + 0xFE, 0x68, 0xD3, 0x35, 0x4F, 0x9A, 0x1B, 0x8C, 0x31, 0xDD, 0xF8, 0x72, + 0xC8, 0x36, 0x44, 0x93, 0x55, 0x96, 0x9B, 0xA9, 0x76, 0xB5, 0xC5, 0x00, + 0xCF, 0xCC, 0x0D, 0x5B, 0xF3, 0x4E, 0xF5, 0x04, 0xFF, 0x9D, 0x7F, 0x1F, + 0xB8, 0xD4, 0x12, 0x80, 0xE7, 0xC0, 0xD9, 0x90, 0x3F, 0xCC, 0x12, 0xFF, + 0x4C, 0xE1, 0x20, 0x70, 0x86, 0x8D, 0xC7, 0xE8, 0x31, 0x6D, 0xD6, 0x2C, + 0xCF, 0x55, 0xED, 0x03, 0xF0, 0x12, 0x78, 0x13, 0x7B, 0xE1, 0x99, 0x7E, + 0xAF, 0x11, 0x37, 0x47, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, + 0x21, 0x08, 0x35, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, + 0x21, 0x08, 0x41, 0x44, 0xB6, 0x5F, 0x03, 0x00, 0xB0, 0xEE, 0xE7, 0x04, + 0x67, 0x01, 0x94, 0x88, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, + 0xAE, 0x42, 0x60, 0x82 +}; +} +static const unsigned char* misc_icon = raw::misc_raw; +} \ No newline at end of file diff --git a/cheat/tf2/icons/rage.hpp b/cheat/tf2/icons/rage.hpp new file mode 100644 index 0000000..00dff07 --- /dev/null +++ b/cheat/tf2/icons/rage.hpp @@ -0,0 +1,1293 @@ +/* E:\Users\admin\Desktop\stuff\icons\rage.png (1/26/2018 4:18:26 AM) + StartOffset: 00000000, EndOffset: 00003C11, Length: 00003C12 */ + +namespace icons { +static const size_t rage_size = 15378; +namespace raw { +static const unsigned char rage_raw[15378] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, + 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, + 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, + 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, + 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, + 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, + 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, + 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, + 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, + 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, + 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, + 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, + 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, + 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, + 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, + 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, + 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, + 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, + 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, + 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, + 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, + 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, + 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, + 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, + 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, + 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, + 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, + 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, + 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, + 0x31, 0x38, 0x3A, 0x32, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, + 0x3A, 0x32, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, + 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, + 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x32, + 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, + 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, + 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, + 0x39, 0x61, 0x36, 0x38, 0x61, 0x33, 0x31, 0x37, 0x2D, 0x37, 0x65, 0x39, + 0x34, 0x2D, 0x37, 0x30, 0x34, 0x31, 0x2D, 0x38, 0x63, 0x62, 0x30, 0x2D, + 0x61, 0x39, 0x35, 0x63, 0x62, 0x61, 0x33, 0x33, 0x39, 0x66, 0x34, 0x65, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, + 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, + 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x39, 0x31, 0x65, + 0x62, 0x39, 0x62, 0x37, 0x65, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, + 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, + 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, + 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, + 0x33, 0x62, 0x30, 0x66, 0x31, 0x39, 0x37, 0x63, 0x2D, 0x32, 0x35, 0x66, + 0x66, 0x2D, 0x30, 0x66, 0x34, 0x63, 0x2D, 0x61, 0x62, 0x66, 0x36, 0x2D, + 0x33, 0x66, 0x33, 0x30, 0x39, 0x30, 0x65, 0x33, 0x32, 0x31, 0x63, 0x62, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, + 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, + 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, + 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, + 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, + 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x33, 0x62, 0x30, 0x66, 0x31, + 0x39, 0x37, 0x63, 0x2D, 0x32, 0x35, 0x66, 0x66, 0x2D, 0x30, 0x66, 0x34, + 0x63, 0x2D, 0x61, 0x62, 0x66, 0x36, 0x2D, 0x33, 0x66, 0x33, 0x30, 0x39, + 0x30, 0x65, 0x33, 0x32, 0x31, 0x63, 0x62, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, + 0x38, 0x3A, 0x32, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, + 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, + 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, + 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, + 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, + 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, + 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, + 0x64, 0x3A, 0x39, 0x61, 0x36, 0x38, 0x61, 0x33, 0x31, 0x37, 0x2D, 0x37, + 0x65, 0x39, 0x34, 0x2D, 0x37, 0x30, 0x34, 0x31, 0x2D, 0x38, 0x63, 0x62, + 0x30, 0x2D, 0x61, 0x39, 0x35, 0x63, 0x62, 0x61, 0x33, 0x33, 0x39, 0x66, + 0x34, 0x65, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, + 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, + 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, + 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x32, 0x34, 0x2B, + 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, + 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, + 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, + 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, + 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, + 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, + 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, + 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, + 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, + 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, + 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, + 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, + 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, + 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, + 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, + 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, + 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, + 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, + 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, + 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, + 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, + 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, + 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x2C, 0xB7, + 0x84, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, + 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, + 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, + 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, + 0x01, 0xA0, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0xDA, 0x3F, 0x4B, + 0xC3, 0x40, 0x18, 0xC7, 0xF1, 0x6F, 0xFC, 0x8B, 0xA2, 0xB3, 0x48, 0x07, + 0x37, 0x11, 0x1C, 0xEC, 0x24, 0x3A, 0x14, 0xC1, 0xC5, 0x97, 0xE0, 0x24, + 0x4E, 0xBE, 0x0B, 0x57, 0x75, 0x76, 0x12, 0x9C, 0x1C, 0xC4, 0xD1, 0x17, + 0xE0, 0x20, 0x4E, 0x8A, 0x20, 0xBA, 0x15, 0xD1, 0x41, 0x57, 0x9D, 0x05, + 0x07, 0x5B, 0xCF, 0x21, 0x05, 0xCB, 0x79, 0x36, 0x09, 0xB4, 0x49, 0x9B, + 0xE7, 0xF7, 0xC0, 0x0D, 0xF7, 0x5C, 0x2E, 0x21, 0x9F, 0x34, 0x77, 0xD7, + 0x6B, 0x23, 0xE7, 0x1C, 0x0A, 0x18, 0x12, 0x81, 0x20, 0x04, 0x21, 0x08, + 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, 0x41, + 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x31, 0x28, 0x10, 0x93, + 0x80, 0x6B, 0x2B, 0x7E, 0x34, 0xBC, 0xF6, 0xA2, 0xCA, 0x2B, 0x50, 0xED, + 0x25, 0xC4, 0x47, 0x42, 0xFB, 0x70, 0x9F, 0x3C, 0xD4, 0x39, 0xE0, 0xA1, + 0x85, 0xB2, 0x93, 0xB5, 0x73, 0x94, 0x62, 0x17, 0xDB, 0x3F, 0x20, 0x4A, + 0x68, 0xEF, 0xA7, 0x88, 0x34, 0x46, 0xFC, 0x3E, 0xA4, 0x54, 0xF7, 0x38, + 0xD2, 0x83, 0x8B, 0x9F, 0x01, 0x17, 0x5D, 0x3C, 0xDF, 0x89, 0x57, 0x7F, + 0x02, 0xF6, 0xDB, 0xEA, 0x53, 0xC0, 0x26, 0x50, 0xFB, 0xA7, 0x7F, 0x33, + 0xD5, 0x27, 0xC3, 0x39, 0x97, 0x54, 0xFC, 0x48, 0x6A, 0x9F, 0x4D, 0x71, + 0xCE, 0x2C, 0xC5, 0x8F, 0xED, 0x0E, 0xC7, 0xAE, 0xBB, 0x70, 0x5C, 0x25, + 0x5D, 0xA7, 0x6C, 0xAF, 0xC6, 0x25, 0x30, 0x16, 0xC8, 0xAF, 0x01, 0xA3, + 0xD6, 0xC6, 0x88, 0x2F, 0x60, 0x26, 0x90, 0x7F, 0xB1, 0x38, 0x58, 0xBE, + 0x03, 0x8F, 0x5E, 0xAE, 0x62, 0x75, 0xD6, 0x58, 0x0C, 0xE4, 0x16, 0x2C, + 0x42, 0x7C, 0x07, 0x72, 0xC7, 0x56, 0xD7, 0x11, 0xF7, 0x5E, 0x7D, 0xD9, + 0x2A, 0xC4, 0xB5, 0x57, 0x1F, 0xB7, 0x0A, 0xF1, 0xAC, 0x25, 0x76, 0x1C, + 0x35, 0x41, 0xC4, 0xB1, 0xE1, 0xD5, 0xDF, 0xAC, 0x42, 0x4C, 0x7B, 0xF5, + 0x23, 0x8B, 0x10, 0xA1, 0x19, 0x62, 0xCF, 0x22, 0xC4, 0x6D, 0x20, 0xD7, + 0xB0, 0x06, 0x71, 0x13, 0xC8, 0x6D, 0x59, 0x1B, 0x2C, 0xCF, 0x81, 0x95, + 0x40, 0xFE, 0x34, 0xEF, 0x8D, 0x99, 0xA2, 0xA2, 0x4A, 0xBC, 0x67, 0x19, + 0x8A, 0x4A, 0x52, 0xE7, 0xB2, 0xEF, 0x59, 0x02, 0xEC, 0x76, 0x1A, 0x24, + 0xAD, 0x4C, 0x9F, 0x07, 0x69, 0x10, 0xCA, 0xF6, 0x6A, 0x84, 0xBE, 0x86, + 0xD7, 0xBB, 0xB9, 0xB2, 0x5C, 0x1A, 0x30, 0x80, 0xC3, 0xD6, 0xEB, 0x5B, + 0xCF, 0xD2, 0x29, 0xEA, 0xC2, 0xBF, 0xF3, 0x57, 0x81, 0xF9, 0x9C, 0x6E, + 0x72, 0x02, 0xF8, 0xF4, 0x72, 0x4D, 0xE0, 0x8E, 0xBF, 0x3B, 0x52, 0xE4, + 0x0D, 0x51, 0x8A, 0xD0, 0x8F, 0xC0, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, + 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, + 0x41, 0x08, 0x42, 0x10, 0x82, 0x28, 0x36, 0x7E, 0x06, 0x00, 0x5C, 0x33, + 0x34, 0xCB, 0x4C, 0x00, 0x5F, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, + 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static const unsigned char* rage_icon = raw::rage_raw; +} \ No newline at end of file diff --git a/cheat/tf2/icons/visuals.hpp b/cheat/tf2/icons/visuals.hpp new file mode 100644 index 0000000..4d50ae3 --- /dev/null +++ b/cheat/tf2/icons/visuals.hpp @@ -0,0 +1,1318 @@ +namespace icons { +constexpr size_t visuals_size = 15715; +namespace raw { +constexpr unsigned char visuals_raw[15715] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, + 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, + 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, + 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, + 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, + 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, + 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, + 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, + 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, + 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, + 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, + 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, + 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, + 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, + 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, + 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, + 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, + 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, + 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, + 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, + 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, + 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, + 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, + 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, + 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, + 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, + 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, + 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, + 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, + 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, + 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, + 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, + 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, + 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, + 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, + 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, + 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, + 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, + 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, + 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, + 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, + 0x31, 0x38, 0x3A, 0x33, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, + 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, + 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, + 0x3A, 0x33, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, + 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, + 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, + 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x33, + 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, + 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, + 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, + 0x32, 0x39, 0x31, 0x35, 0x36, 0x62, 0x33, 0x33, 0x2D, 0x65, 0x62, 0x62, + 0x31, 0x2D, 0x63, 0x39, 0x34, 0x36, 0x2D, 0x38, 0x62, 0x33, 0x34, 0x2D, + 0x30, 0x39, 0x32, 0x39, 0x31, 0x63, 0x62, 0x31, 0x34, 0x65, 0x36, 0x35, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, + 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, + 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, + 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, + 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x39, 0x33, 0x30, + 0x65, 0x35, 0x38, 0x62, 0x39, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, + 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, + 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, + 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, + 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, + 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, + 0x62, 0x64, 0x62, 0x35, 0x39, 0x65, 0x61, 0x36, 0x2D, 0x37, 0x63, 0x63, + 0x30, 0x2D, 0x65, 0x65, 0x34, 0x34, 0x2D, 0x39, 0x33, 0x61, 0x66, 0x2D, + 0x32, 0x64, 0x33, 0x62, 0x38, 0x30, 0x39, 0x32, 0x31, 0x35, 0x33, 0x39, + 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, + 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, + 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, + 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, + 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, + 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, + 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, + 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, + 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x62, 0x64, 0x62, 0x35, 0x39, + 0x65, 0x61, 0x36, 0x2D, 0x37, 0x63, 0x63, 0x30, 0x2D, 0x65, 0x65, 0x34, + 0x34, 0x2D, 0x39, 0x33, 0x61, 0x66, 0x2D, 0x32, 0x64, 0x33, 0x62, 0x38, + 0x30, 0x39, 0x32, 0x31, 0x35, 0x33, 0x39, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, + 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, + 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, + 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, + 0x38, 0x3A, 0x33, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, + 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, + 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, + 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, + 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, + 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, + 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, + 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, + 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, + 0x64, 0x3A, 0x32, 0x39, 0x31, 0x35, 0x36, 0x62, 0x33, 0x33, 0x2D, 0x65, + 0x62, 0x62, 0x31, 0x2D, 0x63, 0x39, 0x34, 0x36, 0x2D, 0x38, 0x62, 0x33, + 0x34, 0x2D, 0x30, 0x39, 0x32, 0x39, 0x31, 0x63, 0x62, 0x31, 0x34, 0x65, + 0x36, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, + 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, + 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, + 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x33, 0x37, 0x2B, + 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, + 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, + 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, + 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, + 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, + 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, + 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, + 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, + 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, + 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, + 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, + 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, + 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, + 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, + 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, + 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, + 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, + 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, + 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, + 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, + 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, + 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, + 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, + 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, + 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, + 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, + 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, + 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, + 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, + 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, + 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, + 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, + 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, + 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, + 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, + 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, + 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, + 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, + 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x20, 0x2B, + 0x35, 0xED, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, + 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, + 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, + 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, + 0x02, 0xF1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9B, 0xBD, 0x6B, + 0x14, 0x41, 0x18, 0x87, 0x9F, 0xBD, 0xDC, 0x25, 0x31, 0x41, 0x31, 0x11, + 0x4E, 0x05, 0x25, 0x48, 0x48, 0x2C, 0x04, 0x2B, 0x15, 0x14, 0x84, 0x60, + 0x6C, 0xAC, 0xFC, 0x28, 0x44, 0xD2, 0x89, 0xA8, 0x85, 0x85, 0x58, 0xD9, + 0x08, 0xFE, 0x01, 0x82, 0xFD, 0x89, 0x85, 0x8D, 0x60, 0x17, 0x45, 0x10, + 0x8D, 0x85, 0x96, 0x36, 0x62, 0x65, 0x21, 0x58, 0x84, 0x53, 0x50, 0xB9, + 0x22, 0x28, 0x1A, 0xF5, 0x72, 0xB9, 0xD7, 0xC2, 0x0D, 0x1C, 0xCB, 0x7C, + 0xEC, 0xEC, 0xEE, 0x7D, 0x04, 0xDE, 0x1F, 0x6C, 0xB1, 0x33, 0xF3, 0x9B, + 0xF7, 0xE6, 0xB9, 0x77, 0x67, 0x67, 0xE6, 0xB8, 0x48, 0x44, 0x50, 0x41, + 0x49, 0x11, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, 0x10, + 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, + 0x10, 0x0A, 0x42, 0x41, 0x28, 0x88, 0xBE, 0xAA, 0x5C, 0x70, 0x7F, 0x3B, + 0x81, 0x79, 0x60, 0x06, 0x98, 0x08, 0xF4, 0x0E, 0x03, 0xCD, 0x80, 0xF6, + 0x4D, 0xE0, 0x3D, 0xF0, 0x0A, 0xA8, 0x0F, 0x02, 0x88, 0x1B, 0xC0, 0xDD, + 0x01, 0xF9, 0x62, 0x1F, 0x00, 0x17, 0xB3, 0x18, 0xA3, 0x1C, 0x87, 0xB7, + 0x0B, 0xC0, 0xC3, 0x01, 0xCD, 0xF4, 0x60, 0x20, 0x59, 0x41, 0xFC, 0x8D, + 0x53, 0x79, 0xD0, 0x55, 0x01, 0x5A, 0xDD, 0x9A, 0x2C, 0x65, 0x93, 0x40, + 0x00, 0x58, 0x03, 0x46, 0xBB, 0x01, 0xC2, 0x95, 0x3E, 0xF3, 0x40, 0x94, + 0xB8, 0x86, 0x3C, 0xFD, 0xDD, 0x01, 0xB6, 0x74, 0xB4, 0xAF, 0x00, 0x97, + 0x3C, 0x9E, 0x49, 0x43, 0x9C, 0x99, 0x38, 0x4B, 0x4D, 0xFA, 0x1D, 0xB7, + 0xF1, 0x8C, 0x4C, 0x24, 0xED, 0xF5, 0x56, 0xCC, 0x3A, 0xEE, 0xF0, 0xD8, + 0x74, 0x28, 0x45, 0xBC, 0xAA, 0xC3, 0x6F, 0xF3, 0xEC, 0xB1, 0xB4, 0x6F, + 0xF9, 0xE2, 0xA5, 0x85, 0xB0, 0xDD, 0x12, 0x60, 0xDC, 0xE1, 0xB9, 0x66, + 0xF1, 0x44, 0x01, 0xF0, 0x89, 0x07, 0x91, 0xD4, 0x3B, 0x47, 0xFB, 0xC8, + 0x12, 0xF7, 0x84, 0x2B, 0x4E, 0xDA, 0xC9, 0xB2, 0x65, 0x48, 0xF3, 0x49, + 0x60, 0x25, 0xF0, 0x31, 0x2A, 0x79, 0x1E, 0xAF, 0x90, 0xBE, 0x86, 0x80, + 0xB6, 0xE3, 0x91, 0x5F, 0x37, 0xBD, 0x1C, 0xF2, 0xCC, 0x11, 0x25, 0x03, + 0x84, 0x27, 0x1E, 0x08, 0xA7, 0x0D, 0x65, 0xFB, 0x33, 0x42, 0x00, 0x18, + 0x31, 0x94, 0xBD, 0x70, 0xB4, 0x6F, 0xC7, 0x73, 0x56, 0x52, 0xD3, 0x79, + 0x5E, 0x9F, 0x35, 0xE0, 0x4A, 0x5A, 0xB2, 0x1D, 0xB3, 0x75, 0x39, 0xD0, + 0xE3, 0x53, 0x1D, 0xD8, 0x1B, 0xD8, 0x67, 0x72, 0x70, 0x5F, 0x81, 0xDD, + 0x59, 0x33, 0x22, 0x39, 0x8B, 0x7F, 0xCB, 0xB0, 0x62, 0xBD, 0x50, 0xC0, + 0xAB, 0xF0, 0x40, 0x06, 0xCF, 0xBD, 0xC4, 0xFD, 0xAE, 0x3C, 0x19, 0x91, + 0x6C, 0x70, 0x0E, 0x58, 0x0C, 0xF4, 0x44, 0x14, 0xA3, 0x64, 0xBF, 0x53, + 0x9E, 0x7D, 0xC6, 0x18, 0xF0, 0x2B, 0xCD, 0x67, 0xC9, 0xB2, 0xA0, 0x5A, + 0xF2, 0xD4, 0x8F, 0xD2, 0x3B, 0x1D, 0xF1, 0xD4, 0xAF, 0x76, 0x73, 0x1B, + 0xBE, 0xE6, 0xA9, 0x1F, 0xEF, 0x21, 0x88, 0xC2, 0x62, 0x65, 0x01, 0xB1, + 0xC3, 0x53, 0xFF, 0xBD, 0x87, 0x20, 0x3E, 0xF5, 0x13, 0xC4, 0xCD, 0x14, + 0x6B, 0x8E, 0x5E, 0x3D, 0x2E, 0x6F, 0x3C, 0xF5, 0xB3, 0x45, 0x82, 0x68, + 0x24, 0xEE, 0xAF, 0x67, 0xF8, 0xC0, 0x8F, 0x0A, 0x18, 0xF4, 0xC9, 0x0C, + 0x73, 0xC0, 0x52, 0x91, 0x20, 0xCE, 0x5B, 0x66, 0x63, 0x97, 0x3E, 0xA6, + 0x58, 0x60, 0x85, 0xEA, 0x65, 0x06, 0xCF, 0x54, 0xE2, 0x7E, 0x31, 0x0F, + 0x88, 0xD7, 0x86, 0xB2, 0x9F, 0x1E, 0xCF, 0x61, 0x43, 0xD9, 0xD3, 0x1C, + 0x10, 0xCE, 0x1A, 0xCA, 0xCE, 0x78, 0x3C, 0x1F, 0x52, 0x7E, 0xA9, 0x41, + 0xBB, 0xCF, 0xE7, 0x86, 0x4D, 0x4C, 0xCD, 0xE3, 0x31, 0xE9, 0x68, 0xE0, + 0x86, 0x0B, 0x11, 0x99, 0x08, 0xDC, 0x81, 0x22, 0x22, 0x73, 0x86, 0xF6, + 0xAB, 0x45, 0xEC, 0x3E, 0x6D, 0x03, 0x73, 0xC1, 0xD8, 0x6A, 0xF1, 0x2C, + 0x04, 0xC4, 0x9C, 0xB6, 0xF4, 0x31, 0xE7, 0xF0, 0x9C, 0xB2, 0x78, 0x2A, + 0x45, 0x81, 0x38, 0x68, 0x09, 0xB0, 0x2E, 0x22, 0xC3, 0x16, 0xCF, 0x7D, + 0x8B, 0xA7, 0x29, 0x22, 0x63, 0x8E, 0x58, 0x65, 0x11, 0x59, 0xB6, 0x78, + 0x1B, 0x16, 0x4F, 0x49, 0x44, 0xBE, 0x58, 0x3C, 0xB7, 0x8B, 0x3A, 0x8F, + 0xD8, 0xB8, 0x6A, 0x8E, 0xC3, 0x92, 0x76, 0x1C, 0xB0, 0x1A, 0x83, 0xD9, + 0xB8, 0x7E, 0x88, 0x5B, 0x0D, 0x11, 0x79, 0x26, 0x22, 0x8F, 0x45, 0xE4, + 0xB3, 0xF8, 0x35, 0xD2, 0xD1, 0xF7, 0x36, 0x11, 0xB9, 0x1C, 0xA7, 0xBD, + 0x4D, 0xF5, 0x34, 0x63, 0xCB, 0x72, 0x78, 0x6B, 0xDA, 0x8D, 0x0E, 0xAA, + 0x96, 0x81, 0x7D, 0xDD, 0x5A, 0x50, 0x5D, 0x05, 0x8E, 0x6D, 0x02, 0x08, + 0xB7, 0xD2, 0x42, 0xC8, 0x73, 0x9C, 0xDF, 0xF9, 0x8A, 0x9A, 0x1D, 0x30, + 0x00, 0x2B, 0x40, 0x35, 0xED, 0x31, 0x7E, 0x9E, 0x8C, 0x48, 0x9E, 0x3A, + 0x45, 0xF1, 0xA3, 0xF2, 0xA7, 0x8F, 0x83, 0x6F, 0xF3, 0xFF, 0xD7, 0xB6, + 0x52, 0x7C, 0x84, 0xD8, 0x0A, 0xED, 0x20, 0xD2, 0xBF, 0x29, 0x14, 0x93, + 0x11, 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, + 0x50, 0x10, 0x0A, 0x42, 0x11, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, + 0x82, 0x50, 0x10, 0x0A, 0x42, 0x41, 0xE4, 0xD3, 0xBF, 0x01, 0x00, 0x36, + 0xC5, 0x99, 0x33, 0xE0, 0x8B, 0x14, 0x09, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 +}; +} +static const unsigned char* visuals_icon = raw::visuals_raw; +} diff --git a/cheat/tf2/identity.h b/cheat/tf2/identity.h new file mode 100644 index 0000000..0b3906a --- /dev/null +++ b/cheat/tf2/identity.h @@ -0,0 +1,12 @@ +#pragma once +#include "sdk.h" +//kept incase i wanna do shit here fuck you +namespace features +{ + class c_identity { + private: + public: + void operator()( ) { + } + }; +} \ No newline at end of file diff --git a/cheat/tf2/input_system.cpp b/cheat/tf2/input_system.cpp new file mode 100644 index 0000000..881fa02 --- /dev/null +++ b/cheat/tf2/input_system.cpp @@ -0,0 +1,527 @@ +#include + +#include "input_system.hpp" +#include "util.hpp" + +util::c_input_manager g_input; + +NAMESPACE_REGION( util ) + +const char* const key_names_short[] = { + "unk", + "m1", + "m2", + "can", + "m3", + "m4", + "m5", + "unk", + "back", + "tab", + "unk", + "unk", + "clr", + "ret", + "unk", + "unk", + "shift", + "ctrl", + "alt", + "pause", + "caps", + "kana", + "unk", + "junja", + "final", + "kanji", + "unk", + "esc", + "convert", + "nonconvert", + "accept", + "modechange", + " ", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "slct", + "prnt", + "execute", + "snapshot", + "ins", + "del", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unk", + "unk", + "num0", + "num1", + "num2", + "num3", + "num4", + "num5", + "num6", + "num7", + "num8", + "num9", + "*", + "+", + "sep", + "-", + ",", + "/", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "lshift", + "rshift", + "lctrl", + "rctrl", + "lalt", + "ralt", +}; + +const char* const key_names[] = { + "unknown", + "mouse_1", + "mouse_2", + "cancel", + "mouse_3", + "mouse_4", + "mouse_5", + "unknown", + "back", + "tab", + "unknown", + "unknown", + "clear", + "return", + "unknown", + "unknown", + "shift", + "control", + "alt", + "pause", + "capital", + "kana", + "unknown", + "junja", + "final", + "kanji", + "unknown", + "escape", + "convert", + "nonconvert", + "accept", + "modechange", + "space", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "select", + "print", + "execute", + "snapshot", + "insert", + "delete", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unknown", + "unknown", + "numpad0", + "numpad1", + "numpad2", + "numpad3", + "numpad4", + "numpad5", + "numpad6", + "numpad7", + "numpad8", + "numpad9", + "multiply", + "add", + "separator", + "subtract", + "decimal", + "divide", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "lshift", + "rshift", + "lcontrol", + "rcontrol", + "lmenu", + "rmenu", +}; + +void c_input_manager::capture_mouse_move( ulong_t lparam ) { + m_mouse_pos[ 0 ] = LOWORD( lparam ); + m_mouse_pos[ 1 ] = HIWORD( lparam ); +} + +void c_input_manager::clear_keys( ) { + memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) ); +} + +bool c_input_manager::register_key_press( int key_event, int key ) +{ + switch ( key_event ) { + case KEYDOWN: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = true; + return true; + } + case KEYUP: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = false; + return true; + } + case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = true; + break; + } + case SYSKEYUP: { + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = false; + break; + } + case LBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE1 ] = true; + return true; + case LBUTTONUP: + m_pressed_keys[ KEYS_MOUSE1 ] = false; + return true; + case RBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE2 ] = true; + return true; + case RBUTTONUP: + m_pressed_keys[ KEYS_MOUSE2 ] = false; + return true; + case MBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE3 ] = true; + return true; + case MBUTTONUP: + m_pressed_keys[ KEYS_MOUSE3 ] = false; + return true; + case XBUTTONDOWN: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; + return true; + } + case XBUTTONUP: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; + return true; + } + case MOUSEWHEEL: { + short scroll_input = ( short )HIWORD( key ); + m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; + return true; + } + } + + return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK +} + +bool c_input_manager::is_key_pressed( int key ) { + auto k = key; + return is_valid_key( k ) && m_pressed_keys[ k ]; +} + +const char* c_input_manager::get_key_name( int key ) { + if ( !is_valid_key( key ) || key > KEYS_MAX ) + return key_names[ KEYS_NONE ]; + + return key_names[ key ]; +} + +const char* c_input_manager::get_short_name( int key ) { + return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; +} + +VirtualKeys_t c_input_manager::is_any_key_pressed( ) { + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( m_pressed_keys[ i ] ) { + return VirtualKeys_t( i ); + } + } + + return KEYS_NONE; +} + +int c_input_manager::get_scroll_state( ) { + int current_state = m_scroll_wheel_state; + m_scroll_wheel_state = 0; + return current_state; +} + +char c_input_manager::get_pressed_char( int* out ) { + size_t pressed_character{ }; + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( is_key_pressed( VirtualKeys_t( i ) ) ) { + if ( ( i >= KEYS_A && i <= KEYS_Z ) + || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { + pressed_character = i; + } + } + } + + if ( pressed_character ) { + if ( out ) { + *out = int( pressed_character ); + } + + if ( is_key_pressed( KEYS_SHIFT ) ) { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( pressed_character ); + + //gay way to shift it to symbols + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) { + switch ( pressed_character ) { + case KEYS_N0: + return ')'; + case KEYS_N1: + return '!'; + case KEYS_N2: + return '@'; + case KEYS_N3: + return '#'; + case KEYS_N4: + return '$'; + case KEYS_N5: + return '%'; + case KEYS_N6: + return '^'; + case KEYS_N7: + return '&'; + case KEYS_N8: + return '*'; + case KEYS_N9: + return '('; + } + } + } + else { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( ::tolower( pressed_character ) ); + + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) + return char( pressed_character ); + } + } + else if ( is_key_pressed( KEYS_SPACE ) ) { + if ( out ) + *out = KEYS_SPACE; + + return ' '; + } + else if ( is_key_pressed( KEYS_BACK ) ) { + if ( out ) + *out = KEYS_BACK; + + return 0; + } + + if ( out ) + *out = KEYS_NONE; + + return 0; +} + +END_REGION \ No newline at end of file diff --git a/cheat/tf2/input_system.hpp b/cheat/tf2/input_system.hpp new file mode 100644 index 0000000..6631a09 --- /dev/null +++ b/cheat/tf2/input_system.hpp @@ -0,0 +1,185 @@ +#pragma once +#include "util.hpp" + +enum VirtualKeyEvents_t { + KEYDOWN = 0x0100, + KEYUP = 0x0101, + SYSKEYDOWN = 0x104, + SYSKEYUP = 0x105, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, +}; + +enum VirtualKeys_t { + KEYS_NONE = 0, + KEYS_MOUSE1 = 0X01, + KEYS_MOUSE2 = 0X02, + KEYS_CANCEL = 0X03, + KEYS_MOUSE3 = 0X04, + KEYS_MOUSE4 = 0X05, + KEYS_MOUSE5 = 0X06, + KEYS_BACK = 0X08, + KEYS_TAB = 0X09, + KEYS_CLEAR = 0X0C, + KEYS_RETURN = 0X0D, + KEYS_SHIFT = 0X10, + KEYS_CONTROL = 0X11, + KEYS_ALT = 0X12, + KEYS_PAUSE = 0X13, + KEYS_CAPSLOCK = 0X14, + KEYS_ESCAPE = 0X1B, + KEYS_CONVERT = 0X1C, + KEYS_NONCONVERT = 0X1D, + KEYS_ACCEPT = 0X1E, + KEYS_MODECHANGE = 0X1F, + KEYS_SPACE = 0X20, + KEYS_PRIOR = 0X21, + KEYS_NEXT = 0X22, + KEYS_END = 0X23, + KEYS_HOME = 0X24, + KEYS_LEFT = 0X25, + KEYS_UP = 0X26, + KEYS_RIGHT = 0X27, + KEYS_DOWN = 0X28, + KEYS_SELECT = 0X29, + KEYS_PRINT = 0X2A, + KEYS_EXECUTE = 0X2B, + KEYS_SNAPSHOT = 0X2C, + KEYS_INSERT = 0X2D, + KEYS_DELETE = 0X2E, + KEYS_HELP = 0X2F, + KEYS_N0 = 0X30, + KEYS_N1 = 0X31, + KEYS_N2 = 0X32, + KEYS_N3 = 0X33, + KEYS_N4 = 0X34, + KEYS_N5 = 0X35, + KEYS_N6 = 0X36, + KEYS_N7 = 0X37, + KEYS_N8 = 0X38, + KEYS_N9 = 0X39, + KEYS_A = 0X41, + KEYS_B = 0X42, + KEYS_C = 0X43, + KEYS_D = 0X44, + KEYS_E = 0X45, + KEYS_F = 0X46, + KEYS_G = 0X47, + KEYS_H = 0X48, + KEYS_I = 0X49, + KEYS_J = 0X4A, + KEYS_K = 0X4B, + KEYS_L = 0X4C, + KEYS_M = 0X4D, + KEYS_N = 0X4E, + KEYS_O = 0X4F, + KEYS_P = 0X50, + KEYS_Q = 0X51, + KEYS_R = 0X52, + KEYS_S = 0X53, + KEYS_T = 0X54, + KEYS_U = 0X55, + KEYS_V = 0X56, + KEYS_W = 0X57, + KEYS_X = 0X58, + KEYS_Y = 0X59, + KEYS_Z = 0X5A, + KEYS_LEFTWINDOWS = 0X5B, + KEYS_RIGHTWINDOWS = 0X5C, + KEYS_APPLICATION = 0X5D, + KEYS_NUMPAD0 = 0X60, + KEYS_NUMPAD1 = 0X61, + KEYS_NUMPAD2 = 0X62, + KEYS_NUMPAD3 = 0X63, + KEYS_NUMPAD4 = 0X64, + KEYS_NUMPAD5 = 0X65, + KEYS_NUMPAD6 = 0X66, + KEYS_NUMPAD7 = 0X67, + KEYS_NUMPAD8 = 0X68, + KEYS_NUMPAD9 = 0X69, + KEYS_MULTIPLY = 0X6A, + KEYS_ADD = 0X6B, + KEYS_SEPARATOR = 0X6C, + KEYS_SUBTRACT = 0X6D, + KEYS_DECIMAL = 0X6E, + KEYS_DIVIDE = 0X6F, + KEYS_F1 = 0X70, + KEYS_F2 = 0X71, + KEYS_F3 = 0X72, + KEYS_F4 = 0X73, + KEYS_F5 = 0X74, + KEYS_F6 = 0X75, + KEYS_F7 = 0X76, + KEYS_F8 = 0X77, + KEYS_F9 = 0X78, + KEYS_F10 = 0X79, + KEYS_F11 = 0X7A, + KEYS_F12 = 0X7B, + KEYS_NUMLOCK = 0X90, + KEYS_SCROLLLOCK = 0X91, + KEYS_LEFTSHIFT = 0XA0, + KEYS_RIGHTSHIFT = 0XA1, + KEYS_LEFTCONTROL = 0XA2, + KEYS_RIGHTCONTROL = 0XA3, + KEYS_LEFTMENU = 0XA4, + KEYS_RIGHTMENU = 0XA5, + KEYS_PERIOD = 0xBE, + KEYS_MAX = 0XA6, + KEYS_LAST = 0xfe +}; + +namespace util +{ + class c_input_manager { + public: + bool m_pressed_keys[ KEYS_LAST ]{ }; + int m_mouse_pos[ 2 ]{ }; + int m_scroll_wheel_state{ }; + + + c_input_manager( ) { + memset( m_pressed_keys, 0, KEYS_LAST ); + } + + void capture_mouse_move( ulong_t lparam ); + + void clear_keys( ); + + //registers a key press from wndproc + bool register_key_press( int key_event, int key ); + + //checks if the key is pressed + bool is_key_pressed( int key ); + + //returns the first found key pressed, or KEY_NONE if none are + VirtualKeys_t is_any_key_pressed( ); + + //returns the last scroll state and resets it to 0 + int get_scroll_state( ); + + //returns the key's name + const char* get_key_name( int key ); + const char* get_short_name( int key ); + + //returns the first found currently pressed key + char get_pressed_char( int* pressed_key = nullptr ); + + //check if a key is valid + inline bool is_valid_key( int key ) { return key > KEYS_NONE && key < KEYS_LAST; } + + //get cursor pos + inline void get_cursor_pos( int& x, int& y ) { + x = m_mouse_pos[ 0 ]; + y = m_mouse_pos[ 1 ]; + } + }; +} + +extern util::c_input_manager g_input; \ No newline at end of file diff --git a/cheat/tf2/interfaces.cpp b/cheat/tf2/interfaces.cpp new file mode 100644 index 0000000..8ca7ff3 --- /dev/null +++ b/cheat/tf2/interfaces.cpp @@ -0,0 +1,241 @@ +#include "interfaces.h" +#include "console.hpp" +#include "hooks.h" +#include "renderer.hpp" +#include "pattern.hpp" +#include "base_cheat.h" +#include "settings.h" +#include "ctx.hpp" +#include "netvars.h" +#include + +tf2::client cl; +tf2::interfaces::c_interface_manager g_factory; + +bool tf2::create_interfaces( client *instance ) +{ + if ( !instance ) { + return false; + } + + + + auto d3d_device = pattern::first_code_match( GetModuleHandleA( xors( "shaderapidx9.dll" ) ), + xors( "A1 ?? ?? ?? ?? 50 8B 08 FF 51 0C" ) ) + 0x1; + + auto move_helper = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), + xors( "8B 0D ?? ?? ?? ?? 8B 46 08 68" ) ) + 0x2; + + //sig to containing function: (+0x69) E9 ? ? ? ? CC 55 8B EC 5D + //auto beam_ptr = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), xors( "" ) ); + + //g_con->print( "beam_found: 0x%08x\n", beam_ptr ); + + instance->create( &instance->m_d3d, **reinterpret_cast< uintptr_t** >( d3d_device ) ); + instance->create( &instance->m_movehelper, **reinterpret_cast< uintptr_t** >( move_helper ) ); + //instance->create( &instance->m_beams, *reinterpret_cast< uintptr_t* >( beam_ptr ) ); + + + /* + + + important + + issues: + + the background is white but so am i so really this isnt an issue + + THIS ENTIRE THING IS MESSY AND RIDDLED WITH SHIT COMMENTS AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + chams + + fucking keyvalues + + glow count aint happy cbf looking into it + + menu goes invis because ????? gj menu + + too lazy to fix d3d + + emitsound hook is different + + aimbot is meh meh rn + + + lots of stuff not done that i want to get done, just wanna get it out there so i can keep working on it and not get harrased for the push + + + + + + */ + + //tf2::interfaces::interface_manager factory; + instance->create( &instance->m_chl, xors( "VClient" ) ); + instance->create( &instance->m_vgui, xors( "VEngineVGui" ) ); + instance->create( &instance->m_surface, xors( "VGUI_Surface" ) ); + instance->create( &instance->m_input, xors( "InputSystemVersion" ) ); + instance->create( &instance->m_panel, xors( "VGUI_Panel" ) ); + instance->create( &instance->m_engine, xors( "VEngineClient" ) ); + instance->create( &instance->m_entlist, xors( "VClientEntityList" ) ); + instance->create( &instance->m_prediction, xors( "VClientPrediction" ) ); + instance->create( &instance->m_cvar, xors( "VEngineCvar" ) ); + instance->create( &instance->m_movement, xors( "GameMovement" ) ); + instance->create( &instance->m_modelinfo, xors( "VModelInfoClient" ) ); + instance->create( &instance->m_overlay, "VDebugOverlay" ); + instance->create( &instance->m_trace, xors( "EngineTraceClient" ) ); + instance->create( &instance->m_model_render, xors( "VEngineModel" ) ); + instance->create( &instance->m_mat_system, xors( "VMaterialSystem" ) ); + instance->create( &instance->m_render_view, xors( "VEngineRenderView" ) ); + instance->create( &instance->m_engine_sound, xors( "IEngineSoundClient" ) ); + instance->create( &instance->m_event_mgr, xors( "GAMEEVENTSMANAGER002" ) ); + instance->create( &instance->m_string_table, xors( "VEngineClientStringTable" ) ); + instance->create( &instance->m_clientmode, **reinterpret_cast< uintptr_t** >( instance->m_chl->get_function( 10 ) + 5 ) ); + + instance->m_globals = *reinterpret_cast< CGlobalVarsBase** >( pattern::first_code_match( instance->m_engine.dll( ), "A1 ? ? ? ? 8B 11 68", 0x8 ) ); + + uintptr_t* input = *reinterpret_cast< uintptr_t** >( + instance->m_chl->get_old_function( 1 ) + 0x1 ); + instance->m_hl_input = reinterpret_cast< CInput* >( input ); + + auto kv_fn = ( void*( __cdecl* )( ) )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "KeyValuesSystem" ) ) ); + + instance->m_keyvalues = ( IKeyValuesSystem* )kv_fn( ); + instance->listeners.player_hurt.init( ); + + return true; +} + +con_fn clear_fn{ fnv( "clear" ), [ ]( const char*, const char* ) { g_con->m_logs.clear( ); }, "" }; +con_fn enable_logs_fn{ fnv( "log_enable" ), +[ ]( const char* a, const char* ) { + g_settings.menu.logs_enable ^= 1; + g_con->log( g_settings.menu.logs_enable ? xors( "logs enabled" ) : xors( "logs disabled" ) ); +}, +"" +}; + +con_fn fnv_fn{ fnv( "fnv" ), +[ ]( const char* a, const char* ) { + auto print = hash::fnv1a( a ); + g_con->log( "%08x", print ); +}, +"%S" +}; + +con_fn sum_fn{ fnv( "sum" ), +[ ]( const char* a, const char* syntax ) { + auto arg_1 = con_fn::get_arg< int >( a, 0, syntax ); + auto arg_2 = con_fn::get_arg< int >( a, 1, syntax ); + g_con->log( "%d + %d = %d", arg_1, arg_2, arg_1 + arg_2 ); +}, +"%D %D" +}; + +con_fn dump_cfg{ fnv( "dump_cfg" ), +[ ]( const char* , const char* ) { + for( auto& it : data::holder_.get_nodes( ) ) { + auto setting = static_cast< ISetting* >( it ); + g_con->log( "%08x: %s", setting->get_hash( ), setting->get_string( ).c_str( ) ); + } +}, +"" +}; + +con_fn retard_fn{ fnv( "retard" ), +[ ]( const char*, const char* ) { + g_con->log( "snuze" ); +}, +"" +}; + +con_fn unload_fn{ fnv( "unload" ), +[ ]( const char*, const char* ) { + cl.m_panic = true; + ExitProcess( 0 ); +}, +"" +}; + + +/*con_fn alias_fn{ fnv( "alias" ), +[ ]( const char* a, const char* b ) { +auto var_type = std::string( b ); +if( var_type.length( ) > 1 ) { +g_con->log( xors( "unknown var type: %s" ), var_type.c_str( ) ); +return; +} + +switch( b[ 0 ] ) { +case TYPE_STRING: { +std::shared_ptr< con_alias< const char* > >( fnv( ) ) +} +} +}, +"%S %S" +};*/ + +void tf2::client::initialize( ) { + //m_panic = true; + g_con->create( ); + auto now = std::chrono::high_resolution_clock::now( ); + g_con->print( xors( "hello\n" ) ); + //hi + //bye + + tf2::create_interfaces( &cl ); + g_fonts.initialize( ); + + g_netvars.init( ); + g_settings.load( ); + g_con->register_fn( &clear_fn ); + g_con->register_fn( &enable_logs_fn ); + g_con->register_fn( &fnv_fn ); + g_con->register_fn( &sum_fn ); + g_con->register_fn( &dump_cfg ); + g_con->register_fn( &retard_fn ); + g_con->register_fn( &unload_fn ); + + hooks::commit( &cl ); + + //g_cheat.chams.m_materials.initialize_materials( ); + + + auto offset = g_netvars.get_netvar( fnv( "DT_WeaponTFBaseGun" ), fnv( "m_fLastShotTime" ) ); + g_con->log( "lastshottime: %08x", offset ); + g_con->log( "prop: %08x", g_netvars.get_prop( fnv( "DT_WeaponTFBaseGun" ), fnv( "m_fLastShotTime" ) ) ); + + auto after = std::chrono::high_resolution_clock::now( ); + std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); + + std::chrono::duration< float > delta = after - now; + g_con->log( xors( "cheat initialized\n" ) ); + g_con->log( xors( "time taken: %f\n" ), delta.count( ) ); + + + + m_panic = false; +} + +void tf2::client::uninitialize( ) { + m_panic = true; + g_con->destroy( ); + + //restore wndproc + if( hooks::window_procedure_o ) { + SetWindowLongA( m_hwnd, GWLP_WNDPROC, ( long )hooks::window_procedure_o ); + } + + //unreference materials + //g_cheat.chams.m_materials.destroy_materials( ); + + //restore all interfaces + restore( ); + + Sleep( 100 ); + + //free the library + FreeLibraryAndExitThread( g_dll, 0 ); +} \ No newline at end of file diff --git a/cheat/tf2/interfaces.h b/cheat/tf2/interfaces.h new file mode 100644 index 0000000..96e3be1 --- /dev/null +++ b/cheat/tf2/interfaces.h @@ -0,0 +1,160 @@ +#pragma once + +#include +#include "sdk.h" +#include "vmt.h" +#include "ctx.hpp" +#include "listener.hpp" +#include "factory.h" +struct IDirect3DDevice9; +namespace tf2 +{ +template < typename t > +class interface_base { + friend class client; +public: + t* operator( )( ) { + return m_interface; + } + + //calls a virtual + template< size_t index, typename ret = void, + class... Args > + ret call( Args... args ) { + return util::get_vfunc< ret( __thiscall* )( void*, Args... ) > + ( m_interface, index )( m_interface, args... ); + } + + //also calls a virtual but you supply the typedef instead of return type + template< typename def, size_t index, class... Args > + auto call( Args... args ) { + return util::get_vfunc< def > + ( m_interface, index )( m_interface, args... ); + } + + //allows you to cast the interface + template< typename t0 = t* > + t0 get( ) { + return ( t0 )m_interface; + } + + void operator( )( t* ptr ) { + m_interface = ptr; + m_hook.reset( ); + m_hook = std::make_shared< hooks::c_vmt >( static_cast< void* >( ptr ) ); + + /*find the module the interface is located in + i know i could just pass the pointer but traps are gay*/ + MEMORY_BASIC_INFORMATION info; + VirtualQuery( ptr, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); + + m_dll = static_cast< HMODULE >( info.AllocationBase ); + } + + void operator( )( void* ptr ) { + operator( )( static_cast< t* >( ptr ) ); + } + + decltype( auto ) operator->( ) { + return m_hook; + } + + template< typename t2 = decltype( m_dll ) > + t2 dll( ) { + return ( t2 )m_dll; + } + +protected: + t* m_interface; + HMODULE m_dll; + std::shared_ptr< hooks::c_vmt > m_hook; +}; + + + class client { + public: + interface_base< IEngineVGui > m_vgui; + interface_base< IClientMode > m_clientmode; + interface_base< IEngineTrace > m_trace; + interface_base< IVEngineClient > m_engine; + interface_base< IInputSystem > m_input; + interface_base< chl_client > m_chl; + interface_base< IVDebugOverlay > m_overlay; + interface_base< client_ent_list > m_entlist; + interface_base< IPlayerInfoManager > m_playerinfo; + interface_base< ISurface > m_surface; + interface_base< IPanel > m_panel; + interface_base< ICVar > m_cvar; + interface_base< IVRenderView > m_renderview; + interface_base< IPrediction > m_prediction; + interface_base< IGameMovement > m_movement; + interface_base< IVModelInfo > m_modelinfo; + interface_base< uintptr_t > m_d3d; + interface_base< IVModelRender > m_model_render; + interface_base< IVRenderView > m_render_view; + interface_base< uintptr_t > m_engine_sound; + interface_base< IGameEventManager2 > m_event_mgr; + interface_base< IMaterialSystem > m_mat_system; + interface_base< CStringTable > m_string_table; + interface_base< IViewRenderBeams > m_beams; + IKeyValuesSystem* m_keyvalues; + CGlobalVarsBase* m_globals; + IMoveHelper* m_movehelper; + CInput* m_hl_input; + bool m_panic; + HWND m_hwnd{ }; + float m_frametime; + + struct { + generic_listener_t player_hurt{ xors( "player_hurt" ), &listeners::player_hurt }; + } listeners; + + public: + //find the interface inside of the module + void create( void* iface, const std::string& name, const std::string& mod ) { + auto* interface_ = static_cast< interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( mod, name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void create( void* iface, uintptr_t pointer ) { + auto interface_ = static_cast< interface_base< uintptr_t >* >( iface ); + + //msvc is retarded + ( *interface_ )( ( void* )pointer ); + m_container.push_back( interface_ ); + } + + void create( void* iface, const std::string& name ) { + auto* interface_ = static_cast< interface_base< uintptr_t >* >( iface ); + auto ptr = g_factory.find_interface( name ); + if( !ptr ) + return; + + ( *interface_ )( ptr ); + m_container.push_back( interface_ ); + } + + void __cdecl initialize( ); + void __cdecl uninitialize( ); + + private: + //restore the vmts to their original + void restore( ) { + for( const auto& it : m_container ) { + it->m_hook->restore( ); + } + } + + private: + std::vector< interface_base< uintptr_t >* > m_container; + }; + + bool create_interfaces( client * ); +} + +extern tf2::client cl; diff --git a/cheat/tf2/listener.cpp b/cheat/tf2/listener.cpp new file mode 100644 index 0000000..c48b900 --- /dev/null +++ b/cheat/tf2/listener.cpp @@ -0,0 +1,42 @@ +#include "listener.hpp" +#include "interfaces.h" +#include "base_cheat.h" +#include "ctx.hpp" +#include "settings.h" +#undef PlaySound + +//how can you listen if youre deaf + +generic_listener_t::generic_listener_t( const char* name, void( *function )( IGameEvent* ) ) : + m_function( function ), m_name( name ) { } + +generic_listener_t::~generic_listener_t( ) { + if( m_registered ) + cl.m_event_mgr( )->RemoveListener( this ); + +} + +void generic_listener_t::init( ) { + cl.m_event_mgr( )->AddListener( this, m_name, false ); + m_registered = true; +} + +namespace listeners +{ + + void player_hurt( IGameEvent* e ) { + if( !cl.m_panic && e ) { + int user_id = e->GetInt( xors( "userid" ) ); + int attacker = e->GetInt( xors( "attacker" ) ); + int attacker_id = cl.m_engine( )->GetPlayerForUserID( attacker ); + int player_id = cl.m_engine( )->GetPlayerForUserID( user_id ); + + + //if( attacker_id == cl.m_engine( )->GetLocalPlayer( ) && user_id != attacker_id ) { + g_cheat.visuals.store_hit( ); + + //} + } + } + +} \ No newline at end of file diff --git a/cheat/tf2/listener.hpp b/cheat/tf2/listener.hpp new file mode 100644 index 0000000..1ee442f --- /dev/null +++ b/cheat/tf2/listener.hpp @@ -0,0 +1,24 @@ +#pragma once +#include "sdk.h" + +struct generic_listener_t : public IGameEventListener2 { + generic_listener_t( const char* event_name, + void( *function )( IGameEvent* ) ); + + generic_listener_t( ) = default; + + ~generic_listener_t( ); + + void init( ); + + void FireGameEvent( IGameEvent* event ) override { m_function( event ); } + int GetEventDebugID( ) override { return 0x2a; } +private: + void( *m_function )( IGameEvent* ); + const char* m_name{ }; + bool m_registered{ }; +}; + +namespace listeners { + extern void player_hurt( IGameEvent* e ); +} \ No newline at end of file diff --git a/cheat/tf2/math.cpp b/cheat/tf2/math.cpp new file mode 100644 index 0000000..e3e7436 --- /dev/null +++ b/cheat/tf2/math.cpp @@ -0,0 +1,267 @@ +#include +#include "math.h" +#include "interfaces.h" + +using _m128 = __m128; + +namespace math +{ + uint32_t md5_pseudorandom( uint32_t seed ) { + using fn = uint32_t( __thiscall * )( uint32_t seed ); + + static auto func = pattern::first_code_match< fn >( cl.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 70 6A 58" ) ); + if( !func ) { + return 0; + } + + return func( seed ); + } + + static const __declspec( align( 16 ) ) uint32_t g_simd_component_mask[ 4 ][ 4 ] = { + { 0xFFFFFFFF, 0, 0, 0 }, + { 0, 0xFFFFFFFF, 0, 0 }, + { 0, 0, 0xFFFFFFFF, 0 }, + { 0, 0, 0, 0xFFFFFFFF } + }; + + void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ) { + //SSE concat transforms - turbo mode engaged + + _m128 last_mask = *( _m128* )( &g_simd_component_mask[ 3 ] ); + _m128 row_a0 = _mm_loadu_ps( in[ 0 ] ); + _m128 row_a1 = _mm_loadu_ps( in[ 1 ] ); + _m128 row_a2 = _mm_loadu_ps( in[ 2 ] ); + + _m128 row_b0 = _mm_loadu_ps( in2[ 0 ] ); + _m128 row_b1 = _mm_loadu_ps( in2[ 1 ] ); + _m128 row_b2 = _mm_loadu_ps( in2[ 2 ] ); + + _m128 a0 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 0, 0, 0, 0 ) ); + _m128 a1 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 1, 1, 1, 1 ) ); + _m128 a2 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 2, 2, 2, 2 ) ); + + _m128 mul00 = _mm_mul_ps( a0, row_b0 ); + _m128 mul01 = _mm_mul_ps( a1, row_b1 ); + _m128 mul02 = _mm_mul_ps( a2, row_b2 ); + _m128 out0 = _mm_add_ps( mul00, _mm_add_ps( mul01, mul02 ) ); + + a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); + a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); + a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); + + _m128 mul10 = _mm_mul_ps( a0, row_b0 ); + _m128 mul11 = _mm_mul_ps( a1, row_b1 ); + _m128 mul12 = _mm_mul_ps( a2, row_b2 ); + _m128 out1 = _mm_add_ps( mul10, _mm_add_ps( mul11, mul12 ) ); + + a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); + a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); + a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); + + _m128 mul20 = _mm_mul_ps( a0, row_b0 ); + _m128 mul21 = _mm_mul_ps( a0, row_b1 ); + _m128 mul22 = _mm_mul_ps( a0, row_b2 ); + _m128 out2 = _mm_add_ps( mul20, _mm_add_ps( mul21, mul22 ) ); + + a0 = _mm_and_ps( row_a0, last_mask ); + a1 = _mm_and_ps( row_a1, last_mask ); + a2 = _mm_and_ps( row_a2, last_mask ); + + out0 = _mm_add_ps( out0, a0 ); + out1 = _mm_add_ps( out1, a1 ); + out2 = _mm_add_ps( out2, a2 ); + + *( _m128* )( out[ 0 ] ) = out0; + *( _m128* )( out[ 1 ] ) = out1; + *( _m128* )( out[ 2 ] ) = out2; + } + + void math::set_matrix_position( vec3_t pos, matrix3x4& matrix ) { + for( size_t i{ }; i < 3; ++i ) { + matrix[ i ][ 3 ] = pos[ i ]; + } + } + + vec3_t math::get_matrix_position( const matrix3x4& src ) { + return vec3_t( src[ 0 ][ 3 ], src[ 1 ][ 3 ], src[ 2 ][ 3 ] ); + } + + void angle_matrix( vec3_t angles, matrix3x4& matrix ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + matrix[ 0 ][ 0 ] = cp * cy; + matrix[ 1 ][ 0 ] = cp * sy; + matrix[ 2 ][ 0 ] = -sp; + + float crcy = cr * cy; + float crsy = cr * sy; + float srcy = sr * cy; + float srsy = sr * sy; + matrix[ 0 ][ 1 ] = sp * srcy - crsy; + matrix[ 1 ][ 1 ] = sp * srsy + crcy; + matrix[ 2 ][ 1 ] = sr * cp; + + matrix[ 0 ][ 2 ] = ( sp*crcy + srsy ); + matrix[ 1 ][ 2 ] = ( sp*crsy - srcy ); + matrix[ 2 ][ 2 ] = cr * cp; + + matrix[ 0 ][ 3 ] = 0.f; + matrix[ 1 ][ 3 ] = 0.f; + matrix[ 2 ][ 3 ] = 0.f; + } + + void angle_imatrix( vec3_t angles, matrix3x4& matrix ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + matrix[ 0 ][ 0 ] = cp * cy; + matrix[ 0 ][ 1 ] = cp * sy; + matrix[ 0 ][ 2 ] = -sp; + matrix[ 1 ][ 0 ] = sr * sp*cy + cr * -sy; + matrix[ 1 ][ 1 ] = sr * sp*sy + cr * cy; + matrix[ 1 ][ 2 ] = sr * cp; + matrix[ 2 ][ 0 ] = ( cr*sp*cy + -sr * -sy ); + matrix[ 2 ][ 1 ] = ( cr*sp*sy + -sr * cy ); + matrix[ 2 ][ 2 ] = cr * cp; + matrix[ 0 ][ 3 ] = 0.f; + matrix[ 1 ][ 3 ] = 0.f; + matrix[ 2 ][ 3 ] = 0.f; + } + + void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ) { + angle_matrix( angles, matrix ); + set_matrix_position( origin, matrix ); + } + + vec3_t matrix_angles( const matrix3x4& matrix ) { + //thx strackoverflow + vec3_t angles; + float forward[ 3 ]; + float left[ 3 ]; + float up[ 3 ]; + + forward[ 0 ] = matrix[ 0 ][ 0 ]; + forward[ 1 ] = matrix[ 1 ][ 0 ]; + forward[ 2 ] = matrix[ 2 ][ 0 ]; + left[ 0 ] = matrix[ 0 ][ 1 ]; + left[ 1 ] = matrix[ 1 ][ 1 ]; + left[ 2 ] = matrix[ 2 ][ 1 ]; + up[ 2 ] = matrix[ 2 ][ 2 ]; + + float xy_dist = sqrtf( forward[ 0 ] * forward[ 0 ] + forward[ 1 ] * forward[ 1 ] ); + + if( xy_dist > 0.001f ) { + angles.y = RAD2DEG( atan2f( forward[ 1 ], forward[ 0 ] ) ); + angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); + angles.z = RAD2DEG( atan2f( left[ 2 ], up[ 2 ] ) ); + } + else { + angles.y = RAD2DEG( atan2f( -left[ 0 ], left[ 1 ] ) ); + angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); + + angles.z = 0; + } + + return angles; + } + + void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ) { + angles.y += degrees; + angles.clamp( ); + + vec3_t rotated( 0, degrees, 0 ); + matrix3x4 rotated_matrix; + angle_matrix( rotated, rotated_matrix ); + + vec3_t delta = get_matrix_position( matrix ) - origin; + vec3_t out = vector_transform( delta, rotated_matrix ); + + matrix3x4 bone_rotation, matrix_out; + memcpy( &bone_rotation, &matrix, sizeof( matrix3x4 ) ); + + set_matrix_position( vec3_t( ), bone_rotation ); + concat_transforms( rotated_matrix, bone_rotation, matrix_out ); + auto angles_out = matrix_angles( matrix_out ); + angle_matrix( angles_out, matrix, out ); + } + + float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ) { + vec3_t u = s2 - s1; + vec3_t v = k2 - k1; + vec3_t w = s1 - k1; + float a = u.dot( u ); + float b = u.dot( v ); + float c = v.dot( v ); + float d = u.dot( w ); + float e = v.dot( w ); + float D = a * c - b * b; + float sc, sN, sD = D; + float tc, tN, tD = D; + + if( D < SMALL_NUM ) { + sN = 0.0f; + sD = 1.0f; + tN = e; + tD = c; + } + else { + sN = ( b*e - c * d ); + tN = ( a*e - b * d ); + if( sN < 0.0f ) { + sN = 0.0f; + tN = e; + tD = c; + } + else if( sN > sD ) { + sN = sD; + tN = e + b; + tD = c; + } + } + + if( tN < 0.0f ) { + tN = 0.0; + + if( -d < 0.0f ) + sN = 0.0; + else if( -d > a ) + sN = sD; + else { + sN = -d; + sD = a; + } + } + else if( tN > tD ) { + tN = tD; + + if( ( -d + b ) < 0.0f ) + sN = 0; + else if( ( -d + b ) > a ) + sN = sD; + else { + sN = ( -d + b ); + sD = a; + } + } + + sc = ( abs( sN ) < SMALL_NUM ? 0.0f : sN / sD ); + tc = ( abs( tN ) < SMALL_NUM ? 0.0f : tN / tD ); + + vec3_t dP = w + ( u * sc ) - ( v * tc ); + + return dP.length( ); + } +} \ No newline at end of file diff --git a/cheat/tf2/math.h b/cheat/tf2/math.h new file mode 100644 index 0000000..c5a107f --- /dev/null +++ b/cheat/tf2/math.h @@ -0,0 +1,157 @@ +#pragma once +#include +#include "util.hpp" +#include "pattern.hpp" +#include "sdk.h" + +static constexpr long double M_PI = 3.14159265358979323846f; +static constexpr long double M_RADPI = 57.295779513082f; +static constexpr long double M_PIRAD = 0.01745329251f; +static constexpr float SMALL_NUM = 0.00000001f; +static constexpr float M_PI_F = ( ( float )( M_PI ) ); +__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } +__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } + +namespace { + //make a random generator and seed it with a p random number + static std::random_device rd; + static std::mt19937 gen( rd( ) ); +} + +NAMESPACE_REGION( math ) + +#undef min +#undef max + +template < typename t > +t min( const t& t1, const t& t2 ) { + return t1 < t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t min( const t& t1, const t& t2, ts_&&... ts ) { + return t1 < t2 ? + min( t1, std::forward< ts_ >( ts )... ) : + min( t2, std::forward< ts_ >( ts )... ); +} + +template < typename t > +t max( const t& t1, const t& t2 ) { + return t1 > t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t max( const t& t1, const t& t2, ts_&&... ts ) { + return t1 > t2 ? + max( t1, std::forward< ts_ >( ts )... ) : + max( t2, std::forward< ts_ >( ts )... ); +} + +// todo - dex; make 2 random generator funcs here, this one only works for floats normally + +template < typename t > +__forceinline t random_number( t min, t max ) { + if constexpr( !std::is_integral_v< t > ) { + std::uniform_real_distribution< t > dist( min, max ); + return dist( gen ); + } + else { + std::uniform_int_distribution< t > dist( min, max ); + return dist( gen ); + } +} + +__forceinline vec3_t get_rotated_pos( vec3_t start, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + start.x += cos( rad ) * distance; + start.y += sin( rad ) * distance; + + return start; +} + +__forceinline vec3_t vector_angles( const vec3_t& start, const vec3_t& end ) { + vec3_t delta = end - start; + + float magnitude = sqrtf( delta.x * delta.x + delta.y * delta.y ); + float pitch = atan2f( -delta.z, magnitude ) * M_RADPI; + float yaw = atan2f( delta.y, delta.x ) * M_RADPI; + + vec3_t angle( pitch, yaw, 0.0f ); + return angle.clamp( ); +} + + +__forceinline vec3_t vector_angles( const vec3_t& v ) { + float magnitude = sqrtf( v.x * v.x + v.y * v.y ); + float pitch = atan2f( -v.z, magnitude ) * M_RADPI; + float yaw = atan2f( v.y, v.x ) * M_RADPI; + + vec3_t angle( pitch, yaw, 0.0f ); + return angle; +} + +__forceinline vec3_t angle_vectors( const vec3_t& angles ) { + float sp, sy, cp, cy; + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + + return vec3_t{ cp * cy, cp * sy, -sp }; +} + +__forceinline void angle_vectors( const vec3_t& angles, vec3_t* forward, vec3_t* right, vec3_t* up ) { + float sr, sp, sy, cr, cp, cy; + + sp = sinf( angles.x * M_PIRAD ); + cp = cosf( angles.x * M_PIRAD ); + sy = sinf( angles.y * M_PIRAD ); + cy = cosf( angles.y * M_PIRAD ); + sr = sinf( angles.z * M_PIRAD ); + cr = cosf( angles.z * M_PIRAD ); + + if( forward ) { + forward->x = cp * cy; + forward->y = cp * sy; + forward->z = -sp; + } + + if( right ) { + right->x = -1 * sr * sp * cy + -1 * cr * -sy; + right->y = -1 * sr * sp * sy + -1 * cr * cy; + right->z = -1 * sr * cp; + } + + if( up ) { + up->x = cr * sp * cy + -sr * -sy; + up->y = cr * sp * sy + -sr * cy; + up->z = cr * cp; + } +} + +__forceinline float find_closest_step( float angle, float step ) { + int steps = ( int )( angle / step + 0.5f ); + + return steps * step; +} + +__forceinline vec3_t vector_transform( const vec3_t& in, const matrix3x4& matrix ) { + vec3_t out; + for( int i{ }; i < 3; i++ ) + out[ i ] = in.dot( ( const vec3_t& )matrix[ i ] ) + matrix[ i ][ 3 ]; + + return out; +} + +extern void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ); +extern void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ); +extern void set_matrix_position( vec3_t pos, matrix3x4& src ); +extern vec3_t get_matrix_position( const matrix3x4& pos ); +extern vec3_t matrix_angles( const matrix3x4& matrix ); +extern void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ); +extern void angle_imatrix( vec3_t angles, matrix3x4& matrix ); +extern void angle_matrix( vec3_t angles, matrix3x4& matrix ); +extern uint32_t md5_pseudorandom( uint32_t seed ); +extern float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ); + +END_REGION \ No newline at end of file diff --git a/cheat/tf2/mem.hpp b/cheat/tf2/mem.hpp new file mode 100644 index 0000000..22e8fbf --- /dev/null +++ b/cheat/tf2/mem.hpp @@ -0,0 +1,66 @@ +#pragma once +#include +#include "util.hpp" + +#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) + +class stack_t { + uintptr_t m_ptr; + +public: + __forceinline stack_t( ) : m_ptr( get_baseptr( ) ) { } + + __forceinline stack_t( uintptr_t ptr ) : m_ptr( ptr ) { } + + template < typename t = uintptr_t > + __forceinline t get( ) { + return ( t )m_ptr; + } + + template < typename t = uintptr_t > + __forceinline t return_address( ) { + return *( t* )( m_ptr + sizeof( void* ) ); + } + + template < typename t = uintptr_t > + __forceinline t address_of_return_address( ) { + return ( t )( m_ptr + sizeof( uintptr_t ) ); + } + + __forceinline stack_t& next( ) { + return *( stack_t* )( m_ptr ); + } + + template < typename t = uintptr_t > + __forceinline t local( size_t at ) { + return ( t )( m_ptr - at ); + } + + template < typename t = uintptr_t > + __forceinline t arg( size_t at ) { + return ( t )( m_ptr + at ); + } +}; + +namespace util { + template < typename t = uint8_t > + __forceinline t* memcpy( t* dst, t* src, size_t size = sizeof( t ) ) { + __movsb( + ( uint8_t* )dst, + ( uint8_t* )src, + size + ); + + return dst; + } + + __forceinline void* memset( uint8_t* dst, uint8_t val, size_t size ) { + __stosb( + dst, + val, + size + ); + + return dst; + } +} \ No newline at end of file diff --git a/cheat/tf2/movement.cpp b/cheat/tf2/movement.cpp new file mode 100644 index 0000000..e1dd335 --- /dev/null +++ b/cheat/tf2/movement.cpp @@ -0,0 +1,41 @@ +#include "movement.h" +#include "interfaces.h" +#include "settings.h" + +namespace features { + void c_movement::bhop( ) { + if( !g_settings.misc.bunny_hop ) + return; + + if( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || + g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) + return; + + //jump like you nohat -> WELL THERES FUCKING HATS IN THIS GAME ISNT THERE CUNT + if( m_cmd->m_buttons & IN_JUMP && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { + m_cmd->m_buttons &= ~IN_JUMP; + } + } + + + //ehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh lazy + void c_movement::autostrafe( ) { + if( !g_settings.misc.auto_strafe ) + return; + + float velocity = g_ctx.m_local->m_vecVelocity( ).length2d( ); + auto cmd = g_ctx.get_last_cmd( ); + + if( cmd && m_cmd->m_buttons & IN_JUMP && velocity > 1.0f ) { + if( !cmd->m_forwardmove && !cmd->m_sidemove ) { + if( !cmd->m_mousedx ) { + cmd->m_forwardmove = std::min< float >( 450.f, 5850.f / velocity ); + cmd->m_sidemove = ( m_cmd->m_cmd_nr % 2 ) == 0 ? -450.f : 450.f; + } + else { + cmd->m_sidemove = m_cmd->m_mousedx < 0.f ? -450.f : 450.f; + } + } + } + } +} diff --git a/cheat/tf2/movement.h b/cheat/tf2/movement.h new file mode 100644 index 0000000..d32fb2b --- /dev/null +++ b/cheat/tf2/movement.h @@ -0,0 +1,19 @@ +#pragma once +#include "sdk.h" + +namespace features { + class c_movement { + public: + void update( user_cmd_t* cmd ) { + if ( !cmd ) return; + m_cmd = cmd; + + bhop( ); + } + + private: + void bhop( ); + void autostrafe( ); + user_cmd_t* m_cmd; + }; +} \ No newline at end of file diff --git a/cheat/tf2/netvar_proxy.hpp b/cheat/tf2/netvar_proxy.hpp new file mode 100644 index 0000000..ea18a4d --- /dev/null +++ b/cheat/tf2/netvar_proxy.hpp @@ -0,0 +1,37 @@ +#pragma once +#include "dt_recv.h" + +//dont leave things out of namespaces +namespace hooks +{ + class c_netvar_proxy { + public: + c_netvar_proxy( RecvProp* target_property, RecvVarProxyFn new_proxy ) { + m_target = target_property; + m_original = target_property->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + c_netvar_proxy( ) = default; + + void init( RecvProp* target, RecvVarProxyFn new_proxy ) { + m_target = target; + m_original = target->m_ProxyFn; + m_target->m_ProxyFn = new_proxy; + } + + ~c_netvar_proxy( ) { + if( !m_target ) return; + m_target->m_ProxyFn = m_original; + } + + RecvVarProxyFn get_old_function( ) const { + return m_original; + } + + private: + //overcomplicated... + RecvProp * m_target; + RecvVarProxyFn m_original; + }; +} \ No newline at end of file diff --git a/cheat/tf2/netvars.cpp b/cheat/tf2/netvars.cpp new file mode 100644 index 0000000..2a064bd --- /dev/null +++ b/cheat/tf2/netvars.cpp @@ -0,0 +1,93 @@ +#include "netvars.h" +#include "interfaces.h" + +tf2::c_netvars g_netvars; + +NAMESPACE_REGION( tf2 ) + +void c_netvars::init( ) { + for( auto client_class = cl.m_chl( )->GetAllClasses( ); + !!client_class; + client_class = client_class->m_next + ) { + auto table = client_class->m_rt_table; + m_tables.push_back( table ); + } +} + +RecvTable* c_netvars::get_table( hash_t hash ) const { + if( m_tables.empty( ) ) return nullptr; + + for( auto& table : m_tables ) { + if( !table ) continue; + + if( hash == hash::fnv1a( table->m_pNetTableName ) ) { + return table; + } + } + + return nullptr; +} + +//iterating this too much results in a stack overflow, so thats cool +RecvProp* c_netvars::get_prop( hash_t data, hash_t name ) const { + RecvProp* prop{ }; + RecvTable* child{ }; + + auto table = get_table( data ); + if( !table ) return nullptr; + + for( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if( child && child->m_nProps ) { + auto tmp = get_prop( hash::fnv1a( child->m_pNetTableName ), name ); + if( tmp ) return tmp; + } + + if( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop; + } + + return nullptr; +} + +std::ptrdiff_t c_netvars::get_entry( hash_t name, RecvTable* table ) const { + std::ptrdiff_t ret{ }; + RecvProp* prop; + RecvTable* child; + + for( int i{ }; i < table->m_nProps; ++i ) { + prop = &table->m_pProps[ i ]; + child = prop->GetDataTable( ); + + if( child && child->m_nProps ) { + auto tmp = get_entry( name, child ); + if( tmp ) ret += prop->GetOffset( ) + tmp; + } + + if( name != hash::fnv1a( prop->m_pVarName ) ) + continue; + + return prop->GetOffset( ) + ret; + } + + return ret; +} + +std::ptrdiff_t c_netvars::get_netvar( hash_t data, hash_t name ) const { + std::ptrdiff_t ret{ }; + auto table = get_table( data ); + if( !table ) return 0; + + ret = get_entry( name, table ); +#ifdef DEBUG + printf( "%s:\t\t 0x%05x\n", name.c_str( ), ret ); +#endif + return ret; +} + +END_REGION \ No newline at end of file diff --git a/cheat/tf2/netvars.h b/cheat/tf2/netvars.h new file mode 100644 index 0000000..54b92be --- /dev/null +++ b/cheat/tf2/netvars.h @@ -0,0 +1,44 @@ +#pragma once +#include + +#include "dt_recv.h" +#include "util.hpp" +#include "fnv.hpp" + +class RecvTable; + +#define NETVAR( funcname, name, table, extra, type ) \ +__forceinline auto& funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return get< type >( offset + extra ); \ +} + +#define PNETVAR( funcname, name, table, extra, type ) \ +__forceinline type* funcname( ) { \ + static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ + return reinterpret_cast< type* >( uintptr_t( this ) + offset + extra ); \ +} + +#define OFFSET( funcname, offset, type ) \ +__forceinline auto& funcname( ) { \ + return get< type >( offset ); \ +} + +NAMESPACE_REGION( tf2 ) + +class c_netvars { +public: + void init( ); + //search through the netvar list + std::ptrdiff_t get_netvar( hash_t table, hash_t hash ) const; + RecvProp* get_prop( hash_t table, hash_t name ) const; +public: + std::ptrdiff_t get_entry( hash_t hash, RecvTable* table ) const; + RecvTable* get_table( hash_t hash ) const; +private: + std::vector< RecvTable* > m_tables; +}; + +END_REGION + +extern tf2::c_netvars g_netvars; \ No newline at end of file diff --git a/cheat/tf2/on_screen_size_changed.cpp b/cheat/tf2/on_screen_size_changed.cpp new file mode 100644 index 0000000..580e2db --- /dev/null +++ b/cheat/tf2/on_screen_size_changed.cpp @@ -0,0 +1,9 @@ +#include "hooks.h" + +void __fastcall hooks::on_screen_size_changed( void* ecx_, void* edx_, int old_w, int old_h ) { + static auto old_fn = cl.m_surface->get_old_function< decltype( &hooks::on_screen_size_changed ) >( 116 ); + + old_fn( ecx_, nullptr, old_w, old_h ); + + g_fonts.initialize( ); +} \ No newline at end of file diff --git a/cheat/tf2/override_mouse_input.cpp b/cheat/tf2/override_mouse_input.cpp new file mode 100644 index 0000000..d3a4b9b --- /dev/null +++ b/cheat/tf2/override_mouse_input.cpp @@ -0,0 +1,14 @@ +#include "hooks.h" +#include "base_cheat.h" +#include "ctx.hpp" + +void __fastcall hooks::override_mouse_input( void* ecx_, void* edx_, float* x, float* y ) { + static auto omi_o = cl.m_clientmode->get_old_function< decltype( &hooks::override_mouse_input ) >( 20 ); + omi_o( ecx_, edx_, x, y ); + + if( cl.m_panic ) return; + + if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { + g_cheat.aim( x, y ); + } +} \ No newline at end of file diff --git a/cheat/tf2/override_view.cpp b/cheat/tf2/override_view.cpp new file mode 100644 index 0000000..2e22e58 --- /dev/null +++ b/cheat/tf2/override_view.cpp @@ -0,0 +1,17 @@ +#include "base_cheat.h" +#include "ctx.hpp" +#include "hooks.h" +#include "settings.h" +void __fastcall hooks::override_view( void* ecx_, void* edx_, CViewSetup* setup ) { + static auto override_view_o = cl.m_clientmode->get_old_function< decltype( &hooks::override_view ) >( 16 ); + if( cl.m_panic ) { + return override_view_o( ecx_, nullptr, setup ); + } + + g_ctx.m_fov = setup->m_flFov; + if( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) ) { + setup->m_flFov = g_settings.misc.fov_changer( ); + } + g_cheat.extra.thirdperson( ); + override_view_o( ecx_, nullptr, setup ); +} \ No newline at end of file diff --git a/cheat/tf2/paint.cpp b/cheat/tf2/paint.cpp new file mode 100644 index 0000000..144847b --- /dev/null +++ b/cheat/tf2/paint.cpp @@ -0,0 +1,51 @@ +#include "hooks.h" +#include "interfaces.h" +#include "search.h" +#include "graphics.h" +#include "settings.h" +#include "base_cheat.h" + + +void __fastcall hooks::paint_traverse( void *ecx_, void *edx_, unsigned int panel, bool forcerepaint, bool allowforce ) { + static auto paint_o = cl.m_panel->get_old_function< decltype( hooks::paint_traverse )* >( 41 ); + paint_o( ecx_, edx_, panel, forcerepaint, allowforce ); + + if ( cl.m_panic /*|| !g_ctx->run_frame( ) this will disable esp when dead u dummie!!!*/ ) { + return; + } + + static uint32_t focus_overlay_panel{ }; + if ( !focus_overlay_panel ) { + std::string panelname( cl.m_panel( )->GetName( panel ) ); + if ( panelname.find( "FocusOverlayPanel" ) != std::string::npos ) { //matsystemtoppanel is glitched the fuck out in tf2 + focus_overlay_panel = panel; //hovewer this draws on shit other than the main screen + } //so we should get paint working + } + + if ( panel == focus_overlay_panel ) { //i still wonder why dont we do this in paint + //dank 2007 esp here + cl.m_panel( )->SetMouseInputEnabled( panel, g_settings.menu.open || g_con->m_open ); + } +} + +void __fastcall hooks::paint( void* ecx_, void* edx_, int mode ) { + static auto engine_paint_o = cl.m_vgui->get_old_function< decltype( hooks::paint )* >( 13 ); + static auto start_d = pattern::first_code_match< void( __thiscall* )( void* ) >( cl.m_surface.dll( ), "55 8B EC 64 A1 ? ? ? ? 6A FF 68 ? ? ? ? 50 64 89 25 ? ? ? ? 83 EC 14" ); + static auto finish_d = pattern::first_code_match< void( __thiscall* )( void* ) >( cl.m_surface.dll( ), "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 64 89 25 ? ? ? ? 51 56 6A 00" ); + + engine_paint_o( ecx_, edx_, mode ); + + if ( cl.m_panic ) return; + + if ( mode & PAINT_UIPANELS ) { + start_d( cl.m_surface( ) ); + + //did you say lazy? + + g_renderer.draw_box( 0, 0, 1, 1, clr_t( 0, 0, 0, 1 ) ); + if( !g_settings.misc.hide_from_obs ) + g_cheat.visuals( ); + + finish_d( cl.m_surface( ) ); + } +} \ No newline at end of file diff --git a/cheat/tf2/pattern.hpp b/cheat/tf2/pattern.hpp new file mode 100644 index 0000000..0bc4b1b --- /dev/null +++ b/cheat/tf2/pattern.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma warning ( disable : 4018 ) + +namespace pattern +{ + inline bool bin_match( uint8_t* code, uint8_t* pattern, size_t size ) { + for( size_t j = 0; j < size; j++ ) { + if( pattern[ j ] && code[ j ] != pattern[ j ] ) { + return false; + } + } + return true; + } + + template< typename t = uintptr_t > static t first_match( uintptr_t start, std::string sig, size_t len, std::ptrdiff_t offset = 0 ) { + std::istringstream iss( sig ); + std::vector< std::string > tokens{ std::istream_iterator< std::string >{ iss }, std::istream_iterator< std::string >{} }; + std::vector< uint8_t > sig_bytes; + + for( const auto& hex_byte : tokens ) { + sig_bytes.push_back( static_cast< uint8_t >( std::strtoul( hex_byte.c_str( ), nullptr, 16 ) ) ); + } + + if( sig_bytes.empty( ) || sig_bytes.size( ) < 2 ) { + return t{ }; + } + + auto sig_data = sig_bytes.data( ); + auto sig_size = sig_bytes.size( ); + + for( size_t i{ }; i < len; i++ ) { + uint8_t* code_ptr = reinterpret_cast< uint8_t* >( start + i ); + + if( bin_match( code_ptr, sig_data, sig_size ) ) { + return( ( t )( start + i + offset ) ); + } + } + + return t{ }; + } + + //ultimately the function you want to call to sigscan ( ida style ) + template< typename t = uintptr_t > static t first_code_match( HMODULE start, std::string sig, std::ptrdiff_t offset = 0 ) { + auto dos_hdr = reinterpret_cast< PIMAGE_DOS_HEADER >( start ); + + if( !dos_hdr ) return t{ }; + + //DOS header, verifies if module is valid + if( dos_hdr->e_magic != 0x5a4d ) { + return t{ }; + } + + auto nt_hdrs = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< uintptr_t >( dos_hdr ) + dos_hdr->e_lfanew ); + + return first_match< t >( reinterpret_cast< uintptr_t >( dos_hdr ) + nt_hdrs->OptionalHeader.BaseOfCode, sig, nt_hdrs->OptionalHeader.SizeOfCode, offset ); + } +}; \ No newline at end of file diff --git a/cheat/tf2/prediction.cpp b/cheat/tf2/prediction.cpp new file mode 100644 index 0000000..c9e2493 --- /dev/null +++ b/cheat/tf2/prediction.cpp @@ -0,0 +1,70 @@ +#include "prediction.h" +#include "sdk.h" +#include "interfaces.h" + +void features::c_prediction::run_prediction( user_cmd_t* cmd ) { + static uintptr_t addr_of_runcommand = cl.m_prediction->get_function( 17 ); + static uint32_t pseudo_random_offset = pattern::first_code_match( cl.m_chl.dll( ), "55 8B EC 8B 45 08 85 C0 75 0C", 0x1 ); + static char* move_data = reinterpret_cast< char* >( malloc( 0x256 ) ); + + if ( !cmd || !g_ctx.m_local ) return; + + int flags = g_ctx.m_local->get_flags( ); + int cmd_buttons = cmd->m_buttons; + + auto set_random_seed = reinterpret_cast< void( __cdecl* )( uint32_t ) >( pseudo_random_offset ); + + *reinterpret_cast< user_cmd_t** >( uintptr_t( g_ctx.m_local ) + 0x107c ) = cmd; + + if ( cmd->m_impulse ) { + *reinterpret_cast< uint8_t* >( uintptr_t( g_ctx.m_local ) + 0x1124 ) = cmd->m_impulse; + } + + /*void __cdecl SetButtonState(int a1) + { + int v1; // ecx@0 + int v2; // edx@1 + + v2 = a1 ^ *(_DWORD *)(v1 + 0x1078); + *(_DWORD *)(v1 + 0x106C) = *(_DWORD *)(v1 + 0x1078); + *(_DWORD *)(v1 + 0x1078) = a1; + *(_DWORD *)(v1 + 0x1070) = a1 & v2; + *(_DWORD *)(v1 + 0x1074) = v2 & ~a1; + }*/ + auto v2 = cmd->m_buttons ^ *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1078 ); + + *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x106c ) = *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1078 ); + *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1078 ) = cmd->m_buttons; + *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1070 ) = cmd->m_buttons & v2; + *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1074 ) = v2 &~ cmd->m_buttons; + + cl.m_globals->curtime = g_ctx.m_local->get_tick_base( ) * cl.m_globals->interval_per_tick; + cl.m_globals->frametime = cl.m_globals->interval_per_tick; + + set_random_seed( cmd->m_random_seed ); + **reinterpret_cast< uintptr_t** >( addr_of_runcommand + 0x2b + 0x2 ) = uintptr_t( g_ctx.m_local ); + + cl.m_movement( )->StartTrackPredictionErrors( reinterpret_cast< uintptr_t* >( g_ctx.m_local ) ); + + int tick_base = g_ctx.m_local->get_tick_base( ); + + static auto setup_move = cl.m_prediction->get_function< void( __thiscall* )( void*, c_base_player*, user_cmd_t*, IMoveHelper*, CMoveData* ) >( 18 ); + static auto finish_move = cl.m_prediction->get_function< void( __thiscall* )( void*, c_base_player*, user_cmd_t*, CMoveData* ) >( 19 ); + setup_move( cl.m_prediction( ), g_ctx.m_local, cmd, cl.m_movehelper, reinterpret_cast< CMoveData* >( move_data ) ); + cl.m_movement( )->ProcessMovement( reinterpret_cast< uintptr_t* >( g_ctx.m_local ), reinterpret_cast< CMoveData* >( move_data ) ); + finish_move( cl.m_prediction( ), g_ctx.m_local, cmd, reinterpret_cast< CMoveData* >( move_data ) ); + + g_ctx.m_local->m_nTickBase( ); + + cl.m_movement( )->FinishTrackPredictionErrors( reinterpret_cast< uintptr_t* >( g_ctx.m_local ) ); + + set_random_seed( 0xfffffff ); + **reinterpret_cast< uintptr_t*** >( addr_of_runcommand + 0x2b + 0x2 ) = nullptr; + *reinterpret_cast< user_cmd_t** >( uintptr_t( g_ctx.m_local ) + 0x107c ) = nullptr; + + cl.m_globals->curtime = g_ctx.m_local->get_tick_base( ) * cl.m_globals->interval_per_tick; + cl.m_globals->frametime = cl.m_globals->interval_per_tick; + + g_ctx.m_local->m_nTickBase( ); + cmd->m_buttons = cmd_buttons; +} \ No newline at end of file diff --git a/cheat/tf2/prediction.h b/cheat/tf2/prediction.h new file mode 100644 index 0000000..e71ac24 --- /dev/null +++ b/cheat/tf2/prediction.h @@ -0,0 +1,10 @@ +#pragma once +class user_cmd_t; +class c_base_player; +namespace features +{ + class c_prediction { + public: + void run_prediction( user_cmd_t* cmd ); + }; +} \ No newline at end of file diff --git a/cheat/tf2/process_movement.cpp b/cheat/tf2/process_movement.cpp new file mode 100644 index 0000000..c6f186e --- /dev/null +++ b/cheat/tf2/process_movement.cpp @@ -0,0 +1,12 @@ +#include "hooks.h" +#include "interfaces.h" + +void __fastcall hooks::process_movement( void* thisptr, void* edx_, c_base_player* player, CMoveData* move ) { + static auto old_fn = cl.m_movement->get_old_function< decltype( hooks::process_movement )* >( 1 ); + + if ( cl.m_input( )->IsButtonDown( MOUSE_MIDDLE ) ) { + move->m_outStepHeight = -1.0f; + } + + return old_fn( thisptr, edx_, player, move ); +} \ No newline at end of file diff --git a/cheat/tf2/projectile_pred.cpp b/cheat/tf2/projectile_pred.cpp new file mode 100644 index 0000000..c54f712 --- /dev/null +++ b/cheat/tf2/projectile_pred.cpp @@ -0,0 +1,70 @@ +#include "projectile_pred.h" +#include "sdk.h" +#include "interfaces.h" + +namespace util +{ + + vec3_t c_projectile_pred::predict_player( c_base_player* player ) { + if ( !player || !player->is_valid( ) ) return vec3_t{ }; + + static auto sv_gravity = cl.m_cvar( )->FindVar( "sv_gravity" ); //unnecessary for now + auto local = g_ctx.m_local; //will be used for stuff like grenades + //will also need to calculate friction etc + auto weapon = local->get_active_weapon( ); + if ( !weapon ) return player->get_origin( ); + + float projectile_speed = get_projectile_speed( weapon ); + + vec3_t player_vel = player->get_velocity( ); + vec3_t projectile_vel = vec3_t( ); + + float estimated_travel_time = ( local->get_eye_pos( ) - player->get_origin( ) ).length( ) / projectile_speed + cl.m_globals->interval_per_tick; + vec3_t estimated_predicted_pos = player->get_origin( ) + player_vel * estimated_travel_time; + + return estimated_predicted_pos; + } + + float c_projectile_pred::get_projectile_speed( c_base_weapon* weapon ) { + if ( !weapon ) + return -1.f; + /* + this is completely hardcoded + if you can find a better way to figure this out + then please tell me + -- nave + */ + + int id = weapon->GetClientClass( )->m_class_id; + + float BeginCharge; + float Charge; + + //return flSpeed; + switch ( id ) { + case ClientClassIDs::CTFGrenadeLauncher: + return 840.0f; + case ClientClassIDs::CTFRocketLauncher_DirectHit: + return 1980.0f; + case ClientClassIDs::CTFRocketLauncher: + case ClientClassIDs::CTFRocketLauncher_Mortar: + return 1100.0f; + case ClientClassIDs::CTFFlareGun: + return 1450.0f; + case ClientClassIDs::CTFBat_Wood: + return 1940.0f; + case ClientClassIDs::CTFSyringeGun: + return 990.0f; + case ClientClassIDs::CTFCompoundBow: { + return 0.f; //need more shit, cba now + } + + default: + return -1.0f; + } + + return -1.0f; + } +} + +util::c_projectile_pred projectile_pred; \ No newline at end of file diff --git a/cheat/tf2/projectile_pred.h b/cheat/tf2/projectile_pred.h new file mode 100644 index 0000000..bd1b3d8 --- /dev/null +++ b/cheat/tf2/projectile_pred.h @@ -0,0 +1,15 @@ +#pragma once +class c_base_weapon; +class c_base_player; +class vec3_t; +namespace util +{ + class c_projectile_pred { + public: + vec3_t predict_player( c_base_player* ); + private: + float get_projectile_speed( c_base_weapon* ); + }; +} + +extern util::c_projectile_pred projectile_pred; \ No newline at end of file diff --git a/cheat/tf2/renderer.cpp b/cheat/tf2/renderer.cpp new file mode 100644 index 0000000..8f5e8e7 --- /dev/null +++ b/cheat/tf2/renderer.cpp @@ -0,0 +1,93 @@ +#include "renderer.hpp" +#include "interfaces.h" + +#undef CreateFont + + +drawings::c_fonts g_fonts; +drawings::c_drawings g_renderer; + +NAMESPACE_REGION( drawings ) + +c_fonts::font_t::font_t( std::string name, int size, + int weight, ulong_t flags ) : + m_name( name ), m_size( size ), + m_weight( weight ), m_flags( flags ) { + g_fonts.m_container.push_back( this ); +}; + +void c_fonts::font_t::initialize( ) { + m_font = cl.m_surface( )->CreateFnt( ); + cl.m_surface( )->SetFontGlyphSet( + m_font, m_name.c_str( ), m_size, + m_weight, 0, 0, + m_flags + ); +} + +void c_fonts::initialize( ) { + for( auto& it : m_container ) { + it->initialize( ); + } +} + +void c_drawings::draw_string( const wchar_t* text, HFont font, int x, int y, const clr_t& color ) { + cl.m_surface( )->DrawSetTextPos( x, y ); + cl.m_surface( )->DrawSetTextFont( font ); + cl.m_surface( )->DrawSetTextColor( color ); + cl.m_surface( )->DrawPrintText( text, wcslen( text ) ); +} + +void c_drawings::draw_rect( int x, int y, int w, int h, const clr_t& color ) { + cl.m_surface( )->DrawSetColor( color ); + cl.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); +} + +void c_drawings::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + cl.m_surface( )->DrawSetColor( clr ); + cl.m_surface( )->DrawLine( x, y, x1, y1 ); +} + +void c_drawings::draw_box( int x, int y, int w, int h, const clr_t& clr ) { + draw_line( x, y, x + w, y, clr ); + draw_line( x + w, y, x + w, y + h, clr ); + draw_line( x, y + h, x + w + 1, y + h, clr ); + draw_line( x, y, x, y + h, clr ); +} + +void c_drawings::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + cl.m_surface( )->DrawSetColor( col ); + cl.m_surface( )->DrawOutlinedCircle( x, y, r, res ); +} + +void c_drawings::draw_filled_circle( int x, int y, int r, const clr_t& col, int res ) { + vertex_t* v = ( vertex_t* )( _alloca( res * sizeof( vertex_t ) ) ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + v[ i ].init( x + x_off, y + y_off ); + } + + draw_polygon( res, v, col ); +} + +void c_drawings::draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& clr ) { + draw_line( ( int )begin.x, ( int )begin.y, ( int )end.x, ( int )end.y, clr ); +} + +void c_drawings::draw_polygon( int count, vertex_t* vertices, const clr_t& col ) { + static int texture = cl.m_surface( )->CreateNewTextureID( true ); + + clr_t buf( 255, 255, 255 ); + + cl.m_surface( )->DrawSetTextureRGBA( texture, ( byte* )( &buf ), 1, 1 ); + cl.m_surface( )->DrawSetColor( col ); + cl.m_surface( )->DrawSetTexture( texture ); + + cl.m_surface( )->DrawTexturedPolygon( count, vertices ); +} + +END_REGION \ No newline at end of file diff --git a/cheat/tf2/renderer.hpp b/cheat/tf2/renderer.hpp new file mode 100644 index 0000000..1c86511 --- /dev/null +++ b/cheat/tf2/renderer.hpp @@ -0,0 +1,120 @@ +#pragma once +#include +#include +#include + +#include "util.hpp" +#include "sdk.h" + +enum e_font_style : size_t { + +}; + +enum FontAlign_t : size_t { + ALIGN_CENTER, + ALIGN_LEFT, + ALIGN_RIGHT +}; + +NAMESPACE_REGION( drawings ) + + +class c_fonts { +protected: + struct font_t { + friend class c_fonts; + font_t( std::string name, int size, + int weight, ulong_t flags ); + + operator HFont( ) { + return m_font; + } + + private: + void initialize( ); + + HFont m_font; + std::string m_name; + int m_size; + int m_weight; + ulong_t m_flags; + }; + + std::vector< font_t* > m_container; + friend struct c_fonts::font_t; +public: + void initialize( ); + + font_t f_esp_small{ xors( "Tahoma" ), 11, 500, FONTFLAG_OUTLINE }; + font_t f_bold{ xors( "Verdana" ), 18, 900, FONTFLAG_DROPSHADOW | FONTFLAG_ANTIALIAS }; + font_t f_12{ xors( "Verdana" ), 12, 700, 128 }; + font_t f_14{ xors( "Verdana" ), 14, 700, 128 }; + font_t f_16{ xors( "Verdana" ), 16, 700, 128 }; + font_t f_18{ xors( "Verdana" ), 18, 700, 128 }; +}; + + + +//im going to fill ur triangles +class c_drawings { +private: + //dumb hacky fix for template functions + void draw_string( const wchar_t* msg, HFont font, int x, int y, const clr_t& color ); + +public: + void draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& color ); + void draw_line( int x, int y, int x1, int y2, const clr_t& color ); + void draw_rect( int x, int y, int w, int h, const clr_t& color ); + void draw_box( int x, int y, int w, int h, const clr_t& color ); //thicc + void draw_polygon( int count, vertex_t* vertices, const clr_t& col ); + void draw_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + void draw_filled_circle( int x, int y, int r, const clr_t& col, int res = 48 ); + + template < FontAlign_t align = ALIGN_LEFT > //fuck ur sprintf nigga varargs nigga + void draw_string( HFont font, int x, int y, const clr_t& color, const wchar_t* msg, ... ) { + wchar_t* buffer = ( wchar_t* )_alloca( 2048 ); + va_list list{ }; + int wide, tall; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vswprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + cl.m_surface( )->GetTextSize( + font, buffer, wide, tall ); + + switch( align ) { + case ALIGN_CENTER: + x -= wide / 2; + break; + case ALIGN_RIGHT: + x -= wide; + break; + default: break; + } + + draw_string( buffer, font, x, y, color ); + } + + template < FontAlign_t align = ALIGN_LEFT > //debatable whether it should be center or not + void draw_string( HFont font, int x, int y, const clr_t& color, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + auto wide_str = util::ascii_to_unicode( buffer ); + draw_string< align >( font, x, y, color, wide_str.c_str( ) ); + } +}; + +END_REGION + +extern drawings::c_fonts g_fonts; +extern drawings::c_drawings g_renderer; \ No newline at end of file diff --git a/cheat/tf2/scene_end.cpp b/cheat/tf2/scene_end.cpp new file mode 100644 index 0000000..bb88311 --- /dev/null +++ b/cheat/tf2/scene_end.cpp @@ -0,0 +1,37 @@ +#include "hooks.h" +#include "settings.h" +#include "base_cheat.h" +#include "ctx.hpp" + +void __fastcall hooks::scene_end( void* ecx_, void* edx_ ) { + static auto scene_end_o = cl.m_render_view->get_old_function< decltype( &hooks::scene_end ) >( 9 ); + scene_end_o( edx_, 0 ); + + if( !cl.m_panic && g_ctx.m_local && g_settings.visuals.chams.enabled( ) && g_settings.visuals.chams.ignore_z( ) ) { + g_ctx.m_drawing_screneend = true; + for( int i = 1; i < cl.m_globals->maxclients; ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + if( ent && ent->is_valid( ) ) { + if( ent == g_ctx.m_local && ent->m_bIsScoped( ) ) { + continue; + } + int team = ent->m_iTeamNum( ); + bool enemy = team != g_ctx.m_local->m_iTeamNum( ); + if( enemy || g_settings.visuals.chams.friendlies( ) ) { + IMaterial* mat = g_settings.visuals.chams.flat ? g_cheat.chams.m_materials.m_chams_flat : g_cheat.chams.m_materials.m_chams; + fclr_t clr_vis = enemy ? g_settings.visuals.chams.color_visible_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_visible_friendly( ).to_fclr( ); + fclr_t clr_hid = enemy ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); + //g_cheat.chams.m_materials.force_material( mat, clr_hid ); + ent->ce( )->DrawModel( 0x1, 255 ); + mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); + //g_cheat.chams.m_materials.force_material( mat, clr_vis ); + ent->ce( )->DrawModel( 0x1, 255 ); + cl.m_model_render( )->ForcedMaterialOverride( nullptr ); + } + } + } + + g_ctx.m_drawing_screneend = false; + } +} \ No newline at end of file diff --git a/cheat/tf2/sdk.h b/cheat/tf2/sdk.h new file mode 100644 index 0000000..4db8a8f --- /dev/null +++ b/cheat/tf2/sdk.h @@ -0,0 +1,34 @@ +#pragma once + +#define CLIENT_DLL + +#include +#include +#include + +#include "vector.hpp" + +#include "color.hpp" +#include "IClientMode.h" +#include "CHLClient.h" +#include "IEngineVGui.h" +#include "IClientEntityList.h" +#include "IEngineTrace.h" +#include "CGlobalVarsBase.h" +#include "ICvar.h" +#include "IVDebugOverlay.h" +#include "IVEngineClient.h" +#include "IPlayerInfoManager.h" +#include "CBasePlayer.h" +#include "IPanel.h" +#include "ISurface.h" +#include "GlowObject.h" +#include "IInputSystem.h" +#include "IVRenderView.h" +#include "CBaseWeapon.h" +#include "IVModelInfo.h" +#include "IGameMovement.h" +#include "IMaterialSystem.hpp" +#include "IGameEventManager.h" +#include "CInput.hpp" +#include "KeyValues.h" \ No newline at end of file diff --git a/cheat/tf2/settings.cpp b/cheat/tf2/settings.cpp new file mode 100644 index 0000000..144c74a --- /dev/null +++ b/cheat/tf2/settings.cpp @@ -0,0 +1,4 @@ +#include "settings.h" + +SettingHolder holder_{ "" }; +c_settings settings; \ No newline at end of file diff --git a/cheat/tf2/settings.h b/cheat/tf2/settings.h new file mode 100644 index 0000000..3f9fbac --- /dev/null +++ b/cheat/tf2/settings.h @@ -0,0 +1,276 @@ +#pragma once +#include "simple_settings.h" +#include "strings.hpp" +#include "color.hpp" +#include +//later i will implement a way to load all config files + +namespace data +{ + + + extern SettingHolder holder_; + + + class legitbot_settings : SettingHolder { + public: + using SettingHolder::SettingHolder; + + con_var< float > m_fov{ this, fnv( "fov" ), 5.f }; + con_var< float > m_speed{ this, fnv( "speed" ), 10.f }; + con_var< float > m_assist_strength{ this, fnv( "assist_strength" ), 0.f }; + con_var< int > m_hitbox{ this, fnv( "hitbox" ), 0 }; + con_var< int > m_bone{ this, fnv( "bone" ), 0 }; + }; + + + class c_settings { + public: + + void load( ) { + switch( menu.cur_setting ) { + case 0: + holder_.load( "", xors( "./tf/cfg/scout.cfg" ) ); + break; + case 1: + holder_.load( "", xors( "./tf/cfg/soldier.cfg" ) ); + break; + case 2: + holder_.load( "", xors( "./tf/cfg/pyro.cfg" ) ); + break; + case 3: + holder_.load( "", xors( "./tf/cfg/demo.cfg" ) ); + break; + case 4: + holder_.load( "", xors( "./tf/cfg/heavy.cfg" ) ); + break; + case 5: + holder_.load( "", xors( "./tf/cfg/engineer.cfg" ) ); + break; + case 6: + holder_.load( "", xors( "./tf/cfg/medic.cfg" ) ); + break; + case 7: + holder_.load( "", xors( "./tf/cfg/sniper.cfg" ) ); + break; + case 8: + holder_.load( "", xors( "./tf/cfg/spy.cfg" ) ); + break; + case 9: + holder_.load( "", xors( "./tf/cfg/money_rage1.cfg" ) ); + break; + case 10: + holder_.load( "", xors( "./tf/cfg/money_rage2.cfg" ) ); + break; + } + + menu.anti_untrusted = true; + } + + void save( ) { + switch( menu.cur_setting ) { + case 0: + holder_.load( "", xors( "./tf/cfg/scout.cfg" ) ); + break; + case 1: + holder_.load( "", xors( "./tf/cfg/soldier.cfg" ) ); + break; + case 2: + holder_.load( "", xors( "./tf/cfg/pyro.cfg" ) ); + break; + case 3: + holder_.load( "", xors( "./tf/cfg/demo.cfg" ) ); + break; + case 4: + holder_.load( "", xors( "./tf/cfg/heavy.cfg" ) ); + break; + case 5: + holder_.load( "", xors( "./tf/cfg/engineer.cfg" ) ); + break; + case 6: + holder_.load( "", xors( "./tf/cfg/medic.cfg" ) ); + break; + case 7: + holder_.load( "", xors( "./tf/cfg/sniper.cfg" ) ); + break; + case 8: + holder_.load( "", xors( "./tf/cfg/spy.cfg" ) ); + break; + case 9: + holder_.load( "", xors( "./tf/cfg/money_rage1.cfg" ) ); + break; + case 10: + holder_.load( "", xors( "./tf/cfg/money_rage2.cfg" ) ); + break; + } + } + + void copy_to_clipboard( ) { + holder_.save( "", xors( "./tf/cfg/money_temp.cfg" ) ); + std::vector< uint8_t > file_data; + FILE* f = fopen( xors( "./tf/cfg/money_temp.cfg" ), "r" ); + size_t size = 0; + fseek( f, 0, SEEK_END ); + size = ftell( f ); + + char* buf = ( char* )malloc( size ); + fread( buf, 1, size, f ); + fclose( f ); + for( size_t i{ }; i < size; ++i ) { + file_data.push_back( buf[ i ] ); + } + + free( buf ); + + EmptyClipboard( ); + OpenClipboard( nullptr ); + + auto g = GlobalAlloc( GMEM_FIXED, size ); + memcpy( g, file_data.data( ), size ); + + SetClipboardData( CF_TEXT, g ); + CloseClipboard( ); + //DeleteFileA( xors( "./tf/cfg/money_temp.cfg" ) ); + } + + void load_from_clipboard( ) { + FILE* f = fopen( xors( "./tf/cfg/money_temp.cfg" ), "wb" ); + auto data = GetClipboardData( CF_TEXT ); + + auto size = GlobalSize( data ); + fwrite( data, 1, size, f ); + fclose( f ); + + holder_.load( "", xors( "./tf/cfg/money_temp.cfg" ) ); + + CloseClipboard( ); + //DeleteFileA( xors( "./tf/cfg/money_temp.cfg" ) ); + } + + struct { + con_var< bool > enabled{ &holder_, fnv( "legit_active" ), false }; + con_var< size_t > sample_size{ &holder_, fnv( "legit_sample_size" ), 12 }; + con_var< float > smooth_factor{ &holder_, fnv( "legit_smooth_factor" ), 1.0f }; + con_var< bool > dynamic_smoothing{ &holder_, fnv( "legit_dynamic_smoothing" ), false }; + con_var< bool > assist{ &holder_, fnv( "legit_assist" ), false }; + con_var< bool > friendlies{ &holder_, fnv( "legit_friendlies" ), false }; + con_var< int > activation_type{ &holder_, fnv( "legit_activation_type" ), 1 }; + con_var< int > key{ &holder_, fnv( "legit_key" ), 0 }; + con_var< bool > backtracking{ &holder_, fnv( "legit_backtracking" ), 0 }; + con_var< float > backtracking_time{ &holder_, fnv( "legit_bt_time" ), 0.2f }; + con_var< float > backtracking_fov{ &holder_, fnv( "legit_bt_fov" ), 5.0f }; + con_var< bool > backtracking_target{ &holder_, fnv( "legit_bt_target" ), false }; + con_var< bool > backtracking_visualize{ &holder_, fnv( "legit_bt_visualize" ), 0 }; + con_var< clr_t > backtracking_col{ &holder_, fnv( "legit_bt_col" ), clr_t( 255, 255, 255, 120 ) }; + con_var< bool > triggerbot{ &holder_, fnv( "legit_triggerbot" ), false }; + con_var< int > trigger_key{ &holder_, fnv( "legit_triggerkey" ), 0 }; + con_var< float > trigger_delay{ &holder_, fnv( "legit_triggerdelay" ), 0.f }; + legitbot_settings secondary{ &holder_, "legit_primary" }; + legitbot_settings melee{ &holder_, "legit_melee" }; + legitbot_settings primary{ &holder_, "legit_secondary" }; + legitbot_settings* active = &primary; + } legit; + + struct { + struct { + con_var< bool > enabled{ &holder_, fnv( "visuals_chams_enabled" ), 0 }; + con_var< bool > flat{ &holder_, fnv( "visuals_chams_flat" ), 0 }; + con_var< bool > ignore_z{ &holder_, fnv( "visuals_chams_ignore_z" ), 0 }; + con_var< float > reflectivity{ &holder_, fnv( "visuals_chams_reflectivity" ), 1.0f }; + con_var< float > shine{ &holder_, fnv( "visuals_chams_shine" ), 1.0f }; + con_var< bool > friendlies{ &holder_, fnv( "visuals_chams_friendlies" ), 0 }; + con_var< clr_t > color_visible_friendly{ &holder_, fnv( "visuals_chams_color_friendly" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > color_visible_enemy{ &holder_, fnv( "visuals_chams_color_enemy" ), clr_t( 255, 255, 0 ) }; + con_var< clr_t > color_hidden_friendly{ &holder_, fnv( "visuals_chams_color_h_friendly" ), clr_t( 0, 0, 255 ) }; + con_var< clr_t > color_hidden_enemy{ &holder_, fnv( "visuals_chams_color_h_enemy" ), clr_t( 255, 0, 0 ) }; + } chams; + + con_var< int > activation_type{ &holder_, fnv( "visuals_activation" ), false }; + //players + con_var< bool > box{ &holder_, fnv( "visuals_box" ), false }; + con_var< bool > dormant{ &holder_, fnv( "visuals_dormant" ), false }; + con_var< bool > health{ &holder_, fnv( "visuals_health" ), false }; + con_var< bool > weapon{ &holder_, fnv( "visuals_weapon" ), false }; + con_var< bool > name{ &holder_, fnv( "visuals_name" ), false }; + con_var< bool > out_of_pov{ &holder_, fnv( "visuals_out_of_pov" ), false }; + con_var< float > out_of_pov_radius{ &holder_, fnv( "visuals_out_of_pov_radius" ), 0.75f }; + con_var< int > out_of_pov_size{ &holder_, fnv( "visuals_out_of_pov_size" ), 25 }; + con_var< bool > friendlies{ &holder_, fnv( "visuals_friendlies" ), false }; + con_var< bool > skeleton{ &holder_, fnv( "visuals_skeleton" ) }; + con_var< bool > glow{ &holder_, fnv( "visuals_glow" ), false }; + con_var< bool > conditions{ &holder_, fnv( "visuals_conditions" ), false }; //conditions + con_var< bool > resolver_indicator{ &holder_, fnv( "visuals_resolver_indicator" ), false }; + con_var< bool > ammo{ &holder_, fnv( "visuals_ammo" ), false }; + con_var< bool > player_class{ &holder_, fnv( "visuals_player_class" ) }; + con_var< bool > floating_ragdolls{ &holder_, fnv( "visuals_floating_ragdolls" ) }; //dont remember + con_var< bool > sound{ &holder_, fnv( "visuals_sound" ), false }; + con_var< clr_t > box_enemy{ &holder_, fnv( "visuals_clr_enemy" ), clr_t( 0, 255, 255 ) }; + con_var< clr_t > box_friendly{ &holder_, fnv( "visuals_clr_friendly" ), clr_t( 255, 0, 255 ) }; + con_var< clr_t > glow_enemy{ &holder_, fnv( "visuals_glow_enemy" ), clr_t( 255, 0, 255, 150 ) }; + con_var< clr_t > glow_friendly{ &holder_, fnv( "visuals_glow_friendly" ), clr_t( 255, 120, 0, 150 ) }; + con_var< clr_t > skeleton_enemy{ &holder_, fnv( "visuals_skeleton_enemy" ), clr_t( 255, 255, 255 ) }; + con_var< clr_t > skeleton_friendly{ &holder_, fnv( "visuals_skeleton_friendly" ), clr_t( 255, 255, 255 ) }; + con_var< int > bullet_tracers{ &holder_, fnv( "visuals_bullet_tracers" ), 0 }; + con_var< int > sound_range{ &holder_, fnv( "visuals_sound_range" ), 360 }; + con_var< int > key{ &holder_, fnv( "visuals_key" ), 0 }; + con_var< bool > hitmarkers{ &holder_, fnv( "visuals_hitmarkers" ), false }; + + + //world + con_var< bool > world_modulate{ &holder_, fnv( "visuals_world_modulate" ), false }; + con_var< bool > night_mode{ &holder_, fnv( "visuals_night_mode" ), false }; + con_var< bool > transparent_props{ &holder_, fnv( "visuals_transparent_props" ), false }; + con_var< int > projectile_esp{ &holder_, fnv( "visuals_projectile_esp" ), 0 }; //projectile_esp + con_var< int > building_esp{ &holder_, fnv( "visuals_building_esp" ), 0 };//building_esp + con_var< bool > building_owner{ &holder_, fnv( "visuals_building_owner" ), false }; //building_owner + con_var< clr_t > projectile_esp_clr{ &holder_, fnv( "visuals_projectile_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + con_var< clr_t > building_esp_clr{ &holder_, fnv( "visuals_building_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; + con_var< bool > fullbright{ &holder_, fnv( "visuals_fullbright" ), false }; + con_var< bool > objective_info{ &holder_, fnv( "visuals_objective_info" ), false }; //objective_info + + //local + con_var< bool > draw_spread{ &holder_, fnv( "misc_draw_spread" ), false }; + con_var< bool > grenade_prediction{ &holder_, fnv( "visuals_grenade_prediction" ), false }; + con_var< bool > spec_list{ &holder_, fnv( "visuals_spec_list" ), false }; + + bool active = true; + } visuals; + + struct { + con_var< bool > watermark{ &holder_, fnv( "misc_watermark" ), false }; + con_var< bool > bunny_hop{ &holder_, fnv( "misc_bhop" ), false }; + con_var< bool > auto_strafe{ &holder_, fnv( "misc_autostrafe" ), false }; + con_var< int > viewmodel_fov{ &holder_, fnv( "misc_viewmodel_fov" ), 0 }; + con_var< int > fov_changer{ &holder_, fnv( "fov_changer" ), 90 }; + con_var< bool > thirdperson{ &holder_, fnv( "misc_thirdperson" ), false }; + con_var< int > thirdperson_key{ &holder_, fnv( "misc_tp_key" ), 0 }; + + con_var< bool > no_recoil{ &holder_, fnv( "misc_no_recoil" ), false }; + con_var< bool > no_sound{ &holder_, fnv( "misc_no_sound" ), false }; + con_var< bool > no_scope{ &holder_, fnv( "misc_no_scope" ), false }; + con_var< bool > transparent_vm{ &holder_, fnv( "misc_transparent_vm" ), false }; + con_var< bool > hide_from_obs{ &holder_, fnv( "misc_hide_from_obs" ), false }; + con_var< bool > disable_post_process{ &holder_, fnv( "misc_disable_post_process" ), false }; + + bool recorder_enable = false; + } misc; + + struct { + con_var< uint8_t > menu_color_1r{ &holder_, fnv( "menu_color_1r" ), 231 }; + con_var< uint8_t > menu_color_1g{ &holder_, fnv( "menu_color_1g" ), 105 }; + con_var< uint8_t > menu_color_1b{ &holder_, fnv( "menu_color_1b" ), 105 }; + + con_var< uint8_t > menu_color_2r{ &holder_, fnv( "menu_color_2r" ), 0xf4 }; + con_var< uint8_t > menu_color_2g{ &holder_, fnv( "menu_color_2g" ), 0x7c }; + con_var< uint8_t > menu_color_2b{ &holder_, fnv( "menu_color_2b" ), 0xa8 }; + + bool auto_class_settings = false; + bool anti_untrusted = true; + bool open = false; + bool logs_enable = false; + int cur_setting = 0; + } menu; + }; +} + +extern data::c_settings g_settings; \ No newline at end of file diff --git a/cheat/tf2/shut_down.cpp b/cheat/tf2/shut_down.cpp new file mode 100644 index 0000000..149fbf6 --- /dev/null +++ b/cheat/tf2/shut_down.cpp @@ -0,0 +1,16 @@ +#include "hooks.h" +#include "chams.h" +#include "base_cheat.h" + +void __fastcall hooks::shut_down( void* ecx_, void* edx_ ) { + static auto original_fn = cl.m_chl->get_old_function< decltype( &shut_down ) >( 3 ); + + cl.m_engine( )->ClientCmd_Unrestricted( xors( "host_writeconfig" ) ); + //fuck you + abort( ); + + //how about fuck you instead dumb fucking tentacle hentai lookin ass mofo + + //g_cheat.chams.m_materials.destroy_materials( ); + return original_fn( ecx_, edx_ ); +} \ No newline at end of file diff --git a/cheat/tf2/simple_settings.cpp b/cheat/tf2/simple_settings.cpp new file mode 100644 index 0000000..9d1d1de --- /dev/null +++ b/cheat/tf2/simple_settings.cpp @@ -0,0 +1,32 @@ +#include "settings.h" + +SettingHolder data::holder_{ "fucking_nerd" }; +data::c_settings g_settings; + +#pragma warning(disable: 4996) + +void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< const uint8_t* >( src ); + + for( size_t i = 0; i < size; i++ ) + sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); + + WritePrivateProfileStringA( path, name, buffer, filename ); +} + +void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ) { + auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); + auto data = reinterpret_cast< uint8_t* >( dest ); + + GetPrivateProfileStringA( path, name, "", buffer, size * 2 + 1, filename ); + + if( *buffer == 0 ) + return; + + for( size_t i = 0; i < size; i++ ) { + unsigned temp; + sscanf( &buffer[ 2 * i ], "%02X", &temp ); + data[ i ] = temp; + } +} \ No newline at end of file diff --git a/cheat/tf2/simple_settings.h b/cheat/tf2/simple_settings.h new file mode 100644 index 0000000..db9b814 --- /dev/null +++ b/cheat/tf2/simple_settings.h @@ -0,0 +1,204 @@ +#pragma once +#include +#include +#include +#include + +#include "util.hpp" +#include "fnv.hpp" + +//nama stuff +extern void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ); +extern void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ); + +class ISettingNode { +public: + virtual ~ISettingNode( ) = default; + + virtual void load( const char* path, const char* file ) = 0; + virtual void save( const char* path, const char* file ) const = 0; + virtual void register_( ISettingNode* node_ptr ) = 0; + virtual bool has_nodes( ) { return false; } + virtual hash_t get_hash( ) { return 0; } +}; + +class SettingHolder : public ISettingNode { +public: + __forceinline SettingHolder( const char* name ) : name_( name ) {} + __forceinline SettingHolder( SettingHolder* holder_ptr, const char* name ) : name_( name ) { holder_ptr->register_( this ); } + + void register_( ISettingNode* node_ptr ) override { + setting_nodes_.push_back( node_ptr ); + } + + void load( const char* path, const char* file ) override { + char full_path[ 64 ]; + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_ ); + for( auto x : setting_nodes_ ) + x->load( full_path, file ); + } + + void save( const char* path, const char* file ) const override { + char full_path[ 64 ]; + strcpy_s( full_path, path ); + strcat_s( full_path, "_" ); + strcat_s( full_path, name_ ); + for( auto x : setting_nodes_ ) + x->save( full_path, file ); + } + + auto& get_nodes( ) { + return setting_nodes_; + } + + virtual bool has_nodes( ) { + return true; + } + +private: + const char* name_; + bool has_nodes_; + std::vector setting_nodes_; +}; + +class ISetting : public ISettingNode { + void register_( ISettingNode* node_ptr ) override {} +public: + virtual void set( float value ) = 0; + virtual void set( int value ) = 0; + virtual void set( ulong_t value ) = 0; + virtual std::string get_string( ) = 0; + virtual hash_t get_hash( ) = 0; + virtual std::string get_data_string( ) = 0; + virtual void load_from_string( const std::string& ) = 0; +}; + +template < size_t L > +class SettingString : ISetting { +public: + __forceinline SettingString( SettingHolder* holder_ptr, hash_t hash ) : + m_name( name ), m_value( "" ) { + holder_ptr->register_( this ); + }; + + void load( const char* path, const char* file ) override { + GetPrivateProfileStringA( path, std::to_string( m_name ).c_str( ), "", m_value, L, file ); + } + + void save( const char* path, const char* file ) const override { + WritePrivateProfileStringA( path, std::to_string( m_name ).c_str( ), m_value, file ); + } + + char* get( ) { + return m_value; + } + +private: + char m_value[ L ]; + hash_t m_name; +}; + +template < typename T > +class con_var : public ISetting { +public: + __forceinline con_var( SettingHolder* holder_ptr, hash_t name ) : + name_( name ), + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + __forceinline con_var( SettingHolder* holder_ptr, hash_t name, const T& rhs ) : + value_( rhs ), + name_( name ), + is_float_( std::is_floating_point_v< T > ), + is_integral_( std::is_integral_v< T > ) { + holder_ptr->register_( this ); + } + + void load( const char* path, const char* file ) override { simple_load( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } + + void save( const char* path, const char* file ) const override { simple_save( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } + + __forceinline operator T&( ) { return value_; } + __forceinline T* operator &( ) { return &value_; } + + __forceinline T& operator ()( ) { return value_; } + + virtual std::string get_string( ) { + if constexpr( std::is_arithmetic_v< T > ) { + return std::to_string( value_ ); + } + else { + return util::to_hex_str( *( ulong_t* )( &value_ ) ); + } + } + + virtual void set( float value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + } + + virtual void set( int value ) { + if constexpr( std::is_arithmetic_v< T > ) { + value_ = ( T )( value ); + } + else { + value_ = *( T* )( &value ); + } + } + + virtual void set( ulong_t value ) { + if constexpr( sizeof( T ) == sizeof( ulong_t ) ) { + *( ulong_t* )( &value_ ) = value; + return; + } + + memcpy( &value_, &value, sizeof( value_ ) ); + } + + virtual hash_t get_hash( ) { + return name_; + } + + __forceinline bool is_floating_point( ) { + return is_float_; + } + + __forceinline bool is_integral( ) { + return is_integral_; + } + + virtual std::string get_data_string( ) override { + auto buffer = reinterpret_cast< char* >( _alloca( sizeof( T ) * 2 + 1 ) ); + auto data = reinterpret_cast< const uint8_t* >( &value_ ); + + for( size_t i = 0; i < sizeof( T ); i++ ) + sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); + + return buffer; + } + + virtual void load_from_string( const std::string& str ) override { + auto data = reinterpret_cast< uint8_t* >( &value_ ); + auto buffer = str.data( ); + + if( *buffer == 0 ) + return; + + for( size_t i = 0; i < sizeof( T ); i++ ) { + unsigned temp; + sscanf( &buffer[ 2 * i ], "%02X", &temp ); + data[ i ] = temp; + } + } + + +private: + hash_t name_; + bool is_float_; + bool is_integral_; + T value_; +}; \ No newline at end of file diff --git a/cheat/tf2/strings.hpp b/cheat/tf2/strings.hpp new file mode 100644 index 0000000..dfdeb8b --- /dev/null +++ b/cheat/tf2/strings.hpp @@ -0,0 +1,162 @@ +//-------------------------------------------------------------------------------- +//-- XorCompileTime.hpp +// +// Author: frk +// Date: 12.12.2015 +// +//-------------------------------------------------------------------------------- + +#pragma once +#include +#include +#include + +#define BEGIN_NAMESPACE( x ) namespace x { +#define END_NAMESPACE } + +BEGIN_NAMESPACE( strenc ) + +constexpr auto time = __TIME__; +constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; + +// 1988, Stephen Park and Keith Miller +// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" +// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: +// with 32-bit math and without division + +template < int N > +struct RandomGenerator { +private: + static constexpr unsigned a = 16807; // 7^5 + static constexpr unsigned m = 2147483647; // 2^31 - 1 + + static constexpr unsigned s = RandomGenerator< N - 1 >::value; + static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 + static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 + static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits + static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi + static constexpr unsigned lo3 = lo2 + hi; + +public: + static constexpr unsigned max = m; + static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; +}; + +template <> +struct RandomGenerator< 0 > { + static constexpr unsigned value = seed; +}; + +template < int N, int M > +struct RandomInt { + static constexpr auto value = RandomGenerator< N + 1 >::value % M; +}; + +template < int N > +struct RandomChar { + static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); +}; + +template < size_t N, int K > +struct XorString { +private: + const char _key; + std::array< char, N + 1 > _encrypted; + bool decrypted = false; + + constexpr char enc( char c ) const { + return c ^ _key; + } + + char dec( char c ) const { + return c ^ _key; + } + +public: + template < size_t... Is > + constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { + } + + __forceinline const char* decrypt( void ) { + if( !decrypted ) { + for( size_t i = 0; i < N; ++i ) { + _encrypted[ i ] = dec( _encrypted[ i ] ); + } + _encrypted[ N ] = '\0'; + decrypted = true; + } + printf( "N: %u K: %d str: %s address: %08x\n", N, K, _encrypted.data( ), _encrypted.data( ) ); + + return _encrypted.data( ); + } +}; + +//-------------------------------------------------------------------------------- +//-- Note: XorStr will __NOT__ work directly with functions like printf. +// To work with them you need a wrapper function that takes a const char* +// as parameter and passes it to printf and alike. +// +// The Microsoft Compiler/Linker is not working correctly with variadic +// templates! +// +// Use the functions below or use std::cout (and similar)! +//-------------------------------------------------------------------------------- + +static auto w_printf = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_printf_s = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf( buf, fmt, args ); + va_end( args ); +}; + +static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf_s( buf, buf_size, fmt, args ); + va_end( args ); +}; + +//for compatibility with debug mode +struct debug_ret { +private: + const char* ret; + +public: + debug_ret( const char* str ) : ret( str ) { }; + + auto decrypt( ) { + return ret; + } +}; + +constexpr size_t strlen_ct( const char* const str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; +} + +#if 0 +#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) +#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) +#else +#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) +#define xors( s ) ( s ) +#endif + +END_NAMESPACE \ No newline at end of file diff --git a/cheat/tf2/test_cso2.vcxproj b/cheat/tf2/test_cso2.vcxproj new file mode 100644 index 0000000..ec2ff5b --- /dev/null +++ b/cheat/tf2/test_cso2.vcxproj @@ -0,0 +1,377 @@ + + + + + Debug + Win32 + + + pHit + Win32 + + + pHit + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {DD486C1B-C911-42B8-AB24-A9102A23DC02} + Win32Proj + test_cso2 + 10.0.17763.0 + tf2 + + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + false + v141 + true + MultiByte + + + DynamicLibrary + true + v141 + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + DynamicLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\bin\ + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + true + + + false + $(SolutionDir)\bin\$(Configuration)\ + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + false + $(SolutionDir)\bin\$(Configuration)\ + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + false + + + false + + + + + + Level2 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + false + /Zc:threadSafeInit- %(AdditionalOptions) /std:c++latest + + + Windows + true + + + + + + + Level3 + Disabled + _DEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) + /Zc:threadSafeInit- /std:c++latest %(AdditionalOptions) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) + C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 + /Zc:threadSafeInit- %(AdditionalOptions) /std:c++latest + AnySuitable + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) + C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 + /Zc:threadSafeInit- %(AdditionalOptions) /std:c++latest + AnySuitable + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) + C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) + C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cheat/tf2/test_cso2.vcxproj.filters b/cheat/tf2/test_cso2.vcxproj.filters new file mode 100644 index 0000000..d9d322d --- /dev/null +++ b/cheat/tf2/test_cso2.vcxproj.filters @@ -0,0 +1,428 @@ + + + + + + + features + + + sdk + + + data + + + util + + + features + + + context + + + hooks + + + hooks + + + util + + + sdk + + + hooks + + + hooks + + + util + + + sdk + + + features + + + hooks + + + util + + + util + + + util + + + hooks + + + + util + + + util + + + data + + + hooks + + + sdk + + + features + + + features + + + features + + + features + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + hooks + + + features + + + features + + + util + + + hooks\hookers + + + features + + + + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + data + + + data + + + data + + + features + + + data + + + data + + + util + + + features + + + sdk + + + sdk + + + sdk + + + features + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + sdk + + + protection + + + context + + + util + + + hooks + + + util + + + sdk + + + sdk + + + sdk + + + util + + + sdk + + + sdk + + + sdk + + + features + + + sdk + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + menu + + + util + + + util + + + util + + + util + + + util + + + + + protection + + + util + + + + + util + + + sdk + + + sdk + + + util + + + hooks\hookers + + + sdk + + + sdk + + + sdk + + + util + + + sdk + + + features + + + features + + + features + + + features + + + hooks\hookers + + + + + {3662005c-363b-4165-98d1-4cd08efa5aec} + + + {9b96d956-b922-4bc1-a7fd-448a79007f56} + + + {971e8665-630e-40f6-a426-a9c59476dd28} + + + {7abe95b2-6694-4252-9044-b0a3b6ca500d} + + + {280b6489-8704-41f7-98d1-76e4510e59b1} + + + {45735c33-3420-447c-9257-46d489466c79} + + + {8f34dc36-01d7-4458-a53a-f3698e843b94} + + + {bf4d8bec-9f02-4e3b-99bd-a328befb5cd3} + + + {2c764ae7-bdc8-4a36-b752-8ac395c2c006} + + + \ No newline at end of file diff --git a/cheat/tf2/ui.h b/cheat/tf2/ui.h new file mode 100644 index 0000000..bafb2ce --- /dev/null +++ b/cheat/tf2/ui.h @@ -0,0 +1,374 @@ +#pragma once +#include "ui_base_item.h" +#include "ui_menu.h" +#include "ui_form.h" +#include "ui_render.h" +#include "ui_checkbox.h" +#include "ui_tab_manager.h" +#include "ui_slider.h" +#include "ui_dropdown.h" +#include "ui_key_picker.h" +#include "ui_button.h" +#include "ui_color_picker.h" +#include "ui_label.h" +//#include "ui_itemlist.h" +//#include "ui_itemlist_def.h" + +#include "settings.h" +#include "base_cheat.h" + +namespace ui +{ + int current_category = 0; + + static std::string date_str = __DATE__; + auto menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "quebot" ), + __DATE__ ); + + static void render( ) { + static bool was_setup = false; + if( !was_setup ) { + std::transform( date_str.begin( ), date_str.end( ), date_str.begin( ), + [ ]( char c ) { return ::tolower( c ); } + ); + + menu.reset( ); + menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "moneybot - tf2" ), + date_str.c_str( ) ); + auto tab_sheet = std::make_shared< ui::c_tab_manager >( ); + + //todo: replace with icons? + auto tab_legit = std::make_shared< ui::c_tab_sheet >( xors( "legit" ), &icons::sprite_legit ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_main = std::make_shared< ui::c_tab_sheet >( xors( "main" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.enabled ) ); + auto activation_dropdown = std::make_shared< ui::c_dropdown< > >( + 0, 0, 120, xors( "activation type" ), + &g_settings.legit.activation_type, + &ui::dropdowns::activation_types_aimbot ); + activation_dropdown->add_item( std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.key ) )->set_cond( + [ ]( ) { return g_settings.legit.activation_type == 1; } ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.legit.friendlies ) ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "aim assist" ), &g_settings.legit.assist ) ); + + main_form->add_item( activation_dropdown ); + } + + auto smooth_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "smoothing" ) ); { + smooth_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dynamic smoothing" ), &g_settings.legit.dynamic_smoothing ) ); + smooth_form->add_item( std::make_shared< ui::c_slider< size_t > >( 0, 0, 120, 2, 28, xors( "sample size" ), &g_settings.legit.sample_size ) ); + smooth_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.1f, 2.0f, xors( "multiplier" ), &g_settings.legit.smooth_factor ) ); + } + + auto backtracking_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "backtracking" ) ); { + backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.backtracking ) ); + backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "target" ), &g_settings.legit.backtracking_target ) ); + auto visualize_checkbox = backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "visualize" ), &g_settings.legit.backtracking_visualize ) ); + visualize_checkbox->add_item( std::make_shared< ui::c_color_picker >( 175, 2, 15, &g_settings.legit.backtracking_col ) ); + visualize_checkbox->set_cond( [ ] { return !g_settings.misc.hide_from_obs( ); } ); + + backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 50.f, xors( "max fov" ), &g_settings.legit.backtracking_fov ) ); + backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "max time" ), &g_settings.legit.backtracking_time, "s" ) ); + } + + auto triggerbot_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "triggerbot" ) ); { + triggerbot_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.triggerbot ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.trigger_key ) ); + + triggerbot_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "trigger delay" ), &g_settings.legit.trigger_delay, "s" ) + )->set_cond( [ ] { return g_settings.legit.triggerbot( ); } ); + } + + left_column->add_item( main_form ); + left_column->add_item( smooth_form ); + + right_column->add_item( backtracking_form ); + right_column->add_item( triggerbot_form ); + + subtab_main->add_item( left_column ); + subtab_main->add_item( right_column ); + } + + //make a subtab for each weapon type? + auto subtab_weapons = std::make_shared< ui::c_tab_sheet >( xors( "weapons" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto general_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "general" ) ); { + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.primary.m_fov ) ); + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.primary.m_speed ) ); + general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bone - dropdown" ), &g_settings.legit.primary.m_bone, &ui::dropdowns::aimbot_bone ) ); + general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.primary.m_assist_strength ) ); + } + + auto snipers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "snipers" ) ); { + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.melee.m_fov ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.melee.m_speed ) ); + snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bone - dropdown" ), &g_settings.legit.melee.m_bone, &ui::dropdowns::aimbot_bone ) ); + snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.melee.m_assist_strength ) ); + } + + auto rifles_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "rifles" ) ); { + rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.secondary.m_fov ) ); + rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.secondary.m_speed ) ); + rifles_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bone - dropdown" ), &g_settings.legit.secondary.m_bone, &ui::dropdowns::aimbot_bone ) ); + rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.secondary.m_assist_strength ) ); + } + + + + left_column->add_item( general_form ); + left_column->add_item( snipers_form ); + right_column->add_item( rifles_form ); + + subtab_weapons->add_item( left_column ); + subtab_weapons->add_item( right_column ); + } + + subtab_sheet->add_item( subtab_weapons ); + subtab_sheet->add_item( subtab_main ); + + tab_legit->add_item( subtab_sheet ); + } + + + auto tab_rage = std::make_shared< ui::c_tab_sheet >( xors( "rage" ), &icons::sprite_rage ); { + + + + } + + + auto tab_visuals = std::make_shared< ui::c_tab_sheet >( xors( "visuals" ), &icons::sprite_visuals ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_players = std::make_shared< ui::c_tab_sheet >( xors( "players" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { + main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "activation type" ), &g_settings.visuals.activation_type, &dropdowns::activation_type_visuals ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.visuals.key ) )->set_cond( [ ]( ) { return g_settings.visuals.activation_type > 1; } ); + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.friendlies ) ); + } + + auto player_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "players" ) ); { + auto box_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "box" ), &g_settings.visuals.box ) ); + box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.box_enemy( ) ) ); + box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.visuals.box_friendly( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.friendlies; } ); + + auto glow_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "glow - test" ), &g_settings.visuals.glow ) ); + glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.glow_enemy ) ); + glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.glow_friendly ) )->set_cond( + [ ]( ) { return g_settings.visuals.friendlies || g_settings.visuals.chams.friendlies; } ); + glow_checkbox->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); + + auto skeleton_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "skeleton" ), &g_settings.visuals.skeleton ) ); + skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.skeleton_enemy ) ); + skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.skeleton_friendly ) )->set_cond( + [ ]( ) { return g_settings.visuals.friendlies; } ); + + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant" ), &g_settings.visuals.dormant ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "health" ), &g_settings.visuals.health ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "name" ), &g_settings.visuals.name ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "weapon" ), &g_settings.visuals.weapon ) ); + + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ammo" ), &g_settings.visuals.ammo ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "conditions - close" ), &g_settings.visuals.conditions ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "class" ), &g_settings.visuals.player_class ) ); + //player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "resolver indicator - when i add hvh" ), &g_settings.visuals.resolver_indicator ) ); + player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "sound" ), &g_settings.visuals.sound ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); + player_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 220, 500, &g_settings.visuals.sound_range ) )->set_cond( [ ]( ) { return g_settings.visuals.sound && !g_settings.misc.hide_from_obs; } ); + } + + auto hud_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "hud" ) ); { + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "out of pov - weird angles" ), &g_settings.visuals.out_of_pov ) ); + hud_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.25f, 1.f, &g_settings.visuals.out_of_pov_radius ) + )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); + + hud_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 15, 40, &g_settings.visuals.out_of_pov_size, xors( "px" ) ) + )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); + //hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hitmarkers - not done" ), &g_settings.visuals.hitmarkers ) ); no need + hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spectator list" ), &g_settings.visuals.spec_list ) ); + } + + auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ) ); { + //other_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bullet tracers - not done" ), &g_settings.visuals.bullet_tracers, &dropdowns::tracer_type ) ); no bullet_impact event or any equivalent + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "floating ragdolls - hopefully" ), &g_settings.visuals.floating_ragdolls ) ); + } + + auto chams_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "chams - crash" ), 170 ); { + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.visuals.chams.enabled( ) ) ); + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "through walls" ), &g_settings.visuals.chams.ignore_z( ) ) ); + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.chams.friendlies( ) ) ); + chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flat" ), &g_settings.visuals.chams.flat( ) ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); + chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "reflectivity" ), &g_settings.visuals.chams.reflectivity ) + )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat && !g_settings.misc.hide_from_obs; } ); + + chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "shine" ), &g_settings.visuals.chams.shine ) + )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat && !g_settings.misc.hide_from_obs; } ); + + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies visible" ), &g_settings.visuals.chams.color_visible_friendly( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.chams.friendlies( ); } ); + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies hidden" ), &g_settings.visuals.chams.color_hidden_friendly( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.chams.friendlies( ) && g_settings.visuals.chams.ignore_z( ); } ); + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies visible" ), &g_settings.visuals.chams.color_visible_enemy( ) ) ); + chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies hidden" ), &g_settings.visuals.chams.color_hidden_enemy( ) ) )->set_cond( + [ ]( ) { return g_settings.visuals.chams.ignore_z( ); } ); + } + + chams_form->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); + + left_column->add_item( main_form ); + left_column->add_item( player_form ); + + right_column->add_item( hud_form ); + right_column->add_item( other_form ); + right_column->add_item( chams_form ); + + subtab_players->add_item( left_column ); + subtab_players->add_item( right_column ); + } + + auto subtab_other = std::make_shared< ui::c_tab_sheet >( xors( "other" ) ); { + auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); + auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); + + auto world_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "world" ) ); { + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "world modulate - not done" ), &g_settings.visuals.world_modulate ) + )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "night mode - not done" ), &g_settings.visuals.night_mode ) + )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent props - maybe" ), &g_settings.visuals.transparent_props ) //maybe? + )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); + + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fullbright - not done" ), &g_settings.visuals.fullbright ) ); + world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "projectiles" ), &g_settings.visuals.projectile_esp, &dropdowns::world_esp_type ) + )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.building_esp_clr( ) ) ); + + world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "buildings" ), &g_settings.visuals.building_esp, &dropdowns::world_esp_type ) + )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.building_esp_clr( ) ) ); + + world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "building owner - not done" ), &g_settings.visuals.building_owner ) + )->set_cond( [ ]( ) { return g_settings.visuals.building_esp == 1 || g_settings.visuals.building_esp == 3; } ); + } + + //auto local_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "local player" ) ); { + // local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "projectile prediction - hopefully" ), &g_settings.visuals.grenade_prediction( ) ) ); + //} + + auto view_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "view" ) ); { + view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "watermark" ), &g_settings.misc.watermark ) ); + view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thirdperson - crash" ), &g_settings.misc.thirdperson( ) ) )->add_item( + std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.thirdperson_key ) + ); + view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 40, xors( "viewmodel fov" ), &g_settings.misc.viewmodel_fov( ) ) ); + view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 90, 130, xors( "view fov - broken" ), &g_settings.misc.fov_changer( ) ) ); + } + + auto removals_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "removals" ) ); { + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no scope - not done" ), &g_settings.misc.no_scope ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent viewmodel - hopefully" ), &g_settings.misc.transparent_vm ) ); + removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no post processing - not done" ), &g_settings.misc.disable_post_process ) ); + } + + left_column->add_item( world_form ); + //left_column->add_item( local_form ); + + right_column->add_item( view_form ); + right_column->add_item( removals_form ); + + subtab_other->add_item( left_column ); + subtab_other->add_item( right_column ); + } + + subtab_sheet->add_item( subtab_other ); + subtab_sheet->add_item( subtab_players ); + + tab_visuals->add_item( subtab_sheet ); + } + + + auto tab_misc = std::make_shared< ui::c_tab_sheet >( xors( "miscellaneous" ), &icons::sprite_misc ); { + auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); + + auto subtab_general = std::make_shared< ui::c_tab_sheet >( xors( "general" ) ); { + auto column_left = subtab_general->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 0 ) ); + auto column_right = subtab_general->add_item( std::make_shared< ui::base_item >( 220, -5, 0, 0 ) ); + + auto movement_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "movement" ) ); { + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto strafe" ), &g_settings.misc.auto_strafe ) ); + movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bhop" ), &g_settings.misc.bunny_hop( ) ) ); + } + + auto identity_form = std::make_shared< ui::c_form >( 0, 1, 215, 0, xors( "timeshift - not done" ) ); { + //enabled (key) + //on attack + //value + } + + + auto helpers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "helpers - not done" ) ); { + //no push + //auto backstab + // + } + + auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ) ); { + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "remove gun sounds" ), &g_settings.misc.no_sound ) ); + other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hide from obs" ), &g_settings.misc.hide_from_obs ) ); + //other_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "unlock hidden cvars" ), [ ]( ) { g_cheat.extra.unlock_hidden_cvars( ); } ) ); + } + + column_left->add_item( movement_form ); + column_right->add_item( identity_form ); + column_right->add_item( helpers_form ); + column_left->add_item( other_form ); + + } + subtab_sheet->add_item( subtab_general ); + + tab_misc->add_item( subtab_sheet ); + } + + + auto tab_config = std::make_shared< ui::c_tab_sheet >( xors( "config" ), &icons::sprite_config ); { + auto cfg_form = std::make_shared< ui::c_form >( 0, 10, 200, 93, xors( "config" ) ); + cfg_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 180, xors( "setting" ), &g_settings.menu.cur_setting, &dropdowns::configs ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 0, 0, 85, 20, xors( "save" ), [ ]( ) { g_settings.save( ); } ) ); + cfg_form->add_item( std::make_shared< ui::c_button >( 95, -25, 85, 20, xors( "load" ), [ ]( ) { g_settings.load( ); } ) ); + //cfg_form->add_item( std::make_shared< ui::c_button >( 0, -25, 85, 20, xors( "to clipboard" ), [ ]( ) { g_settings.copy_to_clipboard( ); } ) ); + //cfg_form->add_item( std::make_shared< ui::c_button >( 95, -50, 85, 20, xors( "from clipboard" ), [ ]( ) { g_settings.load_from_clipboard( ); } ) ); + cfg_form->add_item( std::make_shared< ui::c_checkbox >( 0, -25, xors( "anti-untrusted" ), &g_settings.menu.anti_untrusted ) ); + + tab_config->add_item( cfg_form ); + } + + tab_sheet->add_item( tab_config ); + tab_sheet->add_item( tab_misc ); + tab_sheet->add_item( tab_visuals ); + tab_sheet->add_item( tab_rage ); + tab_sheet->add_item( tab_legit ); + + menu->add_item( tab_sheet ); + + was_setup = true; + } + + render_item( menu.get( ) ); + + //reset the menu if home is pressed for debugging purposes + if( g_input.is_key_pressed( KEYS_END ) ) { + menu.reset( ); + menu = std::make_shared< c_menu >( 10, 10, 580, 470, xors( "golden cheat" ) ); + was_setup = false; + } + + } +} \ No newline at end of file diff --git a/cheat/tf2/ui_base_item.h b/cheat/tf2/ui_base_item.h new file mode 100644 index 0000000..68c2198 --- /dev/null +++ b/cheat/tf2/ui_base_item.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include + +#include "ui_draw.h" + +namespace ui +{ + //the offset between each item + constexpr int ITEM_OFFSET = 5; + + class base_item : public std::enable_shared_from_this< base_item > { + public: + base_item( ) { } + base_item( int x, int y, int w, int h, const char* name = nullptr ) : + m_x( x ), m_y( y ), m_width( w ), m_height( h ) { + if( name ) { + strcpy( m_text, name ); + } + } + + virtual void render( ) { }; + virtual bool is_hovered( ) { return false; } + virtual bool is_form( ) const { return false; } + + virtual void reset( ) { + m_y_offset = 0; + } + + virtual int get_total_height( ) const { + return m_height; + } + + void set_y_offset( int offset ) { + m_y_offset = offset; + } + + int get_y_offset( ) const { + return m_y_offset; + } + + auto add_item( std::shared_ptr< base_item > item ) { + item.get( )->m_parent = shared_from_this( ); + m_items.emplace( m_items.begin( ), item ); + + return item; + } + + auto& get_items( ) { return m_items; } + auto get_parent( ) { return m_parent; } + + virtual int x( ) const { return m_x; } + virtual int y( ) const { return m_y; } + virtual int w( ) const { return m_width; } + virtual int h( ) const { return m_height; } + + void set_x( int x ) { m_x = x; } + void set_y( int y ) { m_y = y; } + + void set_width( int w ) { m_width = w; } + void set_height( int h ) { m_height = h; } + + bool get_visible( ) const { + if( m_cond && !m_cond( ) ) { + return false; + } + + return m_visible; + } + + void set_cond( std::function< bool( ) > func ) { + m_cond = func; + } + + void set_visible( bool vis ) { m_visible = vis; } + void set_text( const char* text ) { + strcpy( m_text, text ); + } + auto get_text( ) const { + return m_text; + } + + std::shared_ptr< base_item > find_item( const char* name ) { + if( !m_items.empty( ) ) { + for( auto& it : m_items ) { + if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { + return it; + } + + auto it_find = it->find_item( name ); + if( it_find != it ) return it_find; + } + } + + return shared_from_this( ); + } + + auto get_top_parent( ) { + for( auto parent = m_parent; ; + parent = parent->get_parent( ) ) { + if( !parent->get_parent( ) ) { + return parent; + } + } + + return shared_from_this( ); + } + + int get_relative_x( ) { + int x = m_x; + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + x += parent->x( ); + } + + return x; + } + + int get_relative_y( ) { + int y = m_y + get_y_offset( ); + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + y += parent->y( ) + parent->get_y_offset( ); + } + + return y; + } + + void set_disabled( bool disabled ) { + m_disabled = disabled; + + for( auto& it : m_items ) { + it->set_disabled( disabled ); + } + } + + void set_disabled_callbacks( bool disabled ) { + auto top = get_top_parent( ); + + top->set_disabled( disabled ); + + m_disabled = false; + } + + protected: + int m_x{ }; + int m_y{ }; + + int m_width{ }; + int m_height{ }; + + //current y position for rendering + int m_y_offset{ }; + + bool m_visible = true; + bool m_disabled = false; + char m_text[ 256 ]{ }; + + std::shared_ptr< base_item > m_parent; + std::vector< std::shared_ptr< base_item > > m_items; + std::function< bool( ) > m_cond; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_button.h b/cheat/tf2/ui_button.h new file mode 100644 index 0000000..022fc67 --- /dev/null +++ b/cheat/tf2/ui_button.h @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "ui_base_item.h" + +namespace ui +{ + class c_button : public base_item { + public: + c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : + base_item( x, y, w, h, name ), m_fn( fn ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); + if ( !m_mouse_held ) { + m_fn( ); + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); + } + + protected: + std::function< void( ) > m_fn; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_checkbox.h b/cheat/tf2/ui_checkbox.h new file mode 100644 index 0000000..50cad1c --- /dev/null +++ b/cheat/tf2/ui_checkbox.h @@ -0,0 +1,68 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_checkbox : public base_item { + public: + c_checkbox( int x, int y, const char* txt, bool* setting ) : + base_item( x, y, 16, 16, txt ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int rel_x = get_relative_x( ); + int rel_y = get_relative_y( ); + + return mouse_x >= rel_x && mouse_x <= rel_x + m_width + && mouse_y >= rel_y && mouse_y <= rel_y + m_height; + } + + inline void render_checkbox( const int& x, const int& y ) { + clr_t col = ui_get_bg_col( ); + if ( is_hovered( ) ) { + col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; + } + else if ( *m_setting ) { + col = ui_get_accent_col( ); + } + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); + + //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + } + + inline void input( ) { + bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) && mouse_presesed ) { + if ( !m_mouse_held ) { + *m_setting = !*m_setting; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + render_checkbox( x, y ); + input( ); + + + ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); + } + + protected: + bool* m_setting; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_color_picker.h b/cheat/tf2/ui_color_picker.h new file mode 100644 index 0000000..2711d29 --- /dev/null +++ b/cheat/tf2/ui_color_picker.h @@ -0,0 +1,201 @@ +#pragma once + +#include "ui_base_item.h" +#include "d3d.hpp" + +namespace ui +{ + class c_color_picker : public base_item { + static constexpr int BOX_WIDTH = 106; + static constexpr int BOX_HEIGHT = 125; + public: + c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : + base_item( x, y, w, 4, name ), m_setting( setting ), + m_has_text( true ) { } + + c_color_picker( int x, int y, int w, clr_t* setting ) : + base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), + m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + + int cursor_x, cursor_y; + ui_get_cursor_pos( cursor_x, cursor_y ); + + if ( m_has_text ) y += 12; + + if ( !m_active ) { + return cursor_x >= x && cursor_x <= x + m_width + && cursor_y >= y && cursor_y <= y + m_height; + } + + return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 + && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; + } + + virtual int get_total_height( ) const override { + return m_has_text ? ( m_height + 12 ) : m_height; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_active ) { + m_mouse_held = true; + } + + m_active = true; + } + else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_active = false; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + + m_hue = m_setting->hue( ); + if ( m_hue > 1.0f ) { + m_hue -= 359.f; + } + + m_saturation = m_setting->saturation( ); + m_brightness = m_setting->brightness( ) / 255.f; + m_alpha = m_setting->a( ); + } + + void output( ) { + *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); + m_setting->a( ) = m_alpha; + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + if ( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + y += 12; + } + + input( ); + + if ( m_active ) { + RECT old_rect; + g_d3d.get_device( )->GetScissorRect( &old_rect ); + + RECT new_rect{ + x - 1, y - 1, + x + BOX_WIDTH + 22, + y + BOX_HEIGHT + 2 + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + clr_t bg_col( 0, 0, 0, 90 ); + ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); + ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); + + for ( int i{ }; i < 100; i += 3 ) { + for ( int i2{ }; i2 < 100; i2 += 3 ) { + ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, + clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); + } + } + + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held + && mouse_x > x && mouse_x <= x + 100 + && mouse_y > y && mouse_y <= y + 100 ) { + + int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); + int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); + + int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); + int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); + + m_saturation = float( delta_y ) * 0.01f; + m_brightness = float( delta_x ) * 0.01f; + } + + auto is_hue_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 110 && mouse_x < x + 122 + && mouse_y > y && mouse_y < y + 100; + }; + + auto draw_slider_hue = [&]( ) { + for ( int i{ }; i < 100; ++i ) { + auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); + + ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); + } + + ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, + is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + auto is_alpha_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 1 && mouse_x < x + 122 + && mouse_y > y + 110 && mouse_y < y + 124; + }; + + auto draw_slider_alpha = [&]( ) { + for ( int i{ 121 }; i >= 0; --i ) { + auto col = *m_setting; + col.a( ) = ( int )( float( i ) * 255.f / 121.f ); + + ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); + } + + int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); + ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, + is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + draw_slider_hue( ); + if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_y - y, 0, 100 ); + m_hue = float( delta ) * 0.01f; + } + + draw_slider_alpha( ); + if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_x - x, 0, 121 ); + m_alpha = ( int )( float( delta ) * 255.f / 121.f ); + } + + output( ); + + g_d3d.get_device( )->SetScissorRect( &old_rect ); + } + else { + if ( is_hovered( ) ) { + ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); + } + ui_draw_rect( x, y, m_width, m_height, *m_setting ); + } + } + + protected: + clr_t* m_setting = nullptr; + bool m_active = false; + bool m_mouse_held = false; + float m_saturation = 1.0f; + float m_brightness = 1.0f; + float m_hue = 0.f; + uint8_t m_alpha = 255; + bool m_has_text = false; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_draw.h b/cheat/tf2/ui_draw.h new file mode 100644 index 0000000..4686bf0 --- /dev/null +++ b/cheat/tf2/ui_draw.h @@ -0,0 +1,163 @@ +#pragma once +#include "color.hpp" +#include "d3d.hpp" +#include "icons.hpp" +#include "d3d_sprite.hpp" +#include "input_system.hpp" + +namespace ui +{ + extern float get_tf2_frametime( ); + /*__forceinline auto ui_get_background_texture( ) { + static auto buffer = std::make_shared< byte[ 512 ] >( ); + static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); + static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); + static IDirect3DTexture9* texture; + + if ( !texture ) { + for ( int i = 0; i < 512; i += 4 ) { + *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; + } + + D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); + } + + return texture; + }*/ + + static float anim_time{ }; + + __forceinline void set_animtime( float animtime ) { + anim_time = animtime; + } + + __forceinline void setup_sprites( IDirect3DDevice9* device ) { + //fuck msvc + icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); + icons::sprite_visuals.init( device, icons::raw::visuals_raw, icons::visuals_size, 66, 66 ); + icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); + icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); + } + + __forceinline clr_t ui_get_accent_col( ) { + clr_t col_start = { + g_settings.menu.menu_color_1r, + g_settings.menu.menu_color_1g, + g_settings.menu.menu_color_1b + }; + + clr_t col_end = { + g_settings.menu.menu_color_2r, + g_settings.menu.menu_color_2g, + g_settings.menu.menu_color_2b + }; + + clr_t col = clr_t::blend( col_start, col_end, anim_time ); + + return col; + } + + __forceinline clr_t& ui_get_disabled_col( ) { + static clr_t col = clr_t( 61, 61, 61, 255 ); + return col; + } + + __forceinline clr_t& ui_get_bg_col( ) { + static clr_t col = clr_t( 24, 25, 27, 255 ); + return col; + } + + __forceinline clr_t& ui_get_text_col( ) { + static clr_t col = clr_t( 221, 221, 221, 255 ); + return col; + } + + __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, + clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { + + g_d3d.draw_gradient( start, end, x, y, w, h, type ); + } + + __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { + g_d3d.draw_line( color, x, y, x1, y1 ); + } + + __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_filled_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_filled_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { + char buf[ 2048 ]{ }; + va_list list{ }; + + __crt_va_start( list, str ); + vsprintf_s( buf, 2048, str, list ); + __crt_va_end( list ); + + g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, + center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); + } + + __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { + char* buf = ( char* )_alloca( 2048 ); + va_list list{ }; + + __crt_va_start( list, text ); + vsprintf_s( buf, 2048, text, list ); + __crt_va_end( list ); + + w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); + h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); + } + + __forceinline void ui_get_cursor_pos( int& x, int& y ) { + g_input.get_cursor_pos( x, y ); + } + + __forceinline float ui_get_frametime( ) { + return get_tf2_frametime( ); + } + + __forceinline void ui_draw_cursor( ) { + const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); + int x, y; + ui_get_cursor_pos( x, y ); + + + for( int i{ }; i <= 9; ++i ) { + ui_draw_line( x, y, x + i, y + 11, accent ); + } + + for( int i{ }; i <= 7; ++i ) { + ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); + } + + for( int i{ }; i <= 3; ++i ) { + ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); + } + + ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); + ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); + + ui_draw_line( x, y, x, y + 17, black ); + ui_draw_line( x, y + 17, x + 3, y + 14, black ); + ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); + ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); + ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); + ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); + ui_draw_line( x + 11, y + 12, x, y, black ); + } +} \ No newline at end of file diff --git a/cheat/tf2/ui_dropdown.h b/cheat/tf2/ui_dropdown.h new file mode 100644 index 0000000..0c4e990 --- /dev/null +++ b/cheat/tf2/ui_dropdown.h @@ -0,0 +1,217 @@ +#pragma once +#include "ui_dropdown_item.h" + +namespace ui +{ + template < typename t = int > + class c_dropdown : public base_item { + public: + c_dropdown( int x, int y, int w, const char* name, t* setting, + std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : + base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), + m_max_items( max_items ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + inline bool is_any_item_hovered( ) { + if ( m_disabled || !m_active ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + m_height + 12; + int h = m_height * ( std::min< size_t >( + m_dropdown_items->size( ), m_max_items ) ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 13; + } + + void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { + ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); + ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); + } + + void update_value( ) { + for ( auto& it : *m_dropdown_items ) { + if ( it.m_value == *m_setting ) { + m_selected_item = ⁢ + } + } + } + + void draw_items( const int& x, const int& y ) { + auto& items = *m_dropdown_items; + auto it = &items.front( ); + int offset = m_height + 1; + int hovered = 0; + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + auto is_hovered = [ & ] ( int y_offset ) { + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; + }; + + + for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; + i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); + ++i, offset += m_height + 1 + ) { + it = &items.at( i ); + + draw_box( x, y + offset, it->m_name ); + + if ( is_hovered( offset ) ) { + hovered = offset; + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_selected_item = it; + *m_setting = it->m_value; + m_active = false; + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + } + } + + if ( hovered ) { + ui_draw_outlined_rect( x - 1, y - 1 + hovered, + m_width + 1, m_height + 1, ui_get_text_col( ) ); + } + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = !m_active; + } + m_mouse_held = true; + } + else if ( !is_any_item_hovered( ) ) { + m_mouse_held = false; + } + + if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { + m_active = false; + } + + if ( GetTickCount( ) * 0.001f > m_enable_time && m_enable_next_frame ) { + set_disabled_callbacks( false ); + m_enable_next_frame = false; + } + + + active_changed = m_active != active_backup; + //disable input on all items + if ( active_changed ) { + if ( !m_active ) { + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + else { + set_disabled_callbacks( true ); + } + } + + if ( m_selected_item ) { + *m_setting = m_selected_item->m_value; + } + + if ( m_active && m_dropdown_items->size( ) > m_max_items ) { + int scroll_input = g_input.get_scroll_state( ); + + if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max + m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it + + if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) + m_curr_scroll = m_dropdown_items->size( ) - m_max_items; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + bool restore = false; + RECT prev_rect{ }; + + if ( m_active ) { + restore = true; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + RECT new_rect{ + prev_rect.left, + prev_rect.top, + g_d3d.m_width, + g_d3d.m_height, + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_items( x, y + 11 ); + + + //draw scrollbar + size_t total_items = m_dropdown_items->size( ); + if ( total_items > m_max_items ) { + const size_t height = ( m_height + 1 ) * m_max_items; + const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); + + size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); + ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); + } + } + + update_value( ); + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( m_selected_item ) { + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); + } + + if( restore ) { + g_d3d.get_device( )->SetScissorRect( &prev_rect ); + } + } + + protected: + std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; + dropdowns::dropdown_item_t< t >* m_selected_item{ }; + bool m_active = false; + bool m_mouse_held = false; + t* m_setting{ }; + size_t m_max_items{ }; + size_t m_curr_scroll{ }; + float m_enable_time{ }; + int m_enable_next_frame{ }; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_dropdown_item.h b/cheat/tf2/ui_dropdown_item.h new file mode 100644 index 0000000..f77a732 --- /dev/null +++ b/cheat/tf2/ui_dropdown_item.h @@ -0,0 +1,83 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + namespace dropdowns + { + template < typename t = int > + struct dropdown_item_t { + const char* m_name; + t m_value; + }; + + static std::vector< dropdown_item_t< > > activation_types_aimbot = { + { xors( "always" ), 0 }, + { xors( "on key" ), 1 }, + }; + + static std::vector< dropdown_item_t< > > silent_aimbot_types = { + { xors( "none" ), 0 }, + { xors( "client-side" ), 1 }, + { xors( "server-side" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > hitboxes = { + { "head", 0 }, + { "neck", 1 }, + { "pelvis", 3 }, + { "chest", 6 }, + { "thorax", 5 }, + }; + + static std::vector< dropdown_item_t< > > tracer_type = { + { xors( "none" ), 0 }, + { xors( "line" ), 1 }, + { xors( "beam" ), 2 } + }; + + static std::vector< dropdown_item_t< > > world_esp_type = { + { xors( "off" ), 0 }, + { xors( "name" ), 1 }, + { xors( "glow" ), 2 }, + { xors( "both" ), 3 } + }; + + static std::vector< dropdown_item_t< > > weapon_esp_types = { + { xors( "none" ), 0 }, + { xors( "icon" ), 1 }, + { xors( "name" ), 2 }, + }; + + static std::vector< dropdown_item_t< > > activation_type_visuals = { + { xors( "never" ), 0 }, + { xors( "always" ), 1 }, + { xors( "on hold" ), 2 }, + { xors( "toggle" ), 3 }, + }; + + static std::vector< dropdown_item_t< > > aimbot_bone = { + { "head", 0 }, + { "neck", 1 }, + { "pelvis", 3 }, + { "chest", 6 }, + { "thorax", 5 }, + }; + + static std::vector< dropdown_item_t< > > configs = { + { xors( "scout" ), 0 }, + { xors( "soldier" ), 1 }, + { xors( "pyro" ), 2 }, + { xors( "demo" ), 3 }, + { xors( "heavy" ), 4 }, + { xors( "engineer" ), 5 }, + { xors( "medic" ), 6 }, + { xors( "sniper" ), 7 }, + { xors( "spy" ), 8 }, + { xors( "rage 1" ), 9 }, + { xors( "rage 2" ), 10 }, + }; + + } +} \ No newline at end of file diff --git a/cheat/tf2/ui_form.h b/cheat/tf2/ui_form.h new file mode 100644 index 0000000..0791528 --- /dev/null +++ b/cheat/tf2/ui_form.h @@ -0,0 +1,187 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_form : public base_item { + public: + c_form( int x, int y, int w, int h, const char* name, int max_h = 0, bool collapse = false ) : + base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ), m_collapse( collapse ) { }; + + virtual int x( ) const override { + return m_x + 10; + } + + virtual int y( ) const override { + return m_y + m_scroll_offset + 9; + } + + virtual bool is_form( ) const override { + return true; + } + + virtual bool is_hovered( ) override { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ); + int y = get_relative_y( ); + + return mouse_x > x && mouse_x < x + w( ) + && mouse_y > y && mouse_y < y + h( ); + } + + bool is_collapse_hovered( ) { + if( !m_collapse ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ) + m_width - 8; + int y = get_relative_y( ) + 2; + + return mouse_x >= x && mouse_x <= x + 5 + && mouse_y >= y && mouse_y <= y + 7; + } + + bool is_collapsed( ) { + return ( m_collapse && !m_open ); + } + + inline void update_size( ) { + if ( !m_dynamic ) return; + + int total_height{ ITEM_OFFSET * 2 }; + for ( auto& it : m_items ) { + if ( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + if( m_max_height && total_height + item_height > m_max_height ) { + total_height = m_max_height; + break; + } + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + m_height = total_height; + } + + virtual int get_total_height( ) const override { + if( !m_open && m_collapse ) return 18; + return m_height + 5; + } + + int get_total_item_height( ) { + int total_height{ ITEM_OFFSET * 2 }; + for( auto& it : m_items ) { + if( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + return total_height; + } + + void input( ) { + if( m_collapse ) { + bool hovered = is_collapse_hovered( ); + bool clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + if( hovered && clicked ) { + if( !m_was_pressed ) { + m_open ^= 1; + } + m_was_pressed = true; + } + else { + m_was_pressed = false; + } + } + + if( m_max_height && get_total_item_height( ) > m_max_height ) { + if( !m_disabled && is_hovered( ) ) { + auto scroll_state = g_input.get_scroll_state( ); + if( !!scroll_state && m_was_hovered ) { + scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; + } + m_scroll_offset = std::clamp( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ), 0 ); + } + } + else { + m_scroll_offset = 0; + } + } + + virtual void render( ) override { + update_size( ); + input( ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int text_w, text_h; + ui_get_text_size( text_w, text_h, m_text ); + + if( m_collapse ) { + if( !m_open && m_collapse ) { + ui_draw_outlined_rect( x, y, m_width, 14, ui_get_accent_col( ) ); + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "+" ); + return; + } + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); + } + + ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_max_height && get_total_item_height( ) > m_height ) { + const size_t height = get_total_height( ) - 20; + const float delta = ( float )( get_total_item_height( ) - height + 1 ); + const float slider_step = ( ( float )( height ) / delta ); + const float slider_height = slider_step * 13.f; + + size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); + ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); + ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); + } + + if( is_hovered( ) != m_was_hovered ) { + bool backup = m_disabled; + if( !backup ) { + set_disabled( !is_hovered( ) ); + } + m_disabled = backup; + } + + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + if( m_collapse ) { + int button_x = x + m_width - 6; + int button_y = y + 2; + + ui_draw_string( button_x, button_y, true, + is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "-" ); + } + + m_was_hovered = is_hovered( ); + } + + protected: + bool m_dynamic{ }; + bool m_was_hovered{ }; + int m_max_height{ }; + int m_scroll_offset{ }; + bool m_was_pressed{ }; + bool m_collapse{ }; + bool m_open{ true }; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_key_picker.h b/cheat/tf2/ui_key_picker.h new file mode 100644 index 0000000..03aed84 --- /dev/null +++ b/cheat/tf2/ui_key_picker.h @@ -0,0 +1,164 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_key_picker : public base_item { + public: + c_key_picker( int x, int y, int w, const char* name, int* setting ) : + base_item( x, y, w, 16, name ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 12; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), + g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); + } + + protected: + int* m_setting{ }; + bool m_active{ }; + bool m_mouse_held{ }; + }; + + //skEeT PiCkErS + class c_key_picker_small : public base_item { + public: + c_key_picker_small( int x, int y, int* setting ) : + base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } + + virtual int get_total_height( ) const override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int w, h; + ui_get_text_size( w, h, name ); + + return h; + } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + int mouse_x, mouse_y; + int w, h; + + ui_get_text_size( w, h, "[%s]", name ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= x - w && mouse_x <= x + && mouse_y >= y && mouse_y <= y + h; + } + + void input( ) { + + bool active_backup = m_active; + bool active_changed = false; + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int w, h; + ui_get_text_size( w, h, "[%s]", name ); + + input( ); + + ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? + ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); + } + + protected: + int* m_setting; + bool m_active{ }; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_label.h b/cheat/tf2/ui_label.h new file mode 100644 index 0000000..9df46b5 --- /dev/null +++ b/cheat/tf2/ui_label.h @@ -0,0 +1,18 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_label : public base_item { + public: + c_label( int x, int y, const char* text ) : + base_item( x, y, 0, 16, text ) { } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); + } + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_menu.h b/cheat/tf2/ui_menu.h new file mode 100644 index 0000000..aae68a9 --- /dev/null +++ b/cheat/tf2/ui_menu.h @@ -0,0 +1,89 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_menu : public base_item { + public: + c_menu( int start_x, int start_y, int width, + int height, const char* name, const char* right_text = nullptr ) : + base_item( start_x, start_y, width, height, name ), + m_right_text( right_text ) { } + + virtual bool is_hovered( ) override { + if( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= m_x && mouse_x <= m_x + w( ) + && mouse_y >= m_y && mouse_y <= m_y + 19; + } + + virtual int y( ) const override { + return m_y + 19; + } + + inline void input( ) { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if( is_hovered( ) ) { + m_mouse_held = true; + } + + if( !mouse_clicked ) { + m_mouse_held = is_hovered( ); + } + + if( m_mouse_held && !mouse_clicked ) { + m_drag_offset_y = mouse_y - m_y; + m_drag_offset_x = mouse_x - m_x; + } + + if( m_mouse_held && mouse_clicked ) { + m_x = mouse_x - m_drag_offset_x; + m_y = mouse_y - m_drag_offset_y; + } + } + + virtual void render( ) override { + constexpr auto top_height = 19; + + input( ); + + //draw a c00l shadow + ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); + + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); + if( is_hovered( ) ) { + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); + } + ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_right_text ) { + ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); + + int width, height; + ui_get_text_size( width, height, m_right_text ); + + ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); + } + else { + ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); + } + } + + protected: + int m_drag_offset_x{ }; + int m_drag_offset_y{ }; + bool m_mouse_held{ }; + const char* m_right_text{ }; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_render.h b/cheat/tf2/ui_render.h new file mode 100644 index 0000000..f67f16b --- /dev/null +++ b/cheat/tf2/ui_render.h @@ -0,0 +1,63 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + //recursively render all items + static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { + if( !item->get_visible( ) ) return; + + item->reset( ); + item->render( ); + bool reset = false; + RECT original; + + if( allow_rect && item->is_form( ) ) { + auto device = g_d3d.get_device( ); + device->GetScissorRect( &original ); + + auto x = item->get_relative_x( ); + auto y = item->get_relative_y( ); + + RECT new_rect{ + x, + y + 4, + x + item->w( ), + y + item->get_total_height( ) - 7 + }; + + device->SetScissorRect( &new_rect ); + reset = true; + } + + bool draw = true; + if( item->is_form( ) ) { + auto form_cast = static_cast< c_form* >( item ); + draw = !form_cast->is_collapsed( ); + } + + if( item->get_items( ).size( ) && draw ) { + //madr0fl + int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); + int cur_offset = 0; + for( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { + auto& cur_item = item->get_items( )[ i ]; + height_offset[ i ] = cur_offset; + cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; + } + + int i{ }; + for( auto& it : item->get_items( ) ) { + item->set_y_offset( height_offset[ i ] ); + render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); + ++i; + } + } + + if( reset ) { + auto device = g_d3d.get_device( ); + device->SetScissorRect( &original ); + } + } +} \ No newline at end of file diff --git a/cheat/tf2/ui_slider.h b/cheat/tf2/ui_slider.h new file mode 100644 index 0000000..0e55a73 --- /dev/null +++ b/cheat/tf2/ui_slider.h @@ -0,0 +1,165 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + template < typename t > + class c_slider : public base_item { + public: + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + if( !m_has_text ) { + x += 4; + return mouse_x >= x && mouse_x <= x + m_width - 8 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + void input( ) { + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + bool hovered = is_hovered( ); + float progress = 0.f; + int x = get_relative_x( ); + int y = get_relative_y( ) + 2; + int mouse_x, mouse_y; + + *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + if ( hovered && mouse_clicked ) { + + float progress{ }; + + if( m_has_text ) { + progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); + } + else { + progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); + } + + *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); + } + + if( !m_has_text ) { + bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; + + bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; + bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; + + if( mouse_clicked ) { + if( !m_mouse_held ) { + if( !std::is_floating_point< t >::value ) { + if( minus_hovered ) *m_setting -= ( t )1; + if( plus_hovered ) *m_setting += ( t )1; + } + else if( m_max - m_min <= 2.0f ) { + if( minus_hovered ) *m_setting -= ( t )0.1f; + if( plus_hovered ) *m_setting += ( t )0.1f; + } + } + + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + }; + + void draw_slider( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + } + + void draw_slider_small( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + x -= 1; //i couldnt be fucked + + ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + + ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); + ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); + + char val_str[ 12 ]; + if( m_suffix ) + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ) + 3, y + 2, true, ui_get_text_col( ), val_str ); + } + + virtual int get_total_height( ) const override { + return m_height + ( m_has_text ? 12 : 6 ); + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + int text_w, text_h; + char val[ 12 ]; + + input( ); + + //weird hacky fix for floating point vars + if ( m_suffix ) + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + if( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_get_text_size( text_w, text_h, val ); + ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); + draw_slider( x, y + 12 ); + } + else { + draw_slider_small( x, y + 2 ); + } + } + + + protected: + t* m_setting; + t m_full; + float m_min; + float m_max; + bool m_has_text = true; + const char* m_suffix; + bool m_mouse_held = false; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_tab_manager.h b/cheat/tf2/ui_tab_manager.h new file mode 100644 index 0000000..76258c8 --- /dev/null +++ b/cheat/tf2/ui_tab_manager.h @@ -0,0 +1,227 @@ +#pragma once +#include "ui_base_item.h" + + + +namespace ui +{ + namespace { + constexpr int BUTTON_WIDTH = 120; + constexpr int BUTTON_HEIGHT = 80; + + constexpr int SUBTAB_HEIGHT = 25; + } + + class c_tab_sheet : public base_item { + public: + c_tab_sheet( const char* tab_name ) : + base_item( 0, 0, 0, 0, tab_name ), + m_fade_progress( 0 ) { }; + + c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : + base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), + m_fade_progress( 0.f ) { }; + + virtual void render( ) override { }; + virtual bool is_hovered( ) override { + return false; + }; + + public: + float m_fade_progress{ }; + d3d::c_sprite* m_sprite{ }; + }; + + + class c_tab_manager : public base_item { + public: + c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, + xors( "TAB_MANAGER" ) ) { }; + + virtual bool is_hovered( ) override { + return false; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto text = item->get_text( ); + auto parent_x = m_parent->x( ) + 5; + auto parent_y = m_parent->y( ) + 5; + int item_height = BUTTON_HEIGHT; + + scale_button_fade( item, hovered ); + + ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, + item_height + 1, ui_get_bg_col( ) ); + + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_disabled_col( ) ); + + if( hovered ) { + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); + } + + if( item->m_sprite ) { + auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); + item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, + parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); + } + else { + g_con->log( "sprite is null" ); + } + } + + inline bool is_button_hovered( int start ) { + auto item_x = m_parent->x( ) + 5; + auto item_y = m_parent->y( ) + 5 + start; + int item_height = BUTTON_HEIGHT; + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 + && mouse_y >= item_y && mouse_y <= item_y + item_height; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int cur_y{ 10 }; + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( cur_y ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); + cur_y += BUTTON_HEIGHT + 4; + } + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + + protected: + decltype( m_parent ) m_selected_tab{ }; + }; + + + class c_subtab_manager : public base_item { + public: + c_subtab_manager( ) : base_item( 0, 35, 0, 5, + xors( "SUBTAB_MANAGER" ) ) { } + + virtual bool is_hovered( ) override { return false; } + + int get_button_width( ) { + int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; + + if ( !m_items.empty( ) ) + return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); + + return width; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void render_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto item_x = get_relative_x( ) + start - 2; + auto item_y = get_relative_y( ) + 3 - m_y; + auto width = get_button_width( ); + + scale_button_fade( item, hovered ); + clr_t tab_clr = ui_get_disabled_col( ); + + //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); + if ( hovered ) { + clr_t col = ui_get_accent_col( ); + col.a( ) *= item->m_fade_progress; + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); + } + + ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); + } + + bool is_button_hovered( decltype( m_parent )& button, int start ) { + int item_x = get_relative_x( ) + start - 2; + int item_y = get_relative_y( ) + 3 - m_y - 3; + int item_w = get_button_width( ); + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + item_w && + mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int start = 2; + int width = get_button_width( ); + + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( it, start ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + render_button( it, start, hovered || it == m_selected_tab ); + start += width; + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + } + + protected: + decltype( m_parent ) m_selected_tab; + }; +} \ No newline at end of file diff --git a/cheat/tf2/ui_text_input.h b/cheat/tf2/ui_text_input.h new file mode 100644 index 0000000..f486106 --- /dev/null +++ b/cheat/tf2/ui_text_input.h @@ -0,0 +1,47 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_text_input : public base_item { + c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str ) : + base_item( x, y, w, 16, name ), m_length( max_chars ), m_str( str ) { } + + virtual bool is_hovered( ) override { + + } + + void input( ) { + static float last_press[ KEYS_MAX ]{ }; + + int key = g_input.is_any_key_pressed( ); + if ( key == KEYS_BACK ) { + if ( strlen( m_str ) ) { + m_str[ strlen( m_str ) - 1 ] = 0; + } + } + if ( key != KEYS_NONE ) { + float cur_time = GetTickCount( ) * 0.001f; + if ( std::abs( cur_time - last_press[ key ] ) > 0.1f ) { + + auto scan_code = MapVirtualKeyA( key, MAPVK_VK_TO_VSC ); + uword_t ascii; + ToAscii( key, scan_code, 0, &ascii, 0 ); + char str[ 2 ] = { ( char )ascii, 0 }; + strcat_s( m_str, m_length, str ); + + last_press[ key ] = cur_time; + } + } + } + + virtual void render( ) override { + + } + + protected: + size_t m_length{ }; + char* m_str{ }; + + }; +} \ No newline at end of file diff --git a/cheat/tf2/util.cpp b/cheat/tf2/util.cpp new file mode 100644 index 0000000..424df71 --- /dev/null +++ b/cheat/tf2/util.cpp @@ -0,0 +1,223 @@ +#include "util.hpp" + +#include "interfaces.h" +#include "CBasePlayer.h" +#include "pattern.hpp" +#include "ctx.hpp" +#include "settings.h" +#include "math.h" +#include "base_cheat.h" + +float TICK_INTERVAL( ) { + return cl.m_globals->interval_per_tick; +} + +int TIME_TO_TICKS( float dt ) { + return static_cast< int >( 0.5f + dt / TICK_INTERVAL( ) ); +} + +float TICKS_TO_TIME( int tick ) { + return tick * TICK_INTERVAL( ); +} + +bool util::is_low_fps( ) { + return cl.m_globals->frametime > cl.m_globals->interval_per_tick; +} + +int util::get_closest_player( ) { + float cur_fov{ 360.f }; + int ret{ -1 }; + vec3_t viewangles{ }; + vec3_t local_pos{ }; + + bool friendlies = g_settings.legit.friendlies; + + local_pos = g_ctx.m_local->get_eye_pos( ); + cl.m_engine( )->GetViewAngles( viewangles ); + + for( int i{ 1 }; i < cl.m_globals->maxclients; ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + + if( !ent ) continue; + if( ent == g_ctx.m_local ) continue; + if( !ent->is_valid( ) ) continue; + int team = ent->get_team( ); + if( team == g_ctx.m_local->get_team( ) && !friendlies ) { + continue; + } + + auto ang = math::vector_angles( local_pos, ent->get_hitbox_position( 0 ) ); + ang.clamp( ); + + float fov = ( viewangles - ang ).clamp( ).length2d( ); + if( fov < cur_fov ) { + ret = i; + cur_fov = fov; + } + } + + return ret; +} + +void util::clip_trace_to_player( IClientEntity* player, vec3_t& src, vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* tr ) { + CGameTrace player_trace; + Ray_t ray; + float smallest_fraction = tr->fraction; + + ray.Init( src, end ); + + if( !filter->ShouldHitEntity( player, mask ) ) { + return; + } + + cl.m_trace( )->clip_ray_to_ent( ray, mask | CONTENTS_HITBOX, player, &player_trace ); + + if( player_trace.fraction < smallest_fraction ) { + *tr = player_trace; + smallest_fraction = player_trace.fraction; + } +} + + +bool util::trace_ray( vec3_t& start, vec3_t& end, IClientEntity* a, IClientEntity* b ) { + CGameTrace tr; + Ray_t ray; + CTraceFilter filter; + + filter.pSkip = a; + + ray.Init( start, end ); + + cl.m_trace( )->trace_ray( ray, 0x46004003 | CONTENTS_HITBOX, &filter, &tr ); + clip_trace_to_player( b, start, end, ( unsigned )0x46004003, &filter, &tr ); + + return tr.m_pEnt == b || tr.fraction > 0.98f; +} + +void util::set_random_seed( int seed ) { + using fn = int( __cdecl* )( int ); + fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomSeed" ) ) ); + + fn_ptr( seed ); +} + +float util::get_random_float( float min, float max ) { + using fn = float( *)( float, float ); + fn fn_ptr = ( fn )( GetProcAddress( + GetModuleHandleA( xors( "vstdlib.dll" ) ), + xors( "RandomFloat" ) ) ); + + return fn_ptr( min, max ); +} + +vec3_t util::get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ) { + set_random_seed( ( seed & 0xff ) + 1 ); + + float rand_a = get_random_float( 0.0f, 1.0f ); + float pi_rand_a = get_random_float( 0.f, 2.f * M_PI ); + float rand_b = get_random_float( 0.f, 1.0f ); + float pi_rand_b = get_random_float( 0.f, 2.f * M_PI ); + + float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); + float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); + + vec3_t forward, right, up; + math::angle_vectors( angles, &forward, &right, &up ); + + vec3_t spread_dir = forward + ( right * spread_x ) + ( up * spread_y ); + spread_dir.normalize_vector( ); + + return spread_dir; +} + +bool __vectorcall util::intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ) { + auto dist = math::dist_segment_to_segment( eye_pos, end_pos, min, max ); + + return ( dist < radius ); +} + +float util::get_total_latency( ) { + auto nci = cl.m_engine( )->GetNetChannelInfo( ); + + if( nci ) { + float latency = nci->GetLatency( 0 ) + nci->GetLatency( 1 ); + return latency; + } + + return 0.f; +} + +float util::get_lerptime( ) { + static cvar_t* cl_interpolate = cl.m_cvar( )->FindVar( xors( "cl_interpolate" ) ); + static cvar_t* cl_interp = cl.m_cvar( )->FindVar( xors( "cl_interp" ) ); + static cvar_t* cl_updaterate = cl.m_cvar( )->FindVar( xors( "cl_updaterate" ) ); + static cvar_t* cl_interp_ratio = cl.m_cvar( )->FindVar( xors( "cl_interp_ratio" ) ); + + if( cl_interp && cl_interpolate && cl_updaterate && cl_interp_ratio ) { + bool interpolate = cl_interpolate->get_int( ); + if( interpolate ) { + float interp = cl_interp->get_float( ); + float interp_ratio = cl_interp_ratio->get_float( ); + float updaterate = cl_updaterate->get_float( ); + + return std::max< float >( interp, interp_ratio / updaterate ); + } + } + + return 0.f; +} + +bool util::is_tick_valid( int tickcount ) { + float latency = get_total_latency( ); + float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); + float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) ); + + + return std::abs( delta ) < 0.2f; +} + +void util::disable_pvs( ) { + for( int i{ 1 }; i < 65; ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + + if( !ent || !ent->is_valid( ) ) + continue; + + if( ent == g_ctx.m_local ) + continue; + + *( int* )( uintptr_t( ent ) + 0xa30 ) = cl.m_globals->framecount; + *( int* )( uintptr_t( ent ) + 0xa28 ) = 0; + } +} + +vec2_t util::screen_transform( vec3_t world ) { + vec3_t tmp; cl.m_overlay( )->ScreenPosition( world, tmp ); + const matrix3x4& w2s_matrix = cl.m_engine( )->GetWorldToScreenMatrix( ); + float w = w2s_matrix[ 3 ][ 3 ]; + for( int i{ }; i < 3; i++ ) { + w += w2s_matrix[ 3 ][ i ] * world[ i ]; + } + if( w < 0.001f ) return{ 10000.f, 10000.f }; + + return{ tmp.x, tmp.y }; +} + +const char* util::object_index_to_name( int index ) { + index = std::clamp( index, 0, 65 ); + + switch( index ) { + case 89: + return xors( "teleporter" ); + case 86: + return xors( "dispenser" ); + case 88: + return xors( "sentry" ); + default: + return xors( "none" ); + } +} + diff --git a/cheat/tf2/util.hpp b/cheat/tf2/util.hpp new file mode 100644 index 0000000..7aaa007 --- /dev/null +++ b/cheat/tf2/util.hpp @@ -0,0 +1,100 @@ +#pragma once +#include +#include +#include "strings.hpp" + +#define NAMESPACE_REGION( x ) namespace x { +#define END_REGION } + +extern int TIME_TO_TICKS( float dt ); +extern float TICKS_TO_TIME( int tick ); +extern float TICK_INTERVAL( ); + +//WEE WOO WEE WOO ITS THE DWORD POLICE +using ulong_t = unsigned long; +using uword_t = unsigned short; + +class IClientEntity; +class CTraceFilter; +class CGameTrace; +class vec3_t; +class vec2_t; + +NAMESPACE_REGION( util ) + +template < typename t > +struct reverse_iterable { + reverse_iterable( t&& it ) : + iterable( it ) { } + + t& iterable; + inline auto begin( ) { + return std::rbegin( iterable ); + } + + inline auto end( ) { + return std::rend( iterable ); + } +}; + +template< typename t > +reverse_iterable< t > +reverse_iterator( t&& iter ) { + return reverse_iterable< t >{ iter }; +} + +template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { + if( !classbase ) return fn{ }; + return ( fn )( *( uintptr_t** )classbase )[ index ]; +} + +template < size_t index, typename ret, class ... args_ > +__forceinline ret get_vfunc( void* thisptr, args_... args ) { + using fn = ret( __thiscall* )( void*, args_... ); + + auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; + return fn_ptr( thisptr, args... ); +} + +__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { + std::string ascii_str( unicode.begin( ), unicode.end( ) ); + return ascii_str; +} + +__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { + std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); + return unicode_str; +} + +template < typename integer > +__forceinline auto to_hex_str( const integer& w, + size_t hex_len = sizeof( integer ) << 1 ) { + constexpr char* hex_digits = xors( "0123456789abcdef" ); + std::string rc( hex_len, 0 ); + + for( size_t i{ }, j{ ( hex_len - 1 ) * 4 }; i < hex_len; ++i, j -= 4 ) + rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; + + return rc; +} + +extern void clip_trace_to_player( IClientEntity* player, vec3_t& src, vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* trace ); + +extern bool trace_ray( vec3_t& start, vec3_t& end, IClientEntity* a, IClientEntity* b ); +extern bool is_low_fps( ); +extern bool is_tick_valid( int tickcount ); +extern void set_random_seed( int seed ); +extern vec3_t get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ); +extern float get_random_float( float min, float max ); +extern bool __vectorcall intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ); +extern bool hitchance( int target, const vec3_t& angles, int percentage ); +extern bool hitchance( int target, const vec3_t& angle, int percentage, int hi ); +extern float get_total_latency( ); +extern float get_lerptime( ); +extern int get_closest_player( ); +extern vec2_t screen_transform( vec3_t world ); +extern const char* object_index_to_name( int index ); +extern void disable_pvs( ); + +END_REGION \ No newline at end of file diff --git a/cheat/tf2/vector.hpp b/cheat/tf2/vector.hpp new file mode 100644 index 0000000..af24136 --- /dev/null +++ b/cheat/tf2/vector.hpp @@ -0,0 +1,334 @@ +#pragma once +#include +#include + + +class vec2_t { +public: + vec2_t( ) { + x = y = 0.0f; + } + + vec2_t( float X, float Y ) { + x = X; y = Y; + } + + vec2_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; + } + + vec2_t( const vec2_t& v ) { + x = v.x; y = v.y; + } + + vec2_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec2_t& operator+=( const vec2_t& v ) { + x += v.x; y += v.y; return *this; + } + + vec2_t& operator-=( const vec2_t& v ) { + x -= v.x; y -= v.y; return *this; + } + + vec2_t& operator*=( const vec2_t& v ) { + x *= v.x; y *= v.y; return *this; + } + + vec2_t& operator/=( const vec2_t& v ) { + x /= v.x; y /= v.y; return *this; + } + + vec2_t& operator+=( float v ) { + x += v; y += v; return *this; + } + + vec2_t& operator-=( float v ) { + x -= v; y -= v; return *this; + } + + vec2_t& operator*=( float v ) { + x *= v; y *= v; return *this; + } + + vec2_t& operator/=( float v ) { + x /= v; y /= v; return *this; + } + + vec2_t operator+( const vec2_t& v ) const { + return vec2_t( x + v.x, y + v.y ); + } + + vec2_t operator-( const vec2_t& v ) const { + return vec2_t( x - v.x, y - v.y ); + } + + vec2_t operator*( const vec2_t& v ) const { + return vec2_t( x * v.x, y * v.y ); + } + + vec2_t operator/( const vec2_t& v ) const { + return vec2_t( x / v.x, y / v.y ); + } + + vec2_t operator+( float v ) const { + return vec2_t( x + v, y + v ); + } + + vec2_t operator-( float v ) const { + return vec2_t( x - v, y - v ); + } + + vec2_t operator*( float v ) const { + return vec2_t( x * v, y * v ); + } + + vec2_t operator/( float v ) const { + return vec2_t( x / v, y / v ); + } + + void set( float X = 0.0f, float Y = 0.0f ) { + x = X; y = Y; + } + + float length( void ) const { + return sqrtf( x * x + y * y ); + } + + float lengthsqr( void ) const { + return ( x * x + y * y ); + } + + float dist_to( const vec2_t& v ) const { + return ( *this - v ).length( ); + } + + float dist_to_sqr( const vec2_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + float dot( const vec2_t& v ) const { + return ( x * v.x + y * v.y ); + } + + bool is_zero( void ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON ); + } + + operator bool( ) const noexcept { + return !is_zero( ); + } + +public: + float x, y; +}; + +class vec3_t { +public: + vec3_t( ) { + x = y = z = 0.0f; + } + + vec3_t( float X, float Y, float Z ) { + x = X; y = Y; z = Z; + } + + vec3_t( float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const float* v ) { + x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; + } + + vec3_t( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; + } + + vec3_t( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; + } + + __forceinline vec3_t& operator=( const vec3_t& v ) { + x = v.x; y = v.y; z = v.z; return *this; + } + + __forceinline vec3_t& operator=( const vec2_t& v ) { + x = v.x; y = v.y; z = 0.0f; return *this; + } + + float& operator[]( int i ) { + return ( ( float* )this )[ i ]; + } + + __forceinline float operator[]( int i ) const { + return ( ( float* )this )[ i ]; + } + + vec3_t& operator+=( const vec3_t& v ) { + x += v.x; y += v.y; z += v.z; return *this; + } + + vec3_t& operator-=( const vec3_t& v ) { + x -= v.x; y -= v.y; z -= v.z; return *this; + } + + vec3_t& operator*=( const vec3_t& v ) { + x *= v.x; y *= v.y; z *= v.z; return *this; + } + + vec3_t& operator/=( const vec3_t& v ) { + x /= v.x; y /= v.y; z /= v.z; return *this; + } + + vec3_t& operator+=( float v ) { + x += v; y += v; z += v; return *this; + } + + vec3_t& operator-=( float v ) { + x -= v; y -= v; z -= v; return *this; + } + + vec3_t& operator*=( float v ) { + x *= v; y *= v; z *= v; return *this; + } + + vec3_t& operator/=( float v ) { + x /= v; y /= v; z /= v; return *this; + } + + __forceinline vec3_t operator+( const vec3_t& v ) const { + return vec3_t( x + v.x, y + v.y, z + v.z ); + } + + __forceinline vec3_t operator-( const vec3_t& v ) const { + return vec3_t( x - v.x, y - v.y, z - v.z ); + } + + __forceinline vec3_t operator*( const vec3_t& v ) const { + return vec3_t( x * v.x, y * v.y, z * v.z ); + } + + __forceinline vec3_t operator/( const vec3_t& v ) const { + return vec3_t( x / v.x, y / v.y, z / v.z ); + } + + __forceinline vec3_t operator+( float v ) const { + return vec3_t( x + v, y + v, z + v ); + } + + __forceinline vec3_t operator-( float v ) const { + return vec3_t( x - v, y - v, z - v ); + } + + __forceinline vec3_t operator*( float v ) const { + return vec3_t( x * v, y * v, z * v ); + } + + __forceinline vec3_t operator/( float v ) const { + return vec3_t( x / v, y / v, z / v ); + } + + __forceinline float length( ) const { + return sqrtf( x * x + y * y + z * z ); + } + + __forceinline float lengthsqr( ) const { + return ( x * x + y * y + z * z ); + } + + __forceinline float length2d( ) const { + return sqrtf( x * x + y * y ); + } + + __forceinline float length2dsqr( ) const { + return ( x * x + y * y ); + } + + __forceinline float dist_to( const vec3_t& v ) const { + return ( *this - v ).length( ); + } + + __forceinline float dist_to_sqr( const vec3_t& v ) const { + return ( *this - v ).lengthsqr( ); + } + + __forceinline float dot( const vec3_t& v ) const { + return ( x * v.x + y * v.y + z * v.z ); + } + + __forceinline float fov_to( vec3_t to ) { + const float from_length = length( ); + const float to_length = to.length( ); + + if( from_length && to_length ) { + return acos( dot( to ) / from_length * to_length ); + } + + return 0.f; + } + + vec3_t cross( const vec3_t& v ) const { + return vec3_t( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); + } + + bool is_zero( ) const { + return ( x > -FLT_EPSILON && x < FLT_EPSILON && + y > -FLT_EPSILON && y < FLT_EPSILON && + z > -FLT_EPSILON && z < FLT_EPSILON ); + } + + operator bool( ) const { + return !is_zero( ); + } + + inline void normalize_vector( ) { + vec3_t& v = *this; + + float iradius = 1.f / ( this->length( ) + FLT_EPSILON ); //FLT_EPSILON + + v.x *= iradius; + v.y *= iradius; + v.z *= iradius; + } + + vec3_t abs( ) const { + return vec3_t{ std::abs( x ), std::abs( y ), std::abs( z ) }; + } + + vec3_t clamp( ) { + for( size_t axis{ }; axis < 2; axis++ ) { + auto &cur_axis = operator[]( axis ); + if( !std::isfinite( cur_axis ) ) { + cur_axis = 0.f; + } + } + + x = std::clamp( x, -89.f, 89.f ); + y = std::clamp( std::remainder( y, 360.f ), -180.f, 180.f ); + z = 0.f; + return *this; + } + +public: + float x, y, z; +}; + +__forceinline vec3_t operator*( float f, const vec3_t& v ) { + return v * f; +} diff --git a/cheat/tf2/visuals.hpp b/cheat/tf2/visuals.hpp new file mode 100644 index 0000000..2f8e9f3 --- /dev/null +++ b/cheat/tf2/visuals.hpp @@ -0,0 +1,56 @@ +#pragma once +#include +#include "vector.hpp" +#include "color.hpp" +#include +#include "strings.hpp" +#include "IVRenderView.h" +class c_base_player; + +namespace features +{ + class c_visuals { + private: + static const clr_t esp_green( uint8_t alpha = 255 ) { + return clr_t( 1, 216, 62, alpha ); + } + static const clr_t esp_red( uint8_t alpha = 255 ) { + return clr_t( 240, 0, 0, alpha ); + } + static const clr_t esp_blue( uint8_t alpha = 255 ) { + return clr_t( 84, 173, 247, alpha ); + } + + void draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ); + void draw_line( int x, int y, int x1, int y1, const clr_t& clr ); + void draw_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_filled_rect( int x, int y, int w, int h, const clr_t& clr ); + void draw_circle( int x, int y, int r, const clr_t& clr, int res = 48 ); + + void draw_really_big_string( int x, int y, const clr_t& clr, const char* msg, ... ); + void draw_string( int x, int y, int align, bool big, const clr_t& clr, const char* msg, ... ); + + + void draw_local( ); + void draw_players( ); + void draw_world( ); + + void draw_hits( ); + void spectator_list( ); + //void throwable_prediction( ); + + void invalidate_glow( ); + + vec3_t m_stored_pos[ 65 ]{ }; + float m_anim_progress[ 65 ]{ }; + float m_last_hit{ }; + int m_ent_dmg[ 65 ]{ }; + public: + void update_glow( ); + void world_modulate( ); + void update_position( int index, const vec3_t& pos ); + void out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ); + void store_hit( ); + void operator()( ); + }; +} \ No newline at end of file diff --git a/cheat/tf2/visuals_draw.cpp b/cheat/tf2/visuals_draw.cpp new file mode 100644 index 0000000..87c476b --- /dev/null +++ b/cheat/tf2/visuals_draw.cpp @@ -0,0 +1,94 @@ +#include "d3d.hpp" +#include "interfaces.h" +#include "renderer.hpp" +#include "visuals.hpp" +#include "settings.h" + +namespace features +{ + void c_visuals::draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_line( clr, a.x, a.y, b.x, b.y ); + else + g_renderer.draw_line( a, b, clr ); + } + + void c_visuals::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_line( clr, x, y, x1, y1 ); + else + g_renderer.draw_line( x, y, x1, y1, clr ); + } + + void c_visuals::draw_rect( int x, int y, int w, int h, const clr_t& clr ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_rect( clr, x, y, w, h ); + else + g_renderer.draw_box( x, y, w, h, clr ); + } + + void c_visuals::draw_filled_rect( int x, int y, int w, int h, const clr_t& col ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_filled_rect( col, x, y, w, h ); + else + g_renderer.draw_rect( x, y, w, h, col ); + } + + void c_visuals::draw_circle( int x, int y, int r, const clr_t& col, int res ) { + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_circle( col, x, y, r, res ); + else + g_renderer.draw_circle( x, y, r, col, res ); + } + + void c_visuals::draw_string( int x, int y, int align, bool big, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + switch( align ) { + case ALIGN_CENTER: + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_CENTER >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + else + g_renderer.draw_string< ALIGN_CENTER >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); + + break; + case ALIGN_LEFT: + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_LEFT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + else + g_renderer.draw_string< ALIGN_LEFT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); + + break; + case ALIGN_RIGHT: + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_RIGHT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); + else + g_renderer.draw_string< ALIGN_RIGHT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); + + break; + } + } + + void c_visuals::draw_really_big_string( int x, int y, const clr_t& col, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 1024 ); + va_list list{ }; + + memset( buffer, 0, 1024 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 1024, msg, list ); + __crt_va_end( list ); + + if( g_settings.misc.hide_from_obs ) + g_d3d.draw_text< ALIGN_LEFT >( ::d3d::fonts.f_18, col, x, y, D3DFONTFLAG_OUTLINE, buffer ); + else + g_renderer.draw_string< ALIGN_LEFT >( g_fonts.f_bold, x, y, col, msg ); + } +} \ No newline at end of file diff --git a/cheat/tf2/visuals_local.cpp b/cheat/tf2/visuals_local.cpp new file mode 100644 index 0000000..7f549d9 --- /dev/null +++ b/cheat/tf2/visuals_local.cpp @@ -0,0 +1,207 @@ +#include + +#include "visuals.hpp" +#include "ctx.hpp" +#include "base_cheat.h" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.h" +#include "settings.h" +#include "interfaces.h" +namespace features +{ + void c_visuals::draw_local( ) { + int screen_w, screen_h; + cl.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + + if( g_settings.misc.no_scope( ) && + g_ctx.m_local->m_bIsScoped( ) ) { + int w, h; + cl.m_engine( )->GetScreenSize( w, h ); + + draw_line( 0, h / 2, w, h / 2, clr_t( 0, 0, 0 ) ); + draw_line( w / 2, 0, w / 2, h, clr_t( 0, 0, 0 ) ); + } + spectator_list( ); + //throwable_prediction( ); -- sometime when i can be fucked + } + + void c_visuals::spectator_list( ) { + if( !g_settings.visuals.spec_list ) + return; + + std::vector< std::string > spec_list; + + for( size_t i{ }; i < 65; ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + if( ent && ent->is_player( ) && !ent->ce( )->is_dormant( ) ) { + auto spec_handle = ent->m_hObserverTarget( ); + auto spec_ent = cl.m_entlist( )->get_entity_from_handle< c_base_player >( spec_handle ); + + if( spec_ent == g_ctx.m_local ) { + char player_name[ 32 ]; + ent->get_name_safe( player_name ); + spec_list.push_back( player_name ); + } + } + } + + int screen_w, screen_h; + cl.m_engine( )->GetScreenSize( screen_w, screen_h ); + + int cur_pos{ }; + + if( g_settings.misc.watermark ) { + cur_pos = 20; + } + + for( auto& it : spec_list ) { + draw_string( screen_w - 3, cur_pos, ALIGN_RIGHT, true, clr_t( 255, 255, 255 ), it.c_str( ) ); + cur_pos += 10; + } + } + //i wanna do this + /* + void c_visuals::throwable_prediction( ) { + static auto sv_gravity = cl.m_cvar( )->FindVar( xors( "sv_gravity" ) ); + + if( !g_settings.visuals.grenade_prediction ) + return; + + + /* + auto get_detonate_time = [ ]( int defindex ) { + switch( defindex ) { + case WEAPON_FLASHBANG: + case WEAPON_HEGRENADE: + return 1.5f; + case WEAPON_INCGRENADE: + case WEAPON_MOLOTOV: + return molotov_detonate_time->get_float( ); + case WEAPON_DECOY: + return 5.f; + default: return 3.f; + } + }; + + auto draw_3d_line = [ this ]( const vec3_t& start, const vec3_t& end, clr_t col, bool circle = false ) { + vec2_t start_w2s = util::screen_transform( start ); + vec2_t end_w2s = util::screen_transform( end ); + + draw_line( start_w2s, end_w2s, col ); + if( circle ) + draw_rect( end_w2s.x - 1, end_w2s.y - 1, 2, 2, clr_t( 230, 230, 230 ) ); + }; + + auto clip_velocity = [ ]( const vec3_t& in, const vec3_t& normal, vec3_t& out, float overbounce ) { + int blocked = 0; + float angle = normal[ 2 ]; + + if( angle > 0.f ) + blocked |= 1; + + if( !angle ) + blocked |= 2; + + float backoff = in.dot( normal ) * overbounce; + + for( int i{ }; i < 3; ++i ) { + out[ i ] = in[ i ] - ( normal[ i ] * backoff ); + + if( out[ i ] > -0.1f && out[ i ] < 0.1f ) { + out[ i ] = 0.f; + } + } + + return blocked; + }; + + auto weapon = g_ctx.m_local->get_active_weapon( ); + if( !weapon ) return; + + int def_index = weapon->m_iItemDefinitionIndex( ); + if( weapon->has_trajectory( ) ) + return; + + auto wpn_info = weapon->get_wpn_info( ); + + vec3_t throw_ang, forward; + cl.m_engine( )->GetViewAngles( throw_ang ); + throw_ang.x -= ( 90.f - abs( throw_ang.x ) ) * 0.11111111f; + throw_ang.x = std::remainderf( throw_ang.x, 360.f ); + + forward = math::angle_vectors( throw_ang ); + + float throw_strength = weapon->m_flThrowStrength( ); + float throw_velocity = std::min( std::max( wpn_info->throw_velocity * 0.9f, 15.f ), 750.f ); + + float throw_height = ( throw_strength * 12.f ) - 12.f; + float v68 = throw_velocity * ( ( 0.7f * throw_strength ) + 0.3f ); + + vec3_t start_pos = g_ctx.m_local->get_eye_pos( ) + vec3_t( 0, 0, throw_height ); + vec3_t end_pos = start_pos + ( forward * 22.f ); + + CTraceFilter filter; + filter.pSkip = g_ctx.m_local; + + CGameTrace trace; + Ray_t ray; + ray.Init( start_pos, end_pos, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + cl.m_trace( )->trace_ray( ray, CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_MOVEABLE | CONTENTS_CURRENT_90, &filter, &trace ); + end_pos = trace.endpos - forward * 6.f; + vec3_t throw_pos = g_ctx.m_local->m_vecVelocity( ) * 1.25f + forward * v68; + + //draw_3d_line( start_pos, end_pos, clr_t( 255, 255, 255 ) ); + float gravity = sv_gravity->get_float( ) * 0.4f; + + player_info_t info{ }; + + for( int ticks = TIME_TO_TICKS( get_detonate_time( def_index ) ); ticks >= 0; --ticks ) { + auto throw_dir = vec3_t( throw_pos.x, throw_pos.y, ( throw_pos.z + ( throw_pos.z - ( gravity * TICK_INTERVAL( ) ) ) ) * 0.5f ); + auto temp = throw_dir * TICK_INTERVAL( ); + throw_pos.z -= gravity * TICK_INTERVAL( ); + + vec3_t src = end_pos, end = end_pos + temp; + Ray_t ray; + ray.Init( src, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + + cl.m_trace( )->trace_ray( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); + if( trace.allsolid ) + throw_pos = vec3_t( ); + + end_pos = trace.endpos; + draw_3d_line( src, end_pos, clr_t( 66, 143, 244 ) ); + + if( trace.fraction != 1.f ) { + float surf_elasticity = 1.f; + vec3_t throw_pos2{ }; + clip_velocity( throw_pos, trace.plane.normal, throw_pos2, 2.f ); + + if( trace.m_pEnt && cl.m_engine( )->GetPlayerInfo( trace.m_pEnt->index( ), &info ) ) { + surf_elasticity = 0.3f; + } + + throw_pos2 *= std::clamp( surf_elasticity * 0.45f, 0.f, 0.9f ); + end = end_pos + throw_pos2 * ( ( 1.f - trace.fraction ) * TICK_INTERVAL( ) ); + + if( def_index == WEAPON_MOLOTOV || def_index == WEAPON_INCGRENADE ) { + if( trace.plane.normal.z >= cos( DEG2RAD( molotov_detonate_slope->get_float( ) ) ) ) { + return; + } + } + + ray.Init( end_pos, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); + cl.m_trace( )->trace_ray( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); + + draw_3d_line( end_pos, end, clr_t( 66, 143, 244 ), true ); + end_pos = trace.endpos; + throw_pos = throw_pos2; + } + } + }*/ + +} \ No newline at end of file diff --git a/cheat/tf2/visuals_objects.cpp b/cheat/tf2/visuals_objects.cpp new file mode 100644 index 0000000..e69de29 diff --git a/cheat/tf2/visuals_players.cpp b/cheat/tf2/visuals_players.cpp new file mode 100644 index 0000000..8b9aaf9 --- /dev/null +++ b/cheat/tf2/visuals_players.cpp @@ -0,0 +1,551 @@ +#include + +#include "visuals.hpp" +#include "ctx.hpp" +#include "base_cheat.h" +#include "renderer.hpp" +#include "input_system.hpp" +#include "math.h" +#include "settings.h" +#include "interfaces.h" +//2k lines of code here +int screen_w, screen_h; + +namespace features +{ + void c_visuals::update_position( int index, const vec3_t& pos ) { + m_stored_pos[ index ] = pos; + if( m_anim_progress[ index ] <= 0.3f && g_settings.visuals.dormant ) { + m_anim_progress[ index ] = 0.3f; + } + } + + void c_visuals::store_hit( ) { + if( !g_settings.visuals.hitmarkers ) + return; + + cl.m_surface( )->play_sound( xors( "buttons\\arena_switch_press_02.wav" ) ); + m_last_hit = cl.m_globals->curtime; + } + + + void c_visuals::draw_hits( ) { + if( !g_settings.visuals.hitmarkers || !g_ctx.run_frame( ) ) + return; + + static const clr_t col_start = clr_t( 231, 75, 75, 255 ); + static const clr_t col_end = clr_t( 0xf4, 0x7c, 0xa8, 255 ); + + float delta = ( cl.m_globals->curtime - m_last_hit ) * 1.5f; + if( std::abs( delta ) > 1.0f ) return; + + clr_t blend = clr_t::blend( col_start, col_end, delta ); + if( delta > 0.75f ) { + blend.a( ) = 255 * ( 1.0f - delta ) * 4.f; + } + + auto get_rotated_point = [ ]( vec2_t point, float rotation, float distance ) { + float rad = DEG2RAD( rotation ); + + point.x += sin( rad ) * distance; + point.y += cos( rad ) * distance; + + return point; + }; + + + for( size_t i{ }; i < 2; ++i ) { + float rotation = 135.f + i * 90.f; + + vec2_t center = { screen_w * 0.5f, screen_h * 0.5f }; + vec2_t start = get_rotated_point( center, rotation, 8.f ); + vec2_t end = get_rotated_point( center, rotation, 17.f ); + + vec2_t rot_start = get_rotated_point( center, rotation - 180.f, 8.f ); + vec2_t rot_end = get_rotated_point( center, rotation - 180.f, 17.f ); + + draw_line( start, end, blend ); + draw_line( rot_start, rot_end, blend ); + } + } + + struct box_t { + int x, y, w, h; + }; + + box_t get_box( c_base_player* ent ) { + const matrix3x4& matrix = ent->m_CollisionGroup( ); + + vec3_t min = ent->m_vecMins( ); + vec3_t max = ent->m_vecMaxs( ); + + std::array< vec3_t, 8 > point_list = { + vec3_t{ min.x, min.y, min.z }, + vec3_t{ min.x, max.y, min.z }, + vec3_t{ max.x, max.y, min.z }, + vec3_t{ max.x, min.y, min.z }, + vec3_t{ max.x, max.y, max.z }, + vec3_t{ min.x, max.y, max.z }, + vec3_t{ min.x, min.y, max.z }, + vec3_t{ max.x, min.y, max.z } + }; + + std::array< float, 8 > x_points; + std::array< float, 8 > y_points; + + vec2_t origin = util::screen_transform( ent->m_vecOrigin( ) ); + + for( auto& it : point_list ) { + vec3_t backup = it; + for( int i{ }; i < 3; ++i ) { + it[ i ] = backup.dot( ( const vec3_t& )( matrix[ i ] ) ) + matrix[ i ][ 3 ]; + } + } + + for( size_t i{ }; i < 8; ++i ) { + vec2_t w2s = util::screen_transform( point_list[ i ] ); + x_points[ i ] = w2s.x; + y_points[ i ] = w2s.y; + } + + std::sort( x_points.begin( ), x_points.end( ) ); + std::sort( y_points.begin( ), y_points.end( ) ); + + int x = ( int )x_points.front( ); + int w = ( int )x_points.back( ) - x; + + int y = ( int )y_points.front( ); + int h = ( int )y_points.back( ) - y; + + return { x - ( int )origin.x, y - ( int )origin.y, w, h }; + } + + void c_visuals::out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ) { + vec2_t screen; + vec2_t circle; + + auto find_point = [ ]( vec2_t& point, float deg_x, float deg_y ) { + float x2 = screen_w / 2.f; + float y2 = screen_h / 2.f; + + float d = sqrt( pow( point.x - x2, 2 ) + pow( point.y - y2, 2 ) ); + float r_x = deg_x / d; + float r_y = deg_y / d; + + point.x = r_x * point.x + ( 1.f - r_x ) * x2; + point.y = r_y * point.y + ( 1.f - r_y ) * y2; + }; + + auto get_screen_point = [ ]( vec2_t& screen, const vec3_t& delta ) { + decltype( auto ) w2s_matrix = cl.m_engine( )->GetWorldToScreenMatrix( ); + float x; + float w; + float y; + + screen.x = w2s_matrix[ 0 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 0 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 0 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 0 ][ 3 ]; + screen.y = w2s_matrix[ 1 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 1 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 1 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 1 ][ 3 ]; + w = w2s_matrix[ 3 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 3 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 3 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 3 ][ 3 ]; + + if( w < 0.001f ) { + float invw = -1.0f / w; + screen.x *= invw; + screen.y *= invw; + } + else { + float invw = 1.0f / w; + screen.x *= invw; + screen.y *= invw; + } + + x = float( screen_w ) / 2.f; + y = float( screen_h ) / 2.f; + x += 0.5f * screen.x * screen_w + 0.5f; + y -= 0.5f * screen.y * screen_h + 0.5f; + screen.x = x; + screen.y = y; + }; + + screen = util::screen_transform( pos );//get_screen_point( screen, pos ); + circle = util::screen_transform( pos );// get_screen_point( circle, pos ); + + float radius = g_settings.visuals.out_of_pov_radius * 0.49f; + + float ratio = g_settings.visuals.out_of_pov_radius; + + float w = screen_w * ratio + screen_h * ( 1.0f - ratio ); + + find_point( screen, w * radius, + float( screen_h ) * radius ); + + auto min = std::min< int >( screen_w, screen_h ) * radius; + find_point( circle, float( min ), float( min ) ); + + auto rot_around_center = [ ]( vec2_t start, float rot ) { + float rad = rot * ( M_PI / 180.f ); + + start.x += sin( rad ) * float( g_settings.visuals.out_of_pov_size ); + start.y += cos( rad ) * float( g_settings.visuals.out_of_pov_size ); + + return start; + }; + + float delta_x = ( float( screen_w / 2 ) - circle.x ); + float delta_y = ( float( screen_h / 2 ) - circle.y ); + + auto hyp = sqrt( delta_x * delta_x + delta_y * delta_y ); + + float cos_ = delta_x / hyp; + + float deg = RAD2DEG( acos( cos_ ) ); + + if( screen.y < screen_h / 2 ) { + deg *= -1.f; + } + + auto rotated_pos_1 = rot_around_center( screen, deg + 115 ); + auto rotated_pos_2 = rot_around_center( screen, deg + 65 ); + + col.a( ) *= 0.8f; + + vertex_t v[ ] = { + { screen }, + { rotated_pos_1 }, + { rotated_pos_2 } + }; + + if( !g_settings.misc.hide_from_obs ) + g_renderer.draw_polygon( 3, v, col ); + else { + draw_line( screen, rotated_pos_1, col ); + draw_line( screen, rotated_pos_2, col ); + draw_line( rotated_pos_1, rotated_pos_2, col ); + } + } + + void c_visuals::update_glow( ) { + if( !g_settings.visuals.active || g_settings.misc.hide_from_obs ) + return; + + static auto glow_object_manager = *pattern::first_code_match< GlowObjectManager_t** >( cl.m_chl.dll( ), xors ( "8B 0D ? ? ? ? A1 ? ? ? ? 56 8B 37" ) ) + 0x2; + if( !glow_object_manager ) return; + + static bool invalidated; + if( !g_settings.visuals.glow ) { + if( !invalidated ) { + invalidate_glow( ); + invalidated = true; + } + return; + } + + invalidated = false; + for( int i{ }; i < 64; ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + if( !ent ) continue; + + + if( !ent->is_valid( ) ) { + continue; + } + + if( ent->is_enemy( ) || g_settings.visuals.friendlies ) { + ent->m_bGlowEnabled( ) = true; + ent->update_glow_effect( ); + } + } + + if( !glow_object_manager->data.Count( ) ) return; //data count crashed yea lazy cool cool? cool + for( int i{ }; i < glow_object_manager->data.Count( ); ++i ) { + auto ent = ( c_base_player* )cl.m_entlist( )->get_entity_from_handle( glow_object_manager->data[ i ].ent_ptr ); + if( ent && ent->is_valid( ) && ( ent->is_enemy( ) || g_settings.visuals.friendlies( ) ) ) { + clr_t clr = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.glow_friendly : g_settings.visuals.glow_enemy; + clr.a( ) = 200; + glow_object_manager->data[ i ].glow_color = clr.to_fclr( ); + } + } + + } + + void c_visuals::invalidate_glow( ) { + for( int i{ }; i < 64; i++ ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + if( !ent ) continue; + if( ent->get_client_class( )->m_class_id == CTFPlayer ) { + ent->m_bGlowEnabled( ) = false; + ent->destroy_glow_effect( ); + } + } + } + + inline clr_t blend_clr( clr_t in, float progress ) { + static const clr_t clr_gray = { 160, 160, 160, 255 }; + int a = in.a( ); + + clr_t ret = clr_t::blend( clr_gray, in, 0.1f + progress * 0.9f ); + ret.a( ) = a; + return ret; + } + + void c_visuals::draw_players( ) { + static constexpr float anim_rate = 1.0f / 0.3f; + static float pov_progress[ 65 ]{ }; + + auto resource = c_base_player::get_player_resource( ); + + for( int i{ }; i < 65; ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); + + if( !ent || !ent->is_player( ) || !ent->is_alive( ) || ent == g_ctx.m_local ) + continue; + + if( i == ( g_ctx.m_local->m_hObserverTarget( ) & 0xfff ) ) + continue; + + if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && + !g_settings.visuals.friendlies( ) ) + continue; + + float rate = cl.m_globals->frametime * anim_rate; + float& anim = m_anim_progress[ i ]; + float alpha = anim; + bool dormant = ent->ce( )->is_dormant( ); + int health = ent->m_iHealth( ); + auto origin = ent->m_vecOrigin( ); + auto box = get_box( ent ); + int right_pos = 0; + int bottom_pos = 0; + bool too_distant = true; + if( g_ctx.m_local ) + too_distant = ent->m_vecOrigin( ).dist_to( g_ctx.m_local->m_vecOrigin( ) ) > 2500.f; + + if( !dormant ) { + update_position( i, origin ); + anim = 1.0f; + } + else { + if( anim < 0.3f && g_settings.visuals.dormant && !too_distant ) { + rate *= 0.01f; + } + anim = std::clamp( anim -= rate, 0.f, 1.0f ); + if( m_anim_progress[ i ] <= 0.f ) + continue; + } + + clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? + g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; + + if( dormant ) { + col = blend_clr( col, anim ); + col.a( ) *= anim; + } + + auto w2s_cur_origin = util::screen_transform( m_stored_pos[ i ] ); + + box.x += w2s_cur_origin.x; + box.y += w2s_cur_origin.y; + + if( box.x > screen_w || box.x + box.w < 0 || + box.y > screen_h || box.y + box.h < 0 ) { + if( g_settings.visuals.out_of_pov ) { + auto& anim = pov_progress[ i ]; + anim = std::clamp( anim += cl.m_globals->frametime * anim_rate, 0.f, 1.0f ); + if( dormant ) + anim = std::clamp( anim -= cl.m_globals->frametime * anim_rate, 0.f, 1.0f ); + else + anim = std::clamp( anim += cl.m_globals->frametime * anim_rate, 0.f, 1.0f ); + + col.a( ) *= anim; + out_of_fov( ent, origin, col ); + } + continue; + } + + pov_progress[ i ] = 0.f; + + if( g_settings.visuals.skeleton( ) && !dormant ) { + clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.skeleton_friendly : g_settings.visuals.skeleton_enemy; + col.a( ) *= alpha; + + auto hdr = cl.m_modelinfo( )->GetStudioModel( ent->ce( )->get_model( ) ); + if( hdr ) { + matrix3x4 matrix[ 128 ]; + ent->ce( )->setup_bones( matrix, 128, 0x100, 0.f ); + + for( size_t bone{ }; bone < hdr->numbones; ++bone ) { + auto b = hdr->GetBone( bone ); + if( b && b->flags & 0x100 && b->parent != -1 ) { + vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; + vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; + + auto child_screen = util::screen_transform( child ); + auto parent_screen = util::screen_transform( parent ); + + draw_line( child_screen, parent_screen, col ); + } + } + } + } + + if( g_settings.visuals.box( ) ) { + auto alpha_ = col.a( ); + float percent = float( alpha_ ) / 255.f; + draw_rect( box.x + 1, box.y + 1, box.w - 2, box.h - 2, clr_t( 0, 0, 0, 180 * alpha * percent ) ); + draw_rect( box.x, box.y, box.w, box.h, col ); + } + + if( g_settings.visuals.health( ) ) { + auto fill = box.h - 1; + fill *= std::clamp( health, 0, 100 ) * 0.01f; + + auto hp_col = clr_t( + std::min< int >( 510 * ( 100 - health ) / 100, 255 ), + std::min< int >( 510 * health / 100, 255 ), + 0, + 255 * alpha ); + + draw_filled_rect( box.x - 4, box.y, 3, box.h + 1, clr_t( 0, 0, 0, 170 * alpha ) ); + draw_filled_rect( box.x - 3, box.y + box.h - fill, 1, fill, hp_col ); + + if( health != 100 ) + draw_string( box.x - 2, box.y + 1 + box.h - fill - 3, ALIGN_CENTER, false, clr_t( 255, 255, 255, 255 * alpha ), "%d", health ); + } + + if( g_settings.visuals.name( ) ) { + draw_string( box.x + box.w / 2, box.y - 12, ALIGN_CENTER, true, + blend_clr( clr_t( 255, 255, 255, alpha * 255 ), anim ), ent->get_info( ).name ); + } + + if( g_settings.visuals.player_class( ) ) { + int x_pos = box.x + box.w + 2; + int y_pos = box.y - 1 + right_pos; + draw_string( x_pos, y_pos, ALIGN_LEFT, false, + blend_clr( esp_green( 255 * alpha ), anim ), ent->get_class_name( ) ); + + right_pos += 9; + } + + if( g_settings.visuals.weapon( ) ) { + auto weapon = ent->get_active_weapon( ); + if( weapon ) { //magic font + int max = weapon->get_max_clip_1( ); + + if( g_settings.visuals.ammo && max > 1 && g_settings.visuals.weapon == 1 && !g_settings.misc.hide_from_obs ) { + auto progress = float( weapon->m_iClip1( ) ) / max; + float fill = box.w - 2.f; + float percent = fill * progress; + + draw_filled_rect( box.x, box.y + box.h + 3 + bottom_pos, + box.w, 3, clr_t( 0, 0, 0, 180 * alpha ) ); + + draw_filled_rect( box.x + 1, box.y + box.h + 4 + bottom_pos, + percent, 1, blend_clr( clr_t( 66, 143, 244, 255 * alpha ), anim ) ); + + if( progress < 0.25f ) { + draw_string( + box.x + percent, box.y + box.h + 2 + bottom_pos, ALIGN_LEFT, false, + clr_t( 255, 255, 255, 180 * alpha ), "%d", weapon->m_iClip1( ) ); + } + + bottom_pos += 4; + } + + /*if( g_settings.visuals.weapon == 1 && !g_settings.misc.hide_from_obs ) { + g_renderer.draw_string< ALIGN_CENTER >( 0xa1, box.x + box.w / 2, box.y + box.h + bottom_pos + 3, + clr_t( 255, 255, 255, alpha * 255 ), "%c", weapon->get_hud_icon( ) ); + }*/ + else { + char wep_str[ 64 ]; + if( g_settings.visuals.ammo( ) && weapon->m_iClip1( ) > -1 ) + sprintf_s< 64 >( wep_str, "%s [%d]", weapon->get_print_name( ), weapon->m_iClip1( ) ); + else + sprintf_s< 64 >( wep_str, "%s", weapon->get_print_name( ) ); + + draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, false, + clr_t( 255, 255, 255, alpha * 255 ), wep_str ); + } + } + } + + if( g_settings.visuals.conditions( ) ) { + int x_pos = box.x + box.w + 3; + int y_pos = box.y - 1; + + switch( ent->m_nPlayerCond( ) ) { + case TFCond_Slowed: + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "slow" ) ); + right_pos += 9; + break; + case TFCond_Zoomed: //dont work too lazy + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "scoped" ) ); + right_pos += 9; + break; + case TFCond_Bonked: + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "bonk" ) ); + right_pos += 9; + break; + case TFCond_Disguised: + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "disg" ) ); + right_pos += 9; + break; + case TFCond_Cloaked: + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "cloak" ) ); + right_pos += 9; + break; + case TFCond_Ubercharged: + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "uber" ) ); + right_pos += 9; + break; + case TFCond_UberchargeFading: + draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "uber" ) ); + right_pos += 9; + break; + } + + } + + } + } + + void c_visuals::operator()( ) { + cl.m_engine( )->GetScreenSize( screen_w, screen_h ); + if( g_ctx.run_frame( ) ) { + draw_local( ); + } + + if( !g_ctx.m_local ) + return; + + switch( g_settings.visuals.activation_type( ) ) { + case 0: + g_settings.visuals.active = false; + break; + case 1: + g_settings.visuals.active = true; + break; + case 2: + g_settings.visuals.active = g_input.is_key_pressed( g_settings.visuals.key ); + break; + case 3: { + static bool held = false; + bool pressed = g_input.is_key_pressed( g_settings.visuals.key ); + if( pressed ) { + if( !held ) + g_settings.visuals.active ^= 1; + held = true; + } + else held = false; + } + break; + default: + g_settings.visuals.active = false; + break; + } + + if( g_settings.visuals.active ) { + draw_players( ); + } + + draw_world( ); + draw_hits( ); + } +} \ No newline at end of file diff --git a/cheat/tf2/visuals_world.cpp b/cheat/tf2/visuals_world.cpp new file mode 100644 index 0000000..b727798 --- /dev/null +++ b/cheat/tf2/visuals_world.cpp @@ -0,0 +1,344 @@ +#include +#include +#include "ctx.hpp" +#include "visuals.hpp" +#include "interfaces.h" +#include "renderer.hpp" +#include "base_cheat.h" +#include "settings.h" +namespace features +{ + void fix_static_props( ) { + static auto cvar = cl.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) ); + static bool fixed{ }; + if( !fixed ) { + cvar->m_flags |= 0; + cvar->set_value( 1 ); + + fixed = true; + } + } + + + void c_visuals::draw_world( ) { + if( !g_settings.visuals.active ) + return; + + static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) ); + + + for( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) { + auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i ); + if( !ent ) continue; + + auto client_class = ent->get_client_class( ); + if( !client_class ) continue; + + int class_id = client_class->m_class_id; + std::string name = ""; + + auto is_object = [ &name ]( int class_id ) -> bool { + switch( class_id ) { + case CObjectSentrygun: + name = xors( "sentry" ); + return true; + case CObjectDispenser: + name = xors( "dispenser" ); + return true; + case CObjectTeleporter: + name = xors( "teleporter" ); + return true; + default: + return false; + } + + return false; + }; + + auto is_projectile = [ &name ]( int class_id ) -> bool { + switch( class_id ) { + case CTFProjectile_Arrow: + name = xors( "arrow" ); + return true; + case CTFProjectile_Cleaver: + name = xors( "cleaver" ); + return true; + case CTFProjectile_EnergyBall: + name = xors( "energy ball" ); + return true; + case CTFProjectile_EnergyRing: + name = xors( "energy ring" ); + return true; + case CTFProjectile_Flare: + name = xors( "flare" ); + return true; + case CTFProjectile_HealingBolt: + name = xors( "healing bolt" ); + return true; + case CTFProjectile_Jar: + name = xors( "jar" ); + return true; + case CTFProjectile_JarMilk: + name = xors( "jar milk" ); + return true; + case CTFGrenadePipebombProjectile: + name = xors( "pipe bomb" ); + return true; + case CTFProjectile_Rocket: + name = xors( "rocket" ); + return true; + case CTFProjectile_Throwable: + name = xors( "throwable" ); + return true; + case CTFProjectile_ThrowableBreadMonster: + name = xors( "bread monster" ); + return true; + case CTFProjectile_ThrowableBrick: + name = xors( "brick" ); + return true; + case CTFProjectile_ThrowableRepel: + name = xors( "repel" ); + return true; + case CTFProjectile_SentryRocket: + name = xors( "rocket" ); + return true; + default: + return false; + } + return false; + }; + + //objects + if( is_object( class_id ) ) { + + //wont work + if( ( g_settings.visuals.building_esp == 2 || g_settings.visuals.building_esp == 3 ) && !g_settings.misc.hide_from_obs ) { + //*( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + + if( g_settings.visuals.building_esp == 1 || g_settings.visuals.building_esp == 3 ) { + auto pos = ent->get_abs_origin( ); + auto w2s = util::screen_transform( pos ); + //currently they are not cute + //auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); + draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, + g_settings.visuals.building_esp_clr, name.c_str( ) ); + + //later + + //if( g_settings.visuals.building_owner( ) ) + // draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.building_esp_clr, cutie->get_info( ).name ); + } + } + + + + + //projectiles + if( is_projectile( class_id ) ) { + //wont work + if( ( g_settings.visuals.projectile_esp == 2 || g_settings.visuals.projectile_esp == 3 ) && !g_settings.misc.hide_from_obs ) { + //*( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + + if( g_settings.visuals.projectile_esp == 1 || g_settings.visuals.projectile_esp == 3 ) { + auto pos = ent->get_abs_origin( ); + auto w2s = util::screen_transform( pos ); + //again not cute + //auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); + draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, + g_settings.visuals.projectile_esp_clr, name.c_str( ) ); + + //later when i can be fucked + + //if( g_settings.visuals.building_owner( ) ) + // draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.projectile_esp_clr, cutie->get_info( ).name ); + } + } + + + + + + /*if( class_id == CObjectTeleporter || class_id == CObjectDispenser || class_id == CObjectSentrygun ) { + auto owner = ( int )ent->as< c_base_weapon >( )->m_hBuilder( ) & 0xfff; + if( owner <= 0 || owner > 64 ) { + auto origin = ent->get_render_origin( ); + if( origin ) { + bool draw = g_settings.visuals.grenade_esp( ) == 1; + bool glow = g_settings.visuals.grenade_esp( ) == 2; + + if( draw || g_settings.visuals.grenade_esp == 3 ) { + if( !glow && !g_settings.misc.hide_from_obs ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false; + } + + auto w2s = util::screen_transform( origin ); + auto name = util::object_index_to_name( class_id ); + + draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, + g_settings.visuals.grenade_esp_clr( ), name ); + } + if( ( glow || g_settings.visuals.grenade_esp == 3 ) && !g_settings.misc.hide_from_obs ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + } + } + }*/ + /*else { + if( g_settings.visuals.weapon_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) { + auto model = ent->get_model( ); + if( !model ) continue; + + std::string name = xors( "Rocket" ); + + auto hdr = cl.m_modelinfo( )->GetStudioModel( model ); + if( !hdr ) + continue; + + if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) + continue; + + + + + if( strstr( hdr->name, xors( "JarGas" ) ) ) { + name = xors( "jargas" ); + } + else if( strstr( hdr->name, xors( "Cleaver" ) ) ) { + name = xors( "Cleaver" ); + } + else if( strstr( hdr->name, xors( "JarMilk" ) ) ) { + name = xors( "Milk" ); + } + else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) { + name = xors( "molotov" ); + } + + if( ( g_settings.visuals.weapon_esp == 2 || g_settings.visuals.weapon_esp == 3 ) && !g_settings.misc.hide_from_obs ) { + *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; + } + + if( g_settings.visuals.weapon_esp == 1 || g_settings.visuals.weapon_esp == 3 ) { + auto pos = ent->get_render_origin( ); + auto w2s = util::screen_transform( pos ); + auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); + draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, + g_settings.visuals.grenade_esp_clr, name.c_str( ) ); + + if( g_settings.visuals.grenade_owner( ) ) + draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.grenade_esp_clr, cutie->get_info( ).name ); + } + } + } + }*/ + + } +} + + + void c_visuals::world_modulate( ) { + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials; + static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2; + static c_base_player* local_player = nullptr; + static auto night_mode = false; + static bool modulated = false; + static bool alpha = false; + + if( !g_settings.visuals.world_modulate || !cl.m_engine( )->IsInGame( ) || g_settings.misc.hide_from_obs ) { + modulated = false; + if( !world_materials2.empty( ) ) { + for( auto& it : world_materials2 ) { + auto mat = cl.m_mat_system( )->GetMaterial( it.first ); + if( !mat ) continue; + + auto original_col = it.second; + mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) ); + mat->AlphaModulate( original_col.a( ) ); + } + + world_materials.clear( ); + world_materials2.clear( ); + } + + return; + } + + if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) { + fix_static_props( ); + + if( local_player == g_ctx.m_local && + night_mode == g_settings.visuals.night_mode( ) && + alpha == g_settings.visuals.transparent_props( ) && + modulated == g_settings.visuals.world_modulate( ) ) + return; + + + for( auto i = cl.m_mat_system( )->FirstMaterial( ); + i != cl.m_mat_system( )->InvalidMaterial( ); + i = cl.m_mat_system( )->NextMaterial( i ) ) { + + auto mat = cl.m_mat_system( )->GetMaterial( i ); + if( !mat ) continue; + + const char* group = mat->GetTextureGroupName( ); + bool is_world = strstr( group, xors( "World" ) ); + bool is_sky = strstr( group, xors( "Sky" ) ); + bool is_prop = strstr( group, xors( "StaticProp" ) ); + + if( is_world || is_sky || is_prop ) { + const char* name = mat->GetName( ); + if( world_materials.find( i ) == world_materials.end( ) ) { + fclr_t clr; + + mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) ); + clr.a( ) = mat->GetAlphaModulation( ); + + world_materials.emplace( i, clr ); + world_materials2.emplace( i, clr ); + } + + fclr_t new_color; + + new_color = world_materials2.find( i )->second; + bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate; + + if( is_world ) { + if( apply ) { + new_color.r( ) *= 0.15f; + new_color.g( ) *= 0.15f; + new_color.b( ) *= 0.15f; + } + } + else if( is_prop ) { + if( apply ) { + new_color.r( ) *= 0.3f; + new_color.g( ) *= 0.3f; + new_color.b( ) *= 0.3f; + } + if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) { + new_color.a( ) *= 0.6f; + } + } + else if( is_sky ) { + if( apply ) { + new_color = fclr_t( 0.f, 0.f, 0.f ); + } + } + + if( !( world_materials.at( i ) == new_color ) ) { + mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) ); + mat->AlphaModulate( new_color.a( ) ); + + world_materials.at( i ) = new_color; + } + } + } + + modulated = g_settings.visuals.world_modulate; + night_mode = g_settings.visuals.night_mode; + alpha = g_settings.visuals.transparent_props; + local_player = g_ctx.m_local; + } + } +} \ No newline at end of file diff --git a/cheat/tf2/vmt.h b/cheat/tf2/vmt.h new file mode 100644 index 0000000..f2a39ac --- /dev/null +++ b/cheat/tf2/vmt.h @@ -0,0 +1,79 @@ +#pragma once +#include +#include "util.hpp" + +// todo - dex; rewrite this, VirtualQuery (except for custom codeptr / readptr) and VirtualProtect shouldnt be used +// and we need to copy rtti over too or stuff will break later on + +// correct me if im wrong, but the vtable isnt replaced, instead the original is edited during hooking, rtti should be intact and accessable by game +// class could definetly do with a rewrite tho! + +// ^ you're corrct, but changing page rights and replacing ptrs direclty in rdata (or usually the heap, since thats where vmts go) is not a safe solution +// copying table + aligning it to compensate for rtti is safer +// vac loves scanning memory regions but it doesnt really do much outside of game servers (only loads some shit for checking DEP and stuff) + +// trash + +//llama is a fucking nigger +//true + +namespace hooks +{ + class c_vmt { + uintptr_t* m_table; + uintptr_t* m_original; + std::vector< uintptr_t > m_new; + public: + int count( ) { + int vfunc_count{ }; + + while( m_original[ vfunc_count ] ) { + vfunc_count++; + }; + + return vfunc_count; + } + + c_vmt( void* table ) { + if( !table ) { + return; + } + + this->m_table = reinterpret_cast< uintptr_t* >( table ); + this->m_original = *reinterpret_cast< uintptr_t** >( this->m_table ); + + for( int i = -1; i < this->count( ); ++i ) { + this->m_new.push_back( this->m_original[ i ] ); + } + + auto data = this->m_new.data( ); + *this->m_table = uintptr_t( &data[ 1 ] ); + } + + ~c_vmt( ) { } + + template< typename T = uintptr_t > T get_function( int index ) { + return( ( T )( this->m_new.at( index + 1 ) ) ); + } + + template< typename T = uintptr_t > T get_old_function( int index ) { + return( ( T )( this->m_original[ index ] ) ); + } + + void hook( int index, uintptr_t new_func ) { + this->m_new.at( index + 1 ) = new_func; + } + + void unhook( int index ) { + this->m_new.at( index + 1 ) = this->m_original[ index ]; + } + + void hook( int index, void* new_func ) { + hook( index, reinterpret_cast< uintptr_t >( new_func ) ); + } + + void restore( ) const { + *this->m_table = uintptr_t( m_original ); + } + }; +} \ No newline at end of file diff --git a/cheat/tf2/window_procedure.cpp b/cheat/tf2/window_procedure.cpp new file mode 100644 index 0000000..b67f9bb --- /dev/null +++ b/cheat/tf2/window_procedure.cpp @@ -0,0 +1,59 @@ +#include "hooks.h" +#include "input_system.hpp" +#include "settings.h" + +//im pretty sure half this shit is redundant rn but idrc + + +decltype( &hooks::window_procedure ) hooks::window_procedure_o; +long __stdcall hooks::window_procedure( HWND hwnd, uint32_t msg, uint32_t wparam, long lparam ) { + if( cl.m_panic ) { + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); + } + + if( msg == WM_ACTIVATE && wparam == WA_INACTIVE ) { + g_input.clear_keys( ); + } + + if( msg == WM_MOUSEMOVE ) { + g_input.capture_mouse_move( lparam ); + g_con->get_input( )->capture_mouse_move( lparam ); + } + static auto con_pressed = false; + if( g_con->get_input( )->is_key_pressed( KEYS_HOME ) ) { + if( !con_pressed ) { + if( !g_con->m_open ) { + g_con->m_consuming_input = true; + } + + g_con->m_open ^= 1; + } + con_pressed = true; + } + else con_pressed = false; + + if( g_con->get_input( )->register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) ) { + if( g_con->m_open ) return false; + } + + if( !g_con->m_open ) { + static bool was_pressed = false; + if( g_input.is_key_pressed( KEYS_INSERT ) ) { + if( !was_pressed ) { + g_settings.menu.open ^= 1; + + was_pressed = true; + } + } + else { + was_pressed = false; + } + + if( g_input.register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) + && g_settings.menu.open ) { + return false; + } + } + + return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); +} \ No newline at end of file diff --git a/cheat/tf2/x86.hpp b/cheat/tf2/x86.hpp new file mode 100644 index 0000000..e96c469 --- /dev/null +++ b/cheat/tf2/x86.hpp @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace x86 +{ + enum class reg : size_t { + eax = 0, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + + /* + x64: + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15,*/ + }; + + enum instruction : uint8_t { + retn_imm16 = 0xc2, + retn = 0xc3, + fs = 0x64, + //its big nigga season + call = 0xff + }; + + __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { + return ( 0xb8 + ( size_t( dreg ) ) ); + } + + __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { + return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); + } + + __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { + return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); + } +}; \ No newline at end of file diff --git a/client/client.vcxproj b/client/client.vcxproj deleted file mode 100644 index 12d3dc8..0000000 --- a/client/client.vcxproj +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Debug - Win32 - - - pHit - Win32 - - - pHit - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {E877E475-A428-4FBC-AF71-378AFB92B706} - Win32Proj - client - 10.0.17763.0 - - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - false - - - Application - false - v141 - true - Unicode - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - MultiByte - false - - - Application - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - false - - - false - - - - Level3 - Disabled - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS - true - stdcpp17 - - - true - Console - - - - - Level3 - Disabled - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - true - Console - - - - - Level3 - MaxSpeed - true - true - true - _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - stdcpp17 - - - true - true - true - Console - - - - - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - stdcpp17 - - - true - true - true - Console - - - - - Level3 - MaxSpeed - true - true - true - _CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - stdcpplatest - - - true - true - true - Console - - - - - Level3 - MaxSpeed - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - true - true - true - Console - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/client.vcxproj.filters b/client/client.vcxproj.filters deleted file mode 100644 index a0e485b..0000000 --- a/client/client.vcxproj.filters +++ /dev/null @@ -1,36 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/client/client_windows.cpp b/client/client_windows.cpp deleted file mode 100644 index 7fdd467..0000000 --- a/client/client_windows.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#pragma comment( lib, "ws2_32.lib" ) - -#include "connect.hpp" - -/* - 1. Connect - 2. Send hello message - 3. Receive hello message from server, - 4. Enter and send username - 5. Enter and send password - 6. Send and let server check hardware id. - 7. Recieve list of games. - 8. Select game and send to server - 9. Receive space of dll. - 10. Allocate space for dll. - 11. Send base address of dll. - 12. Server does relocations. - 13. Server sends dll - 14. Client Manual maps dll - 15. Send game module list and possibly PE headers - 16. Server sends back needed module base addresses and possibly size. - 17. Call DLLMain with correct parameters (Included Base Addresses) - 18. In cheat DLLMain set up base addresses and do cheat stuff. -*/ - - - - -// note below is just pseudo unprotected code... -// will make not retarded soon. -int main( ) { - // TEMPORARY, WE NEED TO ENCRYPT IP STRING SO WE DON'T HAVE DDOS NOOBS. - std::string ip = "192.168.0.7"; - // std::cin >> ip; - - // START. - client::c_connect c( ip.c_str( ) ); - if( !c.setup( ) ) - return 1; - - if( !c.connect( ) ) - return 2; - - c.handle( ); - - system( "pause" ); - - return 0; -} diff --git a/client/connect.hpp b/client/connect.hpp deleted file mode 100644 index 96bb9c8..0000000 --- a/client/connect.hpp +++ /dev/null @@ -1,282 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#pragma comment( lib, "ws2_32.lib" ) - -#include - -/* TEST */ -#include -#include -/* TEST */ - -#include "err.hpp" -#include "util.hpp" - -/* -protocol rules: -every msg must be xored -first byte is the xorkey - -*/ - -namespace client -{ - constexpr auto PORT_NUM = 6969; - constexpr auto BUFFER_SIZE = 255; - - class c_connect { - public: - c_connect( const char* ip ) : - m_ip( inet_addr( ip ) ) { } - - ~c_connect( ) { - if( m_socket ) - closesocket( m_socket ); - - WSACleanup( ); - } - - bool setup( ) { - int code{ }; - - if( WSAStartup( MAKEWORD( 2, 2 ), &m_wsdata ) ) - code = err::ERR_WSA; - else { - m_socket = socket( AF_INET, SOCK_STREAM, 0 ); - if( m_socket == INVALID_SOCKET ) - code = err::ERR_WSA; - } - - if( code != err::ERR_NONE ) { - MessageBoxA( nullptr, err::translate_err( code ), "", MB_OK ); - return false; - } - - return true; - } - - bool connect( ) { - sockaddr_in server_address{ }; - int code{ }; - - server_address.sin_addr.s_addr = m_ip; - server_address.sin_port = htons( PORT_NUM ); - server_address.sin_family = AF_INET; - - code = ::connect( m_socket, ( sockaddr* )( &server_address ), - sizeof( server_address ) ); - - if( code == -1 ) { - MessageBoxA( nullptr, err::translate_err( err::ERR_CONNECT ), "", MB_OK ); - return false; - } - - return true; - } - - void decode_buffer( uint8_t* buf, size_t length ) { - auto key = buf[ 0 ]; - for( size_t i{ 1 }; i < length; ++i ) - buf[ i ] ^= key; - } - - std::string get_string( ) { - std::string ret{ }; - char buffer[ BUFFER_SIZE ]; - - - while ( true ) { - int received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); - if ( received < 0 ) - break; - - for ( int i{ }; i < received; ++i ) - ret.push_back( buffer[ i ] ); - - if ( received < BUFFER_SIZE ) - break; - } - - if ( ret.size( ) ) { - decode_buffer( ( uint8_t* )ret.data( ), ret.size( ) ); - ret.erase( ret.begin( ) ); - } - - return ret; - } - - std::vector< uint8_t > get_msg( ) { - std::vector< uint8_t > ret; - char buffer[ BUFFER_SIZE ]; - int received = 0; - - while( true ) { - received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); - if( received < 0 ) - break; - - for( int i{ }; i < received; ++i ) - ret.push_back( buffer[ i ] ); - - if( received < BUFFER_SIZE ) - break; - } - - if( ret.size( ) ) { - decode_buffer( ret.data( ), ret.size( ) ); - ret.erase( ret.begin( ) ); - } - return ret; - } - - void send_msg( const uint8_t* msg, size_t length ) { - auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); - auto key = util::random_number( 0, 255 ) & 0xff; - - buffer[ 0 ] = key; - memcpy( buffer.get( ) + 1, - msg, - length ); - - for( size_t i = 1; i <= length; ++i ) { - buffer[ i ] ^= key; - } - - int ret = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); - if ( ret == SOCKET_ERROR ) { - printf( xors( "error sending message error code: %d" ), WSAGetLastError( ) ); - } - } - - void send_msg( const char* msg ) { - auto length = strlen( msg ); - auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); - auto key = util::random_number( 0, 255 ) & 0xff; - - buffer[ 0 ] = key; - memcpy( buffer.get( ) + 1, - msg, - length ); - - for ( size_t i = 1; i <= length; ++i ) { - buffer[ i ] ^= key; - } - - int ret = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); - if ( ret == SOCKET_ERROR ) { - printf( xors( "error sending message error code: %d" ), WSAGetLastError( ) ); - } - } - - - void send_msg( const char msg ) { - auto buffer = std::make_unique< uint8_t[ ] >( 2 ); - auto key = util::random_number( 0, 255 ) & 0xff; - - buffer[ 0 ] = key; - buffer[ 1 ] = msg; - buffer[ 1 ] ^= buffer[ 0 ]; - - int ret = send( m_socket, ( char* )buffer.get( ), 2, 0 ); - if ( ret == SOCKET_ERROR ) { - printf( xors( "error sending message error code: %d" ), WSAGetLastError( ) ); - } - } - - void handle( ) { - - auto msg = get_string( ); - if ( msg != xors( "hello" ) ) { - std::cout << "connection failed." << std::endl; - //return 0; - } - - send_msg( "hello" ); - - std::string username{ }, password{ }; - std::cout << "Enter your username" << std::endl << "> "; - std::cin >> username; - - send_msg( username.c_str( ) ); - msg = get_string( ); - std::cout < "; - std::cin >> password; - - send_msg( password.c_str( ) ); - if ( get_string( ) != xors( "correct password" ) ) { - std::cout << "incorrect password"; - //return 0; // remember to close connection on server when bad values were sent. - } - - // Receive list of games, - msg = get_string( ); - std::cout << msg << std::endl; - - - std::cout << "For what game do you want to inject on?" << std::endl << "> "; - - char game_id{ }; - std::cin >> game_id; - - send_msg( game_id ); - - // get process name. - msg = get_string( ); - - std::cout << msg << std::endl; - - int process_identifier{ }; - - HANDLE snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); - if ( snapshot != INVALID_HANDLE_VALUE ) { - PROCESSENTRY32 entry{ sizeof( PROCESSENTRY32 ) }; - - if ( Process32First( snapshot, &entry ) ) { - do { - if ( msg == entry.szExeFile ) { - process_identifier = entry.th32ProcessID; - break; - } - } while ( Process32Next( snapshot, &entry ) ); - } - } - - if ( !process_identifier ) { - std::cout << "Could not find process." << std::endl; - return; - } - - std::cout << "found" << std::endl; - send_msg( "found" ); - - auto file = get_msg( ); - auto file_data = file.data( ); - auto file_size = file.size( ); - - auto save_file = std::ofstream( "gmod.txt", std::ofstream::binary ); - if ( save_file.is_open( ) ) { - save_file.write( ( const char* )file_data, file_size ); - save_file.close( ); - } - - - } - - private: - SOCKET m_socket; - WSADATA m_wsdata; - int m_ip; - }; -} \ No newline at end of file diff --git a/client/err.hpp b/client/err.hpp deleted file mode 100644 index 5a6691d..0000000 --- a/client/err.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once -#include "strings.hpp" - -namespace err -{ - enum ErrCode_t { - ERR_NONE = 0, - ERR_WSA = 1, - ERR_CONNECT = 2, - }; - - const char* translate_err( int code ) { - switch( code ) { - case ERR_WSA: - return xors( "socket error" ); - case ERR_CONNECT: - return xors( "connection error" ); - } - - return xors( "unknown error" ); - } -} \ No newline at end of file diff --git a/client/strings.hpp b/client/strings.hpp deleted file mode 100644 index b5dba75..0000000 --- a/client/strings.hpp +++ /dev/null @@ -1,163 +0,0 @@ -//-------------------------------------------------------------------------------- -//-- XorCompileTime.hpp -// -// Author: frk -// Date: 12.12.2015 -// -//-------------------------------------------------------------------------------- - -#pragma once -#include -#include -#include - -#define BEGIN_NAMESPACE( x ) namespace x { -#define END_NAMESPACE } - -BEGIN_NAMESPACE( strenc ) - -constexpr auto time = __TIME__; -constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; - -// 1988, Stephen Park and Keith Miller -// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" -// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: -// with 32-bit math and without division - -template < int N > -struct RandomGenerator { -private: - static constexpr unsigned a = 16807; // 7^5 - static constexpr unsigned m = 2147483647; // 2^31 - 1 - - static constexpr unsigned s = RandomGenerator< N - 1 >::value; - static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 - static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 - static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits - static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi - static constexpr unsigned lo3 = lo2 + hi; - -public: - static constexpr unsigned max = m; - static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; -}; - -template <> -struct RandomGenerator< 0 > { - static constexpr unsigned value = seed; -}; - -template < int N, int M > -struct RandomInt { - static constexpr auto value = RandomGenerator< N + 1 >::value % M; -}; - -template < int N > -struct RandomChar { - static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); -}; - -template < size_t N, int K > -struct XorString { -private: - const char _key; - std::array< char, N + 1 > _encrypted; - bool decrypted = false; - - constexpr char enc( char c ) const { - return c ^ _key; - } - - char dec( char c ) const { - return c ^ _key; - } - -public: - template < size_t... Is > - constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { - } - - __forceinline const char* decrypt( void ) { - if( !decrypted ) { - for( size_t i = 0; i < N; ++i ) { - _encrypted[ i ] = dec( _encrypted[ i ] ); - } - _encrypted[ N ] = '\0'; - decrypted = true; - } - - return _encrypted.data( ); - } -}; - -//-------------------------------------------------------------------------------- -//-- Note: XorStr will __NOT__ work directly with functions like printf. -// To work with them you need a wrapper function that takes a const char* -// as parameter and passes it to printf and alike. -// -// The Microsoft Compiler/Linker is not working correctly with variadic -// templates! -// -// Use the functions below or use std::cout (and similar)! -//-------------------------------------------------------------------------------- - -#if( 1 ) -static auto w_printf = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_printf_s = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf( buf, fmt, args ); - va_end( args ); -}; - -static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf_s( buf, buf_size, fmt, args ); - va_end( args ); -}; -#endif - -//for compatibility with debug mode -struct debug_ret { -private: - const char* ret; - -public: - debug_ret( const char* str ) : ret( str ) { }; - - auto decrypt( ) { - return ret; - } -}; - -constexpr size_t strlen_ct( const char* const str ) { - size_t out = 1; - - for( ; str[ out ] != '\0'; ++out ); - - return out; -} - -#if TRUE -#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) -#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) -#else -#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) -#define xors( s ) ( s ) -#endif - -END_NAMESPACE \ No newline at end of file diff --git a/client/util.hpp b/client/util.hpp deleted file mode 100644 index 8e7d549..0000000 --- a/client/util.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#include - -namespace util -{ - namespace { - //make a random generator and seed it with a p random number - static std::random_device rd; - static std::mt19937 gen( rd( ) ); - } - - template < typename t > - __forceinline t random_number( t min, t max ) { - if constexpr( !std::is_integral_v< t > ) { - std::uniform_real_distribution< t > dist( min, max ); - return dist( gen ); - } - else { - std::uniform_int_distribution< t > dist( min, max ); - return dist( gen ); - } - } -} \ No newline at end of file diff --git a/enc_file/enc_file.vcxproj b/enc_file/enc_file.vcxproj deleted file mode 100644 index f6f6299..0000000 --- a/enc_file/enc_file.vcxproj +++ /dev/null @@ -1,179 +0,0 @@ - - - - - Debug - Win32 - - - pHit - Win32 - - - pHit - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8} - encfile - 10.0.16299.0 - - - - Application - true - v141 - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - true - v141 - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - false - v141 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - Disabled - true - true - - - - - Level3 - Disabled - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - - - - - \ No newline at end of file diff --git a/enc_file/enc_file.vcxproj.filters b/enc_file/enc_file.vcxproj.filters deleted file mode 100644 index 9fa84c5..0000000 --- a/enc_file/enc_file.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - \ No newline at end of file diff --git a/enc_file/source.cpp b/enc_file/source.cpp deleted file mode 100644 index 9056764..0000000 --- a/enc_file/source.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include - -int main( ) { - uint8_t key{ }; - std::cin >> key; - printf( "key: %d", key ); - - auto file = CreateFileA( "./enc.dll", GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0 ); - if( !file ) return 0; - - auto size = GetFileSize( file, 0 ); - if( !size ) { - CloseHandle( file ); - return 0; - } - - uint8_t* data = ( uint8_t* )( malloc( size ) ); - if( !ReadFile( file, data, size, 0, 0 ) ) { - CloseHandle( file ); - free( data ); - return 0; - } - - CloseHandle( file ); - - for( size_t i{ }; i < size; ++i ) { - data[ i ] ^= key; - } - - data[ 0 ] = 'c'; - data[ 1 ] = 'd'; - - FILE* f; - fopen_s( &f, "./out.dll", "wb" ); - fwrite( data, 1, size, f ); - fclose( f ); - - return 0; -} \ No newline at end of file diff --git a/gmod/CHLClient.hpp b/gmod/CHLClient.hpp deleted file mode 100644 index 4ed244c..0000000 --- a/gmod/CHLClient.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#pragma once -#include "util.hpp" -#include "IClientEntityList.hpp" -#include "ClientClass.hpp" -#include "color.hpp" - -enum ClientFrameStage_t { - FRAME_UNDEFINED = -1, - FRAME_START, - FRAME_NET_UPDATE_START, - FRAME_NET_UPDATE_POSTDATAUPDATE_START, - FRAME_NET_UPDATE_POSTDATAUPDATE_END, - FRAME_NET_UPDATE_END, - FRAME_RENDER_START, - FRAME_RENDER_END -}; - -struct GlowObject_t { - IClientEntity* m_pEntity; - fclr_t color; - char junk0[ 8 ]; - float m_flBloomAmount; - char junk1[ 4 ]; - bool m_bRenderWhenOccluded; - bool m_bRenderWhenUnoccluded; - bool m_bFullBloom; - char junk2[ 14 ]; -}; - -struct GlowObjectManager_t { - GlowObject_t* DataPtr; //0000 - unsigned int Max; //0004 - unsigned int unk02; //0008 - unsigned int Count; //000C - unsigned int DataPtrBack; //0010 - int m_nFirstFreeSlot; //0014 - unsigned int unk1; //0018 - unsigned int unk2; //001C - unsigned int unk3; //0020 - unsigned int unk4; //0024 - unsigned int unk5; //0028 -}; - -class IBaseClientDLL -{ -public: - ClientClass* GetAllClasses( ) { - using fn = ClientClass*( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 8 )( this ); - } - - /* - DONTCARE - void SetCrosshairAngle( Vector& angle ) - { - typedef void( __thiscall* SetCrosshairAngleFn )( void*, Vector& ); - CallVFunction( this, 29 )( this, angle ); - } - - void HudProcessInput( bool enable ) - { - using fn = void( __thiscall* )( void*, bool ); - CallVFunction( this, 10 )( this, enable ); - } - - void HudUpdate( bool enable ) - { - using fn = void( __thiscall* )( void*, bool ); - CallVFunction( this, 11 )( this, enable ); - } - - void IN_ActivateMouse( ) - { - using fn = void( __thiscall* )( void* ); - CallVFunction( this, 15 )( this ); - } - - void IN_DeactivateMouse( ) - { - using fn = void( __thiscall* )( void* ); - CallVFunction( this, 16 )( this ); - }*/ -}; \ No newline at end of file diff --git a/gmod/CInput.hpp b/gmod/CInput.hpp deleted file mode 100644 index 613b849..0000000 --- a/gmod/CInput.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once -#include "vector.hpp" -#include "IClientMode.hpp" - -class CInput { - void* pvftable; //0x00 -public: - bool m_fTrackIRAvailable; //0x04 - bool m_fMouseInitialized; //0x05 - bool m_fMouseActive; //0x06 - bool m_fJoystickAdvancedInit; //0x07 -private: - char pad_0x08[ 0x2C ]; //0x08 -public: - void* m_pKeys; //0x34 -private: - char pad_0x38[ 0x64 ]; //0x38 - int pad_0x41; - int pad_0x42; -public: - bool m_fCameraInterceptingMouse; //0x9C - bool m_fCameraInThirdPerson; //0x9D - bool m_fCameraMovingWithMouse; //0x9E - vec3_t m_vecCameraOffset; //0xA0 - bool m_fCameraDistanceMove; //0xAC - int m_nCameraOldX; //0xB0 - int m_nCameraOldY; //0xB4 - int m_nCameraX; //0xB8 - int m_nCameraY; //0xBC - bool m_CameraIsOrthographic; //0xC0 - vec3_t m_angPreviousViewAngles; //0xC4 - vec3_t m_angPreviousViewAnglesTilt; //0xD0 - float m_flLastForwardMove; //0xDC - int m_nClearInputState; //0xE0 -private: - char pad_0xE4[ 0x8 ]; //0xE4 -public: - user_cmd_t* m_pCommands; //0xEC - void* m_pVerifiedCommands; //0xF0 - - user_cmd_t* GetUserCmd( int slot, int seq_num ) { - return util::get_vfunc< 8, user_cmd_t* >( this, slot, seq_num ); - } -}; diff --git a/gmod/CLuaInterface.hpp b/gmod/CLuaInterface.hpp deleted file mode 100644 index adc0f7b..0000000 --- a/gmod/CLuaInterface.hpp +++ /dev/null @@ -1,246 +0,0 @@ -#pragma once - -#include -#include - -#include "vector.hpp" -#include "color.hpp" - -#define LUA_REGISTRYINDEX (-10000) -#define LUA_ENVIRONINDEX (-10001) -#define LUA_GLOBALSINDEX (-10002) - -class CLuaInterface; - -enum STATE_TYPE -{ - LUA_CLIENT = 0, - LUA_SERVER, - LUA_MENU -}; - - -enum LUA_SPECIAL -{ - SPECIAL_GLOB, - SPECIAL_ENV, - SPECIAL_REG, -}; - - -enum LUA_TYPE : int8_t { - TYPE_INVALID = -1, - TYPE_NIL, - TYPE_BOOL, - TYPE_LIGHTUSERDATA, - TYPE_NUMBER, - _TYPE_STRING, - TYPE_TABLE, - TYPE_FUNCTION, - TYPE_USERDATA, - TYPE_THREAD, - - TYPE_ENTITY, - TYPE_VECTOR, - TYPE_ANGLE, - TYPE_PHYSOBJ, - TYPE_SAVE, - TYPE_RESTORE, - TYPE_DAMAGEINFO, - TYPE_EFFECTDATA, - TYPE_MOVEDATA, - TYPE_RECIPIENTFILTER, - TYPE_USERCMD, - TYPE_SCRIPTEDVEHICLE, - - TYPE_MATERIAL, - TYPE_PANEL, - TYPE_PARTICLE, - TYPE_PARTICLEEMITTER, - TYPE_TEXTURE, - TYPE_USERMSG, - - TYPE_CONVAR, - TYPE_IMESH, - TYPE_MATRIX, - TYPE_SOUND, - TYPE_PIXELVISHANDLE, - TYPE_DLIGHT, - TYPE_VIDEO, - TYPE_FILE, - - TYPE_COUNT, - - TYPE_PLAYER = TYPE_ENTITY, -}; - -struct lua_State -{ - uint8_t header[ 69 ]; - CLuaInterface* m_lua_base; -}; - -struct UserData -{ - void* data; - LUA_TYPE type; -}; - -using CLuaFunction = int( __cdecl* )( lua_State* ); - -class CLuaInterface -{ -public: - virtual int Top( void ) = 0; - virtual void Push( int iStackPos ) = 0; - virtual void Pop( int iAmt = 1 ) = 0; - virtual void GetTable( int iStackPos ) = 0; - virtual void GetField( int iStackPos, const char* strName ) = 0; - virtual void SetField( int iStackPos, const char* strName ) = 0; - virtual void CreateTable( ) = 0; - virtual void SetTable( int i ) = 0; - virtual void SetMetaTable( int i ) = 0; - virtual bool GetMetaTable( int i ) = 0; - virtual void Call( int iArgs, int iResults ) = 0; - virtual int PCall( int iArgs, int iResults, int iErrorFunc ) = 0; - virtual int Equal( int iA, int iB ) = 0; - virtual int RawEqual( int iA, int iB ) = 0; - virtual void Insert( int iStackPos ) = 0; - virtual void Remove( int iStackPos ) = 0; - virtual int Next( int iStackPos ) = 0; - virtual void* NewUserdata( unsigned int iSize ) = 0; - virtual void ThrowError( const char* strError ) = 0; - virtual void CheckType( int iStackPos, int iType ) = 0; - virtual void ArgError( int iArgNum, const char* strMessage ) = 0; - virtual void RawGet( int iStackPos ) = 0; - virtual void RawSet( int iStackPos ) = 0; - - virtual const char* GetString( int iStackPos = -1, unsigned int* iOutLen = NULL ) = 0; - virtual double GetNumber( int iStackPos = -1 ) = 0; - virtual bool GetBool( int iStackPos = -1 ) = 0; - virtual CLuaFunction* GetCFunction( int iStackPos = -1 ) = 0; - virtual void* GetUserdata( int iStackPos = -1 ) = 0; - - virtual void PushNil( ) = 0; - virtual void PushString( const char* val, unsigned int iLen = 0 ) = 0; - virtual void PushNumber( double val ) = 0; - virtual void PushBool( bool val ) = 0; - virtual void PushCFunction( CLuaFunction* val ) = 0; - virtual void PushCClosure( CLuaFunction* val, int iVars ) = 0; - virtual void PushUserdata( void* ) = 0; - - // - // If you create a reference - don't forget to free it! - // - virtual int ReferenceCreate( ) = 0; - virtual void ReferenceFree( int i ) = 0; - virtual void ReferencePush( int i ) = 0; - - // - // Push a special value onto the top of the stack ( see below ) - // - virtual void PushSpecial( int iType ) = 0; - - // - // For type enums see Types.h - // - virtual bool IsType( int iStackPos, int iType ) = 0; - virtual int GetType( int iStackPos ) = 0; - virtual const char* GetTypeName( int iType ) = 0; - - // - // Creates a new meta table of string and type and leaves it on the stack. - // Will return the old meta table of this name if it already exists. - // - virtual void CreateMetaTableType( const char* strName, int iType ) = 0; - - // - // Like Get* but throws errors and returns if they're not of the expected type - // - virtual const char* CheckString( int iStackPos = -1 ) = 0; - virtual double CheckNumber( int iStackPos = -1 ) = 0; - - - virtual void ObjLen( int ) = 0; - virtual void GetAngle( int ) = 0; - virtual void GetVector( int ) = 0; - virtual void PushAngle( vec3_t const& ) = 0; - virtual void PushVector( vec3_t const& ) = 0; - virtual void SetState( lua_State * ) = 0; - virtual void CreateMetaTable( char const* ) = 0; - virtual void PushMetaTable( int ) = 0; - virtual void PushUserType( void *, int ) = 0; - virtual void SetUserType( int, void * ) = 0; - virtual void Init( void *, bool ) = 0; - virtual void Shutdown( void ) = 0; - virtual void Cycle( void ) = 0; - virtual void Global( void ) = 0; - virtual void* GetObject( int ) = 0; - virtual void PushLuaObject( void * ) = 0; - virtual void PushLuaFunction( CLuaFunction ) = 0; - virtual void LuaError( char const*, int ) = 0; - virtual void TypeError( char const*, int ) = 0; - virtual void CallInternal( int, int ) = 0; - virtual void CallInternalNoReturns( int ) = 0; - virtual void CallInternalGetBool( int ) = 0; - virtual void CallInternalGetString( int ) = 0; - virtual void CallInternalGet( int, void * ) = 0; - virtual void NewGlobalTable( char const* ) = 0; - virtual void NewTemporaryObject( void ) = 0; - virtual void isUserData( int ) = 0; - virtual void GetMetaTableObject( char const*, int ) = 0; - virtual void GetMetaTableObject( int ) = 0; - virtual void GetReturn( int ) = 0; - virtual void IsServer( void ) = 0; - virtual void IsClient( void ) = 0; - virtual void IsDedicatedServer( void ) = 0; - virtual void DestroyObject( void * ) = 0; - virtual void CreateObject( void ) = 0; - virtual void SetMember( void *, void *, void * ) = 0; - virtual void GetNewTable( void ) = 0; - virtual void SetMember( void *, float ) = 0; - virtual void SetMember( void *, float, void * ) = 0; - virtual void SetMember( void *, char const* ) = 0; - virtual void SetMember( void *, char const*, void * ) = 0; - virtual void SetIsServer( bool ) = 0; - virtual void PushLong( long ) = 0; - virtual void GetFlags( int ) = 0; - virtual void FindOnObjectsMetaTable( int, int ) = 0; - virtual void FindObjectOnTable( int, int ) = 0; - virtual void SetMemberFast( void *, int, int ) = 0; - virtual void RunString( char const* filename, char const* path, char const* stringtoun, bool run = true, bool showerrors = true ) = 0; - virtual void IsEqual( void *, void * ) = 0; - virtual void Error( char const* ) = 0; - virtual void GetStringOrError( int ) = 0; - virtual void RunLuaModule( char const* ) = 0; - virtual void FindAndRunScript( const char* path, bool run = true, bool showerrors = true, const char* type = "!CLIENT" ) = 0; - virtual void SetPathID( char const* ) = 0; - virtual void GetPathID( void ) = 0; - virtual void ErrorNoHalt( char const*, ... ) = 0; - virtual void Msg( char const*, ... ) = 0; - virtual void PushPath( char const* ) = 0; - virtual void PopPath( void ) = 0; - virtual void GetPath( void ) = 0; - virtual void GetColor( int ) = 0; - virtual void PushColor( clr_t ) = 0; - virtual int GetStack( int, void * ) = 0; - virtual void GetInfo( char const*, void * ) = 0; - virtual void GetLocal( void *, int ) = 0; - virtual void GetUpvalue( int, int ) = 0; - virtual void RunStringEx( void*, char const* filename, char const* path, char const* torun, bool run, bool showerrors, bool idk, bool idk2 ) = 0; - virtual void GetDataString( int, void ** ) = 0; - virtual void ErrorFromLua( char const*, ... ) = 0; - virtual void GetCurrentLocation( void ) = 0; - virtual void MsgColour( clr_t const&, char const*, ... ) = 0; - virtual void GetCurrentFile( std::string & ) = 0; - virtual void CompileString( int &, std::string const& ) = 0; - virtual void CallFunctionProtected( int, int, bool ) = 0; - virtual void Require( char const* ) = 0; - virtual void GetActualTypeName( int ) = 0; - virtual void PreCreateTable( int, int ) = 0; - virtual void PushPooledString( int ) = 0; - virtual void GetPooledString( int ) = 0; - virtual void AddThreadedCall( void * ) = 0; - - lua_State* L; -}; diff --git a/gmod/CLuaShared.hpp b/gmod/CLuaShared.hpp deleted file mode 100644 index 1a46e74..0000000 --- a/gmod/CLuaShared.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "CLuaInterface.hpp" - -class CLuaShared -{ -public: - virtual ~CLuaShared( ); - virtual void Init( ); - virtual void ShutDown( ); - virtual void DumpStats( ); - virtual CLuaInterface* CreateLuaInterface( STATE_TYPE, bool ); - virtual void CloseLuaInterface( CLuaInterface* ); - virtual CLuaInterface* GetLuaInterface( STATE_TYPE ); -}; \ No newline at end of file diff --git a/gmod/CUtlVector.hpp b/gmod/CUtlVector.hpp deleted file mode 100644 index a212270..0000000 --- a/gmod/CUtlVector.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -template -class CUtlMemory { -public: - T* GetBuffer( void ) { - return m_pMemory; - } - - int GetAllocationCount( void ) { - return m_nAllocationCount; - } - - int GetGrowSize( void ) { - return m_nGrowSize; - } - - T* OffsetBufferByIndex( size_t index ) { - return m_pMemory + index; - } - -private: - T* m_pMemory; - int m_nAllocationCount; - int m_nGrowSize; -}; - -template > -class CUtlVector { -public: - Allocator GetMemory( void ) { - return m_Memory; - } - - int GetSize( void ) { - return m_Size; - } - - T* GetElements( void ) { - return m_pElements; - } - -private: - Allocator m_Memory; - int m_Size; - T* m_pElements; -}; \ No newline at end of file diff --git a/gmod/ClientClass.hpp b/gmod/ClientClass.hpp deleted file mode 100644 index b1d69dd..0000000 --- a/gmod/ClientClass.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include "Valve/dt_common.h" -#include "Valve/dt_recv.h" - - -class ClientClass { -public: - void* m_create_fn; - void* m_createevent_fn; - char* m_name; - RecvTable* m_rt_table; - ClientClass* m_next; - int m_class_id; -}; \ No newline at end of file diff --git a/gmod/GlobalVars_t.hpp b/gmod/GlobalVars_t.hpp deleted file mode 100644 index 820fe0d..0000000 --- a/gmod/GlobalVars_t.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -class global_vars_t { -public: - float m_realtime; - int m_framecount; - float m_absframetime; - float m_curtime; - float m_frametime; - int m_maxclients; - int m_tickcount; - float m_interval_per_tick; - float m_interpolation_amount; - int m_sim_ticks; - int m_network_protocol; -}; \ No newline at end of file diff --git a/gmod/IAppSystem.hpp b/gmod/IAppSystem.hpp deleted file mode 100644 index a8cf475..0000000 --- a/gmod/IAppSystem.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -class AppSystemInfo_t; - -enum InitReturnVal_t; - -enum AppSystemTier_t { - APP_SYSTEM_TIER0 = 0, - APP_SYSTEM_TIER1, - APP_SYSTEM_TIER2, - APP_SYSTEM_TIER3, - - APP_SYSTEM_TIER_OTHER, -}; - - -class IAppSystem { -public: - virtual bool Connect( void* factory ) = 0; - virtual void Disconnect( ) = 0; - virtual void* QueryInterface( const char* pInterfaceName ) = 0; - virtual InitReturnVal_t Init( ) = 0; - virtual void Shutdown( ) = 0; -}; \ No newline at end of file diff --git a/gmod/IClientEntityList.hpp b/gmod/IClientEntityList.hpp deleted file mode 100644 index 2a0ac28..0000000 --- a/gmod/IClientEntityList.hpp +++ /dev/null @@ -1,144 +0,0 @@ -#pragma once -#include "util.hpp" -#include "vector.hpp" -#include "ClientClass.hpp" -#include "IVEngineClient.hpp" - -class ICollideable; -class IClientNetworkable; -class IClientRenderable; -class IClientThinkable; -class IClientEntity; -class IClientAlphaProperty; -class bf_read; -using model_t = uintptr_t; - - -class c_base_player; - -class IClientUnknown { -public: - virtual ICollideable* GetCollideable( ) = 0; - virtual IClientNetworkable* GetClientNetworkable( ) = 0; - virtual IClientRenderable* GetClientRenderable( ) = 0; - virtual IClientEntity* GetIClientEntity( ) = 0; - virtual IClientEntity* GetBaseEntity( ) = 0; - virtual IClientThinkable* GetClientThinkable( ) = 0; - //virtual IClientModelRenderable* GetClientModelRenderable() = 0; - virtual IClientAlphaProperty* GetClientAlphaProperty( ) = 0; -}; - -class IClientNetworkable { -public: - virtual IClientUnknown* GetIClientUnknown( ) = 0; - virtual void Release( ) = 0; - virtual ClientClass* GetClientClass( ) = 0; - virtual void NotifyShouldTransmit( int state ) = 0; - virtual void OnPreDataChanged( int updateType ) = 0; - virtual void OnDataChanged( int updateType ) = 0; - virtual void PreDataUpdate( int updateType ) = 0; - virtual void PostDataUpdate( int updateType ) = 0; - virtual bool IsDormant( void ) = 0; - virtual int EntIndex( void ) const = 0; - virtual void ReceiveMessage( int classID, bf_read& msg ) = 0; - virtual void* GetDataTableBasePtr( ) = 0; - virtual void SetDestroyedOnRecreateEntities( void ) = 0; -}; - -class IClientEntity { -public: - void* GetClientRenderable( ) { - return reinterpret_cast< void* >( this + 0x4 ); - } - - IClientNetworkable* GetClientNetworkable( ) { - return reinterpret_cast< IClientNetworkable* >( this + 0x8 ); - } - - ICollideable* GetCollideable( ) { - using fn = ICollideable* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 2 )( this ); - } - - vec3_t& GetRenderOrigin( ) { - using fn = vec3_t& ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 9 )( this ); - } - - vec3_t& GetRenderAngles( ) { - using fn = vec3_t& ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 10 )( this ); - } - - ClientClass* GetClientClass( ) { - try { - return GetClientNetworkable( )->GetClientClass( ); - } - catch( ... ) { - return 0; - } - } - - bool IsDormant( ) { - return GetClientNetworkable( )->IsDormant( ); - } - - int GetIndex( ) { - return GetClientNetworkable( )->EntIndex( ); - } - - model_t* GetModel( ) { - using fn = model_t* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this->GetClientRenderable( ), 9 )( this->GetClientRenderable( ) ); - } - - int DrawModel( int flags, uint8_t alpha ) { - using fn = int( __thiscall* )( void*, int, uint8_t ); - return util::get_vfunc< fn >( this->GetClientRenderable( ), 10 )( this->GetClientRenderable( ), flags, alpha ); - } - - bool SetupBones( matrix3x4* bone_to_world, int max_bones, int mask, float time ) { - using fn = bool( __thiscall* )( void*, matrix3x4*, int, int, float ); - return util::get_vfunc< fn >( GetClientRenderable( ), 16 ) - ( GetClientRenderable( ), bone_to_world, max_bones, mask, time ); - } - - void PushEntity( ) { - return util::get_vfunc< 172, void >( this ); - } - - bool IsWeapon( ) { - return util::get_vfunc< 167, bool >( this ); - } - - template < typename t > - t* as( ) { - return reinterpret_cast< t* >( this ); - } -}; - -class IClientEntityList -{ -public: - IClientNetworkable* GetClientNetworkable( int index ) { - using fn = IClientNetworkable* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 1 )( this, index ); - } - - template < typename t = c_base_player > - t* GetClientEntity( int index ) { - using fn = t* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 3 )( this, index ); - } - - template < typename t = c_base_player > - t* GetClientEntityFromHandle( uint32_t handle ) { - using fn = t* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 4 )( this, handle ); - } - - int GetHighestEntityIndex( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 6 )( this ); - } -}; \ No newline at end of file diff --git a/gmod/IClientMode.hpp b/gmod/IClientMode.hpp deleted file mode 100644 index 4996af6..0000000 --- a/gmod/IClientMode.hpp +++ /dev/null @@ -1,139 +0,0 @@ -#pragma once -#include "util.hpp" -#include "vector.hpp" - -enum player_controls_t { - IN_ATTACK = 1 << 0, - IN_JUMP = 1 << 1, - IN_DUCK = 1 << 2, - IN_FORWARD = 1 << 3, - IN_BACK = 1 << 4, - IN_USE = 1 << 5, - IN_CANCEL = 1 << 6, - IN_LEFT = 1 << 7, - IN_RIGHT = 1 << 8, - IN_MOVELEFT = 1 << 9, - IN_MOVERIGHT = 1 << 10, - IN_ATTACK2 = 1 << 11, - IN_RUN = 1 << 12, - IN_RELOAD = 1 << 13, - IN_ALT1 = 1 << 14, - IN_ALT2 = 1 << 15, - IN_SCORE = 1 << 16, - IN_SPEED = 1 << 17, - IN_WALK = 1 << 18, - IN_ZOOM = 1 << 19, - IN_WEAPON1 = 1 << 20, - IN_WEAPON2 = 1 << 21, - IN_BULLRUSH = 1 << 22, - IN_GRENADE1 = 1 << 23, - IN_GRENADE2 = 1 << 24, - IN_ATTACK3 = 1 << 25, -}; - -class user_cmd_t { -public: - int m_cmd_nr; // 0x0 virtual deconstructor removed - int m_tick_count; // 0x4 - vec3_t m_viewangles; // 0x8 - float m_forwardmove; // 0x14 - float m_sidemove; // 0x18 - float m_upmove; // 0x1C - int m_buttons; // 0x20 - uint8_t m_impulse; // 0x24 - int m_weaponselect; // 0x25 - int m_weaponsubtype; // 0x29 - int m_random_seed; // 0x2D - short m_mousedx; // 0x31 - short m_mousedy; // 0x33 - bool m_predicted; // 0x35 -private: - uint8_t m_pad_0x36[ 0x6 ]; // 0x36 -public: - bool m_world_clicking; // 0x3F - vec3_t m_world_click_direction; // 0x40 - - - __forceinline user_cmd_t clamp( ) { - m_viewangles.clamp( ); - - m_forwardmove = std::clamp( m_forwardmove, -10000.f, 10000.f ); - m_sidemove = std::clamp( m_sidemove, -10000.f, 10000.f ); - m_upmove = std::clamp( m_upmove, -10000.f, 10000.f ); - - return *this; - } - -private: - uint8_t m_pad_0x52[ 0xF2 ]; // 0x52 sizeof( user_cmd_t ) = 0x144 HUGE in gmod -}; - -class CHudChat { -public: - void ChatPrintf( int iPlayerIndex, int iFilter, const char* fmt ) { - using fn = void( __cdecl* )( void*, int, int, const char* ); - util::get_vfunc< fn >( this, 26 )( this, iPlayerIndex, iFilter, fmt ); - } -}; - -enum StereoEye_t -{ - STEREO_EYE_MONO = 0, - STEREO_EYE_LEFT = 1, - STEREO_EYE_RIGHT = 2, - STEREO_EYE_MAX = 3, -}; - - -class CViewSetup -{ -public: - int x; - int m_nUnscaledX; - int y; - int m_nUnscaledY; - int width; - int m_nUnscaledWidth; - int height; - StereoEye_t m_eStereoEye; - int m_nUnscaledHeight; - - bool m_bOrtho; - float m_OrthoLeft; - float m_OrthoTop; - float m_OrthoRight; - float m_OrthoBottom; - - float fov; - float fovViewmodel; - - vec3_t origin; - - vec3_t angles; - float zNear; - float zFar; - - float zNearViewmodel; - float zFarViewmodel; - - bool m_bRenderToSubrectOfLargerScreen; - float m_flAspectRatio; - - bool m_bOffCenter; - float m_flOffCenterTop; - float m_flOffCenterBottom; - float m_flOffCenterLeft; - float m_flOffCenterRight; - - bool m_bDoBloomAndToneMapping; - bool m_bCacheFullSceneState; - bool m_bViewToProjectionOverride; -}; - - -class IClientMode { -public: - char _pad[ 28 ]; - - CHudChat* m_pChatElement; //0x2A -}; \ No newline at end of file diff --git a/gmod/ICvar.hpp b/gmod/ICvar.hpp deleted file mode 100644 index 8cdfca9..0000000 --- a/gmod/ICvar.hpp +++ /dev/null @@ -1,206 +0,0 @@ -#pragma once -#include "IAppSystem.hpp" -#include "util.hpp" -#include "color.hpp" - -using CVarDLLIdentifier_t = int; -class IConVar; -using FnChangeCallback_t = void( *)( IConVar *var, const char *pOldValue, float flOldValue ); -class ConCommandBase; -class ConCommand; -class ICvarQuery; - -class IConsoleDisplayFunc { -public: - virtual void ColorPrint( const uint8_t* clr, const char *pMessage ) = 0; - virtual void Print( const char *pMessage ) = 0; - virtual void DPrint( const char *pMessage ) = 0; -}; - -#define FCVAR_NONE 0 - -// Command to ConVars and ConCommands -// ConVar Systems -#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. -#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined. -#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL -#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL -#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out. - -// ConVar only -#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value -#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. -#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc -#define FCVAR_NOTIFY (1<<8) // notifies players when changed -#define FCVAR_USERINFO (1<<9) // changes the client's info string -#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats - -#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). -#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log -#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar - -// It's a ConVar that's shared between the client and the server. -// At signon, the values of all such ConVars are sent from the server to the client (skipped for local -// client, of course ) -// If a change is requested it must come from the console (i.e., no remote client changes) -// If a value is changed while a server is active, it's replicated to all connected clients -#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time -#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file -#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles -#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload -#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload - -#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server -#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread -#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox - -#define FCVAR_ACCESSIBLE_FROM_THREADS (1<<25) // used as a debugging tool necessary to check material system thread convars - -#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd. -#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue). -#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command. - - -class cvar_t { -public: - void set_value( const char* value ) { - using fn = void( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 14 )( this, value ); - } - - void set_value( float value ) { - using fn = void( __thiscall* )( void*, float ); - return util::get_vfunc< fn >( this, 15 )( this, value ); - } - - void set_value( int value ) { - using fn = void( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 16 )( this, value ); - } - - void set_value( clr_t value ) { - using fn = void( __thiscall* )( void*, clr_t ); - return util::get_vfunc< fn >( this, 17 )( this, value ); - } - - char* get_name( ) { - using fn = char*( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 5 )( this ); - } - - char* get_default( ) { - return m_default; - } - - const char* get_string( ) { - return m_string; - } - - float get_float( ) { - using fn = float( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 12 )( this ); - } - - int get_int( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 13 )( this ); - } - -private: - char pad_0x0000[ 0x4 ]; //0x0000 -public: - cvar_t* m_next; //0x0004 - __int32 m_registered; //0x0008 - char* m_name; //0x000C - char* m_help_str; //0x0010 - __int32 m_flags; //0x0014 -private: - char pad_0x0018[ 0x4 ]; //0x0018 -public: - cvar_t* m_parent; //0x001C - char* m_default; //0x0020 - char* m_string; //0x0024 - __int32 m_str_len; //0x0028 - float m_flvalue; //0x002C - __int32 m_nvalue; //0x0030 - __int32 m_has_min; //0x0034 - float m_min; //0x0038 - __int32 m_hax_max; //0x003C - float m_max; //0x0040 - void* m_change_callback; //0x0044 -};//Size=0x0048 - -class ICVar : public IAppSystem -{ -public: - // Allocate a unique DLL identifier - virtual CVarDLLIdentifier_t AllocateDLLIdentifier( ) = 0; - - // Register, unregister commands - virtual void RegisterConCommand( ConCommandBase *pCommandBase ) = 0; - virtual void UnregisterConCommand( ConCommandBase *pCommandBase ) = 0; - virtual void UnregisterConCommands( CVarDLLIdentifier_t id ) = 0; - - // If there is a + on the command line, this returns the value. - // Otherwise, it returns NULL. - virtual const char* GetCommandLineValue( const char *pVariableName ) = 0; - - // Try to find the cvar pointer by name - virtual ConCommandBase* FindCommandBase( const char *name ) = 0; - virtual const ConCommandBase* FindCommandBase( const char *name ) const = 0; - virtual cvar_t *FindVar( const char *var_name ) = 0; - virtual const cvar_t *FindVar( const char *var_name ) const = 0; - virtual ConCommand *FindCommand( const char *name ) = 0; - virtual const ConCommand *FindCommand( const char *name ) const = 0; - - - - // Install a global change callback (to be called when any convar changes) - virtual void InstallGlobalChangeCallback( FnChangeCallback_t callback ) = 0; - virtual void RemoveGlobalChangeCallback( FnChangeCallback_t callback ) = 0; - virtual void CallGlobalChangeCallbacks( cvar_t *var, const char *pOldString, float flOldValue ) = 0; - - // Install a console printer - virtual void InstallConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; - virtual void RemoveConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; - virtual void ConsoleColorPrintf( const clr_t& clr, const char *pFormat, ... ) const = 0; - virtual void ConsolePrintf( const char *pFormat, ... ) const = 0; - virtual void ConsoleDPrintf( const char *pFormat, ... ) const = 0; - - // Reverts cvars which contain a specific flag - virtual void RevertFlaggedConVars( int nFlag ) = 0; - - // Method allowing the engine ICvarQuery interface to take over - // A little hacky, owing to the fact the engine is loaded - // well after ICVar, so we can't use the standard connect pattern - virtual void InstallCVarQuery( ICvarQuery *pQuery ) = 0; - - - virtual void SetMaxSplitScreenSlots( int nSlots ) = 0; - virtual int GetMaxSplitScreenSlots( ) const = 0; - - virtual void AddSplitScreenConVars( ) = 0; - virtual void RemoveSplitScreenConVars( CVarDLLIdentifier_t id ) = 0; - - virtual int GetConsoleDisplayFuncCount( ) const = 0; - virtual void GetConsoleText( int nDisplayFuncIndex, char *pchText, size_t bufSize ) const = 0; - - // Utilities for convars accessed by the material system thread - virtual bool IsMaterialThreadSetAllowed( ) const = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, const char *pValue ) = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, int nValue ) = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, float flValue ) = 0; - virtual bool HasQueuedMaterialThreadConVarSets( ) const = 0; - virtual int ProcessQueuedMaterialThreadConVarSets( ) = 0; - - class ICVarIteratorInternal - { - public: - virtual void SetFirst( ) = 0; - virtual void Next( ) = 0; - virtual bool IsAlive( ) = 0; - virtual ConCommandBase *Get( ) = 0; - }; - - virtual ICVarIteratorInternal* FactoryInternalIterator( ) = 0; -}; \ No newline at end of file diff --git a/gmod/IEngineTrace.hpp b/gmod/IEngineTrace.hpp deleted file mode 100644 index 142fef9..0000000 --- a/gmod/IEngineTrace.hpp +++ /dev/null @@ -1,380 +0,0 @@ -#pragma once -#include "vector.hpp" -#include "IClientEntityList.hpp" - -enum TraceType_t { - TRACE_EVERYTHING = 0, - TRACE_WORLD_ONLY, // NOTE: This does *not* test static props!!! - TRACE_ENTITIES_ONLY, // NOTE: This version will *not* test static props - TRACE_EVERYTHING_FILTER_PROPS, // NOTE: This version will pass the IHandleEntity for props through the filter, unlike all other filters -}; - -enum SurfaceFlags_t { - DISPSURF_FLAG_SURFACE = 1 << 0, - DISPSURF_FLAG_WALKABLE = 1 << 1, - DISPSURF_FLAG_BUILDABLE = 1 << 2, - DISPSURF_FLAG_SURFPROP1 = 1 << 3, - DISPSURF_FLAG_SURFPROP2 = 1 << 4, -}; - -enum Hitgroup_t { - HITGROUP_GENERIC, - HITGROUP_HEAD, - HITGROUP_CHEST, - HITGROUP_STOMACH, - HITGROUP_LEFTARM, - HITGROUP_RIGHTARM, - HITGROUP_LEFTLEG, - HITGROUP_RIGHTLEG, - HITGROUP_GEAR -}; - -struct csurface_t { - const char* name; - short surfaceProps; - unsigned short flags; -}; - -struct cplane_t { - vec3_t normal; - float dist; - uint8_t type; - uint8_t signbits; - uint8_t pad[ 2 ]; -}; - -class ITraceFilter { -public: - virtual bool ShouldHitEntity( void* pEntity, int contentsMask ) = 0; - virtual TraceType_t GetTraceType( ) const = 0; -}; - -class CTraceFilter : public ITraceFilter { -public: - CTraceFilter( ) {} - - CTraceFilter( void *ent ) - : pSkip( ent ) {} - - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return !( pEntityHandle == pSkip ); - } - - TraceType_t GetTraceType( ) const override { - return TRACE_EVERYTHING; - } - - void* pSkip; -}; - -class CTraceFilterOneEntity : public ITraceFilter { -public: - bool ShouldHitEntity( void* entity_handle, int contents ) override { - return entity_handle == ent; - } - - TraceType_t GetTraceType( ) const override { - return TRACE_ENTITIES_ONLY; - } - - void* ent; -}; - -class CTraceFilterWorldAndPropsOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return false; - } - - TraceType_t GetTraceType( ) const override { - return TRACE_EVERYTHING; - } -}; - -class CTraceFilterEntitiesOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return !( pEntityHandle == pSkip ); - } - - TraceType_t GetTraceType( ) const override { - return TRACE_ENTITIES_ONLY; - } - - void* pSkip; -}; - -class CTraceFilterPlayersOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - IClientEntity* hit_entity = ( IClientEntity* )pEntityHandle; - int index = hit_entity->GetIndex( ); - return !( pEntityHandle == pSkip || index < 1 || index > 64 ); - } - - TraceType_t GetTraceType( ) const override { - return TRACE_ENTITIES_ONLY; - } - - void* pSkip; -}; - -class CTraceFilterWorldOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return false; - } - - TraceType_t GetTraceType( ) const override { - return TRACE_WORLD_ONLY; - } - - void* pSkip; -}; - -class CTraceFilterSkipTwoEntities : public ITraceFilter { -public: - CTraceFilterSkipTwoEntities( ) { - - } - - CTraceFilterSkipTwoEntities( void* pPassEnt1, void* pPassEnt2 ) { - passentity1 = pPassEnt1; - passentity2 = pPassEnt2; - } - - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return !( pEntityHandle == passentity1 || pEntityHandle == passentity2 ); - } - - TraceType_t GetTraceType( ) const override { - return TRACE_EVERYTHING; - } - - void* passentity1; - void* passentity2; -}; - -class __declspec( align( 16 ) )VectorAligned : public vec3_t { -public: - VectorAligned( float _x, float _y, float _z ) { - x = _x; - y = _y; - z = _z; - w = 0; - } - - VectorAligned( ) { } - - void operator=( const vec3_t& vOther ) { - x = vOther.x; - y = vOther.y; - z = vOther.z; - } - - float w; -}; - -struct Ray_t -{ - VectorAligned m_Start; - VectorAligned m_Delta; - VectorAligned m_StartOffset; - VectorAligned m_Extents; - - bool m_IsRay; - bool m_IsSwept; - - Ray_t( ){ } - - void Init( const vec3_t& start, const vec3_t& end ) { - m_Delta = end - start; - - m_IsSwept = m_Delta.lengthsqr( ) != 0; - - m_Extents = vec3_t( 0.f, 0.f, 0.f ); - m_IsRay = true; - - m_StartOffset = vec3_t( 0.f, 0.f, 0.f ); - m_Start = start; - } - - void Init( const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs ) { - m_Delta = end - start; - - m_IsSwept = m_Delta.lengthsqr( ) != 0; - - m_Extents = maxs - mins; - m_Extents *= 0.5f; - m_IsRay = m_Extents.lengthsqr( ) < 1e-6; - - m_StartOffset = mins + maxs; - m_StartOffset *= 0.5f; - m_Start = start + m_StartOffset; - m_StartOffset *= -1.0f; - } -}; - -class CBaseTrace -{ -public: - bool IsDispSurface( ) const { return ( dispFlags & DISPSURF_FLAG_SURFACE ) != 0; } - bool IsDispSurfaceWalkable( ) const { return ( dispFlags & DISPSURF_FLAG_WALKABLE ) != 0; } - bool IsDispSurfaceBuildable( ) const { return ( dispFlags & DISPSURF_FLAG_BUILDABLE ) != 0; } - bool IsDispSurfaceProp1( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP1 ) != 0; } - bool IsDispSurfaceProp2( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP2 ) != 0; } - -public: - vec3_t startpos; - vec3_t endpos; - cplane_t plane; - - float fraction; - - int contents; - unsigned short dispFlags; - - bool allsolid; - bool startsolid; - - CBaseTrace( ) {} - -private: - CBaseTrace( const CBaseTrace& vOther ); -}; - -class CGameTrace : public CBaseTrace -{ -public: - bool DidHitWorld( ) const; - - bool DidHitNonWorldEntity( ) const; - - int GetEntityIndex( ) const; - - bool DidHit( ) const - { - return fraction < 1 || allsolid || startsolid; - } - -public: - float fractionleftsolid; - csurface_t surface; - - int hitgroup; - - short physicsbone; - unsigned short worldSurfaceIndex; - - IClientEntity* m_pEnt; - int hitbox; - - CGameTrace( ) {} - CGameTrace( const CGameTrace& vOther ); -}; - -class IEngineTrace { -public: - int GetPointContents( const vec3_t& vecAbsPosition, int contentsMask = 0xffffffff ) { - using fn = int( __thiscall* )( void*, const vec3_t&, int, void* ); - return util::get_vfunc< fn >( this, 0 )( this, vecAbsPosition, contentsMask, nullptr ); - } - - void TraceRay( const Ray_t& ray, unsigned int fMask, ITraceFilter* pTraceFilter, CBaseTrace* pTrace ) { - return util::get_vfunc< 4, void >( this, ray, fMask, pTraceFilter, pTrace ); - } - - void ClipRayToEntity( const Ray_t& ray, unsigned int fMask, IClientEntity* pEnt, CBaseTrace* pTrace ) { - return util::get_vfunc< 2, void >( this, ray, fMask, pEnt, pTrace ); - } -}; - -#define CONTENTS_EMPTY 0 - -#define CONTENTS_SOLID 0x1 -#define CONTENTS_WINDOW 0x2 -#define CONTENTS_SOLID_SURF 0x3 -#define CONTENTS_AUX 0x4 -#define CONTENTS_LIGHT_SURF 0x7 -#define CONTENTS_GRATE 0x8 -#define CONTENTS_SLIME 0x10 -#define CONTENTS_WATER 0x20 -#define CONTENTS_BLOCKLOS 0x40 -#define CONTENTS_OPAQUE 0x80 -#define LAST_VISIBLE_CONTENTS CONTENTS_OPAQUE - -#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1)) - -#define CONTENTS_TESTFOGVOLUME 0x100 -#define CONTENTS_UNUSED 0x200 -#define CONTENTS_BLOCKLIGHT 0x400 -#define CONTENTS_TEAM1 0x800 -#define CONTENTS_TEAM2 0x1000 -#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 -#define CONTENTS_MOVEABLE 0x4000 -#define CONTENTS_AREAPORTAL 0x8000 -#define CONTENTS_PLAYERCLIP 0x10000 -#define CONTENTS_MONSTERCLIP 0x20000 -#define CONTENTS_CURRENT_0 0x40000 -#define CONTENTS_CURRENT_90 0x80000 -#define CONTENTS_CURRENT_180 0x100000 -#define CONTENTS_CURRENT_270 0x200000 -#define CONTENTS_CURRENT_UP 0x400000 -#define CONTENTS_CURRENT_DOWN 0x800000 - -#define CONTENTS_ORIGIN 0x1000000 - -#define CONTENTS_MONSTER 0x2000000 -#define CONTENTS_DEBRIS 0x4000000 -#define CONTENTS_DETAIL 0x8000000 -#define CONTENTS_TRANSLUCENT 0x10000000 -#define CONTENTS_LADDER 0x20000000 -#define CONTENTS_HITBOX 0x40000000 - -#define SURF_LIGHT 0x0001 -#define SURF_SKY2D 0x0002 -#define SURF_SKY 0x0004 -#define SURF_WARP 0x0008 -#define SURF_TRANS 0x0010 -#define SURF_NOPORTAL 0x0020 -#define SURF_TRIGGER 0x0040 -#define SURF_NODRAW 0x0080 - -#define SURF_HINT 0x0100 - -#define SURF_SKIP 0x0200 -#define SURF_NOLIGHT 0x0400 -#define SURF_BUMPLIGHT 0x0800 -#define SURF_NOSHADOWS 0x1000 -#define SURF_NODECALS 0x2000 -#define SURF_NOPAINT SURF_NODECALS -#define SURF_NOCHOP 0x4000 -#define SURF_HITBOX 0x8000 - -// ----------------------------------------------------- -// spatial content masks - used for spatial queries (traceline,etc.) -// ----------------------------------------------------- -#define MASK_ALL (0xFFFFFFFF) -#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) -#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) -#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) -#define MASK_NPCFLUID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER) -#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) -#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) -#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) -#define MASK_BLOCKLOS (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_BLOCKLOS) -#define MASK_BLOCKLOS_AND_NPCS (MASK_BLOCKLOS|CONTENTS_MONSTER) -#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) -#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) -#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) -#define MASK_SHOT_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_DEBRIS) -#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) -#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER) -#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) -#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) -#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) -#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) -#define MASK_NPCWORLDSTATIC_FLUID (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP) -#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) -#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN) -#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_GRATE) \ No newline at end of file diff --git a/gmod/IGameEventManager.hpp b/gmod/IGameEventManager.hpp deleted file mode 100644 index f2e7c25..0000000 --- a/gmod/IGameEventManager.hpp +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once -#include "util.hpp" - -class IGameEvent -{ -public: - const char* GetName( ) { - return util::get_vfunc< 1, const char* >( this ); - } - - int GetInt( const char* szKeyName, int nDefault = 0 ) { - return util::get_vfunc< 6, int >( this, szKeyName, nDefault ); - } - - float GetFloat( const char* name, float default_ = 0 ) { - return util::get_vfunc< 8, float >( this, name, default_ ); - } - - const char* GetString( const char* szKeyName ) { - return util::get_vfunc< 9, const char* >( this, szKeyName, 0 ); - } - - void SetString( const char* szKeyName, const char* szValue ) { - return util::get_vfunc< 16, void >( this, szKeyName, szValue ); - } -}; - -class IGameEventListener2 { -public: - virtual ~IGameEventListener2( void ) {}; - - // FireEvent is called by EventManager if event just occured - // KeyValue memory will be freed by manager if not needed anymore - virtual void FireGameEvent( IGameEvent* event ) = 0; - - virtual int GetEventDebugID( void ) = 0; -}; - -class IGameEventManager2 { -public: - virtual ~IGameEventManager2( void ) {}; - - // load game event descriptions from a file eg "resource\gameevents.res" - virtual int LoadEventsFromFile( const char* filename ) = 0; - - // removes all and anything - virtual void Reset( ) = 0; - - // adds a listener for a particular event - virtual bool AddListener( IGameEventListener2* listener, const char* name, bool bServerSide ) = 0; - - // returns true if this listener is listens to given event - virtual bool FindListener( IGameEventListener2* listener, const char* name ) = 0; - - // removes a listener - virtual void RemoveListener( IGameEventListener2* listener ) = 0; - - // create an event by name, but doesn't fire it. returns NULL is event is not - // known or no listener is registered for it. bForce forces the creation even if no listener is active - virtual IGameEvent* CreateEvent( const char* name, bool bForce = false, int* pCookie = nullptr ) = 0; - - // fires a server event created earlier, if bDontBroadcast is set, event is not send to clients - virtual bool FireEvent( IGameEvent* event, bool bDontBroadcast = false ) = 0; - - // fires an event for the local client only, should be used only by client code - virtual bool FireEventClientSide( IGameEvent* event ) = 0; - - // create a new copy of this event, must be free later - virtual IGameEvent* DuplicateEvent( IGameEvent* event ) = 0; - - // if an event was created but not fired for some reason, it has to bee freed, same UnserializeEvent - virtual void FreeEvent( IGameEvent* event ) = 0; - - // write/read event to/from bitbuffer - virtual bool SerializeEvent( IGameEvent* event, int* buf ) = 0; - virtual IGameEvent* UnserializeEvent( void* buf ) = 0; // create new KeyValues, must be deleted -}; \ No newline at end of file diff --git a/gmod/IMaterialSystem.hpp b/gmod/IMaterialSystem.hpp deleted file mode 100644 index c9b9490..0000000 --- a/gmod/IMaterialSystem.hpp +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once -#include "util.hpp" -#include "ISurface.hpp" - -using MaterialHandle_t = unsigned short; - -enum MaterialVarFlags_t { - MATERIAL_VAR_DEBUG = 1 << 0, - MATERIAL_VAR_NO_DEBUG_OVERRIDE = 1 << 1, - MATERIAL_VAR_NO_DRAW = 1 << 2, - MATERIAL_VAR_USE_IN_FILLRATE_MODE = 1 << 3, - - MATERIAL_VAR_VERTEXCOLOR = 1 << 4, - MATERIAL_VAR_VERTEXALPHA = 1 << 5, - MATERIAL_VAR_SELFILLUM = 1 << 6, - MATERIAL_VAR_ADDITIVE = 1 << 7, - MATERIAL_VAR_ALPHATEST = 1 << 8, - MATERIAL_VAR_MULTIPASS = 1 << 9, - MATERIAL_VAR_ZNEARER = 1 << 10, - MATERIAL_VAR_MODEL = 1 << 11, - MATERIAL_VAR_FLAT = 1 << 12, - MATERIAL_VAR_NOCULL = 1 << 13, - MATERIAL_VAR_NOFOG = 1 << 14, - MATERIAL_VAR_IGNOREZ = 1 << 15, - MATERIAL_VAR_DECAL = 1 << 16, - MATERIAL_VAR_ENVMAPSPHERE = 1 << 17, - MATERIAL_VAR_NOALPHAMOD = 1 << 18, - MATERIAL_VAR_ENVMAPCAMERASPACE = 1 << 19, - MATERIAL_VAR_BASEALPHAENVMAPMASK = 1 << 20, - MATERIAL_VAR_TRANSLUCENT = 1 << 21, - MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK = 1 << 22, - MATERIAL_VAR_NEEDS_SOFTWARE_SKINNING = 1 << 23, - MATERIAL_VAR_OPAQUETEXTURE = 1 << 24, - MATERIAL_VAR_ENVMAPMODE = 1 << 25, - MATERIAL_VAR_SUPPRESS_DECALS = 1 << 26, - MATERIAL_VAR_HALFLAMBERT = 1 << 27, - MATERIAL_VAR_WIREFRAME = 1 << 28, -}; - -class ITexture { -public: - int GetActualWidth( ) { - return util::get_vfunc< 3, int >( this ); - } - - int GetActualHeight( ) { - return util::get_vfunc< 4, int >( this ); - } -}; - -class IMaterial { -public: - auto GetName( ) { - return util::get_vfunc< 0, const char* >( this ); - } - - auto GetTextureGroupName( ) { - return util::get_vfunc< 1, const char* >( this ); - } - - void IncrementReferenceCount( ) { - return util::get_vfunc< 14, void >( this ); - } - - void AlphaModulate( float alpha ) { - return util::get_vfunc< 27, void >( this, alpha ); - } - - void ColorModulate( float r, float g, float b ) { - return util::get_vfunc< 28, void >( this, r, g, b ); - } - - void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ) { - return util::get_vfunc< 29, void >( this, flag, on ); - } - - bool GetMaterialVarFlag( MaterialVarFlags_t flag ) { - return util::get_vfunc< 30, bool >( this, flag ); - } - - auto GetAlphaModulation( ) { - return util::get_vfunc< 44, float >( this ); - } - - void GetColorModulate( float* r, float* g, float* b ) { - return util::get_vfunc< 45, void >( this, r, g, b ); - } - - void Refresh( ) { - return util::get_vfunc< 37, void >( this ); - } -}; - -class IMaterialSystem -{ -public: - enum RenderTargetSizeMode_t { - RT_SIZE_NO_CHANGE = 0, // Only allowed for render targets that don't want a depth buffer - // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer). - RT_SIZE_DEFAULT = 1, // Don't play with the specified width and height other than making sure it fits in the framebuffer. - RT_SIZE_PICMIP = 2, // Apply picmip to the render target's width and height. - RT_SIZE_HDR = 3, // frame_buffer_width / 4 - RT_SIZE_FULL_FRAME_BUFFER = 4, // Same size as frame buffer, or next lower power of 2 if we can't do that. - RT_SIZE_OFFSCREEN = 5, // Target of specified size, don't mess with dimensions - RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP = 6 // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. - }; - - enum MaterialRenderTargetDepth_t { - MATERIAL_RT_DEPTH_SHARED = 0x0, - MATERIAL_RT_DEPTH_SEPARATE = 0x1, - MATERIAL_RT_DEPTH_NONE = 0x2, - MATERIAL_RT_DEPTH_ONLY = 0x3, - }; - - ImageFormat GetBackBufferFormat( ) { - return util::get_vfunc< 36, ImageFormat >( this ); - } - - IMaterial* CreateMaterial( const char* pMaterialName, void* pVMTKeyValues ) { - return util::get_vfunc< 83, IMaterial* >( this, pMaterialName, pVMTKeyValues ); - } - - IMaterial* FindMaterial( const char* pMaterialName, const char* pTextureGroupName = "Model textures", bool complain = true, const char* pComplainPrefix = nullptr ) { - return util::get_vfunc< 84, IMaterial* >( this, pMaterialName, pTextureGroupName, complain, pComplainPrefix ); - } - - MaterialHandle_t FirstMaterial( ) { - return util::get_vfunc< 86, MaterialHandle_t >( this ); - } - - MaterialHandle_t NextMaterial( MaterialHandle_t h ) { - return util::get_vfunc< 87, MaterialHandle_t >( this, h ); - } - - MaterialHandle_t InvalidMaterial( ) { - return util::get_vfunc< 88, MaterialHandle_t >( this ); - } - - IMaterial* GetMaterial( MaterialHandle_t h ) { - return util::get_vfunc< 89, IMaterial* >( this, h ); - } - - void BeginRenderTargetAllocation( ) { - return util::get_vfunc< 94, void >( this ); - } - - void EndRenderTargetAllocation( ) { - return util::get_vfunc< 95, void >( this ); - } - - ITexture* CreateNamedRenderTargetTextureEx( const char* name, int w, int h, RenderTargetSizeMode_t sizeMode, - ImageFormat format, MaterialRenderTargetDepth_t depth ) - { - const int textureFlags = 0x4 | 0x8; //TEXTUREFLAGS_CLAMPS, TEXTUREFLAGS_CLAMPT - const int renderTargetFlags = 0x1; //CREATERENDERTARGETFLAGS_HDR - return util::get_vfunc< 97, ITexture* >( this, name, w, h, sizeMode, format, depth, textureFlags, renderTargetFlags ); - } - - /*void* GetRenderContext( ) { - typedef IMatRenderContext*( __thiscall* GetRenderContextFn )( void* ); - return CallVFunction( this, 115 )( this ); - }*/ -}; \ No newline at end of file diff --git a/gmod/IMemAlloc.hpp b/gmod/IMemAlloc.hpp deleted file mode 100644 index 2ad76be..0000000 --- a/gmod/IMemAlloc.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -typedef size_t( *MemAllocFailHandler_t )( size_t ); - -class IMemAlloc { -public: - // Release versions - virtual void *Alloc( size_t nSize ) = 0; - virtual void *Realloc( void *pMem, size_t nSize ) = 0; - virtual void Free( void *pMem ) = 0; - virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize ) = 0; - - // Debug versions - virtual void *Alloc( size_t nSize, const char *pFileName, int nLine ) = 0; - virtual void *Realloc( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; - virtual void Free( void *pMem, const char *pFileName, int nLine ) = 0; - virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; - - // Returns size of a particular allocation - virtual size_t GetSize( void *pMem ) = 0; - - // Force file + line information for an allocation - virtual void PushAllocDbgInfo( const char *pFileName, int nLine ) = 0; - virtual void PopAllocDbgInfo( ) = 0; - - // FIXME: Remove when we have our own allocator - // these methods of the Crt debug code is used in our codebase currently - virtual long CrtSetBreakAlloc( long lNewBreakAlloc ) = 0; - virtual int CrtSetReportMode( int nReportType, int nReportMode ) = 0; - virtual int CrtIsValidHeapPointer( const void *pMem ) = 0; - virtual int CrtIsValidPointer( const void *pMem, unsigned int size, int access ) = 0; - virtual int CrtCheckMemory( void ) = 0; - virtual int CrtSetDbgFlag( int nNewFlag ) = 0; - virtual void CrtMemCheckpoint( void *pState ) = 0; - - // FIXME: Make a better stats interface - virtual void DumpStats( ) = 0; - virtual void DumpStatsFileBase( char const *pchFileBase ) = 0; - - // FIXME: Remove when we have our own allocator - virtual void* CrtSetReportFile( int nRptType, void* hFile ) = 0; - virtual void* CrtSetReportHook( void* pfnNewHook ) = 0; - virtual int CrtDbgReport( int nRptType, const char * szFile, - int nLine, const char * szModule, const char * pMsg ) = 0; - - virtual int heapchk( ) = 0; - - virtual bool IsDebugHeap( ) = 0; - - virtual void GetActualDbgInfo( const char *&pFileName, int &nLine ) = 0; - virtual void RegisterAllocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; - virtual void RegisterDeallocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; - - virtual int GetVersion( ) = 0; - - virtual void CompactHeap( ) = 0; - - // Function called when malloc fails or memory limits hit to attempt to free up memory (can come in any thread) - virtual MemAllocFailHandler_t SetAllocFailHandler( MemAllocFailHandler_t pfnMemAllocFailHandler ) = 0; - - virtual void DumpBlockStats( void * ) = 0; - -#if defined( _MEMTEST ) - virtual void SetStatsExtraInfo( const char *pMapName, const char *pComment ) = 0; -#endif - - // Returns 0 if no failure, otherwise the size_t of the last requested chunk - // "I'm sure this is completely thread safe!" Brian Deen 7/19/2012. - virtual size_t MemoryAllocFailed( ) = 0; - - // handles storing allocation info for coroutines - virtual unsigned GetDebugInfoSize( ) = 0; - virtual void SaveDebugInfo( void *pvDebugInfo ) = 0; - virtual void RestoreDebugInfo( const void *pvDebugInfo ) = 0; - virtual void InitDebugInfo( void *pvDebugInfo, const char *pchRootFileName, int nLine ) = 0; - - // Replacement for ::GlobalMemoryStatus which accounts for unused memory in our system - virtual void GlobalMemoryStatus( size_t *pUsedMemory, size_t *pFreeMemory ) = 0; -}; \ No newline at end of file diff --git a/gmod/IPanel.hpp b/gmod/IPanel.hpp deleted file mode 100644 index 8b66fb1..0000000 --- a/gmod/IPanel.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include "util.hpp" - -class IPanel { -public: - const char* GetName( int panel ) { - using fn = const char* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 36 )( this, panel ); - } - - void SetMouseInputEnabled( unsigned int panel, bool enable ) { - return util::get_vfunc< 32, void >( this, panel, enable ); - } -}; \ No newline at end of file diff --git a/gmod/IPhysicsSurfaceProps.hpp b/gmod/IPhysicsSurfaceProps.hpp deleted file mode 100644 index d7003f2..0000000 --- a/gmod/IPhysicsSurfaceProps.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -struct surfacephysicsparams_t { - // vphysics physical properties - float friction; - float elasticity; // collision elasticity - used to compute coefficient of restitution - float density; // physical density (in kg / m^3) - float thickness; // material thickness if not solid (sheet materials) in inches - float dampening; -}; - -struct surfaceaudioparams_t { - float reflectivity; // like elasticity, but how much sound should be reflected by this surface - float hardnessFactor; // like elasticity, but only affects impact sound choices - float roughnessFactor; // like friction, but only affects scrape sound choices - float roughThreshold; // surface roughness > this causes "rough" scrapes, < this causes "smooth" scrapes - float hardThreshold; // surface hardness > this causes "hard" impacts, < this causes "soft" impacts - float hardVelocityThreshold; // collision velocity > this causes "hard" impacts, < this causes "soft" impacts - float highPitchOcclusion; //a value betweeen 0 and 100 where 0 is not occluded at all and 100 is silent (except for any additional reflected sound) - float midPitchOcclusion; - float lowPitchOcclusion; -}; - -struct surfacesoundnames_t { - unsigned short walkStepLeft; - unsigned short walkStepRight; - unsigned short runStepLeft; - unsigned short runStepRight; - unsigned short impactSoft; - unsigned short impactHard; - unsigned short scrapeSmooth; - unsigned short scrapeRough; - unsigned short bulletImpact; - unsigned short rolling; - unsigned short breakSound; - unsigned short strainSound; -}; - -struct surfacegameprops_t { - float maxspeedfactor; - float jumpfactor; - float penetrationmodifier; - float damagemodifier; - uint16_t material; - uint8_t climbable; -}; - -struct surfacedata_t { - surfacephysicsparams_t physics; // physics parameters - surfaceaudioparams_t audio; // audio parameters - surfacesoundnames_t sounds; // names of linked sounds - surfacegameprops_t game; // Game data / properties -}; - -class IPhysicsSurfaceProps -{ -public: - virtual ~IPhysicsSurfaceProps( void ) {} - - // parses a text file containing surface prop keys - virtual int ParseSurfaceData( const char* pFilename, const char* pTextfile ) = 0; - // current number of entries in the database - virtual int SurfacePropCount( void ) const = 0; - - virtual int GetSurfaceIndex( const char* pSurfacePropName ) const = 0; - virtual void GetPhysicsProperties( int surfaceDataIndex, float* density, float* thickness, float* friction, float* elasticity ) const = 0; - - virtual surfacedata_t* GetSurfaceData( int surfaceDataIndex ) = 0; - virtual const char* GetString( unsigned short stringTableIndex ) const = 0; - - virtual const char* GetPropName( int surfaceDataIndex ) const = 0; - - // sets the global index table for world materials - // UNDONE: Make this per-CPhysCollide - virtual void SetWorldMaterialIndexTable( int* pMapArray, int mapSize ) = 0; - - // NOTE: Same as GetPhysicsProperties, but maybe more convenient - //virtual void GetPhysicsParameters(int surfaceDataIndex, surfacephysicsparams_t* pParamsOut) const = 0; -}; \ No newline at end of file diff --git a/gmod/IPrediction.hpp b/gmod/IPrediction.hpp deleted file mode 100644 index 575e270..0000000 --- a/gmod/IPrediction.hpp +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once -#include "vector.hpp" - -//forward declarations -class user_cmd_t; -class IClientEntity; - -class IMoveHelper { -private: - virtual void UnknownVirtual( ) = 0; -public: - virtual void SetHost( IClientEntity* host ) = 0; -}; - -class CMoveData { -public: - bool m_bFirstRunOfFunctions : 1; - bool m_bGameCodeMovedPlayer : 1; - bool m_bNoAirControl : 1; - - unsigned long m_nPlayerHandle; - int m_nImpulseCommand; - vec3_t m_vecViewAngles; - vec3_t m_vecAbsViewAngles; - int m_nButtons; - int m_nOldButtons; - float m_flForwardMove; - float m_flSideMove; - float m_flUpMove; - - float m_flMaxSpeed; - float m_flClientMaxSpeed; - - vec3_t m_vecVelocity; - vec3_t m_vecOldVelocity; - float somefloat; - vec3_t m_vecAngles; - vec3_t m_vecOldAngles; - - float m_outStepHeight; - vec3_t m_outWishVel; - vec3_t m_outJumpVel; - - vec3_t m_vecConstraintCenter; - float m_flConstraintRadius; - float m_flConstraintWidth; - float m_flConstraintSpeedFactor; - bool m_bConstraintPastRadius; - - void SetAbsOrigin( const vec3_t& vec ); - const vec3_t& GetAbsOrigin( ) const; - -private: - vec3_t m_vecAbsOrigin; // edict::origin - uint8_t pad_ending_001[0x160]; -}; - -class ICSGameMovement { -public: - void ProcessMovement( IClientEntity* ent, void* data ) { - using fn = void( __thiscall* )( void*, IClientEntity*, void* ); - return util::get_vfunc< fn >( this, 1 )( this, ent, data ); - } - - void StartTrackPredictionErrors( IClientEntity* ent ) { - using fn = void( __thiscall* )( void*, IClientEntity* ); - return util::get_vfunc< fn >( this, 2 )( this, ent ); - } - - void FinishTrackPredictionErrors( IClientEntity* ent ) { - using fn = void( __thiscall* )( void*, IClientEntity* ); - return util::get_vfunc< fn >( this, 3 )( this, ent ); - } -}; - -class IPrediction { -public: - virtual ~IPrediction( ) { }; - - virtual void Init( ) = 0; - virtual void Shutdown( ) = 0; - - // Run prediction - virtual void Update - ( - int startframe, // World update ( un-modded ) most recently received - bool validframe, // Is frame data valid - int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) - int outgoing_command // Last command (most recent) sent to server (un-modded) - ) = 0; - - // We are about to get a network update from the server. We know the update #, so we can pull any - // data purely predicted on the client side and transfer it to the new from data state. - virtual void PreEntityPacketReceived( int commands_acknowledged, int current_world_update_packet ) = 0; - virtual void PostEntityPacketReceived( ) = 0; - virtual void PostNetworkDataReceived( int commands_acknowledged ) = 0; - - virtual void OnReceivedUncompressedPacket( ) = 0; - - // The engine needs to be able to access a few predicted values - virtual void GetViewOrigin( vec3_t& org ) = 0; - virtual void SetViewOrigin( vec3_t& org ) = 0; - virtual void GetViewAngles( vec3_t& ang ) = 0; - virtual void SetViewAngles( vec3_t& ang ) = 0; - virtual void GetLocalViewAngles( vec3_t& ang ) = 0; - virtual void SetLocalViewAngles( vec3_t& ang ) = 0; - - virtual bool InPrediction( ) const = 0; - virtual bool IsFirstTimePredicted( ) const = 0; - - virtual int GetIncomingPacketNumber( ) const = 0; - - virtual void RunCommand( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *moveHelper ) = 0; - - virtual void SetupMove( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *pHelper, CMoveData *move ) = 0; - virtual void FinishMove( IClientEntity *player, user_cmd_t *ucmd, CMoveData *move ) = 0; - virtual void SetIdealPitch( int nSlot, IClientEntity *player, const vec3_t& origin, const vec3_t& angles, const vec3_t& viewheight ) = 0; - - virtual void CheckError( int nSlot, IClientEntity *player, int commands_acknowledged ) = 0; - - virtual void _Update - ( - int nSlot, - bool received_new_world_update, - bool validframe, // Is frame data valid - int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) - int outgoing_command // Last command (most recent) sent to server (un-modded) - ) = 0; -}; diff --git a/gmod/ISurface.hpp b/gmod/ISurface.hpp deleted file mode 100644 index 5756191..0000000 --- a/gmod/ISurface.hpp +++ /dev/null @@ -1,117 +0,0 @@ -#pragma once -#include "IAppSystem.hpp" -#include "vector.hpp" -#include "color.hpp" - -enum FontDrawType_t { - FONT_DRAW_DEFAULT = 0, - FONT_DRAW_NONADDITIVE, - FONT_DRAW_ADDITIVE, - FONT_DRAW_TYPE_COUNT = 2, -}; - -enum FontFlags_t { - FONTFLAG_NONE, - FONTFLAG_ITALIC = 0x001, - FONTFLAG_UNDERLINE = 0x002, - FONTFLAG_STRIKEOUT = 0x004, - FONTFLAG_SYMBOL = 0x008, - FONTFLAG_ANTIALIAS = 0x010, - FONTFLAG_GAUSSIANBLUR = 0x020, - FONTFLAG_ROTARY = 0x040, - FONTFLAG_DROPSHADOW = 0x080, - FONTFLAG_ADDITIVE = 0x100, - FONTFLAG_OUTLINE = 0x200, - FONTFLAG_CUSTOM = 0x400, - FONTFLAG_BITMAP = 0x800, -}; - -enum ImageFormat { - IMAGE_FORMAT_UNKNOWN = -1, - IMAGE_FORMAT_RGBA8888 = 0, - IMAGE_FORMAT_ABGR8888, - IMAGE_FORMAT_RGB888, - IMAGE_FORMAT_BGR888, - IMAGE_FORMAT_RGB565, - IMAGE_FORMAT_I8, - IMAGE_FORMAT_IA88, - IMAGE_FORMAT_P8, - IMAGE_FORMAT_A8, - IMAGE_FORMAT_RGB888_BLUESCREEN, - IMAGE_FORMAT_BGR888_BLUESCREEN, - IMAGE_FORMAT_ARGB8888, - IMAGE_FORMAT_BGRA8888, - IMAGE_FORMAT_DXT1, - IMAGE_FORMAT_DXT3, - IMAGE_FORMAT_DXT5, - IMAGE_FORMAT_BGRX8888, - IMAGE_FORMAT_BGR565, - IMAGE_FORMAT_BGRX5551, - IMAGE_FORMAT_BGRA4444, - IMAGE_FORMAT_DXT1_ONEBITALPHA, - IMAGE_FORMAT_BGRA5551, - IMAGE_FORMAT_UV88, - IMAGE_FORMAT_UVWQ8888, - IMAGE_FORMAT_RGBA16161616F, - IMAGE_FORMAT_RGBA16161616, - IMAGE_FORMAT_UVLX8888, - IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point - IMAGE_FORMAT_RGB323232F, - IMAGE_FORMAT_RGBA32323232F, - - // Depth-stencil texture formats for shadow depth mapping - IMAGE_FORMAT_NV_DST16, // - IMAGE_FORMAT_NV_DST24, // - IMAGE_FORMAT_NV_INTZ, // Vendor-specific depth-stencil texture - IMAGE_FORMAT_NV_RAWZ, // formats for shadow depth mapping - IMAGE_FORMAT_ATI_DST16, // - IMAGE_FORMAT_ATI_DST24, // - IMAGE_FORMAT_NV_NULL, // Dummy format which takes no video memory - - // Compressed normal map formats - IMAGE_FORMAT_ATI2N, // One-surface ATI2N / DXN format - IMAGE_FORMAT_ATI1N, // Two-surface ATI1N format - - NUM_IMAGE_FORMATS -}; - -struct vertex_t { - vertex_t( ) {} - - vertex_t( const vec2_t& pos, const vec2_t& coord = vec2_t( 0, 0 ) ) { - m_position = pos; - m_tex_coord = coord; - } - - void init( float x, float y, const vec2_t& coord = vec2_t( 0, 0 ) ) { - m_position = vec2_t( x, y ); - m_tex_coord = coord; - } - - vec2_t m_position; - vec2_t m_tex_coord; -}; - -using HFont = unsigned long; -using VPANEL = unsigned long; -class IntRect; -class IHTMLEvents; -class IHTML; -using HCursor = unsigned long; -using HTexture = unsigned long; -class CharRenderInfo; -class IVguiMatInfo; -class IImage; -class DrawTexturedRectParms_t; -class IHTMLChromeController; - -class ISurface : public IAppSystem { -public: - void SetCursorAlwaysVisible( bool state ) { - return util::get_vfunc< 52, void >( this, state ); - } - - void UnlockCursor( ) { - return util::get_vfunc< 61, void >( this ); - } -}; \ No newline at end of file diff --git a/gmod/IVEngineClient.hpp b/gmod/IVEngineClient.hpp deleted file mode 100644 index 4357dc2..0000000 --- a/gmod/IVEngineClient.hpp +++ /dev/null @@ -1,259 +0,0 @@ -#pragma once -#include -#include - -#include "util.hpp" -#include "vector.hpp" - -//using matrix3x4 = float[ 3 ][ 4 ]; - -struct VMatrix -{ - float m_matrix[ 4 ][ 4 ]; - - float* operator[]( int i ) { - return m_matrix[ i ]; - } - - const float* operator[]( int i ) const { - return m_matrix[ i ]; - } -}; - -struct matrix3x4 -{ - float m_matrix[ 3 ][ 4 ]; - - matrix3x4( ) = default; - - matrix3x4( - float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23 ) { - m_matrix[ 0 ][ 0 ] = m00; m_matrix[ 0 ][ 1 ] = m01; m_matrix[ 0 ][ 2 ] = m02; m_matrix[ 0 ][ 3 ] = m03; - m_matrix[ 1 ][ 0 ] = m10; m_matrix[ 1 ][ 1 ] = m11; m_matrix[ 1 ][ 2 ] = m12; m_matrix[ 1 ][ 3 ] = m13; - m_matrix[ 2 ][ 0 ] = m20; m_matrix[ 2 ][ 1 ] = m21; m_matrix[ 2 ][ 2 ] = m22; m_matrix[ 2 ][ 3 ] = m23; - } - - float* operator[]( int i ) { - return m_matrix[ i ]; - } - - const float* operator[]( int i ) const { - return m_matrix[ i ]; - } -}; - - -typedef struct player_info_s { - char name[ 32 ];//32 - int m_userid; - char m_steamid[ 33 ];//32 - unsigned m_friendId; - char m_friendsname[ 32 ]; - bool m_isfakeplayer; - bool m_ishltv; - uint32_t m_customfiles[ 4 ]; - uint8_t m_filesdownloaded; -} player_info_t; - -class INetChannelInfo { -public: - enum - { - GENERIC = 0, // must be first and is default group - LOCALPLAYER, // bytes for local player entity update - OTHERPLAYERS, // bytes for other players update - ENTITIES, // all other entity bytes - SOUNDS, // game sounds - EVENTS, // event messages - TEMPENTS, // temp entities - USERMESSAGES, // user messages - ENTMESSAGES, // entity messages - VOICE, // voice data - STRINGTABLE, // a stringtable update - MOVE, // client move cmds - STRINGCMD, // string command - SIGNON, // various signondata - TOTAL, // must be last and is not a real group - }; - - virtual const char* GetName( ) const = 0; // get channel name - virtual const char* GetAddress( ) const = 0; // get channel IP address as string - virtual float GetTime( ) const = 0; // current net time - virtual float GetTimeConnected( ) const = 0; // get connection time in seconds - virtual int GetBufferSize( ) const = 0; // netchannel packet history size - virtual int GetDataRate( ) const = 0; // send data rate in byte/sec - - virtual bool IsLoopback( ) const = 0; // true if loopback channel - virtual bool IsTimingOut( ) const = 0; // true if timing out - virtual bool IsPlayback( ) const = 0; // true if demo playback - - virtual float GetLatency( int flow ) const = 0; // current latency (RTT), more accurate but jittering - virtual float GetAvgLatency( int flow ) const = 0; // average packet latency in seconds - virtual float GetAvgLoss( int flow ) const = 0; // avg packet loss[0..1] - virtual float GetAvgChoke( int flow ) const = 0; // avg packet choke[0..1] - virtual float GetAvgData( int flow ) const = 0; // data flow in bytes/sec - virtual float GetAvgPackets( int flow ) const = 0; // avg packets/sec - virtual int GetTotalData( int flow ) const = 0; // total flow in/out in bytes - virtual int GetTotalPackets( int flow ) const = 0; - virtual int GetSequenceNr( int flow ) const = 0; // last send seq number - virtual bool IsValidPacket( int flow, int frame_number ) const = 0; // true if packet was not lost/dropped/chocked/flushed - virtual float GetPacketTime( int flow, int frame_number ) const = 0; // time when packet was send - virtual int GetPacketBytes( int flow, int frame_number, int group ) const = 0; // group size of this packet - virtual bool GetStreamProgress( int flow, int* received, int* total ) const = 0; // TCP progress if transmitting - virtual float GetTimeSinceLastReceived( ) const = 0; // get time since last recieved packet in seconds - virtual float GetCommandInterpolationAmount( int flow, int frame_number ) const = 0; - virtual void GetPacketResponseLatency( int flow, int frame_number, int* pnLatencyMsecs, int* pnChoke ) const = 0; - virtual void GetRemoteFramerate( float* pflFrameTime, float* pflFrameTimeStdDeviation ) const = 0; - - virtual float GetTimeoutSeconds( ) const = 0; -}; - -class INetChannel { -public: - char pad_0000[ 20 ]; //0x0000 - bool m_bProcessingMessages; //0x0014 - bool m_bShouldDelete; //0x0015 - char pad_0016[ 2 ]; //0x0016 - int32_t m_nOutSequenceNr; //0x0018 last send outgoing sequence number - int32_t m_nInSequenceNr; //0x001C last received incoming sequnec number - int32_t m_nOutSequenceNrAck; //0x0020 last received acknowledge outgoing sequnce number - int32_t m_nOutReliableState; //0x0024 state of outgoing reliable data (0/1) flip flop used for loss detection - int32_t m_nInReliableState; //0x0028 state of incoming reliable data - int32_t m_nChokedPackets; //0x002C number of choked packets - char pad_0030[ 1044 ]; //0x0030 - - bool transmit( bool only_reliable ) { - return util::get_vfunc< 49, bool >( this, only_reliable ); - } -}; //Size: 0x0444 - -struct INetMessage { - virtual ~INetMessage( ); -}; - -template -class CNetMessagePB : public INetMessage, public T {}; - -class CCLCMsg_Move { -private: - char __PAD0[ 0x8 ]; -public: - int numBackupCommands; - int numNewCommands; -}; - -using CCLCMsg_Move_t = CNetMessagePB; - -class CClientState { -public: - char pad0[ 0x9C ]; - INetChannel* netchannel; - char pad1[ 0xD4 ]; - int32_t m_nDeltaTick; //0x174 - char pad2[ 0x4B34 ]; - float m_frameTime; - int32_t lastoutgoingcommand; - int32_t chokedcommands; - int32_t last_command_ack; -}; - -class CGlobalState { -public: - uintptr_t* m_manager; - CClientState *m_def_clientstate; - - __forceinline CClientState* get_client_state( ) { - return m_def_clientstate; - } -}; - -class IVEngineClient -{ -public: - void GetScreenSize( int& width, int& height ) { - using fn = void( __thiscall* )( void*, int&, int& ); - return util::get_vfunc< fn >( this, 5 )( this, width, height ); - } - - void ClientCmd( const char* szCommandString ) { - std::string command( szCommandString ); - std::replace( command.begin( ), command.end( ), ';', ':' ); - std::replace( command.begin( ), command.end( ), '"', '*' ); - using fn = void( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 7 )( this, command.c_str( ) ); - } - - void ClientCmd_Unrestricted( const char* szCommandString ) { - std::string command( szCommandString ); - std::replace( command.begin( ), command.end( ), ';', ':' ); - std::replace( command.begin( ), command.end( ), '"', '*' ); - using fn = void( __thiscall* )( void*, const char*, const char* ); - return util::get_vfunc< fn >( this, 114 )( this, command.c_str( ), nullptr ); - } - - bool GetPlayerInfo( int index, player_info_t* pInfo ) { - using fn = bool( __thiscall* )( void*, int, player_info_t* ); - return util::get_vfunc< fn >( this, 8 )( this, index, pInfo ); - } - - int GetPlayerForUserID( int UserID ) { - using fn = int( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 9 )( this, UserID ); - } - - int GetLocalPlayer( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 12 )( this ); - } - - float Time( ) { - using fn = float( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 14 )( this ); - } - - void GetViewAngles( vec3_t& ang ) { - using fn = void( __thiscall* )( void*, vec3_t& ); - return util::get_vfunc< fn >( this, 19 )( this, ang ); - } - - void SetViewAngles( vec3_t& ang ) { - using fn = void( __thiscall* )( void*, vec3_t& ); - return util::get_vfunc< fn >( this, 20 )( this, ang ); - } - - int GetMaxClients( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 21 )( this ); - } - - bool IsInGame( ) { - using fn = bool( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 26 )( this ); - } - - bool IsConnected( ) { - using fn = bool( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 27 )( this ); - } - - bool IsPaused( ) { - return util::get_vfunc< 91, bool >( this ); - } - - const VMatrix& WorldToScreenMatrix( ) { - using fn = const VMatrix& ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 36 )( this ); - } - - const char* GetLevelName( ) { - using fn = const char* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 52 )( this ); - } - - INetChannelInfo* GetNetChannelInfo( ) { - using fn = INetChannelInfo* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 72 )( this ); - } -}; \ No newline at end of file diff --git a/gmod/IVModelInfoClient.hpp b/gmod/IVModelInfoClient.hpp deleted file mode 100644 index 957c6d9..0000000 --- a/gmod/IVModelInfoClient.hpp +++ /dev/null @@ -1,134 +0,0 @@ -#pragma once -#include "IVEngineClient.hpp" -#include "IClientEntityList.hpp" - -struct DrawModelState_t; - -struct mstudiobbox_t -{ - int bone; - int group; - vec3_t min; - vec3_t max; - int szhitboxnameindex; - - const char* get_name( ) { - if( szhitboxnameindex == 0 ) - return ""; - - return ( ( const char* )this ) + szhitboxnameindex; - } - - int unused[ 8 ]; -}; - -struct mstudiobone_t -{ - int sznameindex; - inline char * const get_name( void ) const { return ( ( char * )this ) + sznameindex; } - int parent; - char pad01[ 152 ]; - int flags; - char pad02[ 52 ]; -}; - -struct mstudiohitboxset_t -{ - int sznameindex; - inline char * const get_name( void ) const { return ( ( char * )this ) + sznameindex; } - int numhitboxes; - int hitboxindex; - inline mstudiobbox_t *get_hitbox( int i ) const { return ( mstudiobbox_t * )( ( ( unsigned char * )this ) + hitboxindex ) + i; }; -}; - -struct studiohdr_t -{ - char pad00[ 12 ]; - char name[ 64 ]; - char pad01[ 80 ]; - int numbones; - int boneIndex; - inline mstudiobone_t *get_bone( int i ) { return ( mstudiobone_t * )( ( ( unsigned char* )this ) + boneIndex ) + i; } - char pad02[ 8 ]; - int numhitboxsets; - int hitboxsetindex; - - mstudiohitboxset_t* get_hitbox_set( int i ) { - return ( mstudiohitboxset_t * )( ( ( char * )this ) + hitboxsetindex ) + i; - } - - char pad03[ 24 ]; - int numtextures; - inline mstudiobbox_t* get_hit_box( int index ) { return ( ( mstudiohitboxset_t* )( ( unsigned char* )this + hitboxsetindex ) )->get_hitbox( index ); } -}; - -struct ModelRenderInfo_t { - vec3_t m_origin; - vec3_t m_angles; - char pad[ 0x4 ]; - void* m_renderable; - const model_t* m_model; - const matrix3x4* m_model2world; - const matrix3x4* m_light_offset; - const vec3_t* m_light_origin; - int m_flags; - int m_entity_index; - int m_skin; - int m_body; - int m_hitboxset; - uint16_t* m_instance; - - ModelRenderInfo_t( ) { - m_model2world = nullptr; - m_light_offset = nullptr; - m_light_origin = nullptr; - } -}; - -class IVModelInfoClient { -public: - model_t* GetModel( int index ) { - using fn = model_t*( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 1 )( this, index ); - } - - int GetModelIndex( const char* name ) { - using fn = int( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 2 )( this, name ); - } - - const char* GetModelName( const model_t* model ) { - using fn = const char* ( __thiscall* )( void*, const model_t* ); - return util::get_vfunc< fn >( this, 3 )( this, model ); - } - - studiohdr_t* GetStudiomodel( const model_t* mod ) { - using fn = studiohdr_t* ( __thiscall* )( void*, const model_t* ); - return util::get_vfunc< fn >( this, 28 )( this, mod ); - } - - void GetModelMaterials( const model_t *model, int count, class IMaterial** ppMaterial ) { - using fn = const void( __thiscall* )( void*, const model_t*, int, IMaterial** ); - util::get_vfunc< fn >( this, 16 )( this, model, count, ppMaterial ); - } -}; - -enum OverrideType_t { - OVERRIDE_NORMAL = 0, - OVERRIDE_BUILD_SHADOWS, - OVERRIDE_DEPTH_WRITE, - OVERRIDE_SSAO_DEPTH_WRITE, -}; - -class IVModelRender { -public: - void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) { - using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int ); - return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk ); - } - - void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) { - using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); - util::get_vfunc< fn >( this, 21 )( this, matctx, state, pInfo, pCustomBoneToWorld ); - } -}; \ No newline at end of file diff --git a/gmod/IVRenderView.hpp b/gmod/IVRenderView.hpp deleted file mode 100644 index fef45ae..0000000 --- a/gmod/IVRenderView.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include "util.hpp" - -class IVRenderView { -public: - void SetBlend( float blend ) { - return util::get_vfunc< 4, void >( this, blend ); - } - - float GetBlend( ) { - return util::get_vfunc< 5, float >( this ); - } - - void SetColorModulation( float const* blend ) { - return util::get_vfunc< 6, void >( this, blend ); - } - - void GetColorModulation( float* blend ) { - return util::get_vfunc< 7, void >( this, blend ); - } -}; \ No newline at end of file diff --git a/gmod/KeyValues.cpp b/gmod/KeyValues.cpp deleted file mode 100644 index 265cfd8..0000000 --- a/gmod/KeyValues.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "KeyValues.hpp" -#include "pattern.hpp" -#include "interface.hpp" - -int IKeyValuesSystem::GetSymbolForString( const char* str, bool create ) { - static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 83 EC 0C 53 8B 5D 08 57" ) ); - using fn = int( __thiscall* )( void*, const char*, bool ); - - int symbol = ( ( fn )( offset ) )( this, str, create ); - printf( "%s: %d\n", str, symbol ); - return symbol; -} - -const char* IKeyValuesSystem::GetStringForSymbol( int symbol ) { - static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 8B 55 08 83 FA FF" ) ); - using fn = const char*( __thiscall* )( void*, int ); - - auto result = ( ( fn )( offset ) )( this, symbol ); - printf( "%d: %d\n", symbol, *( int* )( &result ) ); - - return result; -} - -KeyValues::KeyValues( const char* setName ) { - static bool inc{ }; - static auto key_values_fn = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "68 ? ? ? ? 8B C8 E8 ? ? ? ? 89 45 FC EB 07 C7 45 ? ? ? ? ? 8B 03 56" ) ) + 7; - if ( !inc ) { - key_values_fn += *reinterpret_cast< uintptr_t* >( key_values_fn + 1 ) + 5; - inc = true; - } - - reinterpret_cast< void( __thiscall* )( KeyValues*, const char* ) >( key_values_fn )( this, setName ); -} - -bool KeyValues::LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem, const char *pPathID, bool( *unknown )( const char* ) ) { - static auto load_from_buffer = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 34 53 8B 5D 0C 89 4C 24 04" ) ); - return reinterpret_cast< bool( __thiscall* )( KeyValues*, const char*, const char*, void*, const char*, bool( *)( const char* ) ) >( load_from_buffer ) - ( this, resourceName, pBuffer, pFileSystem, pPathID, unknown ); -} - -KeyValues* KeyValues::FindKey( const char* name ) { - auto key = g_gmod.m_keyvalues->GetSymbolForString( name, false ); - for( auto dat = m_pSub; !!dat; dat = dat->m_pPeer ) { - if( dat->m_iKeyName == key ) { - return dat; - } - } - - return nullptr; -} \ No newline at end of file diff --git a/gmod/KeyValues.hpp b/gmod/KeyValues.hpp deleted file mode 100644 index 0b11698..0000000 --- a/gmod/KeyValues.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include "util.hpp" - -class IKeyValuesSystem { -public: - int GetSymbolForString( const char* string, bool create ); - const char* GetStringForSymbol( int symbol ); -}; - -class KeyValues -{ -public: - KeyValues( const char *setName ); - bool LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem = nullptr, const char *pPathID = nullptr, bool( *unknown )( const char* ) = nullptr ); - - int m_iKeyName; - - char *m_sValue; - wchar_t *m_wsValue; - - // we don't delete these - union { - int m_iValue; - float m_flValue; - void *m_pValue; - unsigned char m_Color[ 4 ]; - }; - - char m_iDataType; - char m_bHasEscapeSequences; - char m_bEvaluateConditionals; - - KeyValues* FindKey( const char* key_name ); - - KeyValues *m_pPeer; // pointer to next key in list - KeyValues *m_pSub; // pointer to Start of a new sub key list - KeyValues *m_pChain;// Search here if it's not in our list -}; \ No newline at end of file diff --git a/gmod/Source.cpp b/gmod/Source.cpp deleted file mode 100644 index 6c8d000..0000000 --- a/gmod/Source.cpp +++ /dev/null @@ -1,187 +0,0 @@ -//this cheat was a mistake - -#include -#include - -#include "hooks.hpp" -#include "console.hpp" -#include "input_system.hpp" -#include "mem.hpp" - -HMODULE g_dll; - -void main_thread( HINSTANCE uh ) { -#ifdef IFACE_DLLMAIN - util::memset( ( uint8_t* )uh, 0x90, 0x1000 ); -#endif - g_gmod.initialize( ); - - while ( !g_gmod.m_panic ) { - std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) ); - } - - g_gmod.uninitialize( ); - ExitThread( 0 ); -} - -long __stdcall exception_handler( EXCEPTION_POINTERS* e ) { - const char* title = xors( "you crashed, retard" ); - std::string msg = xors( "unknown" ); - - ulong_t e_code = e->ExceptionRecord->ExceptionCode; - ulong_t e_info_0 = e->ExceptionRecord->ExceptionInformation[ 0 ]; - ulong_t e_info_1 = e->ExceptionRecord->ExceptionInformation[ 1 ]; - ulong_t e_info_2 = e->ExceptionRecord->ExceptionInformation[ 2 ]; - - switch( e_code ) { - case EXCEPTION_ACCESS_VIOLATION: - if( !e_info_0 ) - msg = xors( "read access violation at " ); - else if( e_info_0 == 1 ) - msg = xors( "write access violation at " ); - else - msg = xors( "access violation at " ); - - msg += util::to_hex_str( e_info_1 ); - break; - - case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: - msg = xors( "array bounds exceeded" ); - break; - - case EXCEPTION_BREAKPOINT: - msg = xors( "triggered breakpoint" ); - break; - - case EXCEPTION_FLT_DENORMAL_OPERAND: - case EXCEPTION_FLT_DIVIDE_BY_ZERO: - case EXCEPTION_FLT_INEXACT_RESULT: - case EXCEPTION_FLT_INVALID_OPERATION: - case EXCEPTION_FLT_OVERFLOW: - case EXCEPTION_FLT_UNDERFLOW: - case EXCEPTION_FLT_STACK_CHECK: - msg = xors( "invalid floating point operation" ); - break; - - case EXCEPTION_IN_PAGE_ERROR: - if( !e_info_0 ) - msg = xors( "page error - read access violation at " ); - else if( e_info_0 == 1 ) - msg = xors( "page error - write access violation at " ); - else - msg = xors( "page error - access violation at " ); - - msg += util::to_hex_str( e_info_1 ); - msg += '\n'; - msg += xors( "NTSTATUS: " ); - msg += util::to_hex_str( e_info_2 ); - break; - - case EXCEPTION_INT_DIVIDE_BY_ZERO: - case EXCEPTION_INT_OVERFLOW: - msg = xors( "invalid integer operation" ); - break; - - case EXCEPTION_STACK_OVERFLOW: - msg = xors( "stack overflow" ); - break; - - default: - msg = xors( "exception code: " ); - msg += util::to_hex_str( e_code ); - msg += xors( "\nexception variables: \n" ); - msg += util::to_hex_str( e_info_0 ); msg += '\n'; - msg += util::to_hex_str( e_info_1 ); msg += '\n'; - msg += util::to_hex_str( e_info_2 ); msg += '\n'; - break; - } - - msg += xors( "\nregister dump: \n" ); - msg += xors( "eax: " ); msg += util::to_hex_str( e->ContextRecord->Eax ); msg += '\n'; - msg += xors( "esi: " ); msg += util::to_hex_str( e->ContextRecord->Esi ); msg += '\n'; - msg += xors( "ebx: " ); msg += util::to_hex_str( e->ContextRecord->Ebx ); msg += '\n'; - msg += xors( "edi: " ); msg += util::to_hex_str( e->ContextRecord->Edi ); msg += '\n'; - msg += xors( "ecx: " ); msg += util::to_hex_str( e->ContextRecord->Ecx ); msg += '\n'; - msg += xors( "ebp: " ); msg += util::to_hex_str( e->ContextRecord->Ebp ); msg += '\n'; - msg += xors( "edx: " ); msg += util::to_hex_str( e->ContextRecord->Edx ); msg += '\n'; - msg += xors( "esp: " ); msg += util::to_hex_str( e->ContextRecord->Esp ); msg += '\n'; - - if( e->ExceptionRecord->ExceptionAddress ) { - msg += xors( "\nin module: " ); - MEMORY_BASIC_INFORMATION info; - VirtualQuery( ( void* )e->ExceptionRecord->ExceptionAddress, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); - - char module_buf[ 32 ]; - K32GetModuleBaseNameA( GetCurrentProcess( ), ( HMODULE )info.AllocationBase, module_buf, 32 ); - msg += std::string( module_buf ); - msg += " ( "; - msg += util::to_hex_str( ( uintptr_t )info.AllocationBase ); - msg += " ) "; - - msg += xors( "at: " ); - msg += util::to_hex_str( ( uintptr_t )e->ExceptionRecord->ExceptionAddress ); - } - - auto file = CreateFileA( xors( "./moneybot_dump.dmp" ), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, - nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr ); - - if( file ) { - WriteFile( file, msg.data( ), msg.size( ), nullptr, nullptr ); - CloseHandle( file ); - } - - return EXCEPTION_CONTINUE_EXECUTION; -} - -int __stdcall DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { - HANDLE thread; - - uintptr_t wanted_reason; -#ifdef _DEBUG - wanted_reason = DLL_PROCESS_ATTACH; -#else - wanted_reason = DLL_PROCESS_ATTACH; -#endif - - if ( reason == wanted_reason -#ifdef IFACE_DLLMAIN - && !!reserved -#endif - ) { -#ifdef IFACE_DLLMAIN - g_factory.init( ( uintptr_t )( reserved ) ); -#endif - - g_dll = inst; - - //yayo - //SetUnhandledExceptionFilter( exception_handler ); - DisableThreadLibraryCalls( inst ); - - thread = CreateThread( nullptr, 0, - ( LPTHREAD_START_ROUTINE )( main_thread ), - inst, 0, nullptr ); - - if( !thread ) - return 0; - - CloseHandle( thread ); - - return 1; - } - -#ifdef IFACE_DLLMAIN - else if( !reserved ) { - MessageBoxA( nullptr, "interface data nullptr (loader error?)", "error", MB_OK ); - return 1; - } -#endif - - - if( reason == DLL_PROCESS_DETACH ) { - g_gmod.m_panic = true; - //SetUnhandledExceptionFilter( nullptr ); - } - - return 0; -} \ No newline at end of file diff --git a/gmod/Valve/dt_common.h b/gmod/Valve/dt_common.h deleted file mode 100644 index 44bc2a2..0000000 --- a/gmod/Valve/dt_common.h +++ /dev/null @@ -1,180 +0,0 @@ -//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $NoKeywords: $ -// -//=============================================================================// - -#pragma once - -//#include -#include - -// Max number of properties in a datatable and its children. -#define MAX_DATATABLES 1024 // must be a power of 2. -#define MAX_DATATABLE_PROPS 4096 - -#define MAX_ARRAY_ELEMENTS 2048 // a network array should have more that 1024 elements - -#define HIGH_DEFAULT -121121.121121f - -#define BITS_FULLRES -1 // Use the full resolution of the type being encoded. -#define BITS_WORLDCOORD -2 // Encode as a world coordinate. - -#define DT_MAX_STRING_BITS 9 -#define DT_MAX_STRING_BUFFERSIZE (1<varName ) - -// Gets the size of a variable in a class. -#define PROPSIZEOF(className, varName) sizeof(((className*)0)->varName) - - -// SendProp::m_Flags. -#define SPROP_UNSIGNED (1<<0) // Unsigned integer data. - -#define SPROP_COORD (1<<1) // If this is set, the float/vector is treated like a world coordinate. -// Note that the bit count is ignored in this case. - -#define SPROP_NOSCALE (1<<2) // For floating point, don't scale into range, just take value as is. - -#define SPROP_ROUNDDOWN (1<<3) // For floating point, limit high value to range minus one bit unit - -#define SPROP_ROUNDUP (1<<4) // For floating point, limit low value to range minus one bit unit - -#define SPROP_NORMAL (1<<5) // If this is set, the vector is treated like a normal (only valid for vectors) - -#define SPROP_EXCLUDE (1<<6) // This is an exclude prop (not excludED, but it points at another prop to be excluded). - -#define SPROP_XYZE (1<<7) // Use XYZ/Exponent encoding for vectors. - -#define SPROP_INSIDEARRAY (1<<8) // This tells us that the property is inside an array, so it shouldn't be put into the -// flattened property list. Its array will point at it when it needs to. - -#define SPROP_PROXY_ALWAYS_YES (1<<9) // Set for datatable props using one of the default datatable proxies like -// SendProxy_DataTableToDataTable that always send the data to all clients. - -#define SPROP_CHANGES_OFTEN (1<<10) // this is an often changed field, moved to head of sendtable so it gets a small index - -#define SPROP_IS_A_VECTOR_ELEM (1<<11) // Set automatically if SPROP_VECTORELEM is used. - -#define SPROP_COLLAPSIBLE (1<<12) // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer -// (ie: for all automatically-chained base classes). -// In this case, it can get rid of this SendPropDataTable altogether and spare the -// trouble of walking the hierarchy more than necessary. - -#define SPROP_COORD_MP (1<<13) // Like SPROP_COORD, but special handling for multiplayer games -#define SPROP_COORD_MP_LOWPRECISION (1<<14) // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 -#define SPROP_COORD_MP_INTEGRAL (1<<15) // SPROP_COORD_MP, but coordinates are rounded to integral boundaries -#define SPROP_NUMFLAGBITS_NETWORKED 16 - -// This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are -// m_flAnimTime and m_flSimulationTime. MODs shouldn't need to mess with this probably -#define SPROP_ENCODED_AGAINST_TICKCOUNT (1<<16) - -// See SPROP_NUMFLAGBITS_NETWORKED for the ones which are networked -#define SPROP_NUMFLAGBITS 17 - -// Used by the SendProp and RecvProp functions to disable debug checks on type sizes. -#define SIZEOF_IGNORE -1 - - -// Use this to extern send and receive datatables, and reference them. -#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} -#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} - -#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable -#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable - - -class SendProp; - - -typedef enum -{ - DPT_Int = 0, - DPT_Float, - DPT_Vector, - DPT_VectorXY, - DPT_String, - DPT_Array, // An array of the base types (can't be of datatables). - DPT_DataTable, -#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! - DPT_Quaternion, -#endif - DPT_NUMSendPropTypes -} SendPropType; - - -class DVariant -{ -public: - DVariant( ) { m_Type = DPT_Float; } - DVariant( float val ) { m_Type = DPT_Float; m_Float = val; } - - const char *ToString( ) { - static char text[ 128 ]; - - switch( m_Type ) { - case DPT_Int: - sprintf_s( text, sizeof( text ), "%i", m_Int ); - break; - case DPT_Float: - sprintf_s( text, sizeof( text ), "%.3f", m_Float ); - break; - case DPT_Vector: - sprintf_s( text, sizeof( text ), "(%.3f,%.3f,%.3f)", - m_Vector[ 0 ], m_Vector[ 1 ], m_Vector[ 2 ] ); - break; - #if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! - case DPT_Quaternion: - sprintf_s( text, sizeof( text ), "(%.3f,%.3f,%.3f %.3f)", - m_Vector[ 0 ], m_Vector[ 1 ], m_Vector[ 2 ], m_Vector[ 3 ] ); - break; - #endif - case DPT_String: - if( m_pString ) - return m_pString; - else - return "NULL"; - break; - case DPT_Array: - sprintf_s( text, sizeof( text ), "Array" ); - break; - case DPT_DataTable: - sprintf_s( text, sizeof( text ), "DataTable" ); - break; - default: - sprintf_s( text, sizeof( text ), "DVariant type %i unknown", m_Type ); - break; - } - - return text; - } - - union - { - float m_Float; - long m_Int; - char *m_pString; - void *m_pData; // For DataTables. - #if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! - float m_Vector[ 4 ]; - #else - float m_Vector[ 3 ]; - #endif - }; - SendPropType m_Type; -}; - - -// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1. -inline int NumBitsForCount( int nMaxElements ) { - int nBits = 0; - while( nMaxElements > 0 ) { - ++nBits; - nMaxElements >>= 1; - } - return nBits; -} \ No newline at end of file diff --git a/gmod/Valve/dt_recv.h b/gmod/Valve/dt_recv.h deleted file mode 100644 index aaec6cc..0000000 --- a/gmod/Valve/dt_recv.h +++ /dev/null @@ -1,523 +0,0 @@ -//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $NoKeywords: $ -// -//=============================================================================// - -#ifndef DATATABLE_RECV_H -#define DATATABLE_RECV_H - -#ifdef _WIN32 -#pragma once -#endif - -#include "dt_common.h" - -#define ADDRESSPROXY_NONE -1 - - -class RecvTable; -class RecvProp; - - -// This is passed into RecvProxy functions. -class CRecvProxyData -{ -public: - const RecvProp *m_pRecvProp; // The property it's receiving. - - DVariant m_Value; // The value given to you to store. - - int m_iElement; // Which array element you're getting. - - int m_ObjectID; // The object being referred to. -}; - - -//----------------------------------------------------------------------------- -// pStruct = the base structure of the datatable this variable is in (like C_BaseEntity) -// pOut = the variable that this this proxy represents (like C_BaseEntity::m_SomeValue). -// -// Convert the network-standard-type value in m_Value into your own format in pStruct/pOut. -//----------------------------------------------------------------------------- -typedef void( *RecvVarProxyFn )( const CRecvProxyData *pData, void *pStruct, void *pOut ); - -// ------------------------------------------------------------------------ // -// ArrayLengthRecvProxies are optionally used to get the length of the -// incoming array when it changes. -// ------------------------------------------------------------------------ // -typedef void( *ArrayLengthRecvProxyFn )( void *pStruct, int objectID, int currentArrayLength ); - - -// NOTE: DataTable receive proxies work differently than the other proxies. -// pData points at the object + the recv table's offset. -// pOut should be set to the location of the object to unpack the data table into. -// If the parent object just contains the child object, the default proxy just does *pOut = pData. -// If the parent object points at the child object, you need to dereference the pointer here. -// NOTE: don't ever return null from a DataTable receive proxy function. Bad things will happen. -typedef void( *DataTableRecvVarProxyFn )( const RecvProp *pProp, void **pOut, void *pData, int objectID ); - - -// This is used to fork over the standard proxy functions to the engine so it can -// make some optimizations. -class CStandardRecvProxies -{ -public: - CStandardRecvProxies( ); - - RecvVarProxyFn m_Int32ToInt8; - RecvVarProxyFn m_Int32ToInt16; - RecvVarProxyFn m_Int32ToInt32; - RecvVarProxyFn m_FloatToFloat; - RecvVarProxyFn m_VectorToVector; -}; -extern CStandardRecvProxies g_StandardRecvProxies; - - -class CRecvDecoder; - - -class RecvProp -{ - // This info comes from the receive data table. -public: - RecvProp( ); - - void InitArray( int nElements, int elementStride ); - - int GetNumElements( ) const; - void SetNumElements( int nElements ); - - int GetElementStride( ) const; - void SetElementStride( int stride ); - - int GetFlags( ) const; - - const char* GetName( ) const; - SendPropType GetType( ) const; - - RecvTable* GetDataTable( ) const; - void SetDataTable( RecvTable *pTable ); - - RecvVarProxyFn GetProxyFn( ) const; - void SetProxyFn( RecvVarProxyFn fn ); - - DataTableRecvVarProxyFn GetDataTableProxyFn( ) const; - void SetDataTableProxyFn( DataTableRecvVarProxyFn fn ); - - int GetOffset( ) const; - void SetOffset( int o ); - - // Arrays only. - RecvProp* GetArrayProp( ) const; - void SetArrayProp( RecvProp *pProp ); - - // Arrays only. - void SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ); - ArrayLengthRecvProxyFn GetArrayLengthProxy( ) const; - - bool IsInsideArray( ) const; - void SetInsideArray( ); - - // Some property types bind more data to the prop in here. - const void* GetExtraData( ) const; - void SetExtraData( const void *pData ); - - // If it's one of the numbered "000", "001", etc properties in an array, then - // these can be used to get its array property name for debugging. - const char* GetParentArrayPropName( ); - void SetParentArrayPropName( const char *pArrayPropName ); - -public: - - const char *m_pVarName; - SendPropType m_RecvType; - int m_Flags; - int m_StringBufferSize; - - -public: - - bool m_bInsideArray; // Set to true by the engine if this property sits inside an array. - - // Extra data that certain special property types bind to the property here. - const void *m_pExtraData; - - // If this is an array (DPT_Array). - RecvProp *m_pArrayProp; - ArrayLengthRecvProxyFn m_ArrayLengthProxy; - - RecvVarProxyFn m_ProxyFn; - DataTableRecvVarProxyFn m_DataTableProxyFn; // For RDT_DataTable. - - RecvTable *m_pDataTable; // For RDT_DataTable. - int m_Offset; - - int m_ElementStride; - int m_nElements; - - // If it's one of the numbered "000", "001", etc properties in an array, then - // these can be used to get its array property name for debugging. - const char *m_pParentArrayPropName; -}; - - -class RecvTable -{ -public: - - typedef RecvProp PropType; - - RecvTable( ); - RecvTable( RecvProp *pProps, int nProps, const char *pNetTableName ); - ~RecvTable( ); - - void Construct( RecvProp *pProps, int nProps, const char *pNetTableName ); - - int GetNumProps( ); - RecvProp* GetProp( int i ); - - const char* GetName( ); - - // Used by the engine while initializing array props. - void SetInitialized( bool bInitialized ); - bool IsInitialized( ) const; - - // Used by the engine. - void SetInMainList( bool bInList ); - bool IsInMainList( ) const; - - -public: - - // Properties described in a table. - RecvProp *m_pProps; - int m_nProps; - - // The decoder. NOTE: this covers each RecvTable AND all its children (ie: its children - // will have their own decoders that include props for all their children). - CRecvDecoder *m_pDecoder; - - const char *m_pNetTableName; // The name matched between client and server. - - -public: - - bool m_bInitialized; - bool m_bInMainList; -}; - - -inline int RecvTable::GetNumProps( ) { - return m_nProps; -} - -inline RecvProp* RecvTable::GetProp( int i ) { - // Assert( i >= 0 && i < m_nProps ); - return &m_pProps[ i ]; -} - -inline const char* RecvTable::GetName( ) { - return m_pNetTableName; -} - -inline void RecvTable::SetInitialized( bool bInitialized ) { - m_bInitialized = bInitialized; -} - -inline bool RecvTable::IsInitialized( ) const { - return m_bInitialized; -} - -inline void RecvTable::SetInMainList( bool bInList ) { - m_bInMainList = bInList; -} - -inline bool RecvTable::IsInMainList( ) const { - return m_bInMainList; -} - - -// ------------------------------------------------------------------------------------------------------ // -// See notes on BEGIN_SEND_TABLE for a description. These macros work similarly. -// ------------------------------------------------------------------------------------------------------ // -#define BEGIN_RECV_TABLE(className, tableName) \ - BEGIN_RECV_TABLE_NOBASE(className, tableName) \ - RecvPropDataTable("baseclass", 0, 0, className::BaseClass::m_pClassRecvTable, DataTableRecvProxy_StaticDataTable), - -#define BEGIN_RECV_TABLE_NOBASE(className, tableName) \ - template int ClientClassInit(T *); \ - namespace tableName { \ - struct ignored; \ - } \ - template <> int ClientClassInit(tableName::ignored *); \ - namespace tableName { \ - RecvTable g_RecvTable; \ - int g_RecvTableInit = ClientClassInit((tableName::ignored *)NULL); \ - } \ - template <> int ClientClassInit(tableName::ignored *) \ - { \ - typedef className currentRecvDTClass; \ - const char *pRecvTableName = #tableName; \ - RecvTable &RecvTable = tableName::g_RecvTable; \ - static RecvProp RecvProps[] = { \ - RecvPropInt("should_never_see_this", 0, sizeof(int)), // It adds a dummy property at the start so you can define "empty" SendTables. - -#define END_RECV_TABLE() \ - }; \ - RecvTable.Construct(RecvProps+1, sizeof(RecvProps) / sizeof(RecvProp) - 1, pRecvTableName); \ - return 1; \ - } - - -#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) -#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) -#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName) -#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName)) -#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0]) - -// Just specify the name and offset. Used for strings and data tables. -#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName) -#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName) -#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName) - - -void RecvProxy_FloatToFloat( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_VectorToVector( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_QuaternionToQuaternion( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_Int32ToInt8( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_Int32ToInt16( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_StringToString( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_Int32ToInt32( const CRecvProxyData *pData, void *pStruct, void *pOut ); - -// StaticDataTable does *pOut = pData. -void DataTableRecvProxy_StaticDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); - -// PointerDataTable does *pOut = *((void**)pData) (ie: pData is a pointer to the object to decode into). -void DataTableRecvProxy_PointerDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); - - -RecvProp RecvPropFloat( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_FloatToFloat -); - -RecvProp RecvPropVector( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_VectorToVector -); - -// This is here so the RecvTable can look more like the SendTable. -#define RecvPropQAngles RecvPropVector - -#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! - -RecvProp RecvPropQuaternion( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_QuaternionToQuaternion -); -#endif - -RecvProp RecvPropInt( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = 0 -); - -RecvProp RecvPropString( - const char *pVarName, - int offset, - int bufferSize, - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_StringToString -); - -RecvProp RecvPropDataTable( - const char *pVarName, - int offset, - int flags, - RecvTable *pTable, - DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable -); - -RecvProp RecvPropArray3( - const char *pVarName, - int offset, - int sizeofVar, - int elements, - RecvProp pArrayProp, - DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable -); - -// Use the macro to let it automatically generate a table name. You shouldn't -// ever need to reference the table name. If you want to exclude this array, then -// reference the name of the variable in varTemplate. -RecvProp InternalRecvPropArray( - const int elementCount, - const int elementStride, - const char *pName, - ArrayLengthRecvProxyFn proxy -); - - -// -// Use this if you want to completely manage the way the array data is stored. -// You'll need to provide a proxy inside varTemplate that looks for 'iElement' -// to figure out where to store the specified element. -// -#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \ - varTemplate, \ - InternalRecvPropArray( \ - maxArrayLength, \ - 0, \ - #propertyName, \ - arrayLengthProxy \ - ) - - -// Use this and pass the array name and it will figure out the count and stride automatically. -#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \ - varTemplate, \ - InternalRecvPropArray( \ - sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ - PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ - #arrayName, \ - arrayLengthProxy \ - ) - - -// Use this and pass the array name and it will figure out the count and stride automatically. -#define RecvPropArray( varTemplate, arrayName ) \ - RecvPropVariableLengthArray( 0, varTemplate, arrayName ) - - -// Use this one to specify the element count and stride manually. -#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \ - varTemplate, \ - InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy ) - - -// ---------------------------------------------------------------------------------------- // -// Inlines. -// ---------------------------------------------------------------------------------------- // - -inline void RecvProp::InitArray( int nElements, int elementStride ) { - m_RecvType = DPT_Array; - m_nElements = nElements; - m_ElementStride = elementStride; -} - -inline int RecvProp::GetNumElements( ) const { - return m_nElements; -} - -inline void RecvProp::SetNumElements( int nElements ) { - m_nElements = nElements; -} - -inline int RecvProp::GetElementStride( ) const { - return m_ElementStride; -} - -inline void RecvProp::SetElementStride( int stride ) { - m_ElementStride = stride; -} - -inline int RecvProp::GetFlags( ) const { - return m_Flags; -} - -inline const char* RecvProp::GetName( ) const { - return m_pVarName; -} - -inline SendPropType RecvProp::GetType( ) const { - return m_RecvType; -} - -inline RecvTable* RecvProp::GetDataTable( ) const { - return m_pDataTable; -} - -inline void RecvProp::SetDataTable( RecvTable *pTable ) { - m_pDataTable = pTable; -} - -inline RecvVarProxyFn RecvProp::GetProxyFn( ) const { - return m_ProxyFn; -} - -inline void RecvProp::SetProxyFn( RecvVarProxyFn fn ) { - m_ProxyFn = fn; -} - -inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn( ) const { - return m_DataTableProxyFn; -} - -inline void RecvProp::SetDataTableProxyFn( DataTableRecvVarProxyFn fn ) { - m_DataTableProxyFn = fn; -} - -inline int RecvProp::GetOffset( ) const { - return m_Offset; -} - -inline void RecvProp::SetOffset( int o ) { - m_Offset = o; -} - -inline RecvProp* RecvProp::GetArrayProp( ) const { - return m_pArrayProp; -} - -inline void RecvProp::SetArrayProp( RecvProp *pProp ) { - m_pArrayProp = pProp; -} - -inline void RecvProp::SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ) { - m_ArrayLengthProxy = proxy; -} - -inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy( ) const { - return m_ArrayLengthProxy; -} - -inline bool RecvProp::IsInsideArray( ) const { - return m_bInsideArray; -} - -inline void RecvProp::SetInsideArray( ) { - m_bInsideArray = true; -} - -inline const void* RecvProp::GetExtraData( ) const { - return m_pExtraData; -} - -inline void RecvProp::SetExtraData( const void *pData ) { - m_pExtraData = pData; -} - -inline const char* RecvProp::GetParentArrayPropName( ) { - return m_pParentArrayPropName; -} - -inline void RecvProp::SetParentArrayPropName( const char *pArrayPropName ) { - m_pParentArrayPropName = pArrayPropName; -} - -#endif // DATATABLE_RECV_H diff --git a/gmod/aimbot.cpp b/gmod/aimbot.cpp deleted file mode 100644 index 313b927..0000000 --- a/gmod/aimbot.cpp +++ /dev/null @@ -1,404 +0,0 @@ - -#include "aimbot.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "math.hpp" -#include "base_cheat.hpp" -#include "input_system.hpp" - -namespace features -{ - void c_aimbot::operator()( user_cmd_t* cmd ) { - m_cmd = cmd; - run( ); - } - - c_aimbot::aim_target_t c_aimbot::find_best_target( ) const { - aim_target_t ret{ -1, vec3_t{ } }; - vec3_t angle{ }; - - g_gmod.m_engine( )->GetViewAngles( angle ); - - vec3_t angle_dir = math::angle_vectors( angle ); - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - float closest_to = std::numeric_limits< float >::max( ); - - for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { - auto ent = g_gmod.m_entlist( )->GetClientEntity( i ); - if( !ent || ent == g_ctx.m_local || !ent->is_valid( ) ) - continue; - - if( g_settings.rage.ignore_team && - g_ctx.m_local->m_iTeamNum( ) == ent->m_iTeamNum( ) ) - continue; - - if( g_settings.rage.ignore_teamcolor && - g_ctx.m_local->get_team_color( ) == ent->get_team_color( ) ) - continue; - - if( g_settings.rage.ignore_spawnprot && - ent->m_clrRender( ).a( ) < 250 ) - continue; - - player_info_t info; - if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) - continue; - - // whitelisted. - if( g_cheat.m_playerlist.is_friend( info.m_steamid ) ) - continue; - - const auto ent_pos = get_entity_position( ent ); - if( ent_pos.is_zero( ) ) - continue; - - auto dir = ( ent_pos - eye_pos ); - dir.normalize_vector( ); - - const float fov = angle_dir.fov_to( dir ) * M_RADPI; - if( fov > g_settings.rage.fov ) - continue; - - if( g_settings.rage.selection_type( ) == 0 ) { - if( fov < closest_to ) { - closest_to = fov; - ret.m_ent_index = i; - ret.m_position = ent_pos; - } - } - else if( g_settings.rage.selection_type( ) == 1 ) { - float dist = eye_pos.dist_to( ent_pos ); - if( dist < closest_to ) { - closest_to = dist; - ret.m_ent_index = i; - ret.m_position = ent_pos; - } - } - } - return ret; - } - - vec3_t c_aimbot::get_entity_position( c_base_player* ent ) const { - matrix3x4 matrix[ 256 ]{ }; - bool found_valid_hitbox{ }; - // the idea behind this is that some players can have really weird models and our aimbot will not work on them - // so if they don't have a valid hitbox, we then get the OOB center of their model and use that instead. - // fuck gmod. - // const const const const - bool hitscan = g_settings.rage.hitbox == -1; - const char* hitbox_selection[ ] = { - "Head", - "Neck", - "Pelvis", - "Chest" - }; - - - if( !ent->ce( )->SetupBones( matrix, 256, 0x100, g_gmod.m_globals->m_curtime ) ) - return vec3_t{ }; - - const auto model = ent->ce( )->GetModel( ); - if( !model ) - return vec3_t{ }; - - const auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); - if( !hdr ) - return vec3_t{ }; - - const auto set = hdr->get_hitbox_set( ent->m_nHitboxSet( ) ); - if( !set ) - return vec3_t{ }; - - for( int i{ }; i < set->numhitboxes; ++i ) { - const auto hitbox = set->get_hitbox( i ); - if( !hitbox ) - continue; - - const auto bone = hdr->get_bone( hitbox->bone ); - if( !bone ) - continue; - - const std::string name = bone->get_name( ); - if( name.empty( ) ) - continue; - - if( hitscan ) { - if( name.find( "Head" ) == std::string::npos ) - continue; - } - else { - if( name.find( hitbox_selection[ g_settings.rage.hitbox ] ) == std::string::npos ) - continue; - } - - const auto pos = math::vector_transform( ( hitbox->min + hitbox->max ) * 0.5f, matrix[ hitbox->bone ] ); - if( pos.is_zero( ) ) - continue; - - found_valid_hitbox = true; - if( ent->is_visible( pos ) ) - return pos; - } - - if( hitscan ) { // ghetto but it works fine. - for( int i{ }; i < set->numhitboxes; ++i ) { - const auto hitbox = set->get_hitbox( i ); - if( !hitbox ) - continue; - - const auto pos = math::vector_transform( ( hitbox->min + hitbox->max ) * 0.5f, matrix[ hitbox->bone ] ); - if( pos.is_zero( ) ) - continue; - - if( ent->is_visible( pos ) ) - return pos; - } - } - - if( !found_valid_hitbox ) { - auto pos = ent->ce( )->GetRenderOrigin( ); - pos += ( ent->m_vecMins( ) + ent->m_vecMaxs( ) ) * 0.5f; - if( ent->is_visible( pos ) ) - return pos; - } - - return vec3_t{ }; - } - - void c_aimbot::fix_accuracy( vec3_t& angle ) { - auto srand = []( double seed ) -> void { - if( !g_ctx.m_lua ) - return; - - const auto lua = g_ctx.m_lua; - - lua->GetField( LUA_GLOBALSINDEX, xors( "math" ) ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { - lua->Pop( 1 ); - return; - } - - lua->GetField( -1, xors( "randomseed" ) ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { - lua->Pop( 2 ); - return; - } - - lua->PushNumber( seed ); - lua->Call( 1, 0 ); - - lua->Pop( 1 ); - }; - - auto rand = []( const double low, const double high ) -> double { - if( !g_ctx.m_lua ) - return 0.0; - - const auto lua = g_ctx.m_lua; - - lua->GetField( LUA_GLOBALSINDEX, xors( "math" ) ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { - lua->Pop( 1 ); - return 0.0; - } - - lua->GetField( -1, xors( "Rand" ) ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { - lua->Pop( 2 ); - return 0.0; - } - - lua->PushNumber( low ); - lua->PushNumber( high ); - - lua->Call( 2, 1 ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { - lua->Pop( 2 ); - return 0.0; - } - - double rand = lua->GetNumber( -1 ); - - lua->Pop( 2 ); - - return rand; - }; - - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) - return; - - bool is_cw20 = weapon->is_cw20( ); // own spread handling weapon packs (big). - bool is_fas2 = weapon->is_fas2( ); - bool is_custom = is_cw20 || is_fas2; - - auto weapon_name = weapon->get_class_name( ); - if( !is_custom && !weapon_name ) - return; - - auto cone = m_spread[ weapon_name ]; - if( !is_custom && cone.is_zero( ) ) - return; - - float cur_cone = weapon->get_custom_cone( ); - if( is_custom || cur_cone ) { // may be custom weapon similar to FAS2/CW20 - if ( g_settings.rage.norecoil ) - angle -= g_ctx.m_local->m_vecPunchAngle( ); - - if( !g_settings.rage.nospread ) - return; - - if( is_cw20 ) { - srand( m_cmd->m_cmd_nr ); - - if( g_ctx.m_local->m_fFlags( ) & FL_DUCKING ) - cur_cone *= 0.85f; - } - else if ( is_fas2 ) { - srand( g_ctx.m_local->m_nTickBase( ) * g_gmod.m_globals->m_interval_per_tick ); // FPS has to be over tickrate otherwise this fucks up, do not know how to fix. - } - else { - srand( g_ctx.m_local->m_nTickBase( ) * g_gmod.m_globals->m_interval_per_tick ); // some other custom ones based on FAS2 or CW20 use this. - } - - angle.x -= ( float )( rand( -cur_cone, cur_cone ) * 25.0 ); - angle.y -= ( float )( rand( -cur_cone, cur_cone ) * 25.0 ); - } - else { - // if hl2 - // no recoil... figure this out. - - if( !g_settings.rage.nospread ) - return; - - util::set_random_seed( m_cmd->m_random_seed & 0xff ); - - float rand_a = util::get_random_float( -0.5f, 0.5f ) + util::get_random_float( -0.5f, 0.5f ); - float rand_b = util::get_random_float( -0.5f, 0.5f ) + util::get_random_float( -0.5f, 0.5f ); - - float spread_x = cone.x * rand_a; - float spread_y = cone.y * rand_b; - - vec3_t forward, right, up; - math::angle_vectors( angle, &forward, &right, &up ); - - vec3_t spread_dir = forward + ( right * -spread_x ) + ( up * -spread_y ); - spread_dir.normalize_vector( ); - - angle = math::vector_angles( vec3_t{ }, spread_dir ); - } - } - - void c_aimbot::aim_at_target( const c_aimbot::aim_target_t& target ) { - // we're not gonna be checking for m_flNextPrimaryFire due to server side anticheats checking if IN_ATTACK is sent when you can fire, you will get banned. - // I'm gonna do some ghetto autopistol if we find that the weapon is not automatic (we can find this easily using a lua member of the weapon). - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - vec3_t angle_to_target = math::vector_angles( eye_pos, target.m_position ); - auto weapon = g_ctx.m_local->get_weapon( ); - float yaw = m_cmd->m_viewangles.y; - - fix_accuracy( angle_to_target ); - - if( g_settings.rage.silent != 2 || weapon->is_fas2( ) || weapon->is_cw20( ) || weapon->get_custom_cone( ) ) { // These custom weapons cannot do pSilent as they handle shot direction themselves... should probably warn users about this. - m_cmd->m_viewangles = angle_to_target.clamp( ); - - vec3_t delta = m_last_viewangles - ( m_cmd->m_viewangles - m_last_viewangles ); - m_cmd->m_mousedx = -( short )( delta.x / 0.022f ); // serverside anticheats detect this stuff. - m_cmd->m_mousedy = ( short )( delta.y / 0.022f ); - - if( g_settings.rage.silent == 1 ) { - vec3_t move = vec3_t( m_cmd->m_forwardmove, m_cmd->m_sidemove, m_cmd->m_upmove ); - float len = move.length( ); - - if( len ) { - move = math::angle_vectors( ( math::vector_angles( vec3_t{ }, move ) + vec3_t( 0, m_cmd->m_viewangles.y - yaw, 0 ) ) ) * len; - m_cmd->m_forwardmove = move.x; - m_cmd->m_sidemove = move.y; - } - } - } - else { - m_shot_dir = math::angle_vectors( angle_to_target.clamp( ) ); // save for later. this is really inaccurate and i do not know why. - m_shot_dir.normalize_vector( ); - } - - if( g_settings.rage.silent( ) == 0 ) - g_gmod.m_engine( )->SetViewAngles( m_cmd->m_viewangles ); - - if( g_settings.rage.auto_fire ) - m_cmd->m_buttons |= IN_ATTACK; - } - - void c_aimbot::log_shot( c_base_player* ent, fire_bullets_info* info ) { - // we log shot spread cones due to not having a proper function to give us weapon spread... - if( !ent || !info ) - return; - - if( info->spread.is_zero( ) ) - return; - - auto weapon = ent->get_weapon( ); - if( !weapon ) - return; - - auto weapon_name = weapon->get_class_name( ); - if( !weapon_name ) - return; - - m_spread[ weapon_name ] = info->spread; - } - - void c_aimbot::silent( ) { - // the idea behind this was using the context menu used in sandbox and darkrp ( C menu ) - // you can fire anywhere in the menu but it doesn't change your view angles - // worldclick stuff gets set in C_GMOD_Player::CreateMove so we must set it after the call to it. - // however this method has some problems, the weapon back has to be using the lua call player:GetAimVector() for src direction in FireBullets - // otherwise it will not work, 2 of the biggest weapon packs do not use this function so its kinda bork - // another problem is that if you do not aim within a 30 degree cone of your target or are close to them, lag compensation will not take effect ( thanks garry ) - // - kolo - - if( !m_cmd ) - return; - - m_last_viewangles = m_cmd->m_viewangles; // for mousedx garbage. - - if( !g_settings.rage.enabled ) - return; - - if( g_settings.rage.silent != 2 ) - return; - - if( m_shot_dir.is_zero( ) ) - return; - - m_cmd->m_world_clicking = true; - m_cmd->m_world_click_direction = m_shot_dir; - - m_shot_dir = vec3_t{ }; // useless now. - } - - void c_aimbot::run( ) { - if( !g_settings.rage.enabled ) - return; - - if( g_settings.rage.activation_type != 0 && - !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.rage.aimkey( ) ) ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) - return; - - //auto wpn_data = weapon->get_wpn_data( ); // only works for hl2 weapons.. - //if( !wpn_data ) // however you can get lua weapon data, cast to C_WeaponSWEP and call correct functions. - // return; - - auto target = find_best_target( ); - if( target.m_ent_index != -1 ) { - aim_at_target( target ); - } - } -} - diff --git a/gmod/aimbot.hpp b/gmod/aimbot.hpp deleted file mode 100644 index 5b6ad5f..0000000 --- a/gmod/aimbot.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include -#include -#include - -#include "sdk.hpp" -#include "console.hpp" - -namespace features -{ - class c_aimbot - { - public: - c_aimbot( ) = default; - - private: - struct aim_target_t - { - int m_ent_index; - vec3_t m_position; - }; - - vec3_t m_shot_dir{ }, m_last_viewangles{ }; - user_cmd_t* m_cmd{ }; - std::map< const char*, vec3_t > m_spread{ }; // sorry not sorry - - void run( ); - - aim_target_t find_best_target( ) const; - vec3_t get_entity_position( c_base_player* ent ) const; - void aim_at_target( const aim_target_t& target ); - void fix_accuracy( vec3_t& angle ); - public: - void operator()( user_cmd_t* cmd ); - void silent( ); - void log_shot( c_base_player* local, fire_bullets_info* info ); - }; -} diff --git a/gmod/autowall.cpp b/gmod/autowall.cpp deleted file mode 100644 index d94afbc..0000000 --- a/gmod/autowall.cpp +++ /dev/null @@ -1,305 +0,0 @@ -#include - -#include "autowall.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "math.hpp" - -namespace features -{ - bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) { - if ( armor_value <= 0 ) return false; - - switch ( hitgroup ) { - case HITGROUP_GENERIC: - case HITGROUP_CHEST: - case HITGROUP_STOMACH: - case HITGROUP_LEFTARM: - case HITGROUP_RIGHTARM: - return true; - case HITGROUP_HEAD: - return ent->m_bHasHelmet( ); - } - - return false; - } - - void c_autowall::trace_line( const vec3_t& start, const vec3_t& end, unsigned mask, void* ignore, CGameTrace* tr ) { - CTraceFilter filter; - Ray_t ray; - - filter.pSkip = ignore; - ray.Init( start, end ); - - g_csgo.m_trace( )->TraceRay( ray, mask, &filter, tr ); - } - - void c_autowall::scale_damage( c_base_player* ent, int hitgroup, float weapon_armor_ratio, float& damage ) { - float multiplier; - float armor_ratio; - float new_damage; - int armor; - - auto get_hitgroup_mul = []( int hitgroup ) { - switch ( hitgroup ) { - case HITGROUP_HEAD: - return 4.f; - case HITGROUP_STOMACH: - return 1.25f; - case HITGROUP_LEFTLEG: - case HITGROUP_RIGHTLEG: - return 0.75f; - } - - return 1.0f; - }; - - multiplier = get_hitgroup_mul( hitgroup ); - damage *= multiplier; - armor = ent->m_ArmorValue( ); - - if ( is_armored( ent, armor, hitgroup ) ) { - armor_ratio = weapon_armor_ratio * 0.5f; - new_damage = damage * armor_ratio; - if ( hitgroup != HITGROUP_HEAD && damage - damage * armor_ratio * 0.5f > armor ) { - new_damage = damage - armor * 2.0f; - } - - damage = new_damage; - } - } - - bool c_autowall::is_breakable( IClientEntity* ent ) { - static auto is_breakable_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 85 F6 74 68 83 BE" ) ); - - auto& v2 = *reinterpret_cast< uint8_t* >( uintptr_t( ent ) + 0x27c ); - uint8_t backup_value = v2; - - auto clientclass = ent->GetClientClass( ); - if( clientclass->m_class_id != CFuncBrush && clientclass->m_class_id != CBaseDoor ) - v2 = 2; - - auto is_breakable_fn = reinterpret_cast< bool( __thiscall* )( void* ) >( is_breakable_ptr ); - - bool is_breakable = is_breakable_fn( ent ); - v2 = backup_value; - - return is_breakable; - } - - bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) { - float dist = 0.f; - CTraceFilter filter; - Ray_t ray, ray_2; - - while( dist <= 90.f ) { - dist += 4.f; - - out_end = start + dir * dist; - - int contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX ); - - if( contents & MASK_SHOT_HULL && !( contents & CONTENTS_HITBOX ) ) - continue; - - ray.Init( out_end, out_end - dir * 4.f ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, 0, exit_trace ); - - if( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) { - filter.pSkip = exit_trace->m_pEnt; - - ray_2.Init( out_end, start ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace ); - - if( exit_trace->DidHit( ) && !exit_trace->startsolid ) { - out_end = exit_trace->endpos; - return true; - } - } - else if( !exit_trace->DidHit( ) || exit_trace->startsolid ) { - if( tr.m_pEnt && tr.m_pEnt->GetIndex( ) ) { - if( is_breakable( tr.m_pEnt ) ) - return true; - - start = tr.endpos; - } - } - else if( ( ( exit_trace->surface.flags >> 7 ) & 1 ) && !( ( tr.surface.flags >> 7 ) & 1 ) ) - continue; - else if( exit_trace->plane.normal.dot( dir ) <= 1.0f ) { - auto fraction = exit_trace->fraction * 4.0f; - out_end = out_end - dir * fraction; - - return true; - } - } - - return false; - } - - bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) { - surfacedata_t* enter_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps ); - int enter_material = enter_surface_data->game.material; - float enter_surf_penetration_mod = enter_surface_data->game.penetrationmodifier; - - data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; - data.current_damage *= static_cast( pow( wpn_data->range_modifier, data.trace_length * 0.002 ) ); - - if( data.trace_length > 3000.f || enter_surf_penetration_mod < 0.1f ) - data.penetrate_count = 0; - - if( data.penetrate_count <= 0 ) - return false; - - vec3_t dummy; - CGameTrace trace_exit; - if( !trace_to_exit( data.enter_trace.endpos, data.direction, dummy, data.enter_trace, &trace_exit ) ) - return false; - - surfacedata_t* exit_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( trace_exit.surface.surfaceProps ); - - int exit_material = exit_surface_data->game.material; - float exit_surf_penetration_mod = exit_surface_data->game.penetrationmodifier; - - float final_damage_modifier = 0.16f; - float combined_penetration_modifier = 0.0f; - - if( ( data.enter_trace.contents & CONTENTS_GRATE ) != 0 || enter_material == 89 || enter_material == 71 ) { - combined_penetration_modifier = 3.0f; - final_damage_modifier = 0.05f; - } - else { - combined_penetration_modifier = ( enter_surf_penetration_mod + exit_surf_penetration_mod ) * 0.5f; - } - - if( enter_material == exit_material ) { - if( exit_material == 87 || exit_material == 85 ) - combined_penetration_modifier = 3.0f; - else if( exit_material == 76 ) - combined_penetration_modifier = 2.0f; - } - - float modifier = fmaxf( 0.f, 1.0f / combined_penetration_modifier ); - float taken_damage = ( data.current_damage * final_damage_modifier ) + modifier * 3.0f * fmaxf( 0.0f, - ( float )( 3.0 / ( wpn_data->penetration ) ) * 1.25f ); - float thickness = ( trace_exit.endpos - data.enter_trace.endpos ).lengthsqr( ); - - thickness *= modifier; - thickness *= 0.041666668f; - - float lost_damage = fmaxf( 0.0f, taken_damage + thickness ); - - if( lost_damage > data.current_damage ) - return false; - - if( lost_damage >= 0.0f ) - data.current_damage -= lost_damage; - - if( data.current_damage < 1.0f ) - return false; - - data.src = trace_exit.endpos; - data.penetrate_count--; - - return true; - } - - bool c_autowall::fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check, bool scale ) { - data.penetrate_count = 4; - data.trace_length = 0.f; - - if ( !wep_data ) - return false; - - data.current_damage = ( float )( wep_data->damage ); - - while ( data.penetrate_count > 0 && data.current_damage > 1.0f ) { - if ( !ent_check ) { - data.trace_length_remaining = data.length_to_end - data.trace_length; - } - else { - data.trace_length_remaining = wep_data->range - data.trace_length; - } - - vec3_t end = data.src + data.direction * data.trace_length_remaining; - trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace ); - - util::clip_trace_to_player( target->ce( ), data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace ); - - if ( data.enter_trace.fraction == 1.0f ) { - if ( !ent_check ) { - data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; - data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); - - if( scale ) - scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage ); - return true; - } - - break; - } - - - if ( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD - && data.enter_trace.m_pEnt == target->ce( ) ) { - data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; - data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); - - auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt ); - auto cl = enemy->ce( )->GetClientClass( ); - if ( cl->m_class_id != CCSPlayer ) { - return false; - } - - if ( shooter->m_iTeamNum( ) == enemy->m_iTeamNum( ) && !g_settings.rage.friendlies ) { - return false; - } - - if( scale ) - scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage ); - - return true; - } - - if ( !handle_bullet_penetration( wep_data, data ) ) - break; - } - - return false; - } - - float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) { - if ( !shooter || !target ) { - return 0.f; - } - - auto wep = shooter->get_weapon( ); - if ( !wep ) { - return 0.f; - } - - fire_bullet_data_t data; - data.src = shooter->m_vecOrigin( ); - data.filter.pSkip = shooter; - - if ( shooter == g_ctx.m_local ) { - data.src += shooter->m_vecViewOffset( ); - } - else { - data.src += 72.f; - } - - data.length_to_end = ( end - data.src ).length( ); - - vec3_t angles = math::vector_angles( data.src, end ); - data.direction = math::angle_vectors( angles ); - - data.direction.normalize_vector( ); - - if ( fire_bullet( shooter, target, wep->get_wpn_info( ), data, ent_check ) ) { - return data.current_damage; - } - - return 0.f; - } -} diff --git a/gmod/autowall.hpp b/gmod/autowall.hpp deleted file mode 100644 index dfddbcc..0000000 --- a/gmod/autowall.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#include "sdk.hpp" -#include "pattern.hpp" -#include "interface.hpp" - -struct fire_bullet_data_t { - vec3_t src; - CGameTrace enter_trace; - vec3_t direction; - CTraceFilter filter; - float trace_length; - float trace_length_remaining; - float length_to_end; - float current_damage; - int penetrate_count; -}; - -namespace features -{ - class c_autowall { - private: - bool is_armored( c_base_player* entity, int armor_value, int hitgroup ); - void scale_damage( c_base_player* entity, int hitgroup, float weapon_armor_ratio, float& damage ); - void trace_line( const vec3_t& abs_start, const vec3_t& abs_end, unsigned mask, void* ignore, CGameTrace* trace ); - bool is_breakable( IClientEntity* ent ); - - bool trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ); - - public: - bool handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ); - bool fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check = true, bool scale_damage = true ); - float run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check = true ); - }; -} \ No newline at end of file diff --git a/gmod/base_cheat.cpp b/gmod/base_cheat.cpp deleted file mode 100644 index 1a44474..0000000 --- a/gmod/base_cheat.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "base_cheat.hpp" - -features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/gmod/base_cheat.hpp b/gmod/base_cheat.hpp deleted file mode 100644 index b842f98..0000000 --- a/gmod/base_cheat.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include "util.hpp" -#include "movement.hpp" -#include "prediction.hpp" -#include "playerlist.hpp" -// #include "legitbot.hpp" -// #include "chams.hpp" -// #include "autowall.hpp" -#include "aimbot.hpp" -// #include "identity.hpp" -#include "lag_mgr.hpp" -#include "visual.hpp" -#include "extra.hpp" -// #include "movement_recorder.hpp" -// #include "player_manager.hpp" -// #include "skins.hpp" - -NAMESPACE_REGION( features ) - -class c_base_cheat { -public: - //have your cheat classes in here - c_movement m_movement; - c_prediction m_prediction; - c_player_list m_playerlist; - //c_legitbot m_legitbot; - //c_autowall m_autowall; - c_aimbot m_aimbot; - //c_identity m_identity; - //c_chams m_chams; - c_lagmgr m_lagmgr; - c_extra m_extra; - //c_skins m_skins; - c_visuals m_visuals; - //c_move_recorder m_move_rec; - //c_player_manager m_player_mgr; -}; - -END_REGION - -extern features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/gmod/bf_write.hpp b/gmod/bf_write.hpp deleted file mode 100644 index 80960e3..0000000 --- a/gmod/bf_write.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -class bf_write { -public: - bf_write( void* data, int bytes, int max_bits = -1 ) { - m_data = ( unsigned char* )data; - m_bytes = bytes; - if( max_bits == -1 ) - m_bits = bytes * 8; - else - m_bits = max_bits; - } - - bf_write( const char* debug_name, void* data, int bytes, int max_bits = -1 ) { - m_debug_name = debug_name; - m_data = ( unsigned char* )data; - m_bytes = bytes; - if( max_bits == -1 ) - m_bits = bytes * 8; - else - m_bits = max_bits; - } - -public: - unsigned char* m_data{ }; - int m_bytes{ }; - int m_bits{ }; - int m_cur_bit{ }; - -private: - bool m_overflow{ }; - bool m_assert_on_overflow{ }; - const char* m_debug_name{ }; -}; \ No newline at end of file diff --git a/gmod/c_base_player.cpp b/gmod/c_base_player.cpp deleted file mode 100644 index caf1ea0..0000000 --- a/gmod/c_base_player.cpp +++ /dev/null @@ -1,433 +0,0 @@ -#include "c_base_player.hpp" -#include "interface.hpp" -#include "math.hpp" -#include "context.hpp" -#include "base_cheat.hpp" - -#undef max - -//CCSGOPlayerAnimState* c_base_player::sm_player_animstate[ 65 ]; -// -//void CCSGOPlayerAnimState::update( float yaw, float pitch ) { -// static auto fn_ptr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24" ) ); -// uintptr_t alloc = ( uintptr_t )this; -// -// -// //vectorcall is GAY -// if( fn_ptr ) { -// __asm { -// push 0 -// mov ecx, alloc -// -// movss xmm1, dword ptr[ yaw ] -// movss xmm2, dword ptr[ pitch ] -// -// call fn_ptr -// } -// } -//} -// -//void CCSGOPlayerAnimState::reset( ) { -// static auto fn_ptr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "56 6A 01 68 ? ? ? ? 8B F1" ) ); -// if( fn_ptr ) { -// auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); -// fn( this ); -// } -//} -// -//uintptr_t c_base_player::get_player_resource( ) { -// for( int i{ 1 }; i < g_gmod.m_entlist( )->GetHighestEntityIndex( ); ++i ) { -// auto ent = g_gmod.m_entlist( )->GetClientEntity< IClientEntity >( i ); -// if( !ent ) continue; -// auto class_ = ent->GetClientClass( ); -// if( class_ ) { -// if( class_->m_class_id == CCSPlayerResource ) { -// return uintptr_t( ent ); -// } -// } -// } -// -// return 0; -//} -// -////use is_zero( ) on the vector to figure out if it returns a valid value -//vec3_t c_base_player::get_hitbox_pos( int hitbox ) { -// auto ce = this->ce( ); -// -// const auto model = ce->GetModel( ); -// if( !model ) return vec3_t{ }; -// -// auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); -// if( !hdr ) return vec3_t{ }; -// -// matrix3x4 bone_matrix[ 128 ]; -// if( !ce->SetupBones( bone_matrix, 128, 0x100, g_gmod.m_globals->m_curtime ) ) { -// return vec3_t{ }; -// } -// -// auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); -// if( !set ) return vec3_t{ }; -// -// auto box = set->pHitbox( hitbox ); -// if( !box ) return vec3_t{ }; -// -// vec3_t center = ( box->bbmin + box->bbmax ) * 0.5f; -// -// return math::vector_transform( center, bone_matrix[ box->bone ] ); -//} -// - -c_base_player* c_base_player::get_observer_target( ) { - return g_gmod.m_entlist( )->GetClientEntityFromHandle( m_hObserverTarget( ) ); -} - - -const char* c_base_player::get_rank( ) { - if( !g_ctx.m_lua ) - return ""; - - const auto lua = g_ctx.m_lua; - - this->ce( )->PushEntity( ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { - lua->Pop( 1 ); - return ""; - } - - lua->GetField( -1, "GetUserGroup" ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { - lua->Pop( 2 ); - return ""; - } - - lua->Push( -2 ); // have to push the current entity. - - lua->Call( 1, 1 ); - if( !lua->IsType( -1, LUA_TYPE::_TYPE_STRING ) ) { - lua->Pop( 2 ); - return ""; - } - - const char* rank = lua->GetString( -1 ); - - lua->Pop( 2 ); - - return rank; -} - -clr_t c_base_player::get_team_color( ) { - if( !g_ctx.m_lua ) - return clr_t{ }; - - const auto lua = g_ctx.m_lua; - - clr_t ret{ }; - - lua->GetField( LUA_GLOBALSINDEX, xors( "team" ) ); // team - if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { - lua->Pop( 1 ); - return clr_t{ }; - } - - lua->GetField( -1, xors( "GetColor" ) ); // team, GetColor - if( !lua->IsType( -1, LUA_TYPE::TYPE_FUNCTION ) ) { - lua->Pop( 2 ); - return clr_t{ }; - } - - lua->PushNumber( ( double )m_iTeamNum( ) ); // team, GetColor, team_number - lua->Call( 1, 1 ); // team, color_table - if( !lua->IsType( -1, LUA_TYPE::TYPE_TABLE ) ) { - lua->Pop( 2 ); - return clr_t{ }; - } - - lua->PushString( xors( "r" ) ); // team, color_table, "r" - lua->GetTable( -2 ); // team, color_table, r_value - if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { - lua->Pop( 3 ); - return clr_t{ }; - } - - ret.r( ) = lua->GetNumber( -1 ); - lua->Pop( 1 ); - - lua->PushString( xors( "g" ) ); // team, color_table, "g" - lua->GetTable( -2 ); // team, color_table, g_value - if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { - lua->Pop( 3 ); - return clr_t{ }; - } - - ret.g( ) = lua->GetNumber( -1 ); - lua->Pop( 1 ); - - lua->PushString( xors( "b" ) ); // team, color_table, "b" - lua->GetTable( -2 ); // team, color_table, b_value - if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { - lua->Pop( 3 ); - return clr_t{ }; - } - - ret.b( ) = lua->GetNumber( -1 ); - lua->Pop( 3 ); // stack cleaned up. - - return ret; -} - -c_base_weapon* c_base_player::get_weapon( ) { - return g_gmod.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( m_hActiveWeapon( ) ); -} -bool c_base_player::is_visible( const vec3_t& pos ) { - vec3_t start = g_ctx.m_local->get_eye_pos( ); - return util::trace_ray( start, pos, g_ctx.m_local->ce( ), this->ce( ) ); -} - -// -//bool c_base_player::is_visible( int hitbox ) { -// vec3_t start = g_ctx.m_local->get_eye_pos( ); -// vec3_t end = get_hitbox_pos( hitbox ); -// -// if( !end ) return false; -// return util::trace_ray( start, end, g_ctx.m_local->ce( ), this->ce( ) ); -//} -// -//float c_base_player::get_hitbox_radius( int hitbox ) { -// auto model = ce( )->GetModel( ); -// auto hdr = g_gmod.m_model_info( )->GetStudiomodel( model ); -// auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); -// -// if( !model || !hdr || !set ) -// return 0.f; -// -// auto box = set->pHitbox( hitbox ); -// -// if( box ) { -// auto dist = box->bbmin.dist_to( box->bbmax ); -// return dist + box->m_flRadius > 0 ? box->m_flRadius : 0.f; -// } -// -// return 0.f; -//} -// -//bool c_base_player::is_fakewalking( ) { -// auto walk_layer = m_AnimOverlay( ).GetElements( )[ 6 ]; -// auto velocity = m_vecVelocity( ).length2d( ); -// bool on_ground = m_fFlags( ) & FL_ONGROUND; -// if( walk_layer.m_flWeight < 0.03f && velocity > 0.1f && on_ground ) { -// return true; -// } -// -// return false; -//} -// -//int c_base_player::get_choked_ticks( ) { -// auto simtime = m_flSimulationTime( ); -// -// return TIME_TO_TICKS( g_gmod.m_globals->m_curtime - simtime ) + 1; -//} -// -//bool c_base_player::is_breaking_lc( ) { -// auto choked = get_choked_ticks( ); -// auto velocity = m_vecVelocity( ); -// auto ipt = g_gmod.m_globals->m_interval_per_tick; -// -// vec3_t travel_origin = m_vecOrigin( ) + velocity * ( ipt * choked ); -// return travel_origin.dist_to_sqr( m_vecOrigin( ) ) > 4096.f; -//} -// -//bool c_base_player::can_attack( bool ignore_rapid ) { -// if( g_ctx.m_has_fired_this_frame ) return false; -// if( !is_alive( ) ) return false; -// -// auto weapon = get_weapon( ); -// if( !weapon ) return false; -// -// float time = g_ctx.pred_time( ); -// -// float next_attack = m_flNextAttack( ); -// if( next_attack > time ) return false; -// -// float next_primary_attack = weapon->m_flNextPrimaryAttack( ); -// if( next_primary_attack > time ) return false; -// -// if( weapon->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER ) { -// float ready_time = weapon->m_flPostponeFireReadyTime( ); -// if( ready_time == FLT_MAX ) return false; -// -// float time_to_shoot = ready_time - time; -// return TIME_TO_TICKS( time_to_shoot ) < 1; -// } -// -// return true; -//} -// -//int c_base_player::get_seq_activity( int sequence ) { -// static uintptr_t fn_offset = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 7D 08 FF 56 8B F1 74 3D" ) ); -// auto fn = ( int( __thiscall* )( void*, int ) )( fn_offset ); -// -// return fn ? fn( this, sequence ) : -2; -//} -// -//void c_base_player::set_abs_angles( vec3_t angles ) { -// static uintptr_t fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 64 53 56 57 8B F1 E8" ) ); -// auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); -// -// return fn( this, angles ); -//} -// -//void c_base_player::set_abs_origin( vec3_t origin ) { -// static uintptr_t fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 51 53 56 57 8B F1" ) ); -// auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); -// -// return fn( this, origin ); -//} -// -//void c_base_player::create_animstate( CCSGOPlayerAnimState* state ) { -// static auto fn_addr = pattern::first_code_match( g_gmod.m_chl.dll( ), xors( "55 8B EC 56 8B F1 B9 ? ? ? ? C7 46" ) ); -// auto fn = ( void( __thiscall* )( CCSGOPlayerAnimState*, decltype( this ) ) )( fn_addr ); -// -// fn( state, this ); -//} -// -//void c_base_player::enforce_animations( ) { -// int idx = this->ce( )->GetIndex( ); -// auto animstate = sm_player_animstate[ idx ]; -// -// if( animstate && animstate->pBaseEntity == this ) { -// memcpy( get_animstate( ), animstate, sizeof( CCSGOPlayerAnimState ) ); -// } -// -// //get< bool >( 0x38CD ) = false; -// //get< bool >( 0x35F8 ) = false; -// //m_bClientSideAnimation( ) = false; -//} -// -//void c_base_player::fix_animations( CCSGOPlayerAnimState* saved_state ) { -// bool valid = false; -// int idx = this->ce( )->GetIndex( ); -// -// C_AnimationLayer anim_backup[ 13 ]{ }; -// float pose_param_backup[ 24 ]{ }; -// -// memcpy( anim_backup, -// m_AnimOverlay( ).GetElements( ), -// sizeof( anim_backup ) ); -// -// memcpy( pose_param_backup, -// m_flPoseParameter( ), -// sizeof( pose_param_backup ) ); -// -// auto sequence_backup = m_nSequence( ); -// auto flags_backup = m_fFlags( ); -// auto cycle_backup = m_flCycle( ); -// auto eye_angles = m_angEyeAngles( ); -// auto render_angles = ce( )->GetRenderAngles( ); -// auto origin = m_vecOrigin( ); -// -// //these change but idk what they are -// m_bClientSideAnimation( ) = true; -// this->invalidate_bone_cache( ); -// -// auto backup_curtime = g_gmod.m_globals->m_curtime; -// auto backup_frametime = g_gmod.m_globals->m_frametime; -// auto backup_interp = g_gmod.m_globals->m_interpolation_amount; -// -// g_gmod.m_globals->m_curtime = m_flSimulationTime( ) - util::get_lerptime( ); -// g_gmod.m_globals->m_frametime = TICK_INTERVAL( ); -// -// int framecount = g_gmod.m_globals->m_framecount; -// -// auto csgo_animstate = get_animstate( ); -// if( csgo_animstate ) { -// if( !saved_state ) { -// if( !sm_player_animstate[ idx ] ) { -// sm_player_animstate[ idx ] = ( CCSGOPlayerAnimState* )g_gmod.m_alloc->Alloc( sizeof( CCSGOPlayerAnimState ) ); -// this->create_animstate( sm_player_animstate[ idx ] ); -// } -// else if( sm_player_animstate[ idx ]->pBaseEntity != this ) { -// sm_player_animstate[ idx ]->reset( ); -// this->create_animstate( sm_player_animstate[ idx ] ); -// sm_player_animstate[ idx ]->pBaseEntity = this; -// } -// else { -// valid = true; -// sm_player_animstate[ idx ]->m_iLastClientSideAnimationUpdateFramecount = 0; -// sm_player_animstate[ idx ]->m_flLastClientSideAnimationUpdateTime = 0.f; -// sm_player_animstate[ idx ]->update( eye_angles.y, eye_angles.x ); -// } -// } -// } -// else { -// g_con->log( xors( "couldnt update animstate for player %d!" ), ce( )->GetIndex( ) ); -// return; -// } -// -// //call updateclientsideanimation -// util::get_vfunc< 218, void >( this ); -// -// if( saved_state ) -// memcpy( csgo_animstate, saved_state, sizeof( CCSGOPlayerAnimState ) ); -// else if( valid ) -// memcpy( csgo_animstate, sm_player_animstate[ idx ], sizeof( CCSGOPlayerAnimState ) ); -// -// this->ce( )->GetRenderAngles( ).y = std::remainderf( ce( )->GetRenderAngles( ).y, 360.f ); -// this->ce( )->GetRenderOrigin( ) = m_vecOrigin( ); -// set_abs_angles( this->ce( )->GetRenderAngles( ) ); -// set_abs_origin( m_vecOrigin( ) ); -// m_fFlags( ) = flags_backup; -// m_flCycle( ) = cycle_backup; -// m_nSequence( ) = sequence_backup; -// -// //*( int* )( uintptr_t( this ) + 0xa30 ) = 0; -// //m_nWriteableBones( ) = 0; -// -// memcpy( m_AnimOverlay( ).GetElements( ), -// anim_backup, -// sizeof( anim_backup ) ); -// -// memcpy( m_flPoseParameter( ), -// pose_param_backup, -// sizeof( pose_param_backup ) ); -// -// m_flLastBoneSetupTime( ) = 0.f; -// m_iMostRecentModelBoneCounter( ) = 0; -// -// ce( )->SetupBones( nullptr, -1, 0x100, m_flSimulationTime( ) ); -// -// m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); -// m_iMostRecentModelBoneCounter( ) = 0; -// -// g_gmod.m_globals->m_curtime = backup_curtime; -// g_gmod.m_globals->m_frametime = backup_frametime; -// -// m_bClientSideAnimation( ) = false; -//} -// -player_info_t c_base_player::get_info( ) { - player_info_t info; - g_gmod.m_engine( )->GetPlayerInfo( ce( )->GetIndex( ), &info ); - - return info; -} - -void c_base_player::get_name_safe( char* buf ) { - player_info_t info; - if( g_gmod.m_engine( )->GetPlayerInfo( this->ce( )->GetIndex( ), &info ) ) { - for( size_t i{ }; i < 32; ++i ) { - switch( info.name[ i ] ) { - case '"': - case '\\': - case ';': - case '\n': - buf[ i ] = ' '; - break; - default: - buf[ i ] = info.name[ i ]; - break; - } - } - - buf[ 31 ] = 0; - } -} \ No newline at end of file diff --git a/gmod/c_base_player.hpp b/gmod/c_base_player.hpp deleted file mode 100644 index 085f4a2..0000000 --- a/gmod/c_base_player.hpp +++ /dev/null @@ -1,258 +0,0 @@ -#pragma once -#include "util.hpp" -#include "IClientEntityList.hpp" -#include "netvars.hpp" -#include "pattern.hpp" -#include "c_base_weapon.hpp" -#include "CUtlVector.hpp" -#include "settings.hpp" - -enum PlayerState_t { - FL_ONGROUND = 1 << 0, - FL_DUCKING = 1 << 1, - FL_WATERJUMP = 1 << 2, - FL_ONTRAIN = 1 << 3, - FL_INRAIN = 1 << 4, - FL_FROZEN = 1 << 5, - FL_ATCONTROLS = 1 << 6, - FL_CLIENT = 1 << 7, - FL_FAKECLIENT = 1 << 8, - FL_INWATER = 1 << 9, -}; - -enum MoveType_t { - MOVETYPE_NONE = 0, // never moves - MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc. - MOVETYPE_WALK, // Player only - moving on the ground - MOVETYPE_STEP, // gravity, special edge handling -- monsters use this - MOVETYPE_FLY, // No gravity, but still collides with stuff - MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity - MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation - MOVETYPE_PUSH, // no clip to world, push and crush - MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity - MOVETYPE_LADDER, // Used by players only when going onto a ladder - MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode - MOVETYPE_CUSTOM, // Allows the entity to describe its own physics - MOVETYPE_LAST = MOVETYPE_CUSTOM, // should always be defined as the last item in the list - MOVETYPE_MAX_BITS = 4, -}; - -enum LifeState_t { - LIFE_ALIVE = 0, // alive - LIFE_DYING, // playing death animation or still falling off of a ledge waiting to hit ground - LIFE_DEAD, // dead. lying still. - LIFE_RESPAWNABLE, - LIFE_DISCARDBODY, -}; - -class fire_bullets_info -{ -public: - int32_t shots; //0x0000 - vec3_t src; //0x0004 - vec3_t dir; //0x0010 - vec3_t spread; //0x001C - float distance; //0x0028 - int32_t ammo_type; //0x002C - int32_t tracer_freq; //0x0030 - float damage; //0x0034 - int32_t player_damager; //0x0038 - int32_t flags; //0x003C - char pad_0040[ 18 ]; //0x0040 -}; //Size: 0x0054 - - - -struct clientanimating_t { - void* m_pAnimating; - unsigned int m_fFlags; - clientanimating_t( void* _pAnim, unsigned int _flags ) : m_pAnimating( _pAnim ), m_fFlags( _flags ) {} -}; - - - -class VarMapEntry_t { -public: - unsigned short type; - unsigned short m_bNeedsToInterpolate; // Set to false when this var doesn't - // need Interpolate() called on it anymore. - void* data; - void* watcher; -}; - -struct VarMapping_t { - CUtlVector< VarMapEntry_t > m_Entries; - int m_nInterpolatedEntries; // +0x14 - float m_lastInterpolationTime; // +0x18 -}; - -class c_base_player { -private: - -public: - //NETVAR( m_YourFunctionName, "Name", "Table", extra, type ) - - NETVAR( m_nMoveType, "m_Collision", "DT_BaseEntity", -0x24, MoveType_t ); - NETVAR( m_iHealth, "m_iHealth", "DT_BaseEntity", 0, int ); - NETVAR( m_lifeState, "m_lifeState", "DT_BasePlayer", 0, uint8_t ); - NETVAR( m_nTickBase, "m_nTickBase", "DT_BasePlayer", 0, int ); - NETVAR( m_fFlags, "m_fFlags", "DT_BasePlayer", 0, int ); - //NETVAR( m_vecVelocity, "m_vecVelocity[0]", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_nHitboxSet, "m_nHitboxSet", "DT_BaseAnimating", 0, int ); - NETVAR( m_vecOrigin, "m_vecOrigin", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_vecViewOffset, "m_vecViewOffset[0]", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_hActiveWeapon, "m_hActiveWeapon", "DT_BaseCombatCharacter", 0, ulong_t ); - NETVAR( m_iTeamNum, "m_iTeamNum", "DT_BaseEntity", 0, int ); - NETVAR( m_dwBoneMatrix, "m_nForceBone", "DT_BaseAnimating", 28, uintptr_t ); - NETVAR( m_bHasHelmet, "m_bHasHelmet", "DT_CSPlayer", 0, bool ); - NETVAR( m_ArmorValue, "m_ArmorValue", "DT_CSPlayer", 0, int ); - NETVAR( m_flNextAttack, "m_flNextAttack", "DT_BaseCombatCharacter", 0, float ); - NETVAR( m_angEyeAngles, "m_angEyeAngles[0]", "DT_CSPlayer", 0, vec3_t ); - NETVAR( m_AnimOverlay, "m_hLightingOrigin", "DT_BaseAnimating", 0x3c, int ); - NETVAR( m_flSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0, float ); - NETVAR( m_flCycle, "m_flCycle", "DT_BaseAnimating", 0, float ); - NETVAR( m_nSequence, "m_nSequence", "DT_BaseAnimating", 0, int ); - PNETVAR( m_flPoseParameter, "m_flPoseParameter", "DT_BaseAnimating", 0, float ); - NETVAR( m_bClientSideAnimation, "m_bClientSideAnimation", "DT_BaseAnimating", 0, bool ); - NETVAR( m_flLastBoneSetupTime, "m_hLightingOrigin", "DT_BaseAnimating", -0x20, float ); - NETVAR( m_iMostRecentModelBoneCounter, "m_nForceBone", "DT_BaseAnimating", 0x4, int ); - NETVAR( m_nWriteableBones, "m_nForceBone", "DT_BaseAnimating", 0x20, int ); - NETVAR( m_vecThirdpersonAngles, "deadflag", "DT_BasePlayer", 0x4, vec3_t ); - NETVAR( m_hObserverTarget, "m_hObserverTarget", "DT_BasePlayer", 0, uint32_t ); - NETVAR( m_iObserverMode, "m_iObserverMode", "DT_BasePlayer", 0, int ); - NETVAR( m_csgoAnimState, "m_bIsScoped", "DT_CSPlayer", -0xe, void* ); - NETVAR( m_flOldSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0x4, float ); - NETVAR( m_CoordinateFrame, "m_CollisionGroup", "DT_BaseEntity", -0x4C, matrix3x4 ); - NETVAR( m_vecMins, "m_vecMins", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_vecMaxs, "m_vecMaxs", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_bIsScoped, "m_bIsScoped", "DT_CSPlayer", 0, bool ); - NETVAR( m_viewPunchAngle, "m_viewPunchAngle", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_flMaxFlashAlpha, "m_flFlashMaxAlpha", "DT_CSPlayer", 0, float ); - NETVAR( m_flFlashDuration, "m_flFlashDuration", "DT_CSPlayer", 0, float ); - NETVAR( m_flFlashTime, "m_flFlashMaxAlpha", "DT_CSPlayer", -0x10, float ); - NETVAR( m_bGunGameImmunity, "m_bGunGameImmunity", "DT_CSPlayer", 0, bool ); - NETVAR( m_hViewModel, "m_hViewModel[0]", "DT_BasePlayer", 0, uint32_t ); - NETVAR( m_bSpotted, "m_bSpotted", "DT_CSPlayer", 0, bool ); - NETVAR( m_clrRender, "m_clrRender", "DT_BaseEntity", 0, clr_t ); - NETVAR( m_vecPunchAngle, "m_vecPunchAngle", "DT_BasePlayer", 0, vec3_t ); - - OFFSET( m_CachedBoneData, 0x28FC + sizeof( void* ), CUtlVector< matrix3x4 > ); - OFFSET( m_flSpawnTime, 0xa290, float ); - OFFSET( m_vecVelocity, 0xf4, vec3_t ); - -public: - static uintptr_t get_player_resource( ); - - /*makes it much more organized: functions from IClientEntity - dont interfere with our defined functions*/ - __forceinline IClientEntity* ce( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - __forceinline operator IClientEntity*( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - template < typename t > - __forceinline t& get( std::ptrdiff_t offset ) { - return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); - } - - __forceinline bool is_alive( ) { - return m_iHealth( ) > 0; - } - - bool is_flashed( ); - bool is_reloading( ); - - __forceinline auto& m_aimPunchAngle( bool real = false ) { - static vec3_t backup_var{ }; - static auto offset = g_netvars.get_netvar( fnv( "DT_BasePlayer" ), fnv( "m_aimPunchAngle" ) ); - if( g_settings.misc.no_recoil( ) && !real ) { - backup_var = { 0.f, 0.f, 0.f }; - return backup_var; - } - - return get< vec3_t >( offset ); - } - - __forceinline void* get_animstate( ) { - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( "DT_CSPlayer" ), - fnv( "m_bIsScoped" ) ); - - if( !offset ) { - return nullptr; - } - - return *reinterpret_cast< void** >( uintptr_t( this ) + offset - 0xa ); - } - - __forceinline void disable_interpolaton( ) { - VarMapping_t* varmapping = ( VarMapping_t* )( uintptr_t( this ) + 0x24 ); - - for( int i{ }; i < varmapping->m_nInterpolatedEntries; ++i ) { - if( !varmapping->m_Entries.GetElements( ) ) { - continue; - } - - auto e = &varmapping->m_Entries.GetElements( )[ i ]; - - if( e ) - e->m_bNeedsToInterpolate = false; - } - - //this is the only thing that actually disables interpolation - //to re-enable it, u want to backup and restore m_nInterpolatedEntries - //theres no need to re-enable it because the game will do it for you - //as soon as you stop forcing it off - varmapping->m_nInterpolatedEntries = 0; - varmapping->m_lastInterpolationTime = 0.f; - } - - __forceinline void update_clientside_animation( ) { - bool backup = m_bClientSideAnimation( ); - m_bClientSideAnimation( ) = true; - util::get_vfunc< 218, void >( this ); - m_bClientSideAnimation( ) = backup; - } - - __forceinline void invalidate_bone_cache( ) { - m_flLastBoneSetupTime( ) = -FLT_MAX; - m_iMostRecentModelBoneCounter( ) -= 1; - m_nWriteableBones( ) = 0; - } - - __forceinline vec3_t get_eye_pos( ) { - vec3_t yes; - util::get_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 286 )( this, yes ); - return yes; - } - - __forceinline bool is_valid( ) { - return !ce( )->IsDormant( ) && is_alive( ); - } - - c_base_player* get_observer_target( ); - const char* get_rank( ); - clr_t get_team_color( ); - bool is_fakewalking( ); - player_info_t get_info( ); - void get_name_safe( char* buf ); - c_base_weapon* get_weapon( ); - vec3_t get_hitbox_pos( int hitbox ); - bool is_visible( int hitbox ); - bool is_visible( const vec3_t& pos ); - bool can_attack( bool ignore_rapid = false ); - int get_choked_ticks( ); - float get_hitbox_radius( int hitbox ); - - void set_abs_origin( vec3_t origin ); - void set_abs_angles( vec3_t angles ); - void enforce_animations( ); - - void create_animstate( void* state ); - int get_seq_activity( int sequence ); - - void fix_animations( void* saved_state = nullptr ); - bool is_breaking_lc( ); -}; \ No newline at end of file diff --git a/gmod/c_base_weapon.cpp b/gmod/c_base_weapon.cpp deleted file mode 100644 index 94c5ec6..0000000 --- a/gmod/c_base_weapon.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "c_base_weapon.hpp" -#include "context.hpp" -#include "base_cheat.hpp" - -void* c_base_weapon::get_wpn_data( ) { - static auto func = pattern::first_code_match< void*( __thiscall* )( void* ) >( g_gmod.m_chl.dll( ), "0F B7 81 ? ? ? ? 50 E8 ? ? ? ? 83 C4 04 C3" ); - - if ( func ) - return func( this ); - - return nullptr; -} - -bool c_base_weapon::is_cw20( ) { - if( !g_ctx.m_lua ) - return false; - - const auto lua = g_ctx.m_lua; - - this->ce( )->PushEntity( ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { - lua->Pop( 2 ); - return false; - } - - lua->GetField( -1, xors( "CW20Weapon" ) ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_BOOL ) ) { - lua->Pop( 2 ); - return false; - } - - bool is_cw20 = lua->GetBool( -1 ); - - lua->Pop( 2 ); - - return is_cw20; -} - -bool c_base_weapon::is_fas2( ) { - if( !g_ctx.m_lua ) - return false; - - const auto lua = g_ctx.m_lua; - - this->ce( )->PushEntity( ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { - lua->Pop( 2 ); - return false; - } - - lua->GetField( -1, xors( "IsFAS2Weapon" ) ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_BOOL ) ) { - lua->Pop( 2 ); - return false; - } - - bool is_fas2 = lua->GetBool( -1 ); - - lua->Pop( 2 ); - - return is_fas2; -} - -float c_base_weapon::get_custom_cone( ) { - if( !g_ctx.m_lua ) - return 0.f; - - const auto lua = g_ctx.m_lua; - - this->ce( )->PushEntity( ); // thank god for this function. - if( !lua->IsType( -1, LUA_TYPE::TYPE_ENTITY ) ) { - lua->Pop( 2 ); - return false; - } - - lua->GetField( -1, xors( "CurCone" ) ); - if( !lua->IsType( -1, LUA_TYPE::TYPE_NUMBER ) ) { - lua->Pop( 2 ); - return false; - } - - float cone = lua->GetNumber( -1 ); - - lua->Pop( 2 ); - - return cone; -} \ No newline at end of file diff --git a/gmod/c_base_weapon.hpp b/gmod/c_base_weapon.hpp deleted file mode 100644 index 76884c8..0000000 --- a/gmod/c_base_weapon.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include "util.hpp" -#include "IClientEntityList.hpp" -#include "netvars.hpp" -#include "pattern.hpp" - - - -class c_base_weapon { -public: - NETVAR( m_iClip1, "m_iClip1", "DT_BaseCombatWeapon", 0, int ); - NETVAR( m_flNextPrimaryAttack, "m_flNextPrimaryAttack", "DT_BaseCombatWeapon", 0, float ); - NETVAR( m_hOwner, "m_hOwner", "DT_BaseCombatWeapon", 0, uint32_t ); - NETVAR( m_nModelIndex, "m_nModelIndex", "DT_BaseEntity", 0, int ); - - __forceinline IClientEntity* ce( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - __forceinline operator IClientEntity*( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - template < typename t > - __forceinline t& get( std::ptrdiff_t offset ) { - return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); - } - - int get_max_clip1( ) { - return util::get_vfunc< 355, int >( this ); - } - - const char* get_class_name( ) { - return util::get_vfunc< 366, const char* >( this ); - } - - const char* get_print_name( ) { - return util::get_vfunc< 367, const char* >( this ); - } - - void* get_wpn_data( ); - - char get_hud_icon( ); - - bool is_cw20( ); - bool is_fas2( ); - float get_custom_cone( ); -}; \ No newline at end of file diff --git a/gmod/chams.cpp b/gmod/chams.cpp deleted file mode 100644 index 09abe58..0000000 --- a/gmod/chams.cpp +++ /dev/null @@ -1,157 +0,0 @@ -#include "chams.hpp" -#include "interface.hpp" - -static auto chams_mat = xors_raw( ( - R"("VertexLitGeneric" -{ - "$basetexture" "vgui/white" - "$model" "1" - "$envmap" "env_cubemap" - "$envmaptint" "[.3 .3 .3]" - "$envmapcontrast" ".4" - "$envmapsaturation" "1.0" - "$flat" "0" - "$nocull" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" - "$phong" "1" - "$phongexponent" "255.0" - "$normalmapalphaenvmask" "1" - "$phongboost" "6.0" - "$phongfresnelranges" "[0 0.5 1]" - "$BasemapAlphaPhongMask" "1" -})" -) ); - -static auto chams_mat_shine = xors_raw( ( - R"("VertexLitGeneric" -{ - "$basetexture" "vgui/white" - "$envmap" "env_cubemap" - "$envmaptint" "[.3 .3 .3]" - "$reflectivity" "[1.0 1.0 1.0]" - "$envmapcontrast" ".4" - "$envmapsaturation" "1.0" - "$model" "1" - "$flat" "0" - "$nocull" "1" - "$selfillum" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" -})" -) ); - -static auto chams_mat_flat = xors_raw( ( - R"("UnlitGeneric" -{ - "$basetexture" "vgui/white" - "$model" "1" - "$flat" "1" - "$nocull" "1" - "$selfillum" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" -})" -) ); - -namespace features -{ - void c_materials::make_cham_buffer( char* buf, int len, int type ) { - switch ( type ) { - case 1: - sprintf_s( buf, len - 1, chams_mat_flat.decrypt( ) ); - break; - case 2: - sprintf_s( buf, len - 1, chams_mat_shine.decrypt( ) ); - break; - default: - sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); - } - } - - void c_material::init( const char* name, const char* buf ) { - m_keyvalues = new KeyValues( name ); - m_keyvalues->LoadFromBuffer( name, buf ); - - m_mat = g_csgo.m_mat_system( )->CreateMaterial( name, m_keyvalues ); - m_mat->IncrementReferenceCount( ); - } - - void c_materials::force_material( IMaterial* mat, fclr_t clr ) { - if( !mat ) return; - - float col[ ] = { clr.r( ), clr.g( ), clr.b( ) }; - g_csgo.m_render_view( )->SetBlend( clr.a( ) ); - g_csgo.m_render_view( )->SetColorModulation( col ); - - g_csgo.m_model_render( )->ForcedMaterialOverride( mat ); - } - - void c_materials::initialize_materials( ) { - char buffer[ 1024 ]; - - make_cham_buffer( buffer, sizeof( buffer ), 0 ); - m_chams.init( xors( "chamsmat" ), buffer ); - memset( buffer, 0, 1024 ); - - make_cham_buffer( buffer, sizeof( buffer ), 1 ); - m_chams_flat.init( xors( "chamsmat_flat" ), buffer ); - memset( buffer, 0, 1024 ); - m_initialized = true; - } - - void c_materials::update_materials( ) { - if( !m_initialized ) return; - static float last_reflectivity{ }; - static float last_shine{ }; - static KeyValues* reflectivity; - static KeyValues* shine; - - if( !reflectivity ) { - for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { - if( it->m_iDataType != 1 ) continue; - if( strstr( it->m_sValue, xors( "[.3 .3 .3]" ) ) ) { - reflectivity = it; - } - } - } - - if( !shine ) { - for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { - if( it->m_flValue == 6.0f ) - shine = it; - } - } - - if( reflectivity ) { - if( last_reflectivity != g_settings.visuals.chams.reflectivity( ) ) { - char buf[ 32 ]; - sprintf_s< 32 >( buf, xors( "[%1.1f %1.1f %1.1f]" ), - g_settings.visuals.chams.reflectivity( ), - g_settings.visuals.chams.reflectivity( ), - g_settings.visuals.chams.reflectivity( ) ); - - strcpy( reflectivity->m_sValue, buf ); - m_chams.m_mat->Refresh( ); - } - last_reflectivity = g_settings.visuals.chams.reflectivity( ); - } - - if( shine ) { - if( last_shine != g_settings.visuals.chams.shine( ) ) { - shine->m_flValue = g_settings.visuals.chams.shine( ) * 100.f; - m_chams.m_mat->Refresh( ); - } - last_shine = g_settings.visuals.chams.shine( ); - } - } -} \ No newline at end of file diff --git a/gmod/chams.hpp b/gmod/chams.hpp deleted file mode 100644 index 2c3e317..0000000 --- a/gmod/chams.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "sdk.hpp" - -namespace features -{ - enum ChamBufferType_t { - TYPE_NORMAL, - TYPE_FLAT, - TYPE_SHINE - }; - - class c_material { - public: - c_material( ) = default; - - void init( const char* mat, const char* buf ); - - operator IMaterial*( ) { - return m_mat; - } - - public: - IMaterial* m_mat; - KeyValues* m_keyvalues; - }; - - class c_materials { - public: - c_material m_chams{ }; - c_material m_chams_flat{ }; - - void make_cham_buffer( char* buf, int len, int type ); //type, 0 = normal, 1 = flat, 2 = shine - public: - void initialize_materials( ); - void force_material( IMaterial* material, fclr_t color ); - void update_materials( ); - bool m_initialized{ }; - }; - - class c_chams { - public: - c_materials m_materials; - }; -} \ No newline at end of file diff --git a/gmod/color.hpp b/gmod/color.hpp deleted file mode 100644 index 38bb442..0000000 --- a/gmod/color.hpp +++ /dev/null @@ -1,278 +0,0 @@ -#pragma once -#include -#include - -//this is a fucking mess - -class fclr_t { - float R, G, B, A; -public: - fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } - - fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } - - fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } - - float& r( ) { return R; } - float& g( ) { return G; } - float& b( ) { return B; } - float& a( ) { return A; } - - fclr_t& operator =( fclr_t& c ) { - R = c.r( ); - G = c.g( ); - B = c.b( ); - A = c.a( ); - return *this; - } - - fclr_t operator+( const fclr_t& v ) const { - return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); - } - - explicit operator bool( ) const noexcept { - return ( R > 0 || G > 0 || B > 0 || A > 0 ); - } - - bool operator==( fclr_t& c ) const { - return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); - } -}; - -class clr_t { - uint8_t R, G, B, A; -public: - clr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } - - clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } - - clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } - - uint8_t& r( ) { return R; } - uint8_t& g( ) { return G; } - uint8_t& b( ) { return B; } - uint8_t& a( ) { return A; } - - clr_t& operator =( const clr_t& c ) { - R = c.R; - G = c.G; - B = c.B; - A = c.A; - return *this; - } - - clr_t operator+( const clr_t& v ) const { - return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); - } - - clr_t operator*( float f ) { - return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); - } - - explicit operator bool( ) const noexcept { - return ( R > 0 || G > 0 || B > 0 || A > 0 ); - } - - float brightness( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - - float min = static_cast( R < G ? R : G ); - min = static_cast( min < B ? min : B ); - - float max = static_cast( R > G ? R : G ); - max = static_cast( max > B ? max : B ); - - out.v = max; - float delta = max - min; - if ( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if ( max > 0.0f ) { - out.s = delta / max; - } - else { - out.s = 0.0f; - out.h = NAN; - return out.h; - } - if ( R >= max ) - out.h = static_cast( G - B ) / delta; - else if ( G >= max ) - out.h = 2.0f + static_cast( B - R ) / delta; - else - out.h = 4.0f + static_cast( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if ( out.h < 0.0f ) - out.h += 360.0f; - - return out.v; - } - - float saturation( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - - float min = static_cast( R < G ? R : G ); - min = static_cast( min < B ? min : B ); - - float max = static_cast( R > G ? R : G ); - max = static_cast( max > B ? max : B ); - - out.v = max; - float delta = max - min; - if ( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if ( max > 0.0f ) { - out.s = delta / max; - } - else { - out.s = 0.0f; - out.h = NAN; - return out.h; - } - if ( R >= max ) - out.h = static_cast( G - B ) / delta; - else if ( G >= max ) - out.h = 2.0f + static_cast( B - R ) / delta; - else - out.h = 4.0f + static_cast( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if ( out.h < 0.0f ) - out.h += 360.0f; - - return out.s; - } - - static clr_t from_hsb( float hue, float saturation, float brightness ) { - float h = hue == 1.0f ? 0 : hue * 6.0f; - float f = h - ( int )h; - float p = brightness * ( 1.0f - saturation ); - float q = brightness * ( 1.0f - saturation * f ); - float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); - - if ( h < 1 ) { - return clr_t( - ( unsigned char )( brightness * 255 ), - ( unsigned char )( t * 255 ), - ( unsigned char )( p * 255 ) - ); - } - else if ( h < 2 ) { - return clr_t( - ( unsigned char )( q * 255 ), - ( unsigned char )( brightness * 255 ), - ( unsigned char )( p * 255 ) - ); - } - else if ( h < 3 ) { - return clr_t( - ( unsigned char )( p * 255 ), - ( unsigned char )( brightness * 255 ), - ( unsigned char )( t * 255 ) - ); - } - else if ( h < 4 ) { - return clr_t( - ( unsigned char )( p * 255 ), - ( unsigned char )( q * 255 ), - ( unsigned char )( brightness * 255 ) - ); - } - else if ( h < 5 ) { - return clr_t( - ( unsigned char )( t * 255 ), - ( unsigned char )( p * 255 ), - ( unsigned char )( brightness * 255 ) - ); - } - else { - return clr_t( - ( unsigned char )( brightness * 255 ), - ( unsigned char )( p * 255 ), - ( unsigned char )( q * 255 ) - ); - } - } - - static clr_t blend( clr_t first, clr_t second, float t ) { - return clr_t( - first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), - first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), - first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), - first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) - ); - } - - float hue( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - float min, max, delta; - - min = static_cast< float >( R < G ? R : G ); - min = static_cast< float >( min < B ? min : B ); - - max = static_cast< float >( R > G ? R : G ); - max = static_cast< float >( max > B ? max : B ); - - out.v = max; - delta = max - min; - if ( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if ( max > 0.0f ) { - out.s = ( delta / max ); - } - else { - out.s = 0.0f; - out.h = ( float )NAN; - return out.h; - } - if ( R >= max ) - out.h = static_cast< float >( G - B ) / delta; - else - if ( G >= max ) - out.h = 2.0f + static_cast< float >( B - R ) / delta; - else - out.h = 4.0f + static_cast< float >( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if ( out.h < 0.0f ) - out.h += 360.0f; - - return out.h; - } - - fclr_t to_fclr( ) { - return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; - } - - operator fclr_t( ) { - return this->to_fclr( ); - } - - bool operator==( const clr_t& c ) const { - return ( R == c.R && G == c.G && B == c.B ); - } -}; \ No newline at end of file diff --git a/gmod/con_alias.hpp b/gmod/con_alias.hpp deleted file mode 100644 index f00e7df..0000000 --- a/gmod/con_alias.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include -#include "simple_settings.hpp" - -template< typename var_type = bool > -class con_alias : public ISetting { -public: - con_alias( hash_t hash, con_var< var_type >* var ) : - m_var( var ), - m_value( var_type{ } ), - m_name( hash ), - m_is_var( true ) { }; - - con_alias( hash_t hash ) : - m_name( hash ), - m_value( 0 ), - m_var( nullptr ), - m_is_var( false ) { }; - - con_alias( hash_t hash, var_type&& rhs ) : - m_name( hash ), - m_value( rhs ), - m_var( nullptr ), - m_is_var( false ) { }; - - virtual std::string get_string( ) override { - if( m_is_var ) - return m_var->get_string( ); - else - return std::to_string( m_value ); - } - - virtual void set_value( int value ) override { - set_value_internal( value ); - } - - virtual void set_value( float value ) override { - set_value_internal( value ); - } - - virtual void set_value( ulong_t value ) override { - set_value_internal( value ); - } - -private: - template < typename t > - void set_value_internal( t&& val ) { - if( m_is_var ) - m_var->set( val ); - else - m_value = ( var_type )( val ); - } - -private: - bool m_is_var; - hash_t m_name; - var_type m_value; - con_var< var_type >* m_var; -}; \ No newline at end of file diff --git a/gmod/con_fn.hpp b/gmod/con_fn.hpp deleted file mode 100644 index 59fb0a3..0000000 --- a/gmod/con_fn.hpp +++ /dev/null @@ -1,172 +0,0 @@ -#pragma once -#include - -#include "simple_settings.hpp" - -//KEEP THIS UP TO DATE!! -enum ConFnVarType_t { - TYPE_NULL = 0, - TYPE_FLOAT = 'F', - TYPE_STRING = 'S', - TYPE_INTEGER = 'D', - TYPE_HEX = 'X' -}; - -class con_fn_base { -public: - virtual bool execute( const char* str ) = 0; - virtual const char* get_syntax( ) = 0; - virtual hash_t get_hash( ) = 0; -}; - -class con_fn : public con_fn_base { -public: - con_fn( hash_t hash, std::function< void __cdecl( const char*, const char* ) > function, const char* syntax ) { - m_hash = hash; - m_function = function; - strcpy_s< 64 >( m_syntax, syntax ); - for( size_t i{ }; i < strlen( m_syntax ); ++i ) { - if( m_syntax[ i ] == '%' ) { - m_args++; - } - } - } - - static ConFnVarType_t get_var_type( size_t arg, const char* syntax ) { - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( syntax ); ++i ) { - if( syntax[ i ] == '%' ) { - if( cur_arg++ == arg ) { - return ( ConFnVarType_t )( syntax[ i + 1 ] ); - } - } - } - - return TYPE_NULL; - } - - template < typename t > - static t get_arg( const char* str, size_t arg_index, const char* syntax ) { - auto arg_type = get_var_type( arg_index, syntax ); - - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - if( cur_arg++ == arg_index ) { - size_t start = i + 1; - size_t end = strlen( str ); - for( size_t i2 = start; i2 < strlen( str ); ++i2 ) { - if( str[ i2 ] == ' ' ) { - end = i2; - break; - } - } - - std::string str( str + start, end - start ); - - char* end_ptr = ( char* )str.c_str( ) + end; - if constexpr( std::is_integral_v< t > ) { - auto radix = get_var_type( arg_index, syntax ) == TYPE_HEX ? 16 : 10; - return std::strtol( str.c_str( ), &end_ptr, radix ); - } - - if constexpr( std::is_floating_point_v< t > ) { - return std::strtof( str.c_str( ), &end_ptr ); - } - - return ( t )str.c_str( ); - } - } - } - - return t{ }; - } - - virtual const char* get_syntax( ) override { - return m_syntax; - } - - virtual hash_t get_hash( ) override { - return m_hash; - } - - ConFnVarType_t get_var_type( size_t arg ) { - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( m_syntax ); ++i ) { - if( m_syntax[ i ] == '%' ) { - if( cur_arg++ == arg ) { - return ( ConFnVarType_t )( m_syntax[ i + 1 ] ); - } - } - } - - return TYPE_NULL; - } - - //returns false on failed execution - virtual bool execute( const char* str ) override { - size_t arg_count{ }; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - arg_count++; - } - } - - if( arg_count != m_args ) { - return false; - } - - std::string pass_str( " " ); - - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - size_t end = strlen( str ); - for( size_t i2 = i + 2; i2 < strlen( str ); ++i2 ) { - if( str[ i2 ] == ' ' ) { - end = i2; - } - } - - char* end_ptr = ( char* )( str + i + end ); - switch( get_var_type( cur_arg ) ) { - case TYPE_FLOAT: { - pass_str += std::to_string( strtof( str + i, &end_ptr ) ); - break; - } - case TYPE_INTEGER: { - pass_str += std::to_string( strtol( str + i, &end_ptr, 10 ) ); - break; - } - case TYPE_HEX: { - char buf[ 10 ]; - sprintf_s< 10 >( buf, "%08x", strtol( str + i, &end_ptr, 16 ) ); - pass_str += buf; - break; - } - case TYPE_STRING: { - std::string add_str( str + i, end - i ); - pass_str += add_str; - break; - } - default: - return false; - } - - if( end != strlen( str ) ) { - pass_str += ' '; - } - ++cur_arg; - } - } - - m_function( pass_str.c_str( ), m_syntax ); - return true; - } - -private: - hash_t m_hash{ }; - size_t m_args{ }; - char m_syntax[ 64 ]{ }; - std::function< void( __cdecl )( const char*, const char* ) > m_function{ }; -}; \ No newline at end of file diff --git a/gmod/console.cpp b/gmod/console.cpp deleted file mode 100644 index 174fc25..0000000 --- a/gmod/console.cpp +++ /dev/null @@ -1,324 +0,0 @@ -#include "console.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "d3d.hpp" -#include "ui_draw.h" - -std::shared_ptr< console > g_con = std::make_shared< console >( ); - - -void console::draw_text( int x, int y, bool greyed, const char* fmt, ... ) { - va_list args; - char buf[ 512 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 512 >( buf, fmt, args ); - __crt_va_end( args ); - - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, "%s", buf ); - //g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); -} - -void console::draw_text( int x, int y, const char* fmt, ... ) { - va_list args; - char buf[ 512 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 512 >( buf, fmt, args ); - __crt_va_end( args ); - - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); -} - -void console::draw_rect( int x, int y, int w, int h, clr_t col ) { - g_d3d.draw_filled_rect( col, x, y, w, h ); -} - -void console::register_alias( std::shared_ptr< ISetting >& alias ) { - m_aliases.push_back( alias ); -} - -void console::capture_command( ) { - float current_time = GetTickCount( ) * 0.001f; - size_t length = strlen( m_cur_cmd ); - - for( size_t i{ }; i < 0xfe; ++i ) { - if( m_input->is_key_pressed( i ) ) { - float delta_time = current_time - m_last_key_input[ i ]; - if( fabs( delta_time ) > 0.2f ) { - if( i == KEYS_BACK ) { - m_cur_cmd[ length - 1 ] = 0; - m_last_key_input[ i ] = current_time; - continue; - } - - m_key_states[ i ] = 0xf0; - wchar_t pressed_char; - const auto scan = MapVirtualKeyA( i, 2 ); - auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); - - if( ret == 1 ) { - if( length < 200 ) { - m_cur_cmd[ length ] = ( char )( pressed_char ); - m_cur_cmd[ length + 1 ] = 0; - } - } - m_last_key_input[ i ] = current_time; - } - } - else { - m_last_key_input[ i ] = 0.f; - m_key_states[ i ] = 0; - } - } -} - -ISetting* console::find_var( hash_t var ) { - for( auto& it : data::holder_.get_nodes( ) ) { - auto setting = static_cast< ISetting* >( it ); - if( var == setting->get_hash( ) ) { - return setting; - } - } - - return nullptr; -} - -ISetting* console::find_alias( hash_t alias ) { - for( auto& it : m_aliases ) { - if( it->get_hash( ) == alias ) - return it.get( ); - } - - return nullptr; -} - -con_fn_base* console::find_fn( hash_t name ) { - for( auto& it : m_functions ) { - if( it->get_hash( ) == name ) { - return it; - } - } - - return nullptr; -} - -std::string console::impl_alias_str( std::string str ) { - for( size_t i{ }; i < str.length( ); ++i ) { - if( str[ i ] == ' ' && str[ i + 1 ] != ' ' ) { - size_t end = 0; - for( size_t i2{ i + 1 }; i2 < str.length( ); ++i ) { - if( str[ i2 ] == ' ' ) - end = i2; - } - - if( end ) { - std::string alias_str( str.c_str( ) + i, end - i ); - auto alias = find_alias( hash::fnv1a( alias_str ) ); - if( alias ) { - str.replace( alias_str.begin( ), alias_str.end( ), alias->get_string( ) ); - } - else { - g_con->log( xors( "couldnt find alias %s" ), alias_str.c_str( ) ); - } - } - } - } - - return str; -} - -void console::execute_command( const char* cmd ) { - if( !cmd[ 0 ] ) return; - std::string first_param( cmd, strlen( cmd ) ); - - size_t end{ }; - bool one_arg = true; - for( size_t i{ }; i < strlen( cmd ); ++i ) { - if( cmd[ i ] == ' ' ) { - first_param.resize( i ); - end = i; - one_arg = false; - break; - } - } - - if( one_arg ) { - first_param.resize( first_param.length( ) - 1 ); - } - - //find a command to execute - auto fn = find_fn( hash::fnv1a( first_param ) ); - if( fn ) { - //std::string alias_cmd = impl_alias_str( cmd ); - - if( !fn->execute( cmd ) ) { - log( xors( "invalid syntax" ) ); - } - return; - } - - //command not found, we're managing vars - if( !one_arg ) { - std::string second_param = ( cmd + end + 1 ); - bool is_floating_point = second_param.find( '.' ) != std::string::npos; - auto var = find_var( hash::fnv1a( first_param ) ); - - if( var ) { - auto setting_cast = static_cast< con_var< void* >* >( var ); - if( !setting_cast->is_integral( ) && !setting_cast->is_floating_point( ) ) { - auto value = std::strtol( second_param.c_str( ), 0, 16 ); - printf( xors( "value: %08x\n" ), value ); - var->set( value ); - } - - if( is_floating_point ) { - float value = std::strtof( second_param.c_str( ), 0 ); - var->set( value ); - } - else { - int value = std::strtol( second_param.c_str( ), 0, 10 ); - var->set( value ); - } - log( xors( "%s %s\n" ), first_param.c_str( ), second_param.c_str( ) ); - return; - } - } - - - log( xors( "unknown command: %s" ), first_param.c_str( ) ); -} - -void console::input( ) { - static int drag_x, drag_y; - int cursor_x, cursor_y; - int x = m_x, y = m_y; - bool clicked = m_input->is_key_pressed( KEYS_MOUSE1 ); - static bool is_hovered{ }; - m_input->get_cursor_pos( cursor_x, cursor_y ); - - auto is_top_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y && cursor_y < y + TOP_HEIGHT; - }; - - auto is_window_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y && cursor_y < y + HEIGHT; - }; - - auto is_bottom_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y + HEIGHT - TOP_HEIGHT - && cursor_y < y + HEIGHT; - }; - - if( clicked ) { - //m_consuming_input = is_window_hovered( ); - } - - if( !clicked && is_top_hovered( ) ) { - drag_x = cursor_x - m_x; - drag_y = cursor_y - m_y; - } - - if( clicked && is_hovered ) { - is_hovered = true; - m_x = cursor_x - drag_x; - m_y = cursor_y - drag_y; - } - else { - is_hovered = is_top_hovered( ); - } - - if( clicked ) { - m_active = is_bottom_hovered( ); - } - - if( m_active ) { - capture_command( ); - - static bool was_held{ }; - if( m_input->is_key_pressed( KEYS_RETURN ) ) { - if( !was_held ) { - execute_command( m_cur_cmd ); - m_cur_cmd[ 0 ] = 0; - } - was_held = true; - } - else was_held = false; - } -} - -void console::draw( ) { - if( !m_open ) { - m_consuming_input = false; - m_active = false; - return; - } - - static clr_t col = clr_t( 31, 31, 31, 255 ); - - input( ); - - RECT prev_rect{ }; - RECT new_rect{ m_x - 1, m_y - 1, - m_x + WIDTH + 1, m_y + HEIGHT + 1 }; - g_d3d.get_device( )->GetScissorRect( &prev_rect ); - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - draw_rect( m_x - 1, m_y - 1, WIDTH + 2, HEIGHT + 2, ui::ui_get_accent_col( ) ); - draw_rect( m_x, m_y, WIDTH, HEIGHT, col ); - draw_rect( m_x + 1, m_y, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); - - draw_rect( m_x + 1, m_y + HEIGHT - TOP_HEIGHT, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); - if( m_active ) { - draw_rect( m_x + 2, m_y + HEIGHT - TOP_HEIGHT + 1, WIDTH - 4, TOP_HEIGHT - 2, clr_t( 31, 31, 31 ) ); - auto fn = find_fn( hash::fnv1a( m_cur_cmd ) ); - if( fn ) { - std::string fn_str = m_cur_cmd; - fn_str += ' '; - fn_str += fn->get_syntax( ); - - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, "%s", fn_str.c_str( ) ); - } - - else { - auto var = find_var( hash::fnv1a( m_cur_cmd ) ); - if( var ) { - std::string var_str = m_cur_cmd; - var_str += ' '; - - var_str += var->get_string( ); - - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, var_str.c_str( ) ); - } - } - } - - std::string cur_cmd_str = m_cur_cmd; - if( m_active ) { - cur_cmd_str += '_'; - } - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, cur_cmd_str.c_str( ) ); - draw_text( m_x + 3, m_y + TOP_HEIGHT / 2 - 3, xors( "console" ) ); - - int cur_y = m_y + HEIGHT - TOP_HEIGHT; - for( int i = m_logs.size( ) - 1; i >= 0; --i ) { - constexpr int LINE_HEIGHT = 14; - auto& log = m_logs.at( i ); - - if( cur_y - LINE_HEIGHT < m_y + TOP_HEIGHT ) { - m_logs.erase( m_logs.begin( ) + i ); - continue; - } - - draw_text( m_x + 2, cur_y -= LINE_HEIGHT, log.m_msg ); - } - - g_d3d.get_device( )->SetScissorRect( &prev_rect ); -} \ No newline at end of file diff --git a/gmod/console.hpp b/gmod/console.hpp deleted file mode 100644 index cfeb255..0000000 --- a/gmod/console.hpp +++ /dev/null @@ -1,123 +0,0 @@ -#pragma once -#include -#include -#include -#include - -#include "con_fn.hpp" -#include "con_alias.hpp" -#include "input_system.hpp" -#include "math.hpp" - -#pragma warning(disable: 4996) - -class console { -public: - console( ) { - m_input = std::make_shared< util::c_input_manager >( ); - } - - static constexpr size_t TOP_HEIGHT = 22; - static constexpr size_t WIDTH = 400; - static constexpr size_t HEIGHT = 450; - - bool m_consuming_input{ }; - bool m_active{ }; - bool m_open{ }; - - struct con_log { - float m_time; - char m_msg[ 128 ]; - }; - - void draw_text( int x, int y, bool greyed, const char* msg, ... ); - void draw_text( int x, int y, const char* msg, ... ); - void draw_rect( int x, int y, int w, int h, clr_t col ); - void register_fn( con_fn_base* fn ) { m_functions.push_back( fn ); } - - void input( ); - void draw( ); - - auto& get_input( ) { - return m_input; - } - - void log( const char* fmt, ... ) { - va_list args; - char buf[ 128 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 128 >( buf, fmt, args ); - __crt_va_end( args ); - - con_log log; - log.m_time = ( float )GetTickCount( ) * 0.001f; - memcpy( log.m_msg, buf, 128 ); - - print( "%s\n", buf ); - - m_logs.push_back( log ); - } - - void print( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); - } - - void create( ) { - #ifdef _DEBUG - AllocConsole( ); - freopen( xors( "CONOUT$" ), "w", stdout ); - const char* hack_names[ ] = { - xors( "dunk hack" ), - xors( "dweeb dumpster" ), - xors( "nova killER" ), - xors( "moms credit card" ), - xors( "dad hook" ), - xors( "retard remover" ), - xors( "slam hook" ), - xors( "swoosh" ), - xors( "retard remover" ), - xors( "shotgun hack" ), - }; - - SetConsoleTitleA( hack_names[ math::random_number( 0, 9 ) ] ); - #endif - game_console_print = reinterpret_cast< msg_t >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); - } - - void destroy( ) { - //FreeConsole( ); - //fclose( stdout ); - } - - std::vector< con_log > m_logs; - std::vector< con_fn_base* > m_functions; - std::vector< std::shared_ptr< ISetting > > m_aliases; - - void register_alias( std::shared_ptr< ISetting >& alias ); - - using msg_t = void( __cdecl* )( const char*, ... ); - msg_t game_console_print; - -private: - ISetting* find_var( hash_t name ); - ISetting* find_alias( hash_t name ); - - std::string impl_alias_str( std::string str ); - - con_fn_base* find_fn( hash_t name ); - void capture_command( ); - void execute_command( const char* cmd ); - - int m_x{ 100 }, m_y{ 100 }; - - char m_cur_cmd[ 200 ]{ }; - uint8_t m_key_states[ 256 ]{ }; - float m_last_key_input[ 256 ]{ }; - std::shared_ptr< util::c_input_manager > m_input; -}; - -extern std::shared_ptr< console > g_con; \ No newline at end of file diff --git a/gmod/context.cpp b/gmod/context.cpp deleted file mode 100644 index 752585e..0000000 --- a/gmod/context.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "context.hpp" -#include "console.hpp" -#include "hooks.hpp" -#include "base_cheat.hpp" - -context::c_context g_ctx; - -NAMESPACE_REGION( context ) - -bool c_context::run_frame( ) { - m_local = g_gmod.m_entlist( )->GetClientEntity< >( - g_gmod.m_engine( )->GetLocalPlayer( ) ); - - return !!m_local; -} -// -void c_context::on_cmove_end( user_cmd_t* cmd ) { - auto send = g_cheat.m_lagmgr.get_state( ); - - if( send ) { - m_thirdperson_angle = m_last_realangle; - m_last_fakeangle = cmd->m_viewangles; - m_last_origin = m_local->m_vecOrigin( ); - } - else { - m_last_realangle = cmd->m_viewangles; - m_last_realangle.x = m_last_fakeangle.x; - } - - m_thirdperson_angle.x = cmd->m_viewangles.x; - if( g_cheat.m_lagmgr.get_sent( ) > 1 ) { - m_thirdperson_angle.y = m_last_fakeangle.y; - } - *get_last_cmd( ) = *cmd; -} -// -//void c_context::reset_shot_queue( ) { -// m_last_shot = m_last_shot_ack = 0; -// m_shot_data = { }; -//} -// -////predicted servertime of player, use this for breaking lby etc -//float c_context::pred_time( ) { -// calculate_tickbase( ); -// -// return m_tickbase * g_gmod.m_globals->m_interval_per_tick; -//} -// -////calculate tickbase depending on whether last ucmd was predicted -//bool c_context::calculate_tickbase( ) { -// if ( !m_local ) { -// return false; -// } -// -// //get current tickbase -// auto player_tickbase = m_local->m_nTickBase( ); -// -// //disabled due to our engine pred being shit -// m_tickbase = player_tickbase; -// return true; -// -// if ( m_snapshot.empty( ) ) { -// m_tickbase = player_tickbase; -// return false; -// } -// -// //if cmd wasnt predicted increment tickbase -// auto snap_cmd = &m_snapshot.front( ); -// if ( !snap_cmd->m_predicted ) { -// if ( !m_tickbase ) { -// m_tickbase = player_tickbase; -// } -// -// m_tickbase++; -// snap_cmd->m_predicted = true; -// } -// else { -// m_tickbase = player_tickbase; -// } -// -// return true; -//} -// -//save snapshots of usercommands -bool c_context::create_snapshot( user_cmd_t* ucmd ) { - user_cmd_t ucmd_copy; - - while ( m_snapshot.size( ) >= 64 ) { - m_snapshot.pop_back( ); - } - - if ( !ucmd ) { - return false; - } - - memcpy( &ucmd_copy, - ucmd, - sizeof( ucmd_copy ) ); - - m_snapshot.push_front( ucmd_copy ); - return true; -} - -END_REGION \ No newline at end of file diff --git a/gmod/context.hpp b/gmod/context.hpp deleted file mode 100644 index a478776..0000000 --- a/gmod/context.hpp +++ /dev/null @@ -1,71 +0,0 @@ -#pragma once -#include - -#include "util.hpp" -#include "sdk.hpp" - -NAMESPACE_REGION( context ) - -struct shot_data_t { - vec3_t m_local_pos; - vec3_t m_angle; - vec3_t m_enemy_pos; - int m_enemy_index; - int m_resolver_shots; - bool m_resolver_state; - bool m_missed{ true }; - float m_hitbox_radius; - int m_hitgroup; -}; - -//replacement to the old global:: namespace -class c_context { -public: - //run localplayer check, pointer, is valid etc - bool run_frame( ); - float pred_time( ); - - void on_cmove_end( user_cmd_t* cmd ); - bool create_snapshot( user_cmd_t* ); - //calculate accurate tickbase - bool calculate_tickbase( ); - - user_cmd_t* get_last_cmd( ) { - return m_snapshot.empty( ) ? nullptr : &m_snapshot.front( ); - } - -public: - c_base_player* m_local{ }; - int m_stage{ }; - //accurate tickbase - int m_tickbase{ }; - - bool m_drawing_postscreenspace{ }; - bool m_has_incremented_shots{ }; - bool m_drawing_screneend{ }; - - bool m_has_fired_this_frame{ }; - - vec3_t m_last_realangle{ }; - vec3_t m_last_fakeangle{ }; - vec3_t m_thirdperson_angle{ }; - vec3_t m_last_origin{ }; - - float m_fov{ 90.f }; - - CLuaInterface* m_lua{ }; - -public: - void reset_shot_queue( ); - - int m_last_shot_ack; - int m_last_shot; - - std::array< shot_data_t, 128 > m_shot_data; -private: - std::deque< user_cmd_t > m_snapshot; -}; - -END_REGION - -extern context::c_context g_ctx; \ No newline at end of file diff --git a/gmod/create_move.cpp b/gmod/create_move.cpp deleted file mode 100644 index c25d0c5..0000000 --- a/gmod/create_move.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include - -#include "hooks.hpp" -#include "mem.hpp" -#include "interface.hpp" -#include "context.hpp" -#include "input_system.hpp" -#include "math.hpp" - -#include "base_cheat.hpp" - - -bool __fastcall hooks::create_move( void* ecx_, void* edx_, float input_sample_frametime, user_cmd_t* ucmd ) { - static auto create_move_o = g_gmod.m_clientmode->get_old_function< decltype( &hooks::create_move ) >( 21 ); - - // call from CInput::ExtraMouseSample with dummy cmd. - if( !ucmd->m_cmd_nr || !ucmd->m_tick_count || g_gmod.m_panic ) - return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); - - // for interfacing with lua related stuff. - g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); - if( !g_ctx.m_lua ) - return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); - - // random_seed isn't generated in ClientMode::CreateMove yet (since CInput::CreateMove handles that), we must generate it ourselves. - ucmd->m_random_seed = math::md5_pseudorandom( ucmd->m_cmd_nr ) & 0x7fffffff; - - //get sendpacket off the stack - stack_t stack( get_baseptr( ) ); - byte *send_packet = stack.next( ).next( ).next( ).local< byte* >( 0x1 ); - - g_ctx.create_snapshot( ucmd ); - - //return create_move_o( ecx_, 0, input_sample_frametime, ucmd ); - - /* - g_cheat.m_extra.update_netchannel( ); - g_cheat.m_identity( ); - */ - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { - static int last_frame = g_gmod.m_globals->m_framecount; - if( last_frame != g_gmod.m_globals->m_framecount ) - g_ctx.m_has_fired_this_frame = false; - - last_frame = g_gmod.m_globals->m_framecount; - - // hook fire bullets for spread compensation. - if( !fire_bullets_o ) { - fire_bullets_o = decltype( &hooks::fire_bullets )( c_vmt::hook_method( g_ctx.m_local, 16, hooks::fire_bullets ) ); - } - - g_cheat.m_prediction( ucmd ); - g_cheat.m_movement( ucmd ); - - g_cheat.m_lagmgr( ucmd, send_packet ); - - g_cheat.m_aimbot( ucmd ); - - //if( auto weapon = g_ctx.m_local->get_weapon( ) ) { - // if( auto c_class = weapon->ce( )->GetClientClass( ) ) { - // g_con->print( "%s\n", c_class->m_name ); - // } - //} - - g_cheat.m_extra.use_spammer( ucmd ); - - if( g_cheat.m_lagmgr.get_choked( ) > 15 ) { - g_cheat.m_lagmgr.set_state( true ); - } - - g_cheat.m_lagmgr.on_cmove_end( ); - - g_ctx.on_cmove_end( ucmd ); - - ucmd->clamp( ); - // call original *after* any changes due to anticheats detecting changes between this and any changes after. - create_move_o( ecx_, 0, input_sample_frametime, ucmd ); - - g_cheat.m_aimbot.silent( ); - } - else { - create_move_o( ecx_, 0, input_sample_frametime, ucmd ); - } - - return false; -} diff --git a/gmod/d3d.cpp b/gmod/d3d.cpp deleted file mode 100644 index 6802239..0000000 --- a/gmod/d3d.cpp +++ /dev/null @@ -1,344 +0,0 @@ -#include "d3d.hpp" -#include "interface.hpp" -#include "math.hpp" -#include "d3d_sprite.hpp" - -d3d::c_renderer g_d3d; -d3d::d3d_fonts_t d3d::fonts; - - -//theres shit still left to add like drawrect etc but thats really simple -//this is the base and it works so thats ok -//love -// - nave - -// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) -// DrawPrimitiveUP for each object will slow stuff down eventually -// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else - -namespace d3d -{ - void d3d_fonts_t::release( ) { - if( f_12 ) f_12->Release( ); - if( f_14 ) f_14->Release( ); - if( f_16 ) f_16->Release( ); - if( f_18 ) f_18->Release( ); - if( f_menu ) f_menu->Release( ); - if( f_con ) f_con->Release( ); - } - - void d3d_fonts_t::create( IDirect3DDevice9* device ) { - auto create_font = [ & ]( ID3DXFont** font, const char* font_name, int width, int size, int weight ) { - //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); - - auto code = D3DXCreateFontA( device, size, width, weight, 0, false, DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); - - if( code < 0 ) throw xors( "fuck d3d" ); - }; - - create_font( &f_12, xors( "Verdana" ), 0, 12, 0 ); //change this idc - create_font( &f_esp_small, xors( "Tahoma" ), 0, 11, 500 ); - create_font( &f_14, xors( "Verdana" ), 0, 14, 0 ); - create_font( &f_16, xors( "Verdana" ), 0, 16, 0 ); - create_font( &f_18, xors( "Verdana" ), 0, 18, 0 ); - create_font( &f_menu, xors( "Tahoma" ), 0, 12, 300 ); - create_font( &f_con, xors( "Consolas" ), 6, 12, 300 ); - } - - - c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { - create_objects( ); - } - - bool c_renderer::run_frame( IDirect3DDevice9* device ) { - if( g_gmod.m_panic ) { - return false; - } - - if( !m_device ) { - m_device = device; - create_objects( ); - return false; - } - - return true; - } - - c_renderer::~c_renderer( ) { - invalidate_objects( ); - } - - void c_renderer::on_device_lost( ) { - invalidate_objects( ); - } - - void c_renderer::on_device_reset( ) { - create_objects( ); - } - - void c_renderer::invalidate_objects( ) { - if( m_block ) m_block->Release( ); - fonts.release( ); - } - - void c_renderer::create_objects( ) { - D3DVIEWPORT9 viewport; - - if( !m_device ) return; - - if( m_device->GetViewport( &viewport ) < 0 ) { - return; - } - - if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { - return; - } - - if( !m_block ) { - return; - } - - // get display size. - m_width = viewport.Width; - m_height = viewport.Height; - - fonts.create( m_device ); - } - - void c_renderer::begin( ) { - if( !m_device ) return; - - D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; - - m_device->SetViewport( &vp ); - - //m_sil_txt->GetSurfaceLevel( 0, &m_surface ); - - // set vertex stream declaration. - m_device->SetVertexShader( nullptr ); - m_device->SetPixelShader( nullptr ); - m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); - m_block->Capture( ); - - m_device->SetRenderState( D3DRS_LIGHTING, false ); - m_device->SetRenderState( D3DRS_FOGENABLE, false ); - m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); - m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); - - m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); - m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); - m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); - m_device->SetRenderState( D3DRS_STENCILENABLE, false ); - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); - - m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); - m_device->SetRenderState( D3DRS_ALPHATESTENABLE, false ); - m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); - - m_device->SetTexture( 0, nullptr ); - m_device->SetTexture( 1, nullptr ); - m_device->SetTexture( 2, nullptr ); - m_device->SetTexture( 3, nullptr ); - - m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); - m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); - m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); - m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); - m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); - m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); - m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - - m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); - m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); - m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); - m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); - - m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); - m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); - /* commented out until further notice */ - //m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); - //m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); - // todo - dex; if we use textures, need to set those rendering states too - } - - void c_renderer::end( ) { - - //m_device->SetTexture( 0, nullptr ); - //m_device->SetTexture( 1, nullptr ); - //m_device->SetTexture( 2, nullptr ); - //m_device->SetTexture( 3, nullptr ); - m_block->Apply( ); - //m_block->Release( ); - } - - void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { - d3d_vertex_t v[ 2 ] = { - d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why - d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) - }; //edit: do we wanna use z for shit? i mean we could for like menu stuff - //so it renders above other stuff - - m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); - } - - void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { - d3d_vertex_t v[ 5 ] = { - d3d_vertex_t( float( x ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y ), 1.0f, color ) - }; - - m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); - } - - void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { - d3d_vertex_t v[ 6 ] = { - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) - }; - - - m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); - } - - void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { - d3d_vertex_t v[ 4 ]; - - switch( type ) { - case GRADIENT_VERTICAL: - v[ 0 ] = { float( x ), float( y ), 1.0f, start }; - v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; - v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; - v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; - break; - case GRADIENT_HORIZONTAL: - v[ 0 ] = { float( x ), float( y ), 1.0f, start }; - v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; - v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; - v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; - break; - } - - //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); - //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { - constexpr float PI = 3.1415926f; - const float step = PI * 2.0f / float( res ); - - int point_x = x + r, - point_y = y - r, - point_x_o{ }, - point_y_o{ }; - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - for( int i{ }; i <= res; i++ ) { - float theta = float( i ) * step; - - point_x = x + ( int )( r * cos( theta ) ); - point_y = y - ( int )( r * sin( theta ) ); - if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); - point_x_o = point_x; - point_y_o = point_y; - } - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { - d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); - const float step = M_PI * 2.0f / res; - - for( size_t i{ }; i < res; ++i ) { - float theta = i * step; - float x_off = r * cos( theta ); - float y_off = r * sin( theta ); - - v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; - } - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_text( ID3DXFont* font, clr_t color, - int x, int y, FontAlign_t align, long font_flags, const char* msg ) { - if( !msg ) return; - if( !font ) return; - - auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); - auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); - auto buf = msg; - - if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; - if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); - RECT rect{ x, y, 1000, 100 }; - - ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; - - if( font_flags & D3DFONTFLAG_DROPSHADOW ) { - RECT r{ rect }; - r.left++; - r.top++; - font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); - } - - if( font_flags & D3DFONTFLAG_OUTLINE ) { - for( int i = -1; i < 2; i++ ) { - RECT r{ rect }; - r.left += i; - r.top += i; - font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); - } - } - - font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); - } - - int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - RECT temp{ }; - font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); - - return ( temp.right - temp.left ); - } - - int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - RECT temp{ }; - font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); - - return ( temp.bottom - temp.top ); - } -} diff --git a/gmod/d3d.hpp b/gmod/d3d.hpp deleted file mode 100644 index c4088a3..0000000 --- a/gmod/d3d.hpp +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef D3D_HEADER //stackoverflow my niggas -#define D3D_HEADER - -#include -#include - -#pragma comment(lib, "d3d9.lib") -#pragma comment(lib, "d3dx9.lib") -#pragma warning(disable : 4838) - -#include -#include - -#include -#pragma comment(lib, "dwmapi.lib") - -#include "util.hpp" -#include "color.hpp" -#include "renderer.hpp" - -enum D3DFontFlags_t { - D3DFONTFLAG_OUTLINE = 0x10, - D3DFONTFLAG_DROPSHADOW = 0x100, -}; - -enum GradientType_t { - GRADIENT_HORIZONTAL, - GRADIENT_VERTICAL -}; - -//suck my dick -namespace d3d -{ - struct d3d_vertex_t { - d3d_vertex_t( float x, float y, float z, clr_t color ) : - m_x( x ), m_y( y ), m_z( z ), - m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; - - d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), - m_clr( 0 ) { }; - - float m_x; - float m_y; - float m_z; - float m_rhw = 1.f; - D3DCOLOR m_clr; - }; - - constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); - - struct d3d_fonts_t { - void release( ); - void create( IDirect3DDevice9* device ); - - ID3DXFont* f_12; - ID3DXFont* f_esp_small; - ID3DXFont* f_14; - ID3DXFont* f_16; - ID3DXFont* f_18; - ID3DXFont* f_menu; - ID3DXFont* f_con; - }; - - class c_renderer { - private: - IDirect3DDevice9* m_device; - IDirect3DStateBlock9* m_block; - public: - ulong_t m_width; - ulong_t m_height; - - c_renderer( ) { }; - c_renderer( IDirect3DDevice9* device ); - ~c_renderer( ); - - void on_device_lost( ); - void on_device_reset( ); - auto get_device( ) { - return m_device; - } - - bool run_frame( IDirect3DDevice9* device ); - void begin( ); - void end( ); - - void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); - void draw_rect( clr_t color, int x, int y, int w, int h ); - void draw_filled_rect( clr_t color, int x, int y, int w, int h ); - void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); - void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); - void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); - - void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); - - template < FontAlign_t align = ALIGN_CENTER > - void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - draw_text( font, color, x, y, align, font_flags, buffer ); - } - - int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); - int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); - - private: - void invalidate_objects( ); - void create_objects( ); - }; - - extern d3d::d3d_fonts_t fonts; -} - -extern d3d::c_renderer g_d3d; - -#endif \ No newline at end of file diff --git a/gmod/d3d_sprite.cpp b/gmod/d3d_sprite.cpp deleted file mode 100644 index 8dd6705..0000000 --- a/gmod/d3d_sprite.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "d3d_sprite.hpp" - -std::vector< d3d::c_sprite* > d3d::sprites; - -namespace icons -{ - d3d::c_sprite sprite_legit; - d3d::c_sprite sprite_visuals_; - d3d::c_sprite sprite_rage; - d3d::c_sprite sprite_visuals; - d3d::c_sprite sprite_misc; - d3d::c_sprite sprite_config; -} \ No newline at end of file diff --git a/gmod/d3d_sprite.hpp b/gmod/d3d_sprite.hpp deleted file mode 100644 index 42c09c1..0000000 --- a/gmod/d3d_sprite.hpp +++ /dev/null @@ -1,169 +0,0 @@ -#pragma once -#include "d3d.hpp" -#include "console.hpp" - - -namespace d3d -{ - class c_sprite; - - extern std::vector< c_sprite* > sprites; - - class c_sprite { - public: - size_t m_width{ }; - size_t m_height{ }; - - IDirect3DDevice9* m_device{ }; - ID3DXSprite* m_sprite{ }; - IDirect3DTexture9* m_texture{ }; - const byte* m_image{ }; - size_t m_image_size{ }; - - - public: - c_sprite( ) { - sprites.push_back( this ); - } - - ~c_sprite( ) { - on_reset( ); - } - - void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { - m_width = width; - m_height = height; - - m_device = device; - m_image = file; - m_image_size = img_size; - } - - void begin( IDirect3DDevice9* device ) { - m_device = device; - - if( !m_device ) { - return; - } - - if( !m_sprite ) - D3DXCreateSprite( m_device, &m_sprite ); - - if( m_sprite ) - m_sprite->Begin( D3DXSPRITE_DONOTMODIFY_RENDERSTATE ); - - if( !m_texture ) { - auto hr = D3DXCreateTextureFromFileInMemoryEx( m_device, - m_image, - m_image_size, - m_width, - m_height, - -1, - 0, - D3DFORMAT( 0 ), - D3DPOOL_DEFAULT, - -1, - -1, - 0, - 0, - 0, - &m_texture ); - } - } - - void end( ) { - if( !m_device || !m_sprite || !m_texture ) return; - if( m_sprite ) m_sprite->End( ); - } - - void on_reset( ) { - if( m_sprite && m_device && m_texture ) { - m_sprite->OnLostDevice( ); - m_texture->Release( ); - m_texture = nullptr; - } - } - - void on_reset_end( ) { - if( m_sprite && m_device ) - m_sprite->OnResetDevice( ); - } - - void draw( int x, int y, clr_t color ) { - if( !m_device || !m_texture || !m_sprite ) { - return; - } - - const float scale = 0.8f; - - ulong_t - fill_mode, - adaptive_tess, - dest_blend, - cull, - stencil, - vertex_blend, - alpha_test; - - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, &fill_mode ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, &adaptive_tess ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, &dest_blend ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, &cull ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, &stencil ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, &vertex_blend ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, &alpha_test ); - - ulong_t mag_filter; - ulong_t min_filter; - m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, &mag_filter ); - m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, &min_filter ); - - m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC ); - m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC ); - - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, D3DFILL_SOLID ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, D3DCULL_NONE ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, D3DLINECAPS_ALPHACMP ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, D3DMULTISAMPLE_4_SAMPLES ); - - - ulong_t hr; - D3DXVECTOR2 center = D3DXVECTOR2( ( m_width * scale ) * 0.5f, ( m_height * scale ) * 0.5f ); - D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); - D3DXMATRIX matrix; - D3DXVECTOR2 scale_vec( scale, scale ); - D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale_vec, ¢er, 0.f, &trans ); - - hr = m_sprite->SetTransform( &matrix ); - - auto d3dcolor = D3DCOLOR_RGBA( color.r( ), - color.g( ), color.b( ), color.a( ) ); - hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); - - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, fill_mode ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, adaptive_tess ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, dest_blend ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, cull ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, stencil ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, vertex_blend ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, alpha_test ); - - m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, mag_filter ); - } - }; -} - -namespace icons -{ - extern d3d::c_sprite sprite_legit; - extern d3d::c_sprite sprite_visuals_; - extern d3d::c_sprite sprite_rage; - extern d3d::c_sprite sprite_visuals; - extern d3d::c_sprite sprite_misc; - extern d3d::c_sprite sprite_config; -} \ No newline at end of file diff --git a/gmod/debug_show_spread.cpp b/gmod/debug_show_spread.cpp deleted file mode 100644 index 68931b2..0000000 --- a/gmod/debug_show_spread.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" - -int __fastcall hooks::debug_show_spread_get_int( void* ecx_, void* edx_ ) { - static auto original_fn = g_csgo.m_debug_show_spread->get_old_function< decltype( &debug_show_spread_get_int ) >( 13 ); - if( !g_settings.visuals.snipers_crosshair || !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) || g_ctx.m_local->m_bIsScoped( ) ) { - return original_fn( ecx_, 0 ); - } - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon || !weapon->is_sniper( ) ) { - return original_fn( ecx_, 0 ); - } - - return 3; -} \ No newline at end of file diff --git a/gmod/directx.cpp b/gmod/directx.cpp deleted file mode 100644 index dd42588..0000000 --- a/gmod/directx.cpp +++ /dev/null @@ -1,195 +0,0 @@ -#include - -#include "settings.hpp" -#include "hooks.hpp" -#include "ui.h" -#include "base_cheat.hpp" -#include "context.hpp" -#include "mem.hpp" - - -using namespace d3d; - -void on_d3d( IDirect3DDevice9* device ) { - constexpr float step = 1.0f / 2.f; - constexpr float fade_step = 1.0f / 7.f; - static float anim_time{ }; - static bool flip{ }; - static int anim_progress{ }; - - static bool sprites_init{ }; - if( !sprites_init ) { - ui::setup_sprites( device ); - sprites_init = true; - } - - if( g_settings.menu.open ) { - if( anim_time >= 0.95f ) { - flip = true; - } - if( anim_time <= 0.05f ) { - flip = false; - } - - if( flip ) - anim_time -= fade_step * ui::ui_get_frametime( ); - else - anim_time += fade_step * ui::ui_get_frametime( ); - - anim_time = std::clamp( anim_time, 0.f, 1.0f ); - - ui::set_animtime( anim_time ); - - anim_progress += ui::ui_get_frametime( ) * step * 255; - anim_progress = std::clamp( anim_progress, 0, 50 ); - g_d3d.draw_filled_rect( clr_t( 0, 0, 0, anim_progress ), - 0, 0, g_d3d.m_width, g_d3d.m_height ); - - ui::render( ); - } - else { - anim_progress = 0; - } -} - -long __stdcall hooks::d3d::end_scene( IDirect3DDevice9* device ) { - static auto end_scene_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::end_scene ) >( 42 ); - if ( g_gmod.m_panic ) return end_scene_o( device ); - auto ret = end_scene_o( device ); - - static uintptr_t return_address = 0; - static uintptr_t gameoverlay_return_address = 0; - - - if( !gameoverlay_return_address ) { - MEMORY_BASIC_INFORMATION info; - VirtualQuery( _ReturnAddress( ), &info, sizeof( MEMORY_BASIC_INFORMATION ) ); - - char mod[ MAX_PATH ]; - GetModuleFileNameA( ( HMODULE )info.AllocationBase, mod, MAX_PATH ); - - if( strstr( mod, xors( "gameoverlay" ) ) ) - gameoverlay_return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( !return_address ) { - return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - // only using gameoverlay stuff as you can't be screenshotted. any other method requires more effort and frankly i cannot be bothered. - if( gameoverlay_return_address && gameoverlay_return_address != ( uintptr_t )( _ReturnAddress( ) ) ) - return ret; - - if( !g_gmod.m_panic && g_d3d.run_frame( device ) ) { - for( auto& it : ::d3d::sprites ) - it->begin( device ); - g_d3d.begin( ); - - on_d3d( device ); - - g_cheat.m_visuals( ); - - if( g_settings.menu.open || g_con->m_open ) { - ui::ui_draw_cursor( ); - } - - std::chrono::high_resolution_clock timer; - static auto last = timer.now( ); - auto now = timer.now( ); - - std::chrono::duration< double > delta = now - last; - last = timer.now( ); - - g_gmod.m_frametime = delta.count( ); - - if( !g_con->m_logs.empty( ) && g_settings.menu.logs_enable ) { - auto& logs = g_con->m_logs; - float time = ( float )GetTickCount( ) * 0.001f; - - auto data = logs.data( ); - - int cur_pos = 2; - for( int i = logs.size( ) - 1; i >= 0; --i ) { - if( cur_pos > g_d3d.m_height - 200 ) { - cur_pos -= 8; - break; - } - - float delta = time - data[ i ].m_time; - if( delta >= 5.0f ) { - break; - } - - clr_t col( 255, 255, 255 ); - if( delta > 4.f ) col.a( ) *= ( 6.f - delta ); - - g_d3d.draw_text< ALIGN_RIGHT >( fonts.f_con, col, g_d3d.m_width - 5, cur_pos, D3DFONTFLAG_DROPSHADOW, data[ i ].m_msg ); - cur_pos += 10; - } - } - - for( auto& it : ::d3d::sprites ) - it->end( ); - - g_d3d.end( ); - } - - return ret; -} - -long __stdcall hooks::d3d::present( IDirect3DDevice9* device, RECT* source, RECT* dest, HWND wnd_override, RGNDATA* reg ) { - static auto present_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::present ) >( 17 ); - - static uintptr_t return_address = 0; - if( !return_address ) { - return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( return_address && return_address != ( uintptr_t )( _ReturnAddress( ) ) ) - return present_o( device, source, dest, wnd_override, reg ); - - if( g_d3d.run_frame( device ) ) { - g_d3d.begin( ); - if( g_settings.misc.watermark ) { - static std::string str( xors( "moneybot | " ) ); - static bool transform = false; - if( !transform ) { - str += __DATE__; - str += ", "; - str += __TIME__; - - std::transform( str.begin( ), str.end( ), str.begin( ), - [ ]( char c ) { return ::tolower( c ); } ); - transform = true; - } - - g_d3d.draw_text< ALIGN_RIGHT >( ::d3d::fonts.f_menu, - ui::ui_get_text_col( ), g_d3d.m_width - 10, 8, - D3DFONTFLAG_DROPSHADOW, str.c_str( ) ); - } - - g_con->draw( ); - g_d3d.end( ); - } - - return present_o( device, source, dest, wnd_override, reg ); -} - -long __stdcall hooks::d3d::reset( IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params ) { - static auto reset_o = g_gmod.m_d3d->get_old_function< decltype( &hooks::d3d::reset ) >( 16 ); - if ( g_gmod.m_panic ) { - return reset_o( device, params ); - } - - for( auto& sprite : ::d3d::sprites ) - sprite->on_reset( ); - - g_d3d.on_device_lost( ); - long result = reset_o( device, params ); - g_d3d.on_device_reset( ); - - for( auto& sprite : ::d3d::sprites ) - sprite->on_reset_end( ); - - return result; -} \ No newline at end of file diff --git a/gmod/do_post_screen_space_effects.cpp b/gmod/do_post_screen_space_effects.cpp deleted file mode 100644 index 0766233..0000000 --- a/gmod/do_post_screen_space_effects.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -bool __fastcall hooks::do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ) { - static auto old_fn = g_csgo.m_clientmode->get_old_function< decltype( &do_post_screen_space_effects ) >( 44 ); - - g_ctx.m_drawing_postscreenspace = true; - if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.m_local ) { - g_cheat.m_visuals.update_glow( ); - } - - bool ret = old_fn( ecx_, 0, setup ); - g_ctx.m_drawing_postscreenspace = false; - - return ret; -} \ No newline at end of file diff --git a/gmod/draw_model_execute.cpp b/gmod/draw_model_execute.cpp deleted file mode 100644 index 354a3d4..0000000 --- a/gmod/draw_model_execute.cpp +++ /dev/null @@ -1,167 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" -#include "util.hpp" -#include "settings.hpp" -//this is so ugly dont even look at it - -//gets called once per frame for every entity -void __fastcall hooks::draw_model_execute( IVModelRender* ecx_, void* edx_, - void* render_ctx, const DrawModelState_t& state, - const ModelRenderInfo_t& info, matrix3x4* bone_to_world ) { - static auto dme_o = g_csgo.m_model_render->get_old_function< decltype( &hooks::draw_model_execute ) >( 21 ); - - if( g_csgo.m_panic || g_ctx.m_drawing_postscreenspace ) - return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - - bool draw = true; - IMaterial* mat = g_settings.visuals.chams.flat( ) ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; - auto model_name = g_csgo.m_model_info( )->GetModelName( info.m_model ); - auto local_index = g_csgo.m_engine( )->GetLocalPlayer( ); - int local_team = 0; - if( g_ctx.m_local ) - local_team = g_ctx.m_local->m_iTeamNum( ); - int team = 0; - bool is_player = false; - - if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index == local_index ) { - if( g_settings.misc.thirdperson( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) - && g_ctx.m_local->m_bIsScoped( ) ) { - float clr[ ] = { 1.0f, 1.0f, 1.0f }; - g_csgo.m_render_view( )->SetColorModulation( clr ); - g_csgo.m_render_view( )->SetBlend( 0.5f ); - return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - } - } - - if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index ) { - auto player = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); - - if( player && player->is_valid( ) && !player->m_bGunGameImmunity( ) ) { - is_player = true; - team = player->m_iTeamNum( ); - - if( g_settings.visuals.chams.enabled ) { - if( g_settings.visuals.chams.ignore_z && !g_ctx.m_drawing_screneend && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) - draw = false; - else if( !g_settings.visuals.chams.ignore_z && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) { - fclr_t clr = team != local_team ? g_settings.visuals.chams.color_visible_enemy( ) : g_settings.visuals.chams.color_visible_friendly( ); - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - g_cheat.m_chams.m_materials.force_material( mat, clr ); - dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); - g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); - g_csgo.m_render_view( )->SetBlend( 1.0f ); - draw = false; - } - } - - } - } - - if( g_settings.misc.transparent_vm && strstr( model_name, xors( "weapon" ) ) ) { - if( strstr( model_name, xors( "arms" ) ) ) { - g_csgo.m_render_view( )->SetBlend( 0.6f ); - } - } - - if( is_player ) { - if( g_settings.rage.resolver( ) && g_settings.rage.bt_visualize( ) && ( team != local_team || g_settings.rage.friendlies( ) ) ) { - RecordType_t record_type = g_cheat.m_ragebot.m_lagcomp->can_backtrack_entity( info.m_entity_index ); - auto record = g_cheat.m_ragebot.m_lagcomp->get_render_record( info.m_entity_index ); - - if( record && record_type ) { - fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); - - float backup_modulation[ 3 ]{ }; - bool backup_ignorez = false; - float backup_blend = 1.0f; - - backup_blend = g_csgo.m_render_view( )->GetBlend( ); - g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); - - //BIG ROFL - if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) - && backup_blend == clr_hid.a( ) ) { - backup_ignorez = true; - } - - if( !backup_ignorez ) { - auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); - g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, g_settings.rage.bt_col( ) ); - dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - } - - g_csgo.m_render_view( )->SetBlend( backup_blend ); - g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); - g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && - ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); - - if( draw ) { - dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - draw = false; - } - } - } - - - if( g_settings.legit.backtracking_visualize( ) && ( team != local_team || g_settings.legit.friendlies( ) ) ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); - auto record = g_cheat.m_legitbot.m_lagcomp.find_best_record( info.m_entity_index ); - { //idk - auto records = g_cheat.m_legitbot.m_lagcomp.get_records( info.m_entity_index ); - if( records.size( ) ) { - for( auto& it : util::reverse_iterator( records ) ) { - if( it.is_valid( ) ) { - record = ⁢ - break; - } - } - } - } - - if( record && record->is_valid( ) && record->m_position.dist_to( ent->get_hitbox_pos( 0 ) ) > 5.f ) { - fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); - - float backup_modulation[ 3 ]{ }; - bool backup_ignorez = false; - float backup_blend = 1.0f; - - backup_blend = g_csgo.m_render_view( )->GetBlend( ); - g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); - - //BIG ROFL - if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) - && backup_blend == clr_hid.a( ) ) { - backup_ignorez = true; - } - - if( !backup_ignorez ) { - auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); - g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, g_settings.legit.backtracking_col( ) ); - dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - } - - g_csgo.m_render_view( )->SetBlend( backup_blend ); - g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); - g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && - ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); - - if( draw ) { - dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - draw = false; - } - } - } - } - - if( draw ) { - dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); - } - - g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); -} \ No newline at end of file diff --git a/gmod/emit_sound.cpp b/gmod/emit_sound.cpp deleted file mode 100644 index 547828c..0000000 --- a/gmod/emit_sound.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "base_cheat.hpp" -#include "hooks.hpp" - -void __fastcall hooks::emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, - const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, - const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ) { - static auto emit_sound_o = g_csgo.m_engine_sound->get_old_function< decltype( &hooks::emit_sound ) >( 5 ); - - if( !g_csgo.m_panic && origin ) { - auto entity = g_csgo.m_entlist( )->GetClientEntity< >( ent ); - if( entity && entity->is_player( ) && entity->ce( )->IsDormant( ) && - ent >= 0 && ent <= 64 ) - g_cheat.m_visuals.update_position( ent, *origin ); - } - - emit_sound_o( ecx_, 0, filter, ent, channel, sound, hash, sample, - volume, attenuation, seed, flags, pitch, origin, direction, - origins, update_pos, sound_time, speaker_entry ); -} \ No newline at end of file diff --git a/gmod/extra.cpp b/gmod/extra.cpp deleted file mode 100644 index 454971e..0000000 --- a/gmod/extra.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include "base_cheat.hpp" -#include "context.hpp" -#include "input_system.hpp" -#include "math.hpp" -#include "hooks.hpp" -#include "interface.hpp" -#undef min - -namespace features -{ - void c_extra::use_spammer( user_cmd_t* cmd ) { - if( !g_settings.misc.use_spam( ) ) - return; - - if( !g_input.is_key_pressed( g_settings.misc.use_spam_key( ) ) ) - return; - - static bool toggle{ }; - - if( toggle ) - cmd->m_buttons |= IN_USE; - else - cmd->m_buttons &= ~IN_USE; - - toggle ^= 1; - } - - void c_extra::third_person( ) { - if( !g_ctx.m_local ) - return; - - static bool enabled = false; - static bool toggle = true; - static bool key_held = false; - - - if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.thirdperson_key( ) ) ) { - if( !key_held ) { - toggle ^= 1; - } - key_held = true; - } - else { - key_held = false; - } - - if( !g_settings.misc.thirdperson || !toggle ) { - if( enabled ) { - g_gmod.m_input->m_fCameraInThirdPerson = false; - enabled = false; - } - - return; - } - - vec3_t viewangles{ }; - if( g_ctx.m_local->is_alive( ) ) { - g_gmod.m_engine( )->GetViewAngles( viewangles ); - g_gmod.m_input->m_fCameraInThirdPerson = true; - g_gmod.m_input->m_vecCameraOffset = vec3_t( viewangles.x, viewangles.y, 150.0f ); - - constexpr float cam_hull_offset{ 16.f }; - - const vec3_t cam_hull_min( -cam_hull_offset, -cam_hull_offset, -cam_hull_offset ); - const vec3_t cam_hull_max( cam_hull_offset, cam_hull_offset, cam_hull_offset ); - vec3_t cam_forward, origin = g_ctx.m_local->get_eye_pos( ); - - cam_forward = math::angle_vectors( vec3_t( viewangles.x, viewangles.y, 0.f ) ); - - CTraceFilterWorldAndPropsOnly filter; - Ray_t ray; - CGameTrace tr; - - ray.Init( origin, origin - ( cam_forward * 150.f ), cam_hull_min, cam_hull_max ); - - g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, &tr ); - g_gmod.m_input->m_vecCameraOffset.z = 150.f * tr.fraction; - - enabled = true; - } - else if( g_gmod.m_entlist( )->GetClientEntityFromHandle< >( g_ctx.m_local->m_hObserverTarget( ) ) ) { - g_gmod.m_input->m_fCameraInThirdPerson = false; - g_ctx.m_local->m_iObserverMode( ) = 5; - } - } -} \ No newline at end of file diff --git a/gmod/extra.hpp b/gmod/extra.hpp deleted file mode 100644 index 8d01603..0000000 --- a/gmod/extra.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include -#include - -namespace features -{ - class c_extra { - public: - void use_spammer( user_cmd_t* cmd ); - void third_person( ); - }; -} \ No newline at end of file diff --git a/gmod/factory.cpp b/gmod/factory.cpp deleted file mode 100644 index 4133e39..0000000 --- a/gmod/factory.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "factory.hpp" -#ifndef IFACE_DLLMAIN -#include "fnv.hpp" - -#include - -NAMESPACE_REGION( factory ) -NAMESPACE_REGION( interfaces ) - -//iterate all exports inside of a module and find createinterface -uintptr_t c_interface_manager::find_createinterface( void* module_ ) { - IMAGE_DOS_HEADER* dos_header; - IMAGE_NT_HEADERS* nt_headers; - uintptr_t export_address; - IMAGE_EXPORT_DIRECTORY* export_dir; - const char* export_name; - uintptr_t* names; - uintptr_t* funcs; - uint16_t* ords; - uint32_t export_hash; - - dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); - nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); - - //find addresses of functions from nt headers - export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; - export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); - - if ( !export_dir->NumberOfFunctions ) - return uintptr_t{ }; - - names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); - funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); - - ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); - - if ( names && funcs && ords ) { - //iterate the exports - for ( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { - export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); - export_hash = hash::fnv1a( export_name ); - - if ( export_hash == fnv( "CreateInterface" ) ) { - return uintptr_t( module_ ) + funcs[ ords[ i ] ]; - } - } - } - - return uintptr_t{ }; -} - -c_interface_manager::c_interface_manager( ) { - auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); - auto peb = teb->ProcessEnvironmentBlock; - - auto root = &peb->Ldr->InMemoryOrderModuleList; - //iterate module list - for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { - PLDR_DATA_TABLE_ENTRY data_table; - HMODULE module_base; - uintptr_t create_interface_export; - uintptr_t create_interface_; - uintptr_t* list_iterator_ptr; - interface_iterator_t* list_iterator; - - data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); - module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); - create_interface_export = find_createinterface( module_base ); - - if ( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { - continue; - } - - //find the createinterface function - create_interface_ = follow_createinterface_export( create_interface_export ); - if ( !is_createinterface_fn( create_interface_ ) ) { - continue; - } - - //find the list iterator - list_iterator_ptr = find_list_ptr( create_interface_ ); - - //iterate the interface list - for ( list_iterator = reinterpret_cast< interface_iterator_t* >( - list_iterator_ptr ); - !!list_iterator; - list_iterator = list_iterator->m_next - ) { - std::string name( list_iterator->m_name ); - std::string module_name( util::unicode_to_ascii( - std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); - - uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); - - size_t version = [ & ]( ) { - std::string ret( name ); - ret.erase( std::remove_if( ret.begin( ), ret.end( ), - [ & ]( int i ) { return !::isdigit( i ); } - ), ret.end( ) ); - return atoi( ret.c_str( ) ); - }( ); - - m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); - } - } -} - -END_REGION -END_REGION -#endif \ No newline at end of file diff --git a/gmod/factory.hpp b/gmod/factory.hpp deleted file mode 100644 index a3565e0..0000000 --- a/gmod/factory.hpp +++ /dev/null @@ -1,155 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include "vmt.hpp" -#include "util.hpp" -#include "x86.hpp" -#include "console.hpp" - -//IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran -#ifndef _DEBUG -//#define IFACE_DLLMAIN -#endif - -#ifdef IFACE_DLLMAIN -#include "iface_dllmain_impl.hpp" -#else - -NAMESPACE_REGION( factory ) - -namespace interfaces -{ - struct interface_iterator_t { - void* m_create_fn; - char* m_name; - - interface_iterator_t* m_next; - }; - - inline auto follow_createinterface_export( uintptr_t export_ ) { - /* - .text:006F5F00 CreateInterface proc near - .text:006F5F00 push ebp - .text:006F5F01 mov ebp, esp - .text:006F5F03 pop ebp - .text:006F5F04 jmp sub_6F5E90 - */ - uintptr_t jmp = export_ + 0x4; - uintptr_t jmp_target = jmp + *( uintptr_t* )( jmp + 0x1 ) + 0x5; - - return jmp_target; - } - - inline auto find_list_ptr( uintptr_t createinterface ) { - /* - .text:006F5E90 push ebp - .text:006F5E91 mov ebp, esp - .text:006F5E93 push esi - .text:006F5E94 mov esi, dword_2EEFDE4 - .text:006F5E9A push edi - */ - auto iterator_ptr = **( uintptr_t*** )( createinterface + 0x6 ); - - return iterator_ptr; - } - - inline bool is_createinterface_export( uintptr_t export_ ) { - return ( *( uint8_t* )( export_ ) == x86::encode_push_reg( x86::reg::ebp ) - && *( uint8_t* )( export_ + 4 ) == 0xe9 - && *( uint8_t* )( export_ + 9 ) == 0xcc - && *( uint8_t* )( export_ + 10 ) == 0xcc ); - } - - inline bool is_createinterface_fn( uintptr_t fn_ ) { - return ( *( uint8_t* )( fn_ ) == x86::encode_push_reg( x86::reg::ebp ) - && *( uint8_t* )( fn_ + 4 ) == 0x8b - && *( uint8_t* )( fn_ + 10 ) == x86::encode_push_reg( x86::reg::edi ) ); - } - - class c_interface_manager { - public: - struct interface_data_t { - std::string m_name; - std::string m_module; - size_t m_version; - uintptr_t m_ptr; - - template < typename t > __forceinline t get( ) { - return reinterpret_cast< t >( m_ptr ); - } - }; - - c_interface_manager( ); - - //iterate the interface list to find our desired version - template < typename t = void* > - t find_interface( const std::string& module_, std::string name ) { - //avoid finding interfaces with matching names - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += "0"; - - for( auto& it : m_interfaces ) { - if( !it.m_module.compare( module_ ) - && !it.m_name.compare( name ) ) { - g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), - name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - - return it.get< t >( ); - } - } - - g_con->print( xors( "%s not found\n" ), name.c_str( ) ); - - return t{ }; - } - - template < typename t = void* > - t find_interface( std::string name ) { - //avoid finding interfaces with matching names - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += '0'; - - for( auto& it : m_interfaces ) { - if( strstr( it.m_name.c_str( ), name.c_str( ) ) ) { - g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), - name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - - return it.get< t >( ); - } - } - - g_con->print( xors( "%s not found\n" ), name.c_str( ) ); - - return t{ }; - } - - void dump_interface_list( ) { - for( auto& it : m_interfaces ) { - g_con->print( xors( "%s version %u in %s at 0x%08x\n" ), - it.m_name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - } - } - - private: - uintptr_t find_createinterface( void* module_ ); - - std::vector< interface_data_t > m_interfaces; - }; -} - -END_REGION -#endif - -extern HMODULE g_dll; -extern factory::interfaces::c_interface_manager g_factory; \ No newline at end of file diff --git a/gmod/fire_bullets.cpp b/gmod/fire_bullets.cpp deleted file mode 100644 index 6bc4297..0000000 --- a/gmod/fire_bullets.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" -#include "base_cheat.hpp" - -decltype( &hooks::fire_bullets ) hooks::fire_bullets_o{ }; -void __fastcall hooks::fire_bullets( void* ecx, void* edx, fire_bullets_info* info ) { - if( g_gmod.m_panic ) return fire_bullets_o( ecx, edx, info ); - - if( g_ctx.run_frame( ) && - g_ctx.m_local == ecx ) { // only our shots. - g_cheat.m_aimbot.log_shot( ( c_base_player* )ecx, info ); // dynamically logging spread vectors for nospread. - } - - return fire_bullets_o( ecx, edx, info ); -} \ No newline at end of file diff --git a/gmod/fnv.hpp b/gmod/fnv.hpp deleted file mode 100644 index a3f2dc9..0000000 --- a/gmod/fnv.hpp +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#pragma warning( disable : 4307 ) // '*': integral constant overflow -#pragma warning( disable : 4244 ) // possible loss of data - -#include -#include - -using hash_t = unsigned int; - -// used for compile-time FNV-1a 32bit hashes. -#define fnv( str ) \ - [&]() { \ - constexpr hash_t out = hash::fnv1a( str ); \ - \ - return out; \ - }() - -// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. -#define fnv_const( str ) Hash::fnv1a_32( str ) - -namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). -{ - // FNV-1a constants. - enum : hash_t { - FNV1A_PRIME = 0x1000193, - FNV1A_BASIS = 0x811C9DC5 - }; - - // compile-time strlen. - __forceinline constexpr size_t ct_strlen( const char *str ) { - size_t out = 1; - - for( ; str[ out ] != '\0'; ++out ); - - return out; - } - - // hash data. - __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { - hash_t out = FNV1A_BASIS; - - for( size_t i = 0; i < len; ++i ) - out = ( out ^ data[ i ] ) * FNV1A_PRIME; - - return out; - } - - // hash c-style string. - __forceinline constexpr hash_t fnv1a( const char *str ) { - hash_t out = FNV1A_BASIS; - size_t len = ct_strlen( str ); - - for( size_t i = 0; i < len; ++i ) - out = ( out ^ str[ i ] ) * FNV1A_PRIME; - - return out; - } - - // hash C++-style string ( runtime only ). - __forceinline hash_t fnv1a( const std::string &str ) { - return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); - } -} \ No newline at end of file diff --git a/gmod/frame_stage_notify.cpp b/gmod/frame_stage_notify.cpp deleted file mode 100644 index c371eb0..0000000 --- a/gmod/frame_stage_notify.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "base_cheat.hpp" - - -void __fastcall hooks::frame_stage_notify( void* ecx_, void* edx_, ClientFrameStage_t stage ) { - static auto frame_stage_notify_o = g_gmod.m_chl->get_old_function< decltype( &hooks::frame_stage_notify ) >( 35 ); - if ( g_gmod.m_panic ) return frame_stage_notify_o( ecx_, edx_, stage ); - - g_ctx.m_stage = stage; - - switch( stage ) { - case FRAME_NET_UPDATE_START: - break; - case FRAME_NET_UPDATE_POSTDATAUPDATE_START: - break; - case FRAME_RENDER_START: - break; - case FRAME_RENDER_END: - break; - } - - frame_stage_notify_o( ecx_, edx_, stage ); -} \ No newline at end of file diff --git a/gmod/get_screen_size.cpp b/gmod/get_screen_size.cpp deleted file mode 100644 index 19d9908..0000000 --- a/gmod/get_screen_size.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "hooks.hpp" -#include "settings.hpp" - -#include -#include "context.hpp" -#include "mem.hpp" - -void __fastcall hooks::get_screen_size( void* ecx, void* edx, int& w, int& h ) { - static auto get_screen_size_o = g_csgo.m_surface->get_old_function< decltype( &hooks::get_screen_size ) >( 44 ); - static auto draw_crosshair_h = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "8B 0D ? ? ? ? 99 2B C2 D1 F8 89" ) ); - - stack_t stack( get_baseptr( ) ); - auto ret = stack.next( ).return_address( ); - //call original - get_screen_size_o( ecx, edx, w, h ); - - //alter screen width and height to adjust the crosshair position on screen - if( g_settings.visuals.recoil_crosshair && g_ctx.m_local ) { - if( ret == draw_crosshair_h || ret == draw_crosshair_h - 14 /* width call is 14 bytes above height call*/ ) { - w /= 2; - h /= 2; - - vec3_t punch_angles = g_ctx.m_local->m_aimPunchAngle( ) * 2.f; - - if( punch_angles.x < -0.1f ) { - float fov = g_ctx.m_fov; - float angle_step = h / fov; - - w -= int( punch_angles.y * angle_step ); - h += int( punch_angles.x * angle_step ); - } - - w *= 2; - h *= 2; - } - } -} \ No newline at end of file diff --git a/gmod/get_viewmodel_fov.cpp b/gmod/get_viewmodel_fov.cpp deleted file mode 100644 index e4722e2..0000000 --- a/gmod/get_viewmodel_fov.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "hooks.hpp" -#include "settings.hpp" - -float __fastcall hooks::get_viewmodel_fov( void* ecx, void* edx ) { - static auto get_viewmodel_fov_o = g_csgo.m_clientmode->get_old_function< decltype( &hooks::get_viewmodel_fov ) >( 35 ); - - return get_viewmodel_fov_o( ecx, nullptr ) + float( g_settings.misc.viewmodel_fov ); -} diff --git a/gmod/gmod.vcxproj b/gmod/gmod.vcxproj deleted file mode 100644 index ce74398..0000000 --- a/gmod/gmod.vcxproj +++ /dev/null @@ -1,369 +0,0 @@ - - - - - Debug - Win32 - - - pHit - Win32 - - - pHit - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - optimize_test - Win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 15.0 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4} - gmod - 10.0.16299.0 - - - DynamicLibrary - true - v141 - MultiByte - - - - DynamicLibrary - true - v141 - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - Application - true - v141 - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - false - v141 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - $(SolutionDir)\bin - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - $(SolutionDir)bin - - - $(SolutionDir)bin - false - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - $(SolutionDir)bin - false - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - - Level2 - Full - true - /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG;_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS - true - false - Default - AnySuitable - true - StreamingSIMDExtensions2 - Fast - true - MultiThreadedDLL - _DEBUG - NotUsing - precompiled.hpp - - - false - /FAs %(AdditionalOptions) - DebugFastLink - false - false - - - - - Level3 - MaxSpeed - true - true - true - true - stdcpplatest - _CRT_SECURE_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions) - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - stdcpplatest - _CRT_SECURE_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions) - - - true - true - - - - - Level3 - Disabled - true - false - stdcpplatest - _CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) - EditAndContinue - true - - - DebugFastLink - - - - - Level3 - Disabled - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - - \ No newline at end of file diff --git a/gmod/gmod.vcxproj.filters b/gmod/gmod.vcxproj.filters deleted file mode 100644 index c0bbeec..0000000 --- a/gmod/gmod.vcxproj.filters +++ /dev/null @@ -1,385 +0,0 @@ - - - - - {35d8e768-6ac4-4c43-818b-c2bcc4c3d527} - - - {1c1f773e-855b-43aa-afc8-5b8ee2cdbbc0} - - - {d47a6098-6f48-477c-8e9d-2e9ad3c0427d} - - - {f0e1c4a3-598f-4287-b0a6-63c19c84ad72} - - - {120ffcba-bfc7-4d07-97f1-ff5da4f08801} - - - {87974e05-d739-4f24-9c3b-2d96f0148b15} - - - {1df4716c-8aa1-49bd-bc47-e879bc145159} - - - {2b412e0a-8891-49f0-a4e2-752d774d9715} - - - {7306897e-ecec-49ec-b65d-d0e24ae31128} - - - {95cd308d-e344-423e-9068-935c019ffdff} - - - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - icons - - - icons - - - icons - - - icons - - - icons - - - sdk\valve - - - sdk\valve - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - hooks - - - util - - - util - - - util - - - util - - - util - - - util - - - util - - - util - - - hooks\hookers - - - hooks\hookers - - - factory - - - factory - - - factory - - - factory - - - context - - - context - - - context - - - util - - - util - - - util - - - sdk - - - sdk - - - features - - - features - - - features - - - features - - - sdk - - - sdk - - - features - - - features - - - features - - - features - - - - - sdk - - - sdk - - - sdk - - - hooks - - - hooks - - - hooks - - - util - - - util - - - util - - - util - - - util - - - factory - - - factory - - - factory - - - context - - - context - - - util - - - util - - - - features - - - features - - - features - - - hooks - - - features - - - features - - - hooks - - - features - - - features - - - hooks - - - hooks - - - features - - - hooks - - - hooks - - - features - - - hooks - - - \ No newline at end of file diff --git a/gmod/hooks.cpp b/gmod/hooks.cpp deleted file mode 100644 index a5cb91e..0000000 --- a/gmod/hooks.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "hooks.hpp" -#include "interface.hpp" - -hooks::c_netvar_proxy hooks::lby_proxy; -hooks::c_netvar_proxy hooks::last_shot_proxy; - - - - - -bool hooks::commit( factory::c_gmod* instance ) { - while ( !( instance->m_hwnd = FindWindowA( xors( "Valve001" ), 0 ) ) ) - Sleep( 100 ); - - window_procedure_o = reinterpret_cast< decltype( window_procedure_o ) >( - SetWindowLongA( instance->m_hwnd, GWLP_WNDPROC, - ( long )window_procedure ) - ); - - instance->m_d3d->hook( 42, &hooks::d3d::end_scene ); - instance->m_d3d->hook( 16, &hooks::d3d::reset ); - instance->m_d3d->hook( 17, &hooks::d3d::present ); - instance->m_surface->hook( 62, &hooks::lock_cursor ); - //instance->m_view_render->hook( 6, &hooks::render_view ); - instance->m_engine_vgui->hook( 13, &hooks::paint ); - //instance->m_engine->hook( 93, &hooks::is_hltv_proxy ); - //instance->m_engine->hook( 91, &hooks::is_paused ); - //instance->m_engine->hook( 27, &hooks::is_connected ); - //instance->m_panel->hook( 41, &hooks::paint_traverse ); - instance->m_clientmode->hook( 21, &hooks::create_move ); - //instance->m_clientmode->hook( 23, &hooks::override_mouse_input ); - //instance->m_clientmode->hook( 35, &hooks::get_viewmodel_fov ); - //instance->m_clientmode->hook( 44, &hooks::do_post_screen_space_effects ); - instance->m_clientmode->hook( 16, &hooks::override_view ); - //instance->m_chl->hook( 35, &hooks::frame_stage_notify ); - //instance->m_chl->hook( 10, &hooks::hud_process_input ); - instance->m_prediction->hook( 17, &hooks::run_command ); - //instance->m_prediction->hook( 14, &hooks::in_prediction ); - //instance->m_model_render->hook( 21, &hooks::draw_model_execute ); - //instance->m_render_view->hook( 9, &hooks::scene_end ); - //instance->m_surface->hook( 44, &hooks::get_screen_size ); - //instance->m_surface->hook( 116, &hooks::on_screen_size_changed ); - //instance->m_surface->hook( 82, &hooks::play_sound ); - //instance->m_engine_sound->hook( 5, &hooks::emit_sound ); - //instance->m_debug_show_spread->hook( 13, &hooks::debug_show_spread_get_int ); - - return true; -} diff --git a/gmod/hooks.hpp b/gmod/hooks.hpp deleted file mode 100644 index e4a6239..0000000 --- a/gmod/hooks.hpp +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once -#include - -#include "util.hpp" -#include "d3d.hpp" -#include "interface.hpp" -#include "netvar_proxy.hpp" - -namespace hooks -{ - //hook like the hooker that u are - - long __stdcall window_procedure( HWND, uint32_t, uint32_t, long ); - extern decltype( &window_procedure ) window_procedure_o; - - void __fastcall fire_bullets( void*, void*, fire_bullets_info* ); - extern decltype( &fire_bullets ) fire_bullets_o; - - void __fastcall lock_cursor( void*, void* ); - void __fastcall paint( void*, void*, int ); - void __fastcall render_view( void*, void*, CViewSetup&, int, int ); - void __fastcall paint_traverse( void*, void*, unsigned int, bool, bool ); - bool __fastcall create_move( void*, void*, float, user_cmd_t* ); - void __fastcall frame_stage_notify( void*, void*, ClientFrameStage_t ); - void __fastcall run_command( void*, void*, IClientEntity*, user_cmd_t*, IMoveHelper* ); - void __fastcall override_mouse_input( void*, void*, float*, float* ); - void __fastcall draw_model_execute( IVModelRender*, void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); - void __fastcall scene_end( void*, void* ); - bool __fastcall is_hltv_proxy( void*, void* ); - bool __fastcall is_hltv( void* thisptr, uintptr_t pvs_entity ); - float __fastcall get_viewmodel_fov( void*, void* ); - void __fastcall get_screen_size( void*, void*, int&, int& ); - void __fastcall override_view( void* ecx_, void* edx_, CViewSetup* setup ); - void __fastcall emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, - const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, - const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ); - - bool __fastcall is_connected( void* ecx_, void* edx_ ); - - bool __fastcall in_prediction( void* ecx_, void* edx_ ); - - void __cdecl lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); - void __cdecl last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); - int __fastcall send_datagram( INetChannel* channel, void* edx, void* datagram ); - bool __fastcall is_paused( void* ecx_, void* edx_ ); - bool __fastcall do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ); - void __fastcall on_screen_size_changed( void* ecx_, void* edx_, int old_h, int old_w ); - void __fastcall play_sound( void* ecx_, void* edx_, const char* name ); - void __fastcall hud_process_input( void* ecx_, void* edx_, bool repaint ); - - int __fastcall debug_show_spread_get_int( void* ecx_, void* edx_ ); - - extern c_netvar_proxy lby_proxy; - extern c_netvar_proxy last_shot_proxy; - - //do we wanna only run menu in d3d or visuals too? - namespace d3d { - long __stdcall end_scene( IDirect3DDevice9* ); - long __stdcall reset( IDirect3DDevice9*, D3DPRESENT_PARAMETERS* ); - long __stdcall present( IDirect3DDevice9*, RECT*, RECT*, HWND, RGNDATA* ); - } - - extern bool commit( factory::c_gmod* ); -} \ No newline at end of file diff --git a/gmod/hud_process_input.cpp b/gmod/hud_process_input.cpp deleted file mode 100644 index b68c9c1..0000000 --- a/gmod/hud_process_input.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "context.hpp" -#include "hooks.hpp" - -void __fastcall hooks::hud_process_input( void* ecx_, void* edx_, bool active ) { - static auto hud_update_o = g_csgo.m_chl->get_old_function< decltype( &hooks::hud_process_input ) >( 10 ); - - static auto g_vecRenderAngle = *pattern::first_code_match< vec3_t** >( g_csgo.m_chl.dll( ), - xors( "F3 0F 10 05 ? ? ? ? F3 0F 5C 05 ? ? ? ? F3 0F 11 86" ), 0x4 ); - - if( g_ctx.run_frame( ) ) { - float backup = g_vecRenderAngle->y; - g_vecRenderAngle->y = g_ctx.m_last_fakeangle.y; - hud_update_o( ecx_, 0, active ); - g_vecRenderAngle->y = backup; - return; - } - - return hud_update_o( ecx_, 0, active ); -} \ No newline at end of file diff --git a/gmod/icons.hpp b/gmod/icons.hpp deleted file mode 100644 index bffd94e..0000000 --- a/gmod/icons.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "icons/legit.hpp" -#include "icons/rage.hpp" -#include "icons/visuals.hpp" -#include "icons/misc.hpp" -#include "icons/config.hpp" \ No newline at end of file diff --git a/gmod/icons/config.hpp b/gmod/icons/config.hpp deleted file mode 100644 index be45039..0000000 --- a/gmod/icons/config.hpp +++ /dev/null @@ -1,1752 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\config.png (4/1/2018 10:00:36 PM) - StartOffset: 00000000, EndOffset: 0000519A, Length: 0000519B */ - -namespace icons { -constexpr static size_t config_size = 20891; -namespace raw { -static unsigned char config[20891] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, - 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, - 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x66, - 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, 0x65, 0x34, - 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, 0x2D, 0x32, - 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, 0x64, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x30, 0x36, 0x32, 0x33, - 0x62, 0x65, 0x64, 0x36, 0x2D, 0x33, 0x35, 0x62, 0x35, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x37, - 0x61, 0x32, 0x34, 0x30, 0x39, 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, - 0x2D, 0x64, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, - 0x66, 0x66, 0x39, 0x62, 0x39, 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x37, 0x61, 0x32, 0x34, 0x30, 0x39, - 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, 0x2D, 0x64, 0x39, 0x34, 0x38, - 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, 0x66, 0x66, 0x39, 0x62, 0x39, - 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, - 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x66, 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, - 0x65, 0x34, 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, - 0x2D, 0x32, 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x55, 0x32, 0xFE, 0xAE, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0B, 0xBD, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x7B, 0x90, 0x95, 0x65, 0x1D, 0xC7, - 0x3F, 0xE7, 0xEC, 0xC2, 0xDE, 0x61, 0x59, 0x59, 0x02, 0x44, 0x28, 0x58, - 0xC0, 0x58, 0x09, 0x2C, 0x15, 0x44, 0x25, 0x35, 0x75, 0x6C, 0x14, 0xBB, - 0x20, 0x3A, 0x89, 0x63, 0xD9, 0xFD, 0xDE, 0x4C, 0xC3, 0x54, 0x96, 0x8D, - 0x91, 0x35, 0x43, 0x6A, 0x37, 0x2D, 0x29, 0x13, 0xB5, 0x2C, 0x2A, 0x8B, - 0xA9, 0x94, 0xA9, 0x2C, 0xBB, 0xDF, 0x30, 0x1C, 0xE4, 0xB2, 0x54, 0xC8, - 0x2D, 0x10, 0x01, 0xB9, 0x2E, 0xEC, 0xB2, 0xF7, 0x73, 0x9E, 0xFE, 0xF8, - 0xFD, 0x8E, 0x6E, 0xDC, 0xDE, 0xE7, 0x3D, 0x97, 0xF7, 0x76, 0x9E, 0xEF, - 0xCC, 0x99, 0xDD, 0x85, 0xF7, 0x3D, 0xE7, 0x3D, 0xEF, 0xF7, 0x7D, 0x9E, - 0xE7, 0x77, 0xF9, 0xFE, 0x7E, 0x4F, 0xCA, 0x18, 0x83, 0x43, 0x72, 0x91, - 0x76, 0xB7, 0xC0, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, - 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0x19, 0xA1, - 0x32, 0x61, 0xDF, 0xA7, 0x0A, 0x38, 0x13, 0xA8, 0x05, 0x1A, 0x80, 0x61, - 0xFA, 0xB3, 0x6E, 0xD0, 0xC3, 0x9C, 0x01, 0x8E, 0x01, 0x47, 0xF5, 0xD5, - 0x01, 0x74, 0x01, 0xCF, 0xEB, 0xFF, 0x39, 0x82, 0x23, 0x86, 0x51, 0xC0, - 0x6B, 0xF4, 0xE7, 0xAB, 0x81, 0x69, 0x40, 0x35, 0x50, 0xAF, 0xC4, 0xD6, - 0xEA, 0xDF, 0x29, 0x3D, 0x3E, 0x0B, 0xF4, 0x00, 0xDD, 0x40, 0xA7, 0xBE, - 0xBA, 0x80, 0xF5, 0xC0, 0x73, 0xC0, 0x3E, 0xE0, 0x59, 0xE0, 0x48, 0x12, - 0x08, 0x4E, 0xC5, 0x34, 0x54, 0x59, 0x0D, 0xCC, 0x00, 0xCE, 0x03, 0x66, - 0x02, 0xD3, 0x81, 0x26, 0x7D, 0x35, 0x28, 0x99, 0x69, 0x7D, 0xA5, 0x4E, - 0xF1, 0x1E, 0x46, 0xC9, 0xCE, 0xEA, 0xEF, 0xED, 0xC0, 0x21, 0xE0, 0x30, - 0xF0, 0x0C, 0xB0, 0x01, 0x78, 0x1A, 0x68, 0xD3, 0x63, 0x1C, 0xC1, 0x01, - 0xA0, 0x1E, 0xB8, 0x18, 0x98, 0x0B, 0xCC, 0x02, 0xA6, 0x02, 0x8D, 0x40, - 0x4D, 0x11, 0xED, 0x89, 0xAC, 0x4E, 0xE1, 0x87, 0x80, 0x8D, 0xC0, 0xDF, - 0x81, 0xBF, 0xEA, 0xCF, 0x7E, 0x47, 0x70, 0x69, 0x30, 0x14, 0xB8, 0x0C, - 0xB8, 0x0A, 0x78, 0x3D, 0x30, 0x51, 0x47, 0x6A, 0xA9, 0x97, 0x98, 0x01, - 0x1D, 0xD1, 0x9B, 0x81, 0xA7, 0x80, 0x27, 0x81, 0x7F, 0xE8, 0x88, 0x77, - 0x04, 0x17, 0x09, 0xD3, 0x80, 0xEB, 0x81, 0x6B, 0x74, 0xC4, 0x36, 0x84, - 0x60, 0xFD, 0x67, 0x95, 0xE8, 0x36, 0xE0, 0x71, 0x60, 0x05, 0xB0, 0xC3, - 0x11, 0x5C, 0xB8, 0x01, 0x78, 0x25, 0xF0, 0x7E, 0x60, 0x36, 0x30, 0x32, - 0x02, 0x6E, 0x5D, 0x06, 0xD8, 0x03, 0xFC, 0x11, 0x78, 0x10, 0xF8, 0x93, - 0x23, 0x38, 0x3F, 0x8C, 0x04, 0xDE, 0x09, 0xDC, 0xA0, 0x16, 0xF2, 0x90, - 0x88, 0x5D, 0x5F, 0x17, 0xB0, 0x16, 0x58, 0x06, 0xFC, 0x48, 0xFF, 0x76, - 0x6E, 0x92, 0x25, 0x26, 0x01, 0x1F, 0x07, 0xAE, 0x03, 0xC6, 0x46, 0x34, - 0x18, 0x53, 0xAB, 0x46, 0xDE, 0x19, 0xC0, 0x78, 0xE0, 0x9B, 0xC0, 0x7E, - 0x37, 0x82, 0xBD, 0x71, 0x0E, 0x70, 0x3B, 0xF0, 0x46, 0x0D, 0x52, 0x14, - 0x82, 0x0E, 0xF5, 0x65, 0xBB, 0x4E, 0x12, 0xC0, 0x18, 0xA2, 0x24, 0x35, - 0xEA, 0xCF, 0x7C, 0x61, 0xD4, 0x6F, 0x5E, 0x01, 0xDC, 0x09, 0xEC, 0x75, - 0x04, 0x9F, 0xDE, 0x98, 0x5A, 0x02, 0x5C, 0xA1, 0x6E, 0x4F, 0x3E, 0xD8, - 0xA1, 0x16, 0xEF, 0x0B, 0x1A, 0xB8, 0xD8, 0xA7, 0x24, 0x67, 0x4E, 0x32, - 0x73, 0x8D, 0x00, 0x5E, 0xA1, 0xFE, 0xF4, 0x68, 0x0D, 0x92, 0x8C, 0xC9, - 0xF3, 0x73, 0x8F, 0x02, 0x8F, 0x01, 0x77, 0x00, 0xBB, 0x1D, 0xC1, 0x27, - 0x62, 0x22, 0x70, 0x8F, 0x5A, 0xCA, 0x43, 0x7D, 0x9E, 0xDB, 0xA7, 0xAE, - 0xCB, 0x7A, 0x60, 0x95, 0x12, 0xDC, 0xAE, 0x53, 0x66, 0xAF, 0xBA, 0x3A, - 0xC7, 0x7F, 0xC9, 0x94, 0x7E, 0x4E, 0xB5, 0xAE, 0xF7, 0x8D, 0xFA, 0x80, - 0x9D, 0x0F, 0x9C, 0xAB, 0x46, 0x5D, 0x3E, 0x33, 0xC6, 0x72, 0xE0, 0xB3, - 0x51, 0x9A, 0xAE, 0xA3, 0x40, 0xF0, 0x08, 0xE0, 0x6E, 0x60, 0xA1, 0xDE, - 0x70, 0x3F, 0xF8, 0x3D, 0xF0, 0x3B, 0xB5, 0x6A, 0x77, 0x68, 0x70, 0xA2, - 0x17, 0x7F, 0x91, 0xA7, 0x94, 0xBE, 0x6A, 0x74, 0x4D, 0x7D, 0x25, 0x70, - 0xB5, 0xCE, 0x24, 0xE7, 0xFB, 0xBC, 0x9E, 0x76, 0xE0, 0x3E, 0x9D, 0xAE, - 0xFB, 0x1D, 0xC1, 0x50, 0x01, 0xDC, 0x06, 0x2C, 0x02, 0x86, 0xFB, 0x38, - 0xEF, 0x3F, 0xC0, 0x4F, 0x81, 0x95, 0x3A, 0x62, 0x4F, 0x36, 0x0D, 0x17, - 0x72, 0x4D, 0x67, 0x00, 0xAD, 0xC0, 0x5B, 0x80, 0xF9, 0x6A, 0xEC, 0xD9, - 0x62, 0x17, 0xB0, 0x58, 0xDD, 0xA8, 0xB2, 0x27, 0x78, 0x3E, 0xF0, 0x15, - 0xB5, 0x44, 0x6D, 0xF1, 0x2B, 0x60, 0xA9, 0x4E, 0xC7, 0x07, 0x29, 0x5D, - 0x9C, 0xB8, 0x02, 0xC9, 0x4C, 0xCD, 0x05, 0xDE, 0x87, 0x84, 0x48, 0x6D, - 0xF1, 0x6F, 0x75, 0xF3, 0x56, 0x95, 0x33, 0xC1, 0x13, 0x75, 0xCD, 0xBA, - 0x80, 0x53, 0x27, 0x04, 0x8E, 0xB7, 0x58, 0x97, 0x02, 0x0F, 0xEB, 0x7A, - 0xDB, 0x17, 0xD0, 0x75, 0xD6, 0x00, 0xAF, 0x03, 0x3E, 0x0A, 0x2C, 0xB0, - 0x3C, 0x27, 0xAB, 0xB3, 0xCB, 0x2D, 0x84, 0x9C, 0x95, 0xAA, 0x0C, 0xF1, - 0x73, 0x3F, 0xAC, 0x37, 0xCE, 0x86, 0xDC, 0x8C, 0x8E, 0xF4, 0xA5, 0xBA, - 0xD6, 0x06, 0x99, 0xDD, 0xE9, 0x56, 0x23, 0xAE, 0x5D, 0xAD, 0xE5, 0x77, - 0x59, 0x9C, 0x93, 0x46, 0xA2, 0x70, 0x6F, 0x07, 0xEE, 0x0D, 0x93, 0xE0, - 0xB0, 0x82, 0x08, 0x17, 0x02, 0x6F, 0xF3, 0xF1, 0x80, 0xDD, 0x03, 0x7C, - 0x1D, 0xD8, 0x4E, 0x38, 0xA9, 0xBB, 0x0C, 0x92, 0x59, 0x5A, 0xE2, 0x63, - 0x6D, 0xAD, 0xD1, 0xA9, 0x7D, 0x7A, 0xB9, 0x11, 0x5C, 0x0B, 0x7C, 0x40, - 0x7D, 0x4F, 0x1B, 0x3C, 0xA8, 0x96, 0xE9, 0x0B, 0x21, 0x2F, 0x67, 0x06, - 0xD8, 0x0A, 0x7C, 0x49, 0xA7, 0x5F, 0x1B, 0x4C, 0x05, 0x6E, 0x2E, 0x30, - 0x98, 0x12, 0x2B, 0x82, 0x2B, 0x90, 0x10, 0xDF, 0xD5, 0x96, 0xC7, 0xFF, - 0x41, 0xA7, 0xE6, 0xB0, 0xC9, 0x3D, 0x19, 0xC9, 0x1B, 0x2C, 0xBF, 0xEF, - 0x0D, 0xC0, 0xAB, 0xCA, 0x85, 0xE0, 0x34, 0xF0, 0x0E, 0xF5, 0x7D, 0xBD, - 0xF0, 0xBC, 0xFA, 0xC7, 0x9B, 0x88, 0x16, 0x0C, 0xA2, 0xF4, 0xB8, 0x0B, - 0x91, 0xFB, 0x78, 0x61, 0x82, 0x0F, 0xE3, 0x2C, 0xF6, 0x04, 0x4F, 0xF1, - 0x31, 0x7A, 0x1F, 0x45, 0xD2, 0x71, 0x51, 0x94, 0xCB, 0xF4, 0xEB, 0x34, - 0xFD, 0x43, 0xCB, 0x40, 0xCA, 0x8D, 0x48, 0xC4, 0xAC, 0x22, 0xE9, 0x04, - 0xCF, 0x07, 0x9A, 0x2D, 0x8E, 0x5B, 0x45, 0xC4, 0xD3, 0x70, 0x6A, 0x55, - 0x7F, 0x57, 0x0D, 0x3F, 0x2F, 0xB4, 0x00, 0xD7, 0x86, 0xF1, 0xB0, 0x06, - 0x49, 0x70, 0x35, 0x22, 0xB9, 0xB1, 0x71, 0x8B, 0x1E, 0x8E, 0xE0, 0xD4, - 0x7C, 0x32, 0x3C, 0x6B, 0x39, 0x8A, 0x2B, 0x91, 0xF4, 0xA7, 0x49, 0x32, - 0xC1, 0xB3, 0x81, 0xC9, 0x16, 0xC7, 0xAD, 0x47, 0x62, 0xCB, 0x7D, 0x31, - 0x20, 0xB8, 0x0B, 0x91, 0xF0, 0xD8, 0x64, 0x90, 0x5A, 0x81, 0x71, 0x49, - 0x26, 0x78, 0x0E, 0x92, 0xB5, 0xF1, 0xC2, 0x13, 0xC0, 0x4E, 0xE2, 0x83, - 0x8D, 0x48, 0xF8, 0xD4, 0x0B, 0x63, 0x10, 0xC1, 0x60, 0x62, 0x09, 0x9E, - 0x84, 0xB7, 0xF4, 0xE6, 0x00, 0x92, 0x21, 0xEA, 0x89, 0x11, 0xC1, 0x9D, - 0xD8, 0x69, 0xB3, 0xEA, 0x10, 0xF9, 0x51, 0x22, 0x09, 0x1E, 0xAE, 0x4E, - 0xBF, 0xD7, 0xFA, 0xBB, 0x5A, 0x47, 0x44, 0xDC, 0xB0, 0x0E, 0x51, 0x5C, - 0x7A, 0x59, 0xD3, 0x89, 0x9D, 0xA2, 0xA7, 0x5A, 0x3A, 0xFB, 0x5B, 0x90, - 0x0C, 0x51, 0xDC, 0xB0, 0x1D, 0x11, 0xE1, 0x79, 0x11, 0x3C, 0xC9, 0xD2, - 0x8B, 0x88, 0x1D, 0xC1, 0x63, 0x90, 0xAA, 0x04, 0xAF, 0x00, 0xC2, 0x26, - 0x44, 0x81, 0x11, 0x37, 0x74, 0x5A, 0x1A, 0x5A, 0x13, 0x80, 0xB3, 0x93, - 0x48, 0x70, 0xBD, 0x85, 0x93, 0xFF, 0x22, 0x92, 0x47, 0x8D, 0x23, 0x8C, - 0xCE, 0x3E, 0x5E, 0x0F, 0x67, 0xAD, 0xA5, 0xA1, 0x19, 0x3B, 0x82, 0xEB, - 0x2C, 0x3E, 0x6B, 0x3F, 0x22, 0x92, 0x8B, 0x2B, 0xB6, 0xE3, 0x9D, 0xFB, - 0xCD, 0x69, 0xC1, 0x12, 0x47, 0xF0, 0x30, 0x8B, 0xCF, 0xEA, 0x8C, 0x99, - 0xF5, 0x7C, 0x3C, 0x8E, 0x20, 0xD1, 0x2D, 0x2F, 0x82, 0xAB, 0x92, 0x48, - 0xB0, 0xCD, 0x97, 0xEA, 0x25, 0x86, 0xD5, 0x7B, 0x83, 0xD0, 0x87, 0x88, - 0x03, 0xBC, 0x30, 0x24, 0x89, 0x04, 0x1B, 0xBC, 0xC3, 0x74, 0x71, 0x6F, - 0x27, 0x91, 0xB6, 0xFC, 0x0E, 0xA9, 0x24, 0x12, 0xDC, 0x6B, 0x41, 0x70, - 0x25, 0xF1, 0xEE, 0x38, 0x90, 0xB2, 0xB8, 0xFE, 0x6C, 0xD0, 0xCB, 0x50, - 0x50, 0x04, 0x77, 0xE0, 0x2D, 0x6B, 0xAD, 0x0F, 0xDA, 0x00, 0x29, 0x32, - 0x9A, 0x2D, 0x7D, 0xDC, 0x81, 0x24, 0x12, 0xDC, 0x65, 0x31, 0x82, 0xC7, - 0x22, 0xA2, 0xF3, 0xB8, 0x62, 0x32, 0xDE, 0xDA, 0xEE, 0x34, 0x01, 0xA7, - 0x0C, 0x83, 0x24, 0xD8, 0xCB, 0x0F, 0x6E, 0x44, 0x04, 0x01, 0x71, 0x85, - 0x4D, 0xFD, 0x72, 0x07, 0x01, 0x27, 0x52, 0x82, 0x22, 0x78, 0x0B, 0x52, - 0x21, 0xEF, 0xB5, 0x06, 0x9F, 0x19, 0x53, 0x63, 0x6B, 0x04, 0x12, 0x86, - 0xF4, 0x32, 0x34, 0xB7, 0x03, 0xDB, 0x92, 0x48, 0xF0, 0x36, 0xA4, 0xC4, - 0xC4, 0x0B, 0xE7, 0x91, 0x7F, 0x85, 0x5F, 0x98, 0x18, 0x0F, 0x5C, 0x64, - 0x71, 0xDC, 0x2E, 0x02, 0x16, 0xC2, 0x07, 0x45, 0xF0, 0x31, 0xFD, 0x72, - 0x5E, 0x78, 0xAD, 0xC5, 0x48, 0x88, 0x22, 0x5A, 0xF1, 0x2E, 0xBF, 0x31, - 0x48, 0xBC, 0x3A, 0x93, 0x44, 0x82, 0x0D, 0x12, 0x67, 0xEE, 0xF5, 0x38, - 0x6E, 0x38, 0xF0, 0x86, 0x98, 0x91, 0x5B, 0x83, 0x94, 0xBD, 0x7A, 0xD9, - 0x18, 0x9D, 0xC0, 0x9F, 0xC3, 0x70, 0xCE, 0x83, 0xC2, 0x53, 0xD8, 0x89, - 0xE8, 0xAE, 0x27, 0x44, 0x1D, 0x71, 0x1E, 0x98, 0x01, 0x5C, 0x6E, 0x71, - 0xDC, 0x51, 0x44, 0x6E, 0x9B, 0x58, 0x82, 0xDB, 0xB0, 0x53, 0x20, 0x4E, - 0x41, 0x5A, 0x38, 0xC4, 0xC1, 0xD8, 0xAA, 0x42, 0x94, 0xA2, 0xA3, 0x2C, - 0x8E, 0x5D, 0x45, 0x08, 0x85, 0xE1, 0x41, 0xDE, 0xC4, 0x2E, 0xEC, 0x15, - 0x88, 0xEF, 0x45, 0x44, 0x02, 0x51, 0xC7, 0x4C, 0x44, 0xD4, 0x6E, 0x73, - 0x1F, 0x1F, 0x23, 0x84, 0x58, 0x7B, 0xD0, 0xA3, 0xE4, 0xB7, 0xD8, 0xA5, - 0x04, 0x5B, 0x91, 0xFA, 0x5A, 0x08, 0x41, 0x2C, 0x6E, 0x89, 0x6A, 0xA4, - 0x1B, 0xD0, 0x59, 0x16, 0xC7, 0x6E, 0xC4, 0x5B, 0xF1, 0x91, 0x08, 0x82, - 0xB7, 0x22, 0xAA, 0x49, 0x9B, 0x51, 0x7C, 0x93, 0x4E, 0x7F, 0x51, 0x6B, - 0xF1, 0x9B, 0xCB, 0x06, 0xDD, 0xEA, 0x63, 0x29, 0xF9, 0x09, 0x21, 0x35, - 0x67, 0x09, 0x9A, 0xE0, 0x63, 0xC0, 0xF7, 0x2C, 0x47, 0xF1, 0x18, 0xE0, - 0x33, 0x48, 0x53, 0x94, 0x28, 0xA1, 0x1F, 0x98, 0x07, 0x7C, 0x0C, 0x69, - 0xAB, 0x68, 0x33, 0x7A, 0x7F, 0x4E, 0x48, 0x55, 0x1A, 0x41, 0x13, 0x6C, - 0x80, 0x35, 0x96, 0xA3, 0x38, 0x85, 0xC8, 0x4C, 0x17, 0x23, 0x5A, 0xA6, - 0x28, 0xAD, 0xBB, 0xB7, 0x23, 0xE5, 0x28, 0x36, 0x58, 0x81, 0xF4, 0xA1, - 0x36, 0xE5, 0x40, 0x70, 0xCE, 0x1F, 0x5C, 0x66, 0x19, 0xF8, 0xA8, 0x50, - 0xBF, 0xF8, 0x73, 0x48, 0x18, 0x33, 0x6C, 0x4C, 0x47, 0x2A, 0x1E, 0x67, - 0x5A, 0xDA, 0x06, 0x1B, 0x91, 0x66, 0x31, 0xDD, 0x61, 0x5D, 0x70, 0x58, - 0xAE, 0xC8, 0x1A, 0xE0, 0x01, 0xCB, 0x63, 0x6B, 0x75, 0x2D, 0xFE, 0x2A, - 0xD2, 0xAC, 0x2C, 0x2C, 0x5C, 0x08, 0x7C, 0x03, 0xB8, 0x04, 0xBB, 0xB4, - 0x66, 0x2F, 0xD2, 0xBE, 0xE1, 0xB9, 0x30, 0x9F, 0xC8, 0xB0, 0x08, 0xEE, - 0x45, 0x2A, 0xF3, 0x7E, 0x69, 0x79, 0x7C, 0x03, 0x12, 0x2D, 0xBA, 0xCF, - 0x32, 0xA8, 0x50, 0x6C, 0x2C, 0x00, 0xBE, 0xA6, 0x24, 0xDB, 0x6A, 0xAA, - 0x96, 0xEB, 0xF4, 0xDC, 0x1B, 0x26, 0xC1, 0x61, 0x76, 0xD9, 0x49, 0xEB, - 0xF4, 0xFB, 0x00, 0xF6, 0x79, 0xE0, 0x7E, 0xA4, 0x47, 0xD6, 0x32, 0xBD, - 0x81, 0xA5, 0x0E, 0x1C, 0x8C, 0x47, 0x9A, 0xAE, 0xDC, 0xAC, 0x76, 0x80, - 0xAD, 0xCB, 0xB6, 0x1A, 0xF8, 0x08, 0x21, 0x44, 0xAE, 0xA2, 0x44, 0x30, - 0x48, 0x1C, 0x77, 0xA1, 0x8E, 0x4C, 0xDB, 0x2E, 0x77, 0x59, 0xB5, 0xC2, - 0x9F, 0x06, 0x1E, 0x02, 0xFE, 0x82, 0x77, 0x2A, 0xD2, 0x2F, 0xC6, 0xE8, - 0x4C, 0x71, 0xAB, 0xAE, 0xB7, 0x4D, 0xD8, 0x6B, 0xA9, 0xF6, 0x22, 0x81, - 0x9A, 0x27, 0x89, 0x40, 0x85, 0x64, 0x14, 0x5A, 0x19, 0x0E, 0x57, 0x97, - 0x63, 0xB1, 0xCF, 0xF3, 0x7A, 0x90, 0x36, 0x0F, 0xFF, 0x04, 0x7E, 0xA6, - 0x81, 0x84, 0xAD, 0x05, 0x5E, 0x4B, 0x2B, 0x92, 0xB2, 0x7C, 0x13, 0x92, - 0xD9, 0x1A, 0x8B, 0x3F, 0x15, 0x64, 0xBF, 0x8E, 0xDC, 0x47, 0x89, 0x48, - 0xF1, 0x7A, 0x54, 0x9A, 0x91, 0x8E, 0x46, 0x9A, 0x78, 0x7E, 0x30, 0x0F, - 0xB7, 0xAB, 0x4B, 0x47, 0xF4, 0x66, 0xA4, 0x32, 0x71, 0x27, 0x52, 0x98, - 0xBD, 0xC3, 0xC2, 0x7A, 0xAD, 0x53, 0x52, 0xA7, 0x20, 0x69, 0xCA, 0xAB, - 0x90, 0x02, 0xB1, 0x51, 0xBA, 0xD6, 0xFA, 0x55, 0x40, 0xDE, 0x86, 0xF4, - 0xF2, 0x8A, 0xCC, 0x96, 0x3C, 0x51, 0x21, 0x38, 0xA5, 0x6B, 0xDC, 0x22, - 0xE0, 0x43, 0x79, 0xFA, 0xD7, 0xFD, 0x7A, 0x63, 0xBB, 0x95, 0xEC, 0x5C, - 0xD7, 0xD9, 0xBE, 0x53, 0x1C, 0x9F, 0x6B, 0x3E, 0x3A, 0x4D, 0x5D, 0xB0, - 0x3A, 0x44, 0x36, 0x94, 0xCE, 0x83, 0xD8, 0x2C, 0xF0, 0x45, 0xB5, 0x9A, - 0x0F, 0x44, 0x29, 0x2A, 0x13, 0xA5, 0x7E, 0xD1, 0x29, 0x44, 0x95, 0x78, - 0xAD, 0x92, 0x3C, 0x33, 0x4F, 0x2B, 0x3F, 0x47, 0x76, 0x0F, 0x12, 0xE6, - 0xCC, 0x9E, 0xC6, 0xC8, 0xAB, 0x54, 0xA2, 0x2B, 0xC8, 0x4F, 0xAF, 0x3C, - 0x00, 0xFC, 0x0D, 0xB8, 0x1F, 0x49, 0x87, 0x1E, 0x22, 0x62, 0x88, 0x92, - 0x0E, 0x39, 0xD7, 0x3D, 0xFD, 0x80, 0x92, 0x93, 0x2A, 0xE0, 0x41, 0x19, - 0x4A, 0x30, 0x12, 0xDC, 0x14, 0x12, 0x7E, 0x7D, 0x31, 0x8A, 0xE4, 0x46, - 0x69, 0x04, 0xB7, 0x20, 0xF1, 0xDD, 0x59, 0xBA, 0x16, 0xB6, 0x10, 0x70, - 0x15, 0x5E, 0x01, 0xD8, 0xAF, 0xCB, 0xC1, 0x36, 0x64, 0xF3, 0xAC, 0x5F, - 0x10, 0xA1, 0xAE, 0xEF, 0x61, 0x13, 0x3C, 0x47, 0xA7, 0xE4, 0xCB, 0x91, - 0xB4, 0x5B, 0x93, 0x5A, 0xAD, 0x69, 0x02, 0x2E, 0xF1, 0x28, 0x00, 0xB9, - 0xED, 0xF1, 0xFA, 0x91, 0xE2, 0xF5, 0x2D, 0x48, 0x5A, 0x74, 0x25, 0xD2, - 0x50, 0xA6, 0x2C, 0x09, 0x9E, 0xA6, 0x01, 0x84, 0x2B, 0xD5, 0x15, 0x69, - 0x8C, 0x19, 0xA9, 0x5E, 0xEB, 0x7F, 0xBB, 0x12, 0xFD, 0x1B, 0x0D, 0xE4, - 0xEC, 0x29, 0x17, 0x82, 0x1B, 0x94, 0xD8, 0x85, 0x48, 0x25, 0x40, 0x18, - 0xBB, 0x98, 0x05, 0x85, 0x01, 0x44, 0x87, 0xB5, 0x01, 0x78, 0x04, 0x69, - 0xEC, 0xD6, 0x93, 0x64, 0x82, 0x2F, 0x02, 0x3E, 0x89, 0xF4, 0xCB, 0x6A, - 0x22, 0xBA, 0x4A, 0x8D, 0x62, 0x23, 0xA3, 0xEB, 0xF4, 0xAF, 0x91, 0x78, - 0xF6, 0xBA, 0xA4, 0x11, 0x3C, 0x04, 0x78, 0x37, 0xD2, 0x00, 0xBC, 0x85, - 0x78, 0x17, 0x98, 0x15, 0x82, 0x4E, 0x44, 0x78, 0xF8, 0x65, 0x24, 0x85, - 0x98, 0xB3, 0xC2, 0x4D, 0x9C, 0x09, 0x6E, 0x46, 0x54, 0x19, 0x37, 0x22, - 0xD1, 0xA1, 0x62, 0x4D, 0xC7, 0xFD, 0x1A, 0xD0, 0x18, 0x1C, 0xC4, 0xC8, - 0x6D, 0x80, 0x55, 0x45, 0x7E, 0x5B, 0xF3, 0xF4, 0xEA, 0xAC, 0x52, 0x7B, - 0x9C, 0xBB, 0x55, 0x4D, 0xF1, 0x8A, 0xB6, 0x07, 0x74, 0x3D, 0xBE, 0x1F, - 0x69, 0x70, 0xDE, 0x1D, 0xE7, 0x11, 0x3C, 0x01, 0xF8, 0x3C, 0xB2, 0x73, - 0x49, 0x43, 0x81, 0xEF, 0xB5, 0x67, 0x90, 0xAF, 0xB9, 0x1A, 0x91, 0xDF, - 0x1E, 0xD6, 0x51, 0x91, 0x1D, 0xE4, 0xAE, 0xF4, 0xAB, 0xC1, 0x56, 0x8F, - 0x7D, 0x15, 0x5F, 0x5A, 0xDF, 0xA7, 0x5D, 0x89, 0x6C, 0x1E, 0xF4, 0xEF, - 0x0D, 0xBA, 0x9C, 0x4C, 0x46, 0x62, 0xD3, 0x4D, 0x48, 0x22, 0x62, 0x64, - 0x81, 0x86, 0xD8, 0x61, 0x44, 0x61, 0x7A, 0x07, 0x25, 0x6E, 0x1B, 0x55, - 0x2A, 0x82, 0x27, 0x20, 0xED, 0xEF, 0xE7, 0x21, 0x21, 0xC0, 0x7C, 0x70, - 0x48, 0xFD, 0xCA, 0xAD, 0x48, 0x63, 0xF0, 0x2D, 0x3A, 0x4A, 0x8F, 0xE8, - 0x88, 0xCB, 0x45, 0xA9, 0xCC, 0xA0, 0xB5, 0xCE, 0xE8, 0x28, 0x4C, 0xFB, - 0x98, 0xFA, 0x52, 0xFA, 0x3E, 0x19, 0xFD, 0xBD, 0x62, 0xD0, 0xBF, 0xA7, - 0xF5, 0xEF, 0x6A, 0x25, 0x7B, 0x18, 0x22, 0xE7, 0x9D, 0xAB, 0xCB, 0xCD, - 0x9C, 0x02, 0x1E, 0xDE, 0x0E, 0xE0, 0x07, 0xC0, 0xA7, 0x29, 0x7E, 0x36, - 0xAC, 0xA4, 0x04, 0x8F, 0x43, 0x3A, 0xA2, 0xBF, 0x99, 0xFC, 0x5A, 0xD9, - 0xB7, 0x21, 0x42, 0x80, 0x35, 0x48, 0xA6, 0xA8, 0x53, 0x6F, 0x46, 0x1F, - 0x76, 0xAD, 0x20, 0x4A, 0x76, 0xAF, 0x78, 0xB9, 0x89, 0x4A, 0xBD, 0xCE, - 0x14, 0xB3, 0x91, 0x8D, 0x45, 0xAE, 0xC1, 0x5E, 0xA3, 0x75, 0x3C, 0xC9, - 0xDF, 0xD7, 0x65, 0xEC, 0x70, 0x1C, 0x08, 0x1E, 0x81, 0x04, 0xDC, 0xDF, - 0x9A, 0x07, 0xB9, 0xEB, 0x80, 0x1F, 0xEB, 0x68, 0xDD, 0xA4, 0x2E, 0x45, - 0x0F, 0xD1, 0xDD, 0x6D, 0x3B, 0xB7, 0x5B, 0x5A, 0x35, 0x22, 0x0E, 0xBC, - 0x42, 0x6D, 0x0D, 0xBF, 0x44, 0x77, 0x02, 0xDF, 0xD6, 0x91, 0xDC, 0x17, - 0x65, 0x82, 0xAB, 0xF4, 0x22, 0x17, 0xF9, 0x24, 0xF7, 0x20, 0x2F, 0xCB, - 0x5B, 0xD6, 0x22, 0xB1, 0xDD, 0xB8, 0x75, 0xBB, 0x1B, 0xA2, 0x4B, 0xD1, - 0x2C, 0x25, 0xF9, 0x26, 0xFC, 0xB5, 0x4B, 0x3A, 0xAC, 0x2E, 0xE4, 0x77, - 0xA2, 0x4C, 0xF0, 0x3C, 0x44, 0x4A, 0xD3, 0xEC, 0x73, 0xD4, 0xDE, 0x85, - 0xE4, 0x71, 0x0F, 0x12, 0xEF, 0x36, 0x4A, 0xB9, 0x87, 0x7C, 0xA4, 0x4E, - 0xD9, 0x9F, 0xC0, 0x5F, 0x29, 0xEC, 0x26, 0xE0, 0x3D, 0x88, 0x42, 0xA5, - 0x78, 0x30, 0xC6, 0x14, 0xE3, 0xD5, 0x62, 0x8C, 0x59, 0x6B, 0xFC, 0xE1, - 0x21, 0x63, 0xCC, 0x0C, 0x63, 0x4C, 0x8D, 0x31, 0x26, 0x55, 0xA4, 0xEB, - 0x88, 0xC2, 0x2B, 0x65, 0x8C, 0xA9, 0x33, 0xC6, 0x5C, 0x60, 0x8C, 0x59, - 0xE9, 0xE3, 0x7E, 0x0C, 0x18, 0x63, 0x1E, 0x37, 0xC6, 0x8C, 0x2B, 0xE6, - 0xF5, 0x14, 0xC3, 0x2F, 0x1D, 0xA6, 0x4F, 0x5E, 0xAB, 0x0F, 0x5F, 0x70, - 0x89, 0xBA, 0x08, 0x6D, 0xEA, 0x0B, 0x1A, 0x92, 0x03, 0xA3, 0xCB, 0xCC, - 0x1A, 0x44, 0x8A, 0xF4, 0x88, 0xE5, 0x79, 0x15, 0x48, 0x6C, 0x7E, 0x5E, - 0xD4, 0xA6, 0xE8, 0x8B, 0x91, 0x14, 0x59, 0x93, 0x65, 0xD8, 0xEE, 0x0B, - 0xBA, 0xD6, 0xEC, 0x4E, 0x18, 0xB1, 0xA7, 0xF2, 0xB1, 0xC7, 0x23, 0x7A, - 0xB3, 0x5B, 0x2C, 0xCF, 0xF9, 0xAF, 0x1A, 0x6C, 0x5B, 0x8B, 0x75, 0x01, - 0x85, 0xA0, 0x1A, 0x51, 0x5F, 0x34, 0x59, 0x1E, 0x7F, 0x2F, 0xA2, 0x59, - 0x2A, 0x07, 0x72, 0x51, 0xFF, 0x7A, 0x27, 0x52, 0xEA, 0xB2, 0xC2, 0xF2, - 0x9C, 0xF1, 0xC8, 0x96, 0x78, 0xA9, 0x28, 0x10, 0x7C, 0x09, 0x70, 0x99, - 0xE5, 0xB1, 0x4F, 0x20, 0xBB, 0x98, 0xED, 0x2B, 0x13, 0x72, 0x07, 0x93, - 0xBC, 0x0B, 0xF8, 0x14, 0xF0, 0x8C, 0x25, 0x27, 0x0B, 0x28, 0x52, 0x97, - 0x83, 0x42, 0x09, 0xBE, 0xCE, 0xD2, 0x6A, 0xDE, 0xA9, 0xD3, 0xD4, 0xEE, - 0x32, 0x23, 0x77, 0xF0, 0xBA, 0xBC, 0x4D, 0x6D, 0x0F, 0x1B, 0xC5, 0xE5, - 0x59, 0x1A, 0x4B, 0x08, 0x95, 0xE0, 0x16, 0x1D, 0xC1, 0x36, 0xEF, 0xF1, - 0x2D, 0xA4, 0x10, 0x2B, 0x4B, 0xF9, 0x22, 0x8B, 0xA4, 0x0C, 0x97, 0x5B, - 0x1A, 0x5C, 0x97, 0x6A, 0x20, 0x25, 0x34, 0x82, 0xCF, 0xC5, 0xAE, 0x18, - 0x6C, 0x15, 0x22, 0x4C, 0xEF, 0xC1, 0xE1, 0x18, 0xB2, 0x9B, 0xAA, 0x8D, - 0x01, 0x35, 0x07, 0xD9, 0x3C, 0x3B, 0x34, 0x82, 0x5B, 0xF1, 0x56, 0x65, - 0x66, 0x90, 0xDC, 0xE7, 0x16, 0xC7, 0xED, 0x4B, 0xC8, 0x15, 0x84, 0xDB, - 0xB8, 0x9F, 0x67, 0x87, 0x45, 0x70, 0xA3, 0x9A, 0xF2, 0x5E, 0xE7, 0xB7, - 0x21, 0xB1, 0xE5, 0x01, 0xC7, 0xEB, 0x4B, 0xE8, 0x45, 0x36, 0xD2, 0xDA, - 0x6B, 0xC1, 0xCD, 0x39, 0x61, 0x11, 0x3C, 0x12, 0xBB, 0xC6, 0xA1, 0x9B, - 0x91, 0x12, 0x12, 0x87, 0xFF, 0xC7, 0xBF, 0xB0, 0xDB, 0x67, 0xE9, 0x52, - 0xEC, 0x37, 0xD2, 0x2E, 0x2A, 0xC1, 0xCD, 0x78, 0xAB, 0x26, 0x06, 0x90, - 0x0A, 0xC0, 0x76, 0xC7, 0xE7, 0x09, 0x68, 0xC7, 0x6E, 0x83, 0xE9, 0xD1, - 0x14, 0x28, 0x96, 0xC8, 0x97, 0xE0, 0xD1, 0x78, 0x8B, 0xE6, 0x0E, 0x21, - 0xBA, 0xE0, 0x8C, 0xE3, 0xF3, 0x04, 0x74, 0x23, 0x89, 0x16, 0xAF, 0xF4, - 0x60, 0xA5, 0xAE, 0xC5, 0x81, 0x13, 0x3C, 0xDC, 0xE2, 0xDC, 0xA3, 0xC4, - 0x73, 0x17, 0xB3, 0xA0, 0xB0, 0xCF, 0xC2, 0x27, 0x4E, 0x87, 0x45, 0x70, - 0x2D, 0xDE, 0xA1, 0xB4, 0x7E, 0xE2, 0xB1, 0x45, 0x6C, 0x98, 0x2E, 0x93, - 0xD7, 0xFD, 0x49, 0x91, 0x9F, 0x2A, 0xA6, 0x60, 0x82, 0xAB, 0x2D, 0x09, - 0x76, 0xD6, 0xF3, 0xE9, 0xEF, 0x8F, 0x4D, 0xE0, 0xC7, 0x84, 0x41, 0xB0, - 0x0D, 0x32, 0x94, 0x77, 0xE4, 0xCA, 0x0B, 0x7D, 0x04, 0x10, 0xB6, 0x2D, - 0x65, 0xF9, 0x68, 0x13, 0x92, 0xDB, 0x9C, 0x41, 0xC0, 0xBB, 0x7D, 0xC5, - 0x84, 0xDC, 0xE9, 0xE4, 0xAF, 0x38, 0x8D, 0x04, 0xC1, 0xE3, 0x80, 0x3B, - 0x29, 0xCF, 0xE4, 0x82, 0x0D, 0x2A, 0x08, 0xA0, 0xCA, 0xA3, 0xB2, 0xC4, - 0x5F, 0xA0, 0xC2, 0xF1, 0x18, 0x2E, 0xD2, 0xEE, 0x16, 0x38, 0x82, 0x1D, - 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0xB0, 0x43, 0x74, 0x08, 0xCE, - 0x15, 0x62, 0x39, 0x94, 0x16, 0x05, 0xDF, 0xE7, 0x7C, 0xDD, 0xA4, 0x23, - 0x48, 0x3D, 0x4D, 0x35, 0x2E, 0x5A, 0x55, 0xCA, 0xC1, 0xD7, 0x41, 0x81, - 0x45, 0xE2, 0x51, 0xEA, 0x74, 0xE7, 0xE0, 0xD6, 0x60, 0x07, 0x47, 0xB0, - 0x83, 0x23, 0xD8, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, - 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0xD9, 0xE2, - 0x7F, 0x03, 0x00, 0xFF, 0x90, 0x57, 0xA9, 0xA4, 0xD4, 0xE2, 0xD9, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static unsigned char* config_icon = raw::config; -} \ No newline at end of file diff --git a/gmod/icons/legit.hpp b/gmod/icons/legit.hpp deleted file mode 100644 index c5db680..0000000 --- a/gmod/icons/legit.hpp +++ /dev/null @@ -1,1798 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\legit.png (4/1/2018 9:59:16 PM) - StartOffset: 00000000, EndOffset: 000053B8, Length: 000053B9 */ - -namespace icons { -constexpr static size_t legit_size = 21433; -namespace raw { -static unsigned char legit[21433] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, - 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, - 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x32, - 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, 0x39, 0x32, - 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, 0x2D, 0x35, - 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, 0x33, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x64, 0x63, 0x38, 0x34, - 0x38, 0x37, 0x30, 0x30, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x61, - 0x32, 0x66, 0x61, 0x64, 0x37, 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, - 0x2D, 0x39, 0x66, 0x34, 0x30, 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, - 0x37, 0x35, 0x61, 0x36, 0x31, 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, 0x32, 0x66, 0x61, 0x64, 0x37, - 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, 0x2D, 0x39, 0x66, 0x34, 0x30, - 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, 0x37, 0x35, 0x61, 0x36, 0x31, - 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, - 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x32, 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, - 0x39, 0x32, 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, - 0x2D, 0x35, 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, - 0x33, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x78, 0xE1, 0xB7, 0x9F, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0D, 0xDB, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x70, 0xD5, 0xD5, 0x15, 0xC7, - 0xBF, 0x2F, 0x21, 0x46, 0x88, 0x24, 0x84, 0x04, 0x15, 0xC4, 0x32, 0xE0, - 0x82, 0x88, 0x8A, 0x80, 0x48, 0x47, 0xAA, 0x8E, 0xD6, 0x05, 0x5C, 0xAA, - 0xA2, 0xD6, 0xB1, 0x08, 0x6A, 0xD5, 0x56, 0xB4, 0x75, 0x5F, 0x6A, 0xDD, - 0x82, 0x6B, 0xC5, 0xE2, 0x86, 0xB4, 0xD6, 0xDA, 0xD6, 0x8D, 0x8A, 0x75, - 0x5C, 0xC6, 0x1D, 0xB4, 0x3A, 0x50, 0xB7, 0xBA, 0x55, 0x45, 0x44, 0x91, - 0x28, 0x22, 0xAB, 0x52, 0x76, 0x49, 0x42, 0x96, 0x6F, 0xFF, 0xB8, 0xDF, - 0x37, 0xF3, 0x4C, 0x21, 0xF9, 0x9D, 0x9B, 0xDF, 0x7B, 0xEF, 0x17, 0x72, - 0xCF, 0xCC, 0x6F, 0x70, 0xCC, 0xFB, 0xBD, 0x7B, 0xDF, 0xFD, 0xFC, 0xCE, - 0xB9, 0xE7, 0xDE, 0x7B, 0xCE, 0xF9, 0xA5, 0x48, 0x22, 0xC8, 0x96, 0x2B, - 0x05, 0x61, 0x08, 0x02, 0xE0, 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, - 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, - 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, - 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, 0x20, 0x01, 0x70, 0x90, 0xF6, - 0x27, 0x9D, 0x12, 0xD2, 0x8F, 0x42, 0x00, 0x83, 0x00, 0x1C, 0x09, 0x60, - 0x00, 0x80, 0x62, 0x00, 0x5F, 0x01, 0x78, 0x0B, 0xC0, 0x8B, 0x00, 0xBE, - 0x03, 0xD0, 0x98, 0x60, 0x25, 0xD9, 0x19, 0xC0, 0xF1, 0x00, 0x06, 0x02, - 0xD8, 0x06, 0xC0, 0x22, 0x00, 0xEF, 0x02, 0x78, 0x0A, 0xC0, 0xEA, 0x8E, - 0x0E, 0xB8, 0x04, 0xC0, 0xD1, 0x00, 0x2E, 0x05, 0x30, 0xA4, 0xD9, 0xDF, - 0x96, 0x01, 0x98, 0x0A, 0xE0, 0x3E, 0x00, 0x9F, 0x01, 0x48, 0x5A, 0x7C, - 0x51, 0x31, 0x80, 0x91, 0xEA, 0xFB, 0x88, 0x66, 0x7F, 0x5B, 0x07, 0xA0, - 0x3F, 0x80, 0x5B, 0x01, 0xAC, 0xCC, 0x5B, 0x0F, 0x49, 0xE6, 0xFB, 0xDA, - 0x9D, 0xE4, 0x7B, 0xDC, 0xBC, 0x6C, 0x20, 0x79, 0x3B, 0xC9, 0x01, 0x24, - 0x53, 0x09, 0xE8, 0x6F, 0xFA, 0xEA, 0x42, 0xF2, 0xF8, 0x56, 0xFA, 0x5E, - 0x4F, 0xF2, 0x12, 0x92, 0x9D, 0xF2, 0xD5, 0xCF, 0x24, 0xCC, 0xC1, 0x7B, - 0x00, 0xD8, 0xBD, 0x85, 0xBF, 0x77, 0x06, 0x70, 0x2E, 0x80, 0x73, 0xA4, - 0x11, 0xA9, 0x04, 0xF4, 0xB9, 0x0B, 0x80, 0x23, 0x00, 0x5C, 0xB1, 0x09, - 0xAB, 0xD3, 0xDC, 0x42, 0x8E, 0x94, 0x95, 0xEA, 0xB0, 0x4E, 0x56, 0x5F, - 0x00, 0x5B, 0xB7, 0xF2, 0x99, 0x22, 0x00, 0xE3, 0x75, 0xED, 0x92, 0x10, - 0xB3, 0x7C, 0x25, 0x80, 0xA1, 0x11, 0x3E, 0xBF, 0x03, 0x80, 0xD2, 0x8E, - 0x0C, 0x38, 0xAA, 0xF3, 0x54, 0x28, 0xC0, 0xE7, 0x49, 0x93, 0xF3, 0x21, - 0x5B, 0x4B, 0x73, 0xAF, 0x06, 0xB0, 0x77, 0xC4, 0x7B, 0x9A, 0xF2, 0xE9, - 0x3B, 0x24, 0x01, 0xF0, 0xE7, 0x00, 0xD6, 0x47, 0xFC, 0x6C, 0x11, 0x80, - 0x33, 0x01, 0x5C, 0x98, 0x07, 0xC8, 0xC5, 0x00, 0x46, 0x01, 0xA8, 0x32, - 0xC0, 0x05, 0x80, 0x2F, 0x01, 0xAC, 0xED, 0xC8, 0x80, 0x3F, 0x00, 0xF0, - 0x86, 0xE1, 0x29, 0x2F, 0x06, 0x70, 0x1A, 0x80, 0x8B, 0x00, 0xEC, 0x96, - 0xA3, 0x39, 0x39, 0x6D, 0x96, 0x27, 0x00, 0xD8, 0xCB, 0x70, 0xDF, 0x72, - 0x00, 0x33, 0x00, 0xD4, 0x75, 0x64, 0xC0, 0x5F, 0x03, 0xB8, 0x01, 0xC0, - 0x6C, 0x83, 0xB9, 0x2E, 0x06, 0x70, 0x86, 0x96, 0x27, 0x03, 0x65, 0xBE, - 0xB3, 0x25, 0x5B, 0x01, 0xF8, 0x89, 0xFA, 0xB8, 0xA7, 0xE1, 0xBE, 0xD5, - 0x00, 0xEE, 0x01, 0x30, 0x0D, 0x40, 0x7D, 0x47, 0x5E, 0x26, 0xA5, 0xAF, - 0xFD, 0x49, 0xBE, 0x4F, 0xB2, 0x81, 0xD1, 0xA5, 0x9E, 0xE4, 0xBD, 0x24, - 0x07, 0x91, 0x2C, 0xCC, 0x42, 0x9F, 0x8A, 0x49, 0x9E, 0x48, 0xF2, 0x23, - 0xDA, 0x64, 0x25, 0xC9, 0xEB, 0x49, 0x6E, 0x9B, 0xEF, 0x71, 0x4D, 0x12, - 0xE0, 0x34, 0xE4, 0xF7, 0x3C, 0x20, 0xFF, 0x99, 0xE4, 0xE0, 0x98, 0x21, - 0x77, 0x26, 0x79, 0x12, 0xC9, 0x8F, 0x8D, 0x70, 0x57, 0x90, 0x9C, 0x40, - 0xB2, 0x22, 0x09, 0x63, 0x9A, 0x34, 0xC0, 0x20, 0xB9, 0x1F, 0xC9, 0x77, - 0x8D, 0x90, 0x1B, 0x05, 0x79, 0x08, 0xC9, 0xA2, 0x18, 0xFA, 0x50, 0x42, - 0x72, 0x0C, 0xC9, 0xB9, 0x46, 0xB8, 0xDF, 0x08, 0x6E, 0x59, 0x52, 0xC6, - 0x33, 0x5B, 0x5F, 0x9C, 0x22, 0x59, 0xA0, 0x2B, 0x57, 0x90, 0x99, 0x01, - 0xB9, 0x2D, 0x3B, 0x47, 0xDB, 0x90, 0x1C, 0x47, 0xF2, 0x13, 0x63, 0xDB, - 0xCB, 0x48, 0x5E, 0x4B, 0xB2, 0x7B, 0x92, 0x14, 0x26, 0x15, 0x73, 0xFA, - 0x68, 0xA1, 0x36, 0xDB, 0xCB, 0xB5, 0xDB, 0x03, 0x2D, 0x81, 0x56, 0xE9, - 0xC0, 0xA0, 0xC9, 0xF0, 0x5D, 0x23, 0x00, 0x4C, 0x02, 0xB0, 0x8F, 0xC1, - 0x89, 0x6A, 0x02, 0xF0, 0x17, 0x00, 0xF7, 0xCA, 0x3B, 0x6F, 0x30, 0xF6, - 0xBF, 0x14, 0xC0, 0x71, 0x19, 0xCE, 0x5B, 0x54, 0x59, 0x06, 0x60, 0x0A, - 0x80, 0xC9, 0x00, 0xD6, 0x18, 0xC7, 0xAB, 0x44, 0xFF, 0x52, 0xFD, 0x8F, - 0xF5, 0x60, 0x25, 0x4E, 0xC0, 0x85, 0xDA, 0x65, 0x1A, 0x07, 0xE0, 0x30, - 0x00, 0x83, 0x35, 0xC0, 0x6F, 0x03, 0x78, 0x16, 0xC0, 0x63, 0x00, 0x16, - 0x1A, 0x07, 0x7D, 0x18, 0x80, 0x3B, 0x00, 0x0C, 0x37, 0x7A, 0xCA, 0x0F, - 0x00, 0xF8, 0x03, 0x80, 0xF7, 0x0D, 0xED, 0x75, 0xD3, 0x89, 0xD0, 0x25, - 0x5A, 0x7E, 0x45, 0xF2, 0x51, 0x01, 0x2C, 0x01, 0x70, 0xB7, 0xAE, 0xF5, - 0x86, 0x3E, 0x96, 0xC8, 0x2B, 0x3F, 0x04, 0xC0, 0xF6, 0xEA, 0xE7, 0x5A, - 0x00, 0xCF, 0x68, 0x6F, 0x60, 0x4D, 0x2C, 0x1B, 0x24, 0x31, 0x9A, 0x83, - 0x3E, 0x24, 0xA7, 0xB6, 0x60, 0xC2, 0x1E, 0x22, 0x39, 0xCC, 0x63, 0x8E, - 0xDC, 0x97, 0xE4, 0xDB, 0x1E, 0xE6, 0xFA, 0xAF, 0x24, 0x87, 0x46, 0x34, - 0xD7, 0x65, 0x24, 0x7F, 0x4E, 0xF2, 0x53, 0xC3, 0xF7, 0x37, 0x91, 0x5C, - 0x4C, 0xF2, 0xB7, 0x24, 0xBB, 0x1A, 0x7F, 0x53, 0x19, 0xC9, 0xD3, 0xF5, - 0xBB, 0x9A, 0xCB, 0xDB, 0x24, 0xCF, 0x8E, 0x6B, 0x1E, 0x8F, 0xD3, 0xE3, - 0xBC, 0x3A, 0xC2, 0xA0, 0x4C, 0xF5, 0x84, 0x3C, 0x9C, 0xE4, 0x9B, 0x1E, - 0x90, 0xFF, 0x26, 0xEF, 0xBA, 0x25, 0xC8, 0xDD, 0x34, 0xD8, 0x56, 0xB8, - 0x8B, 0x04, 0x77, 0x1B, 0xE3, 0x6F, 0x29, 0x27, 0x79, 0x16, 0xC9, 0xEA, - 0x16, 0xBE, 0x7F, 0xAE, 0x56, 0x14, 0xA9, 0xA4, 0x00, 0xEE, 0x4E, 0xF2, - 0xB9, 0x88, 0x83, 0xF3, 0xA8, 0x80, 0x59, 0x1D, 0xA1, 0xA1, 0x24, 0x5F, - 0xD7, 0xB2, 0xC8, 0x22, 0x7F, 0x27, 0xB9, 0xCF, 0x66, 0xDA, 0x2B, 0xD3, - 0x60, 0xCF, 0x37, 0xC2, 0xFD, 0x5A, 0xC7, 0x80, 0x25, 0x1E, 0x70, 0xCF, - 0xD5, 0xC3, 0xD1, 0x9A, 0xDC, 0x11, 0xC7, 0x8A, 0x20, 0x2E, 0xC0, 0x95, - 0x24, 0x9F, 0x37, 0x0C, 0xD2, 0x23, 0xF2, 0x76, 0xAD, 0xEB, 0xD6, 0x7D, - 0x48, 0xBE, 0xE1, 0x01, 0x79, 0xDA, 0x26, 0xDA, 0x2B, 0x25, 0x79, 0x06, - 0xC9, 0xCF, 0x8D, 0x70, 0x97, 0x90, 0xBC, 0x4C, 0xE7, 0xC1, 0x96, 0xBE, - 0x97, 0xCA, 0xF4, 0x2E, 0x8C, 0xD8, 0xD6, 0x73, 0x24, 0xB7, 0x4A, 0x0A, - 0xE0, 0x72, 0x92, 0x4F, 0x19, 0x07, 0xFD, 0x61, 0x92, 0x7B, 0x7B, 0x40, - 0x1E, 0xE6, 0x09, 0x79, 0x6A, 0x06, 0xE4, 0x2E, 0x24, 0x4F, 0x25, 0x39, - 0xCF, 0x08, 0x77, 0x29, 0xC9, 0x2B, 0x3C, 0xE6, 0xDC, 0xF4, 0xC3, 0x54, - 0x6D, 0x68, 0xEF, 0x49, 0x92, 0x5B, 0x27, 0x05, 0x70, 0x21, 0xC9, 0x5F, - 0x91, 0xAC, 0x35, 0x0E, 0xD8, 0x63, 0x32, 0xBD, 0xD6, 0x27, 0x75, 0x08, - 0xC9, 0x59, 0x24, 0x37, 0x7A, 0x40, 0xDE, 0x83, 0xE4, 0xC9, 0x46, 0xCD, - 0x6D, 0x94, 0xE6, 0x5E, 0xE2, 0xA1, 0xB9, 0xE5, 0x46, 0xCD, 0x4D, 0xB7, - 0x77, 0x77, 0x92, 0x34, 0x18, 0x24, 0x7B, 0x92, 0x7C, 0x96, 0x64, 0x9D, - 0x71, 0xD0, 0x1F, 0x6F, 0x61, 0x8E, 0x6C, 0xE9, 0xDA, 0x9B, 0xE4, 0x4C, - 0x23, 0xE4, 0x26, 0x92, 0xCF, 0x78, 0x3A, 0x54, 0x17, 0xCB, 0x99, 0xB4, - 0x6A, 0xEE, 0x99, 0x11, 0xE7, 0xDC, 0x4C, 0xB8, 0xD5, 0x24, 0x47, 0x24, - 0xC9, 0xC9, 0xCA, 0x1C, 0xF4, 0x7F, 0x7A, 0x40, 0x9E, 0x26, 0x4D, 0xB6, - 0x3A, 0x15, 0x83, 0x3D, 0x35, 0xD9, 0x3A, 0xE7, 0xFA, 0x38, 0x54, 0x5D, - 0x49, 0x9E, 0x66, 0x34, 0xCB, 0x8D, 0xD2, 0xF4, 0x5F, 0x7B, 0x58, 0x8A, - 0x9C, 0x6D, 0x55, 0x0E, 0x22, 0x39, 0xC3, 0x13, 0xF2, 0x0F, 0x3D, 0xE6, - 0x9D, 0xC1, 0x24, 0x5F, 0xC9, 0x02, 0xE4, 0xC6, 0x0C, 0x6F, 0xD9, 0xBA, - 0x14, 0x4A, 0xAF, 0x73, 0x2D, 0xD3, 0x40, 0x03, 0xC9, 0x05, 0x9A, 0xEA, - 0x4A, 0x93, 0xBE, 0x17, 0xBD, 0x9B, 0xBC, 0xC0, 0x5A, 0xE3, 0xA0, 0x3E, - 0x4D, 0xF2, 0x40, 0x0F, 0x53, 0xB8, 0x17, 0xC9, 0x97, 0x3C, 0x1E, 0xAA, - 0x96, 0x06, 0xFB, 0x4B, 0x92, 0xE7, 0x79, 0x3C, 0x70, 0x15, 0x9E, 0x73, - 0xEE, 0x7C, 0x92, 0xBF, 0xD4, 0x11, 0x65, 0xBB, 0x38, 0x4D, 0x1A, 0xE0, - 0x09, 0xF9, 0x09, 0x4F, 0xC8, 0x83, 0x48, 0xBE, 0x1C, 0x03, 0xE4, 0x06, - 0x92, 0x5F, 0xC8, 0x4C, 0x5A, 0x07, 0xBB, 0xBB, 0x20, 0x2D, 0xF4, 0x98, - 0x73, 0xCF, 0x8D, 0x1B, 0x6E, 0x2E, 0x8E, 0x0B, 0x07, 0xC8, 0xF1, 0xAA, - 0xF1, 0x70, 0xBC, 0xF6, 0xF7, 0x98, 0x87, 0x06, 0xC9, 0x07, 0xA8, 0xCD, - 0x31, 0xDC, 0x54, 0x86, 0xE6, 0x7E, 0x65, 0x6C, 0x6F, 0xBE, 0xEE, 0xEB, - 0xC2, 0x76, 0x7A, 0x1E, 0xDC, 0x5F, 0xC0, 0x6A, 0x3C, 0xCC, 0xF5, 0xC1, - 0x1E, 0xF3, 0xDF, 0x40, 0x92, 0x2F, 0x78, 0x40, 0x6E, 0xD0, 0xBA, 0x78, - 0xBC, 0xD1, 0xD9, 0x4B, 0x29, 0x72, 0xE3, 0x02, 0xCD, 0xD9, 0x96, 0xF6, - 0xE6, 0x6A, 0xAE, 0xDE, 0x8A, 0xED, 0xFC, 0xC0, 0x7F, 0x67, 0x6D, 0x84, - 0x58, 0x21, 0x3F, 0x4B, 0xF2, 0x10, 0x0F, 0x73, 0x3D, 0x90, 0xE4, 0x74, - 0x03, 0xE4, 0x46, 0x92, 0x9F, 0x49, 0x93, 0xAC, 0x70, 0x7B, 0x90, 0xBC, - 0x50, 0xDE, 0xB6, 0xF5, 0x61, 0x3A, 0xBD, 0x0D, 0x67, 0xE6, 0x89, 0x8B, - 0xE8, 0xE8, 0xAF, 0x35, 0xA8, 0x15, 0xF2, 0x93, 0x9A, 0x93, 0xAD, 0xCE, - 0xCE, 0x1E, 0xF2, 0xE6, 0x5B, 0xF3, 0xAE, 0x9B, 0x32, 0xCC, 0xA4, 0x15, - 0x6E, 0x25, 0xC9, 0xF3, 0x75, 0xAA, 0x64, 0x85, 0x7B, 0x56, 0xB6, 0xE1, - 0xE6, 0x23, 0x64, 0x67, 0x27, 0x99, 0xEB, 0x0D, 0x1E, 0xE6, 0xFA, 0x20, - 0x0F, 0xC8, 0xBB, 0x93, 0xFC, 0x57, 0x2B, 0xDB, 0x9A, 0x8B, 0x65, 0x96, - 0x3B, 0x79, 0x98, 0xE5, 0x8B, 0x8C, 0x70, 0xEB, 0x15, 0xE3, 0x75, 0x3A, - 0x73, 0x94, 0x67, 0x95, 0x8F, 0x30, 0x92, 0x7E, 0x9E, 0xE6, 0x7A, 0x3A, - 0xC9, 0x03, 0x3C, 0xCC, 0xF5, 0x01, 0xDA, 0xBB, 0x5E, 0x2F, 0x6D, 0x6D, - 0xD2, 0xF7, 0xD5, 0xC9, 0xAC, 0x5E, 0xEE, 0xA1, 0xB9, 0xDB, 0x69, 0x67, - 0x6B, 0xB9, 0x51, 0x73, 0x3F, 0x21, 0x39, 0x76, 0x4B, 0x88, 0xC9, 0x8A, - 0x32, 0x27, 0x3F, 0xED, 0x01, 0xF9, 0x05, 0x01, 0xB3, 0x2E, 0x27, 0x06, - 0x91, 0x7C, 0x40, 0xA6, 0x78, 0x81, 0x3C, 0xDD, 0xE9, 0x3A, 0xE4, 0xB7, - 0x3A, 0x38, 0x95, 0x9A, 0x73, 0x2D, 0x70, 0x1B, 0xB5, 0x3D, 0x7A, 0x5A, - 0x7B, 0x8F, 0xC9, 0xB2, 0xC8, 0x4E, 0x8A, 0xB9, 0x3A, 0x4C, 0x19, 0x84, - 0x51, 0xE5, 0x45, 0x00, 0x37, 0x29, 0x14, 0xC8, 0x92, 0x31, 0x50, 0xA1, - 0x50, 0x9C, 0x46, 0xA5, 0xC0, 0x2C, 0x50, 0xD0, 0x3D, 0x8C, 0xDF, 0x31, - 0x16, 0xC0, 0x65, 0x00, 0x7A, 0x1A, 0x72, 0xAF, 0xAA, 0x01, 0xDC, 0x0C, - 0xE0, 0x21, 0xE4, 0x3A, 0x91, 0x3D, 0xCF, 0x51, 0x7F, 0xFD, 0xE4, 0x44, - 0x59, 0xE7, 0xE4, 0xE7, 0x3D, 0x1D, 0xAF, 0xB6, 0x44, 0x89, 0x56, 0x68, - 0x29, 0x64, 0xF5, 0x96, 0xE7, 0x4A, 0x73, 0xF3, 0x92, 0x23, 0x9C, 0x84, - 0xD0, 0xCE, 0x3E, 0xDA, 0xBD, 0xB2, 0x42, 0x9E, 0xA1, 0x25, 0x54, 0x97, - 0x1C, 0xC0, 0xDD, 0x56, 0x66, 0xF9, 0x1B, 0xA3, 0x59, 0x4E, 0xC3, 0xCD, - 0x5B, 0xE2, 0x7A, 0x52, 0xE2, 0x77, 0xFB, 0xEA, 0x6C, 0x78, 0x9D, 0x11, - 0xF2, 0xCB, 0x24, 0x0F, 0xCD, 0x22, 0xE4, 0x34, 0x5C, 0x1F, 0x87, 0x6A, - 0x2E, 0x5D, 0x7C, 0x75, 0x51, 0x3E, 0xC7, 0x36, 0x49, 0x19, 0x0D, 0xFD, - 0x14, 0xCA, 0x63, 0x85, 0xFC, 0x12, 0xC9, 0x51, 0x1E, 0x51, 0x16, 0x51, - 0xE0, 0xF6, 0xD4, 0x69, 0x92, 0xC5, 0x2C, 0xA7, 0x97, 0x42, 0x63, 0xB3, - 0xB9, 0x43, 0xD5, 0x1E, 0x01, 0x67, 0x86, 0xDE, 0x5A, 0x21, 0xCF, 0x22, - 0x39, 0x32, 0xC6, 0x79, 0xAE, 0x80, 0xE4, 0x8E, 0x74, 0x09, 0x64, 0x2B, - 0x8C, 0x70, 0x67, 0x2B, 0x62, 0xA4, 0x30, 0x09, 0x63, 0x9A, 0xC4, 0xDC, - 0xA4, 0xDE, 0x24, 0x1F, 0xF4, 0x80, 0xFC, 0x38, 0xC9, 0xED, 0x63, 0xEA, - 0x43, 0x0F, 0x92, 0x37, 0x69, 0x1E, 0xB5, 0xC0, 0xFD, 0x90, 0x2E, 0x61, - 0x2D, 0x31, 0xE3, 0x99, 0xC4, 0x42, 0x68, 0x8B, 0x54, 0xFF, 0xE2, 0x29, - 0xD8, 0x6A, 0x4C, 0x1D, 0x0B, 0x57, 0x63, 0x2B, 0x0E, 0xD9, 0x53, 0x49, - 0xE6, 0x51, 0xC7, 0x67, 0xA3, 0xF2, 0x9B, 0x6F, 0x06, 0xF0, 0x68, 0x92, - 0x06, 0x33, 0xA9, 0x95, 0xEE, 0xBE, 0x06, 0x70, 0x1D, 0x80, 0xD7, 0x0C, - 0xE9, 0x1B, 0x4D, 0xCA, 0x89, 0x8A, 0x43, 0xB6, 0x37, 0xAC, 0x73, 0x1B, - 0x00, 0x7C, 0xA4, 0x04, 0xF1, 0x69, 0x49, 0x1B, 0xC8, 0xA4, 0x02, 0x2E, - 0x03, 0xD0, 0x4B, 0x1B, 0x19, 0x51, 0x01, 0xA7, 0x94, 0xBF, 0x14, 0x47, - 0x49, 0x87, 0x72, 0x43, 0xBB, 0x0D, 0x00, 0x66, 0x01, 0x78, 0x39, 0x89, - 0x03, 0x99, 0x44, 0xC0, 0x25, 0x4A, 0xC8, 0xBA, 0x45, 0xC9, 0x60, 0x51, - 0xFB, 0xB8, 0x0C, 0xC0, 0x17, 0x31, 0x55, 0xB4, 0x59, 0x21, 0xB3, 0x1B, - 0x35, 0xE9, 0xEE, 0x47, 0x00, 0xC6, 0x00, 0xD8, 0x36, 0x69, 0x83, 0xD9, - 0x29, 0x81, 0x70, 0x0F, 0x56, 0x81, 0x95, 0xE1, 0x86, 0xFB, 0x6A, 0x00, - 0x3C, 0x01, 0x60, 0x71, 0x4C, 0xFD, 0xF8, 0x1C, 0xC0, 0x5C, 0x44, 0xAB, - 0xA6, 0x53, 0x04, 0x60, 0x5F, 0x00, 0xBD, 0x95, 0x32, 0xFB, 0x20, 0x80, - 0x6F, 0x83, 0x06, 0xFF, 0xBF, 0x74, 0x05, 0x70, 0x28, 0x5C, 0xF5, 0xB8, - 0xFD, 0x0C, 0xF7, 0xAD, 0x07, 0x30, 0x1D, 0xC0, 0x44, 0x55, 0xB5, 0x89, - 0x43, 0xE6, 0x2B, 0xCF, 0x78, 0xA9, 0xC1, 0x22, 0xF4, 0xD2, 0x83, 0x39, - 0x0E, 0x40, 0x0F, 0x24, 0xA3, 0x22, 0x5F, 0x62, 0x96, 0x49, 0x5D, 0x49, - 0x8E, 0x66, 0xCB, 0x75, 0x1F, 0x37, 0x25, 0x6B, 0x48, 0xDE, 0x4F, 0xB2, - 0x57, 0x16, 0xFA, 0x54, 0xA4, 0xBD, 0xE7, 0x6A, 0xDA, 0xB2, 0x1A, 0x97, - 0x90, 0xBC, 0x54, 0x3B, 0x60, 0xA9, 0xB0, 0x0E, 0x76, 0x31, 0x57, 0xC7, - 0x91, 0x7C, 0xC7, 0x08, 0x77, 0x35, 0xC9, 0xFB, 0xB4, 0x66, 0xCD, 0xE6, - 0x3E, 0xF4, 0x38, 0x92, 0x73, 0x8C, 0x90, 0x17, 0xD3, 0x25, 0xA8, 0xF5, - 0xCC, 0x37, 0xE4, 0x7C, 0x82, 0x4D, 0x29, 0x40, 0x7C, 0x34, 0xC9, 0x7F, - 0x1B, 0xE1, 0xAE, 0x24, 0x79, 0x8F, 0xCE, 0x66, 0x73, 0xD1, 0xD7, 0xB1, - 0xDA, 0x7E, 0xB4, 0x42, 0xBE, 0x5C, 0x1B, 0x37, 0x1D, 0xEE, 0xB0, 0x21, - 0xA5, 0x18, 0xE2, 0x31, 0x74, 0xC5, 0x56, 0x2C, 0xF2, 0x5F, 0xBA, 0xDC, - 0xD9, 0x6E, 0x6D, 0x68, 0xDB, 0xE7, 0xBE, 0x93, 0x49, 0x7E, 0xE0, 0x61, - 0xAE, 0xAF, 0xD4, 0xB6, 0x67, 0x5E, 0x20, 0xE7, 0xCB, 0x8B, 0x2E, 0x87, - 0xAB, 0xFB, 0x78, 0x11, 0x5A, 0x2E, 0xC7, 0xDB, 0x5C, 0x56, 0xC2, 0x15, - 0x08, 0x9F, 0x60, 0xD8, 0xE5, 0x4A, 0xC1, 0x55, 0xAB, 0xEB, 0xAC, 0x02, - 0x31, 0x05, 0x00, 0x36, 0xE8, 0xAA, 0x31, 0x38, 0x51, 0x8F, 0xE8, 0xDF, - 0xCB, 0xB4, 0xD3, 0x15, 0xA5, 0x66, 0x48, 0x4F, 0xB8, 0x52, 0xC8, 0x94, - 0x77, 0xBD, 0xC4, 0x58, 0x88, 0xA6, 0xDD, 0x2D, 0x93, 0x52, 0x2A, 0x76, - 0x32, 0x12, 0xC0, 0xF9, 0x9E, 0x70, 0xAB, 0xE0, 0xAA, 0xF6, 0x44, 0x6D, - 0xAF, 0x52, 0xCB, 0x9D, 0xBD, 0x00, 0xF4, 0x13, 0xEC, 0xC5, 0x00, 0x3E, - 0x01, 0xF0, 0x8E, 0x0A, 0xC3, 0x44, 0x8D, 0xB2, 0x78, 0x54, 0xB0, 0x2E, - 0x37, 0x42, 0x1E, 0xAF, 0xFF, 0x7E, 0x58, 0xBB, 0x74, 0xDC, 0x12, 0xBD, - 0xE8, 0x74, 0x98, 0xE9, 0x29, 0x74, 0x25, 0x0B, 0x2D, 0xB2, 0x9C, 0xE4, - 0xEF, 0x3D, 0xCC, 0x72, 0x05, 0xC9, 0x5F, 0xC8, 0xB4, 0x6E, 0xEA, 0x3B, - 0x27, 0x29, 0x3E, 0xCC, 0x7A, 0xF2, 0x73, 0x92, 0x7E, 0x83, 0x25, 0x09, - 0x7D, 0x29, 0xC9, 0x6B, 0x72, 0x6D, 0xAE, 0x73, 0x09, 0xB8, 0x92, 0x2E, - 0xAB, 0xFE, 0x03, 0x8F, 0x39, 0xF7, 0x56, 0xDA, 0xAB, 0xCE, 0x74, 0x57, - 0x34, 0x45, 0x4B, 0xB9, 0xC0, 0x75, 0x24, 0x27, 0xEA, 0x2C, 0xBA, 0xC0, - 0x13, 0x72, 0x83, 0x11, 0xF2, 0x95, 0x24, 0x77, 0xD8, 0xD2, 0xC2, 0x66, - 0xCB, 0xE4, 0x89, 0xBE, 0xE7, 0x01, 0x77, 0x92, 0x51, 0x73, 0x53, 0xFA, - 0x7C, 0x54, 0x4B, 0xB1, 0x5A, 0xE7, 0xBE, 0x7D, 0x3C, 0x06, 0xFD, 0x44, - 0x0F, 0xC7, 0x6B, 0x19, 0x5D, 0x45, 0xA2, 0x9C, 0x40, 0xCE, 0x15, 0xDC, - 0x9F, 0x91, 0xFC, 0x8F, 0x11, 0xEE, 0x0A, 0x92, 0xB7, 0x19, 0x23, 0x35, - 0xD2, 0xC1, 0x71, 0x63, 0x75, 0x36, 0x6B, 0x79, 0x90, 0x6E, 0xF0, 0x84, - 0x7C, 0xBC, 0x7E, 0x9B, 0x05, 0xF2, 0xB7, 0x24, 0xAB, 0x72, 0xB1, 0x84, - 0xCA, 0x36, 0xDC, 0x6E, 0xDA, 0x28, 0xF8, 0xD0, 0x03, 0xEE, 0x24, 0xDA, - 0x13, 0xA1, 0x2B, 0x34, 0x0D, 0xCC, 0xF6, 0xC8, 0x2C, 0x5C, 0x25, 0x4D, - 0xF6, 0x99, 0x23, 0x4F, 0xF0, 0x84, 0x7C, 0xAD, 0x76, 0xE1, 0x52, 0xED, - 0x11, 0x70, 0x99, 0xD6, 0xB9, 0x1F, 0xE7, 0x40, 0x73, 0xD3, 0xED, 0x9D, - 0xE2, 0x61, 0x29, 0x36, 0x65, 0xAE, 0x7D, 0x21, 0x5B, 0xE7, 0xE4, 0x15, - 0x72, 0xBC, 0xB2, 0x66, 0xAE, 0xB3, 0x6D, 0x96, 0x3F, 0xF6, 0xD4, 0xDC, - 0x7C, 0xC0, 0x4D, 0xCB, 0x3A, 0x99, 0x6B, 0x1F, 0xC8, 0xC7, 0xCA, 0xCF, - 0xA8, 0x37, 0x4E, 0x0F, 0xD7, 0x65, 0xCB, 0xBB, 0xCE, 0x96, 0x59, 0x1E, - 0x43, 0x7B, 0x95, 0xF4, 0x6F, 0x3D, 0xE1, 0xA6, 0xDB, 0x9B, 0xCD, 0xF8, - 0x64, 0x4D, 0x1B, 0x20, 0x8F, 0xF6, 0x80, 0xBC, 0x8A, 0xAE, 0xCE, 0xF4, - 0x0F, 0xE2, 0x86, 0x1C, 0x37, 0xDC, 0x72, 0x2D, 0x4D, 0xE6, 0x78, 0xC0, - 0x9D, 0x48, 0x7B, 0xB2, 0x77, 0xDA, 0x5B, 0x9E, 0xC3, 0xF8, 0x65, 0x9D, - 0x02, 0xEF, 0xFA, 0x78, 0x42, 0x7E, 0xC7, 0x53, 0x93, 0x63, 0x85, 0x1C, - 0xF7, 0xF1, 0xDA, 0x4F, 0x69, 0xAB, 0x41, 0x45, 0x65, 0x0B, 0xFC, 0x8E, - 0xF6, 0x32, 0x45, 0x69, 0xB8, 0x16, 0xCD, 0x6D, 0x32, 0x46, 0x4A, 0xAE, - 0x25, 0x79, 0x8B, 0xD6, 0xC9, 0xD6, 0x41, 0x3F, 0x86, 0xE4, 0x5B, 0xB4, - 0x55, 0xFF, 0x59, 0x21, 0xCB, 0xD1, 0x97, 0x31, 0xE5, 0x0E, 0xC7, 0x05, - 0xB7, 0x80, 0xAE, 0x98, 0xD9, 0xEB, 0x46, 0xB8, 0x4B, 0x49, 0xDE, 0x6C, - 0xCC, 0x4C, 0x48, 0x65, 0x6C, 0x62, 0x58, 0xCD, 0xF2, 0x42, 0xF9, 0x05, - 0x35, 0x46, 0x4D, 0x4E, 0x6F, 0x86, 0x58, 0x77, 0xBC, 0x8E, 0xA6, 0x4B, - 0x5D, 0xDD, 0x68, 0xD4, 0xE4, 0x1B, 0xE9, 0x52, 0x54, 0x13, 0x03, 0xB8, - 0x84, 0xE4, 0x9D, 0x1E, 0x70, 0x6F, 0xF0, 0x30, 0xCB, 0x95, 0x74, 0xD5, - 0xE3, 0xE6, 0x7A, 0xB4, 0xF7, 0x1B, 0x79, 0xBB, 0xAF, 0xD2, 0x56, 0x8D, - 0x67, 0xAD, 0x20, 0xEF, 0xEA, 0x01, 0xF9, 0x18, 0x41, 0xAE, 0x33, 0x5A, - 0xB5, 0xD1, 0x4C, 0x50, 0xA5, 0xBB, 0x4A, 0xBA, 0xEA, 0x36, 0x96, 0xC1, - 0xAE, 0xA2, 0x3D, 0x99, 0xBB, 0x52, 0x7B, 0xCB, 0x9F, 0x7A, 0xC0, 0xBD, - 0x2E, 0x23, 0xF3, 0x61, 0x24, 0x5D, 0xE6, 0x7F, 0x9D, 0x51, 0x93, 0x6F, - 0xA7, 0xAB, 0x1C, 0x64, 0x85, 0x7C, 0x14, 0xC9, 0xD7, 0x8C, 0xED, 0xDD, - 0xCF, 0x04, 0x95, 0x13, 0xAE, 0xA0, 0x4B, 0xCE, 0xB6, 0xC0, 0xB5, 0x9A, - 0xE5, 0x4A, 0xBA, 0x1A, 0x54, 0x56, 0xCD, 0x5D, 0xA2, 0xF6, 0x9A, 0xA7, - 0x9A, 0x1E, 0xE1, 0x31, 0xE8, 0x6B, 0x75, 0x16, 0xDD, 0xDF, 0x63, 0x8E, - 0x4C, 0xB7, 0x17, 0xD5, 0xF1, 0x9A, 0xCE, 0x18, 0xEA, 0x66, 0xC5, 0x05, - 0xB8, 0x94, 0xAE, 0xBA, 0x7A, 0x94, 0xC1, 0x9E, 0x60, 0xD4, 0xDC, 0x14, - 0x5D, 0x4A, 0xCA, 0xD9, 0x74, 0x95, 0x70, 0x2C, 0xB2, 0x58, 0x1B, 0x09, - 0x9B, 0x7B, 0x98, 0x8E, 0xF4, 0x84, 0xEC, 0x7B, 0x0A, 0x75, 0x94, 0x1C, - 0xAF, 0x28, 0x90, 0xFF, 0xC1, 0x84, 0x95, 0x13, 0x3E, 0x91, 0x9B, 0x4F, - 0xB1, 0x4C, 0x17, 0xF5, 0xBC, 0xC6, 0xC3, 0x2C, 0x6F, 0x47, 0x57, 0x24, - 0x65, 0x9E, 0x87, 0xE6, 0x5E, 0x15, 0xA1, 0xBD, 0x51, 0x74, 0xC9, 0x6B, - 0x56, 0x73, 0x7D, 0x9B, 0xA7, 0x26, 0x1F, 0xC9, 0xD6, 0x2B, 0xD7, 0xD7, - 0x6A, 0xAC, 0x0A, 0x99, 0xA0, 0x65, 0x52, 0x67, 0x2D, 0x77, 0x16, 0xA9, - 0x83, 0x0D, 0xFA, 0x11, 0x35, 0x74, 0xD5, 0xE3, 0xAE, 0xA2, 0x5F, 0xDD, - 0xC7, 0x73, 0x3C, 0x34, 0x37, 0x0D, 0x37, 0x6A, 0xFA, 0xE6, 0xE1, 0x6C, - 0xBD, 0x1A, 0x4F, 0x73, 0xF9, 0x4E, 0x8E, 0xE5, 0x2E, 0x1E, 0xCE, 0x50, - 0xBA, 0xBD, 0xDA, 0xCD, 0xC0, 0x7D, 0x95, 0xAE, 0x42, 0x50, 0x9B, 0x9D, - 0xAC, 0xC2, 0xAA, 0xAA, 0xAA, 0xB8, 0x62, 0x07, 0x1A, 0x00, 0x7C, 0xA8, - 0x8C, 0x80, 0x0D, 0xCA, 0x0E, 0x58, 0x00, 0xF7, 0xFE, 0xA2, 0xA9, 0x70, - 0xAF, 0xB9, 0xA9, 0x35, 0xD6, 0xC3, 0x38, 0x01, 0xC0, 0x05, 0xB0, 0xBD, - 0x4A, 0x76, 0x29, 0xDC, 0x4B, 0x21, 0x27, 0x1A, 0xB2, 0x13, 0xAA, 0x15, - 0x53, 0xBD, 0x8B, 0xF2, 0x92, 0xA2, 0xC4, 0x8B, 0x17, 0x29, 0xAA, 0xA3, - 0x40, 0x81, 0xF2, 0x96, 0x44, 0xB9, 0x6A, 0x25, 0xD9, 0x55, 0x2A, 0x94, - 0x68, 0x23, 0xDC, 0xFB, 0x92, 0x56, 0x01, 0x78, 0x1D, 0xEE, 0x55, 0x42, - 0x6F, 0xC6, 0x12, 0x42, 0xC3, 0xEC, 0x14, 0x61, 0xE9, 0xAD, 0xCE, 0x37, - 0x29, 0xCA, 0x7F, 0xA9, 0xF1, 0xFE, 0x4A, 0xA5, 0xAD, 0x5C, 0x0C, 0xDB, - 0x1B, 0xBF, 0x33, 0xE1, 0xD6, 0x7A, 0xF4, 0x7B, 0x14, 0xDC, 0xCB, 0x9F, - 0x87, 0x2A, 0xB4, 0x27, 0x8A, 0x6C, 0x80, 0x7B, 0x11, 0xD7, 0x64, 0xB8, - 0x77, 0x05, 0x5B, 0x06, 0x74, 0x37, 0x7C, 0xFF, 0xBD, 0x49, 0x6B, 0x00, - 0x3C, 0x07, 0x60, 0x9E, 0x1E, 0x9C, 0xA6, 0xF6, 0x14, 0xB2, 0x63, 0x89, - 0xC4, 0x18, 0x4F, 0x5B, 0x21, 0xED, 0xB4, 0x59, 0xBE, 0x9A, 0x6D, 0xCF, - 0xAA, 0x3F, 0x54, 0x73, 0xB2, 0xC5, 0x5C, 0xD7, 0x91, 0xBC, 0xCB, 0xD3, - 0x5C, 0x77, 0xA8, 0x04, 0xF0, 0xEE, 0x5A, 0xE7, 0x5A, 0x1D, 0xAA, 0x74, - 0xBC, 0x53, 0x5C, 0xE5, 0x78, 0x0F, 0xA7, 0xFD, 0x15, 0x3E, 0x75, 0x24, - 0x27, 0x27, 0x0D, 0x72, 0x92, 0xE0, 0xF6, 0xD0, 0x3A, 0xD7, 0xEA, 0x50, - 0x2D, 0x92, 0xE6, 0xC6, 0x5D, 0x6B, 0x79, 0xA4, 0x20, 0x5B, 0xB6, 0x19, - 0x6B, 0x32, 0x1C, 0xAF, 0x82, 0x00, 0xF8, 0xFB, 0x4B, 0xA1, 0xF3, 0xE4, - 0x6D, 0x5B, 0xE1, 0x5E, 0xC1, 0xEC, 0xD5, 0xA0, 0xFA, 0xB1, 0x3C, 0x5A, - 0x4B, 0x69, 0xE2, 0x5A, 0x92, 0x53, 0xE4, 0x05, 0x77, 0x0A, 0x80, 0xDD, - 0xA9, 0x90, 0x15, 0x6E, 0xE6, 0xAB, 0xE5, 0xB2, 0x5D, 0xC9, 0xE6, 0x20, - 0xDA, 0x8B, 0x8C, 0xD7, 0x92, 0xFC, 0x23, 0x5D, 0x59, 0xE3, 0xBC, 0x42, - 0xCE, 0x77, 0xFA, 0x68, 0x01, 0x80, 0xFD, 0x15, 0x04, 0xDF, 0x37, 0xAA, - 0x5F, 0xA8, 0x60, 0xF5, 0x29, 0x70, 0xA5, 0x10, 0x37, 0x66, 0xB9, 0x8F, - 0xAF, 0x02, 0xB8, 0x51, 0xE5, 0x24, 0xA2, 0x96, 0x4E, 0x2C, 0x06, 0x70, - 0x2A, 0x80, 0x33, 0xB5, 0xDC, 0xEB, 0xB0, 0xF9, 0xC1, 0x65, 0x70, 0xB5, - 0x1F, 0xFB, 0x19, 0xEE, 0x59, 0x08, 0xE0, 0x4E, 0x00, 0xB7, 0xC2, 0x56, - 0xAB, 0xB2, 0x2D, 0xF2, 0x0A, 0x80, 0xEB, 0x55, 0xAA, 0x61, 0x43, 0xC4, - 0x7B, 0x3A, 0xEB, 0xB7, 0xF5, 0xED, 0xC8, 0x80, 0x7B, 0xC1, 0xBD, 0x00, - 0x3A, 0xAA, 0xE6, 0x7E, 0x05, 0xE0, 0x2E, 0x5D, 0x0D, 0x39, 0xEE, 0xEB, - 0x4C, 0x69, 0xF2, 0x2C, 0xC3, 0x83, 0x55, 0x01, 0x57, 0x74, 0xB5, 0xC3, - 0x96, 0x70, 0xE8, 0xA4, 0x1D, 0xA1, 0xA8, 0x70, 0x27, 0x0B, 0x6E, 0x63, - 0x9E, 0xFA, 0x3B, 0x33, 0x43, 0x31, 0x0E, 0x94, 0x29, 0x8E, 0x02, 0x39, - 0x9E, 0x4D, 0x8B, 0x76, 0x08, 0xF8, 0x3B, 0xED, 0x74, 0xF5, 0x6E, 0xE5, - 0x73, 0x0B, 0xB4, 0x7D, 0x37, 0x25, 0x8F, 0x70, 0x33, 0x21, 0x33, 0xC3, - 0x7F, 0x28, 0x6E, 0x65, 0xFB, 0x76, 0x49, 0x47, 0x36, 0xD1, 0xCB, 0x35, - 0xBF, 0xD5, 0xB7, 0xA2, 0xB9, 0xB7, 0x27, 0x04, 0x6E, 0x5A, 0x66, 0x69, - 0x4E, 0x9E, 0xD9, 0x82, 0xB9, 0x26, 0x80, 0x4F, 0x01, 0xCC, 0xC9, 0x69, - 0x36, 0x61, 0xC2, 0x34, 0x78, 0x1D, 0x5C, 0x91, 0xEC, 0x61, 0x00, 0x06, - 0xC3, 0x55, 0xD9, 0x49, 0x9B, 0xB3, 0x7A, 0x69, 0xEE, 0xBD, 0x3A, 0xA8, - 0x48, 0x0A, 0xDC, 0x4C, 0xC8, 0x54, 0x5F, 0x47, 0xC0, 0x55, 0xD8, 0x29, - 0xD4, 0xFF, 0xAB, 0x57, 0x8A, 0xEA, 0x9F, 0xE4, 0x14, 0xE6, 0x0D, 0x70, - 0x3E, 0x2B, 0xBE, 0x67, 0xCA, 0x21, 0x3A, 0x5C, 0x18, 0xA2, 0x8D, 0xF7, - 0x95, 0x70, 0x65, 0x8C, 0x66, 0x28, 0xA7, 0xB6, 0x01, 0xC9, 0x95, 0xE1, - 0x00, 0x4E, 0x51, 0xDF, 0x77, 0xD4, 0x81, 0xC1, 0x3C, 0xB8, 0xC2, 0x68, - 0x0F, 0xEB, 0x21, 0x46, 0x47, 0x07, 0x0C, 0xB8, 0xC4, 0xF0, 0xA1, 0x00, - 0x76, 0xD5, 0x51, 0xDA, 0xFB, 0x88, 0xAF, 0xEE, 0x55, 0xB6, 0xA5, 0x14, - 0x2E, 0xC9, 0x7C, 0x4F, 0x4D, 0x3B, 0xEF, 0xCA, 0xFA, 0xE4, 0x5D, 0x92, - 0x04, 0x38, 0xC8, 0x16, 0xE8, 0x64, 0x05, 0x09, 0x80, 0x83, 0x04, 0xC0, - 0x41, 0x02, 0xE0, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, - 0x00, 0x07, 0x09, 0x80, 0x83, 0x04, 0xC0, 0x41, 0x02, 0xE0, 0x20, 0x01, - 0x70, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x83, - 0x64, 0x47, 0xFE, 0x37, 0x00, 0x03, 0xCE, 0x9A, 0x67, 0x1F, 0xCC, 0x4A, - 0xE6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, - 0x82 -}; -} -static unsigned char* legit_icon = raw::legit; -} \ No newline at end of file diff --git a/gmod/icons/misc.hpp b/gmod/icons/misc.hpp deleted file mode 100644 index 9e78249..0000000 --- a/gmod/icons/misc.hpp +++ /dev/null @@ -1,1721 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\misc.png (4/1/2018 10:00:14 PM) - StartOffset: 00000000, EndOffset: 00005025, Length: 00005026 */ - -namespace icons { -constexpr static size_t misc_size = 20518; -namespace raw { -static unsigned char misc[20518] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, - 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, - 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, - 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, 0x35, 0x37, - 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, 0x2D, 0x63, - 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, 0x64, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x66, 0x37, 0x34, - 0x35, 0x33, 0x62, 0x38, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, - 0x34, 0x35, 0x36, 0x39, 0x37, 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, - 0x2D, 0x37, 0x37, 0x34, 0x33, 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, - 0x65, 0x38, 0x65, 0x34, 0x36, 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x34, 0x35, 0x36, 0x39, 0x37, - 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, 0x2D, 0x37, 0x37, 0x34, 0x33, - 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, 0x65, 0x38, 0x65, 0x34, 0x36, - 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, - 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x61, 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, - 0x35, 0x37, 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, - 0x2D, 0x63, 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xCB, 0xA4, 0xEC, 0x39, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0A, 0x48, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x8C, 0x5D, 0x55, 0x15, 0xC7, - 0x7F, 0xF7, 0xDE, 0x79, 0xF7, 0xE1, 0xB4, 0xB4, 0xA5, 0x6F, 0x3A, 0xA5, - 0x28, 0x32, 0xA5, 0x9D, 0x92, 0x52, 0x04, 0x15, 0x94, 0x8A, 0x90, 0x5A, - 0x2D, 0x11, 0xA2, 0x35, 0x4A, 0x04, 0xF1, 0x91, 0xF8, 0xC2, 0x10, 0xEB, - 0x2B, 0xD1, 0xF8, 0x41, 0xE1, 0x83, 0xD1, 0x84, 0x48, 0x22, 0x31, 0x8A, - 0x04, 0x11, 0xD4, 0x08, 0x0D, 0x6D, 0xAC, 0x96, 0x48, 0x85, 0xAA, 0xA1, - 0x45, 0x91, 0x42, 0x5B, 0xEB, 0x4C, 0x87, 0x16, 0x28, 0xED, 0x40, 0xA7, - 0xD3, 0x4E, 0x3B, 0x73, 0x67, 0xDA, 0x79, 0xDC, 0xED, 0x87, 0xB5, 0x4E, - 0xE8, 0x87, 0xCA, 0xD9, 0x67, 0xEE, 0xB9, 0xF7, 0xEC, 0x73, 0xCF, 0xFE, - 0x27, 0x27, 0x43, 0xE1, 0xD0, 0x39, 0xF7, 0xFE, 0xCE, 0xDE, 0x7B, 0xAD, - 0xFF, 0x5E, 0x7B, 0xEF, 0x9C, 0x31, 0x06, 0xAF, 0xDA, 0x55, 0xDE, 0x7F, - 0x05, 0x1E, 0xB0, 0x97, 0x07, 0xEC, 0xE5, 0x01, 0x7B, 0x79, 0xC0, 0x5E, - 0xF1, 0xAB, 0xCE, 0xC1, 0x67, 0xCA, 0x01, 0x05, 0x7D, 0xF9, 0xEA, 0x80, - 0x7A, 0xFD, 0x73, 0xCE, 0x91, 0xE7, 0x2B, 0x01, 0x63, 0x7A, 0x8D, 0x9F, - 0x75, 0x79, 0xC0, 0x21, 0x6A, 0x01, 0x26, 0x01, 0x8B, 0x81, 0x99, 0xFA, - 0xCF, 0xD3, 0x80, 0xA9, 0xFA, 0xDF, 0x1A, 0x1C, 0xE8, 0x71, 0x4A, 0xC0, - 0x19, 0xA0, 0x08, 0x9C, 0x04, 0x4E, 0xE9, 0xCF, 0xFD, 0xC0, 0x09, 0xE0, - 0x34, 0x30, 0xE4, 0x01, 0xBF, 0xA9, 0x06, 0x60, 0x06, 0xB0, 0x10, 0xB8, - 0x4C, 0x7F, 0xAE, 0x02, 0xCE, 0x07, 0x9A, 0x80, 0x29, 0x0A, 0xBA, 0xC1, - 0xA1, 0x97, 0x71, 0x54, 0x41, 0x16, 0x15, 0x66, 0x11, 0xF8, 0x2F, 0xD0, - 0x09, 0xBC, 0x06, 0xFC, 0x13, 0x38, 0x02, 0xF4, 0xE9, 0xBD, 0xC9, 0x76, - 0x87, 0x09, 0x19, 0x1D, 0x8D, 0xC0, 0x3C, 0xE0, 0x72, 0xE0, 0x6A, 0xA0, - 0x1D, 0xB8, 0x44, 0x5B, 0x6E, 0x5A, 0x35, 0x0E, 0x1C, 0x05, 0xF6, 0x02, - 0xBB, 0x81, 0xED, 0xC0, 0xBF, 0x81, 0xD7, 0x81, 0x91, 0xAC, 0x00, 0xAE, - 0xD7, 0xD6, 0x79, 0x35, 0x70, 0x3D, 0x70, 0x15, 0xB0, 0xA4, 0x46, 0xE3, - 0x9B, 0x7D, 0xC0, 0x53, 0xC0, 0x36, 0xE0, 0xEF, 0xC0, 0x31, 0x1D, 0xB7, - 0x6B, 0x16, 0x70, 0x8B, 0x82, 0x5D, 0x03, 0xAC, 0x05, 0xDA, 0x32, 0x12, - 0xC8, 0x76, 0x02, 0x9B, 0x80, 0xAD, 0xC0, 0x3F, 0xB4, 0x7B, 0xAF, 0x39, - 0xC0, 0x0B, 0x80, 0x1B, 0x80, 0xDB, 0x75, 0x8C, 0xCD, 0x91, 0x2D, 0x8D, - 0x6A, 0x97, 0xFD, 0x00, 0xB0, 0x59, 0x03, 0xB3, 0x9A, 0x08, 0xB2, 0x72, - 0xC0, 0x3B, 0x81, 0xCF, 0x00, 0xEB, 0x75, 0xDC, 0xCD, 0xA2, 0xEA, 0x81, - 0xD5, 0xC0, 0x05, 0xC0, 0x6C, 0xE0, 0x31, 0xE0, 0x40, 0xDA, 0x5B, 0x70, - 0x0E, 0xE8, 0x00, 0xEE, 0x04, 0x6E, 0x02, 0x9A, 0xBD, 0xED, 0x00, 0x9A, - 0x4E, 0xFD, 0x06, 0xF8, 0x29, 0xD0, 0x95, 0x66, 0xC0, 0xCB, 0x81, 0xEF, - 0x2A, 0xDC, 0x38, 0x64, 0x34, 0x0F, 0x4D, 0xCA, 0x54, 0x28, 0xE8, 0x65, - 0x62, 0x18, 0x62, 0x86, 0x81, 0x07, 0x81, 0x9F, 0x54, 0x1A, 0x72, 0x5D, - 0x85, 0x5A, 0xEE, 0xDB, 0x81, 0x0D, 0x65, 0xC0, 0x1D, 0x51, 0x13, 0xE1, - 0x18, 0x30, 0x70, 0x56, 0x9A, 0x31, 0x08, 0xF4, 0x27, 0x60, 0x78, 0x94, - 0x80, 0x56, 0x60, 0xB2, 0xFE, 0xB9, 0x59, 0x73, 0xF4, 0xF3, 0xF4, 0xDF, - 0x35, 0x44, 0xFC, 0xFB, 0x9A, 0x81, 0x4F, 0xEB, 0xD8, 0xFC, 0x63, 0xE0, - 0xE5, 0x34, 0x01, 0x6E, 0x03, 0xEE, 0xD0, 0x31, 0x37, 0x6A, 0x0B, 0xED, - 0x07, 0x5E, 0xD2, 0xB7, 0xFA, 0x45, 0xFD, 0xD9, 0x8F, 0xB8, 0x47, 0x39, - 0x35, 0x15, 0x8A, 0x09, 0xB5, 0xE0, 0x49, 0x9A, 0x09, 0xE4, 0xD4, 0x84, - 0x99, 0x0E, 0xBC, 0x03, 0x58, 0x06, 0x2C, 0xD5, 0xF8, 0x62, 0x6A, 0x84, - 0xBF, 0xAF, 0x09, 0xB8, 0x4D, 0x3F, 0xCF, 0x5D, 0xFA, 0x42, 0x3B, 0x0F, - 0xB8, 0x19, 0xB8, 0x05, 0xB8, 0x55, 0xBB, 0x33, 0x5B, 0x0D, 0x02, 0xCF, - 0x01, 0x4F, 0x03, 0x7F, 0x05, 0x5E, 0x01, 0x5E, 0xC5, 0x61, 0x8F, 0x57, - 0xD5, 0x00, 0x2C, 0xD2, 0x58, 0x63, 0x25, 0xF0, 0x7E, 0x35, 0x6C, 0x5A, - 0x22, 0xBC, 0x34, 0x9F, 0x47, 0x9C, 0xB0, 0x87, 0x2A, 0x91, 0x27, 0xC7, - 0x39, 0x06, 0xE7, 0x81, 0x0F, 0x03, 0xF7, 0x02, 0xF3, 0x2D, 0xFF, 0x9F, - 0x31, 0x85, 0xF9, 0x47, 0xE0, 0x11, 0xC4, 0x01, 0x2A, 0x92, 0x4E, 0xB5, - 0x2A, 0xE8, 0xF5, 0x9A, 0xEB, 0xCF, 0x8F, 0x30, 0x56, 0xEF, 0x56, 0xD0, - 0x3B, 0x5C, 0x6E, 0xC1, 0x41, 0xD7, 0x6C, 0x0B, 0x77, 0x58, 0x73, 0xC3, - 0x5F, 0x03, 0x4F, 0x00, 0xBD, 0x29, 0x8F, 0x8E, 0xFB, 0x11, 0xE7, 0xAA, - 0x0B, 0x78, 0x5E, 0xC7, 0xD8, 0x95, 0x9A, 0x22, 0x85, 0xE9, 0x52, 0xE0, - 0x73, 0x3A, 0x3C, 0xC5, 0xFB, 0x3D, 0x18, 0x63, 0xE2, 0xB8, 0xEA, 0x8C, - 0x31, 0x5F, 0x37, 0xC6, 0x8C, 0x19, 0x3B, 0x0D, 0x18, 0x63, 0x1E, 0x36, - 0xC6, 0xAC, 0x8A, 0xE9, 0xF7, 0xBB, 0x78, 0xAD, 0x36, 0xC6, 0x6C, 0x31, - 0xC6, 0x8C, 0x58, 0x7E, 0x27, 0xC7, 0x8D, 0x31, 0xB7, 0x1A, 0x63, 0x0A, - 0x71, 0x3E, 0x47, 0x5C, 0x2D, 0xF8, 0x22, 0xE0, 0x13, 0x96, 0xE3, 0xEE, - 0x88, 0x5A, 0x77, 0x77, 0x03, 0x7B, 0x6A, 0x38, 0xDF, 0x7D, 0x52, 0x87, - 0x9B, 0x3C, 0x70, 0x9D, 0x45, 0xE4, 0x3F, 0x0D, 0xF8, 0x24, 0xF0, 0x37, - 0x6D, 0xC9, 0xB1, 0x8D, 0x9B, 0x71, 0x04, 0x56, 0x6B, 0x35, 0xEF, 0xB5, - 0xD1, 0x36, 0xE0, 0x47, 0x35, 0x0E, 0x37, 0xD0, 0x0E, 0x8D, 0x90, 0x9F, - 0xB7, 0xBC, 0xFF, 0x5D, 0xC0, 0x35, 0xC4, 0x68, 0xE5, 0xC6, 0x01, 0xF8, - 0x02, 0xE0, 0x66, 0xCB, 0xD6, 0xDB, 0xA5, 0x2D, 0x77, 0x57, 0x86, 0x9C, - 0xAB, 0xED, 0xC0, 0x3D, 0xC0, 0x1B, 0x16, 0xF7, 0x4E, 0x46, 0x3C, 0xFB, - 0x69, 0xAE, 0x00, 0xCE, 0x6B, 0x80, 0xD0, 0x61, 0x71, 0xEF, 0x10, 0xF0, - 0x0B, 0xFD, 0xC0, 0x59, 0xD3, 0x63, 0x9A, 0x06, 0xD9, 0xA4, 0x7D, 0xD7, - 0x68, 0x7E, 0xED, 0x04, 0xE0, 0xC9, 0x9A, 0xFB, 0xD9, 0x38, 0x39, 0x3B, - 0xF5, 0x43, 0x66, 0x51, 0x45, 0xE0, 0x3E, 0x64, 0x8E, 0x38, 0x4C, 0xB3, - 0x90, 0x79, 0xF2, 0x7A, 0x17, 0x00, 0xB7, 0x02, 0xD7, 0x5A, 0x06, 0x56, - 0xBF, 0x05, 0x7A, 0xC8, 0xAE, 0xBA, 0x35, 0xD7, 0xB7, 0xD1, 0x07, 0x22, - 0xBA, 0x62, 0x15, 0x03, 0x3C, 0x0B, 0xBB, 0x29, 0xC0, 0xBD, 0xC8, 0x84, - 0x77, 0xD6, 0xB5, 0x11, 0xA9, 0xD7, 0x0A, 0xD3, 0xF2, 0xB8, 0xC6, 0xE1, - 0x72, 0x01, 0x2F, 0x43, 0xEA, 0xAB, 0xC2, 0xF4, 0x27, 0xA4, 0x20, 0x2D, - 0x97, 0x61, 0xB8, 0x39, 0xA4, 0xFA, 0xF2, 0x2F, 0x16, 0xF7, 0x4E, 0x05, - 0xE6, 0xBA, 0x00, 0xF8, 0x0A, 0x8B, 0xB1, 0x62, 0x14, 0x78, 0x46, 0x03, - 0x8C, 0x2C, 0x2F, 0x65, 0x34, 0x88, 0x35, 0xFB, 0xB4, 0xC5, 0xBD, 0x4D, - 0xC0, 0x8A, 0xA4, 0x01, 0xD7, 0x21, 0xD5, 0x09, 0x61, 0x3A, 0x40, 0x05, - 0xA7, 0xC3, 0x52, 0xA8, 0x43, 0x84, 0xFB, 0xED, 0x05, 0xED, 0x1D, 0x13, - 0x05, 0xDC, 0x64, 0x19, 0xE9, 0xED, 0xB5, 0x1C, 0x77, 0xDE, 0xAA, 0x6B, - 0x73, 0xB1, 0xBB, 0x2D, 0x07, 0xB0, 0x4D, 0xB9, 0xCE, 0x14, 0xA2, 0xCD, - 0xC8, 0xFD, 0xDF, 0x56, 0x38, 0x51, 0xD5, 0x63, 0x57, 0x86, 0xD3, 0x8B, - 0xCC, 0xE7, 0x46, 0x4D, 0xBF, 0xDA, 0x78, 0xB3, 0x00, 0xBE, 0xE4, 0x18, - 0xE0, 0xBC, 0xE6, 0xF5, 0x3D, 0xC0, 0x41, 0xA2, 0x55, 0x4A, 0x1E, 0x45, - 0xA6, 0x42, 0x2F, 0xB5, 0xB8, 0xB7, 0x40, 0x99, 0x53, 0xA6, 0xE5, 0x00, - 0x2E, 0x58, 0xE6, 0xBF, 0x51, 0xAB, 0xFB, 0xE7, 0x00, 0x1F, 0xD3, 0x54, - 0x61, 0x81, 0x02, 0x36, 0x0E, 0xB6, 0xE0, 0x21, 0x6D, 0x89, 0x9B, 0x80, - 0x47, 0xB1, 0x9F, 0xE6, 0x34, 0xC8, 0x4C, 0x9A, 0x0D, 0x9B, 0x7C, 0x92, - 0x2D, 0x38, 0x6F, 0xF9, 0x00, 0x51, 0x82, 0xAB, 0xA0, 0x94, 0xE5, 0x6B, - 0xDA, 0x7A, 0x5D, 0xD7, 0x0A, 0xC4, 0xC5, 0x1B, 0x57, 0xC8, 0xA7, 0x2D, - 0x5F, 0x8E, 0xAA, 0x0D, 0x4D, 0xF9, 0x18, 0xDE, 0xE4, 0x38, 0x75, 0x31, - 0x32, 0xF1, 0x9D, 0x06, 0xB8, 0x81, 0x2E, 0x04, 0xBE, 0x8A, 0x78, 0xF2, - 0x71, 0x47, 0xDD, 0x89, 0x03, 0x8E, 0x5B, 0x1D, 0x48, 0x09, 0x4C, 0xDA, - 0xB4, 0x14, 0xFB, 0x25, 0x38, 0xB9, 0x6A, 0x06, 0x8E, 0xAE, 0x01, 0x6E, - 0x75, 0x30, 0xA0, 0xB2, 0xD1, 0x98, 0x46, 0xBD, 0xCE, 0xC9, 0x35, 0xC0, - 0xBD, 0xB8, 0x5F, 0x68, 0x77, 0x2E, 0x8D, 0x00, 0xC7, 0x3D, 0xE0, 0x70, - 0xED, 0x43, 0x4C, 0xF9, 0xB4, 0x69, 0x0F, 0x55, 0x58, 0xA5, 0x50, 0x0B, - 0x80, 0x5F, 0x42, 0x16, 0x68, 0x1D, 0x4A, 0x49, 0x4B, 0x1E, 0xD3, 0x3C, - 0xF8, 0x7E, 0xC4, 0x6B, 0x77, 0x4E, 0xAE, 0xED, 0xD1, 0xD1, 0x0F, 0xFC, - 0x0A, 0x31, 0x46, 0xDE, 0x8B, 0xAC, 0xFA, 0xAF, 0x77, 0xF0, 0x7B, 0xCB, - 0x21, 0xAB, 0x2E, 0xFE, 0x83, 0xD4, 0x50, 0x6D, 0x24, 0x81, 0xB5, 0xBF, - 0x69, 0x04, 0x8C, 0x7E, 0x71, 0x3F, 0x07, 0xB6, 0x00, 0x57, 0x22, 0xC5, - 0xE1, 0x2E, 0x02, 0xEE, 0xD2, 0x1E, 0xA7, 0x87, 0xE8, 0x4E, 0x5D, 0xA6, - 0x01, 0xA3, 0x86, 0x41, 0xB7, 0x5E, 0x05, 0x47, 0x9F, 0x31, 0x15, 0xC1, - 0x60, 0x5D, 0x0A, 0x9E, 0x31, 0x8D, 0x51, 0xB5, 0x0F, 0xB2, 0xBC, 0x3C, - 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x80, 0xBD, 0x3C, 0x60, 0x2F, - 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x4A, 0x40, 0x69, 0x30, 0x3A, 0x5C, 0xAD, - 0xAA, 0x2C, 0x79, 0xC0, 0x13, 0xD7, 0x64, 0x64, 0x51, 0xF9, 0x6C, 0xC4, - 0x8B, 0xCE, 0xE1, 0x4E, 0xE1, 0x5D, 0x00, 0xF7, 0x14, 0xB2, 0x93, 0xEC, - 0x7E, 0xAA, 0xBC, 0xFF, 0x64, 0xDA, 0x01, 0xCF, 0x45, 0xAA, 0x2A, 0x3F, - 0x88, 0x54, 0x55, 0x36, 0x3B, 0x0A, 0x78, 0x10, 0x29, 0x7F, 0xDD, 0x08, - 0xFC, 0x1E, 0xC7, 0x36, 0x02, 0x77, 0x15, 0x70, 0x13, 0x52, 0x55, 0x79, - 0x07, 0xE9, 0x28, 0xBC, 0xEB, 0x40, 0xEA, 0x9B, 0x47, 0x81, 0x3F, 0xE0, - 0xE0, 0xAC, 0x92, 0x6B, 0x41, 0x56, 0xB0, 0x71, 0x69, 0x9A, 0xAA, 0x2A, - 0xDB, 0x80, 0x2F, 0xE1, 0x68, 0xB1, 0xA0, 0x8B, 0x55, 0x95, 0x69, 0xDC, - 0x47, 0xBA, 0x1D, 0x29, 0x9F, 0xF5, 0x80, 0x43, 0xD4, 0x9A, 0xE2, 0x8C, - 0xC4, 0x57, 0x55, 0x5A, 0xA8, 0x17, 0x47, 0x4B, 0x5F, 0x42, 0x34, 0x82, - 0x6C, 0x13, 0xEC, 0x01, 0x87, 0x68, 0x2F, 0xB2, 0x6F, 0x63, 0xDA, 0xB4, - 0x0B, 0xBB, 0xFD, 0x37, 0x32, 0x0F, 0xB8, 0x1B, 0x29, 0xBA, 0x7B, 0x85, - 0x74, 0x54, 0x72, 0x8C, 0x6A, 0x1E, 0x7C, 0x3F, 0x70, 0xD8, 0xA7, 0x49, - 0xE1, 0x1A, 0x40, 0xF6, 0xAE, 0x3C, 0x83, 0xEC, 0xDE, 0x73, 0x19, 0xD1, - 0xF7, 0x62, 0xAE, 0x96, 0x86, 0x91, 0x9D, 0x83, 0x9E, 0x42, 0x56, 0x18, - 0x96, 0x3C, 0x60, 0x3B, 0x1D, 0x47, 0x6A, 0xA3, 0x9F, 0x44, 0x36, 0xF3, - 0x6C, 0x71, 0x14, 0xF0, 0x00, 0x72, 0x08, 0xD6, 0x61, 0x12, 0x3C, 0x17, - 0x29, 0x8D, 0x80, 0x41, 0xAC, 0xBF, 0xFD, 0x7A, 0xF9, 0xAA, 0xCA, 0x1A, - 0x04, 0x9C, 0xBA, 0x2F, 0xD2, 0x55, 0xF9, 0xE9, 0x42, 0x0F, 0xD8, 0xCB, - 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x3C, 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, - 0xF6, 0xF2, 0x80, 0xB3, 0xA4, 0x34, 0x18, 0x1D, 0x2E, 0x3A, 0x59, 0xC1, - 0x41, 0x99, 0x1E, 0xF0, 0x04, 0x35, 0x05, 0x39, 0xB7, 0x60, 0x0E, 0x6E, - 0xAE, 0xF0, 0x37, 0x88, 0x17, 0xDD, 0x83, 0x4C, 0x6F, 0x0E, 0x7B, 0xC0, - 0xF6, 0x9A, 0x07, 0x7C, 0x1C, 0xB8, 0x5E, 0x01, 0x37, 0x39, 0xFA, 0xDD, - 0x0D, 0x22, 0xBB, 0xE8, 0x3E, 0x8E, 0x9C, 0x07, 0xEC, 0xAB, 0x2A, 0x2D, - 0xD4, 0x88, 0x1C, 0x6C, 0xF9, 0x65, 0xEC, 0xF6, 0xA2, 0x4E, 0x5A, 0x2B, - 0x90, 0x7A, 0xAC, 0x21, 0xEC, 0xF7, 0xAA, 0xCC, 0x74, 0x90, 0x75, 0x09, - 0x52, 0x36, 0x9B, 0x06, 0xB8, 0x81, 0x16, 0xE1, 0xAB, 0x2A, 0xAD, 0xD5, - 0x81, 0xA3, 0xD5, 0x89, 0x21, 0x6A, 0x07, 0x16, 0x7B, 0xC0, 0xE1, 0x6A, - 0x25, 0x9D, 0x07, 0x77, 0xE4, 0x88, 0xE9, 0x18, 0x9C, 0x5A, 0x07, 0xDC, - 0x8B, 0xC3, 0xD5, 0x11, 0x6F, 0xA1, 0x33, 0xF8, 0xBD, 0x2A, 0xAD, 0xB4, - 0x0F, 0xE8, 0x4C, 0x21, 0xE0, 0x5D, 0xD4, 0x68, 0x55, 0x65, 0xDC, 0x0B, - 0xC2, 0xBA, 0x90, 0x0A, 0xC5, 0x83, 0x29, 0x31, 0x12, 0xC6, 0x34, 0x0F, - 0x8E, 0x5A, 0x55, 0x59, 0xB5, 0x85, 0x74, 0xE5, 0xA4, 0x49, 0x25, 0xEC, - 0x8A, 0xD4, 0xA3, 0xBC, 0x44, 0x41, 0x55, 0xE5, 0x10, 0xB0, 0x1A, 0x29, - 0xBA, 0x73, 0xB9, 0x6E, 0xEC, 0x59, 0xE4, 0xA0, 0xAB, 0xCD, 0x11, 0x5E, - 0x48, 0xDB, 0x23, 0x0E, 0x4C, 0xD2, 0x80, 0xC7, 0xB1, 0x3B, 0x70, 0x23, - 0xAA, 0x51, 0x71, 0x5C, 0x21, 0x6F, 0xD7, 0xA8, 0xBA, 0x11, 0x37, 0x0F, - 0xE5, 0x28, 0x22, 0xE7, 0x02, 0x1F, 0x26, 0xDA, 0xAA, 0xC2, 0x46, 0xEC, - 0xDC, 0xB9, 0x52, 0x1C, 0x9F, 0xBB, 0x1C, 0xC0, 0xA3, 0xD8, 0xB9, 0x37, - 0xE7, 0x23, 0xD6, 0xE3, 0x50, 0xC4, 0xD6, 0xD1, 0xA9, 0x5D, 0x76, 0xDE, - 0x51, 0xC0, 0x13, 0x2D, 0x06, 0x9C, 0x83, 0xDD, 0x02, 0x3B, 0x43, 0x0C, - 0xCB, 0x78, 0xCA, 0x01, 0x7C, 0xDA, 0xF2, 0xCD, 0x6D, 0x07, 0x16, 0x62, - 0x77, 0x40, 0xF2, 0xB9, 0x3E, 0x64, 0xAD, 0x55, 0x55, 0xCE, 0xB3, 0xCC, - 0x99, 0x8F, 0xC5, 0xF1, 0xD9, 0xCB, 0x09, 0xB2, 0xC6, 0xB1, 0x5B, 0x70, - 0xB5, 0x48, 0x01, 0x7B, 0x89, 0x16, 0x10, 0x7E, 0xA0, 0x67, 0x89, 0x98, - 0x4E, 0x49, 0x2F, 0x07, 0xB0, 0x01, 0x9E, 0xB3, 0xE8, 0x46, 0x0A, 0xD8, - 0x9D, 0x10, 0x9E, 0x05, 0x35, 0x03, 0xEF, 0xB1, 0xB8, 0x6F, 0x18, 0x39, - 0x26, 0x20, 0xF1, 0x34, 0x69, 0x27, 0x32, 0xAB, 0x12, 0xA6, 0xB5, 0xA4, - 0x6B, 0xD5, 0x7E, 0xA5, 0xB4, 0x54, 0xB3, 0x83, 0x30, 0xF5, 0x11, 0xD3, - 0x61, 0xDA, 0xE5, 0x02, 0x3E, 0x8C, 0xAC, 0x04, 0x0C, 0xD3, 0x32, 0xE0, - 0x43, 0x19, 0x87, 0x9B, 0x07, 0x6E, 0xC2, 0x6E, 0x22, 0xE5, 0x05, 0x85, - 0x9C, 0x38, 0xE0, 0x53, 0xC8, 0xEA, 0x3A, 0x9B, 0xDF, 0x73, 0x1B, 0x30, - 0x3D, 0xC3, 0x80, 0x57, 0x00, 0xEB, 0x2C, 0xEF, 0x7D, 0xC2, 0xB2, 0x67, - 0xAC, 0x38, 0xE0, 0xD3, 0xFA, 0x30, 0x36, 0x15, 0x0D, 0x57, 0x20, 0x73, - 0xBD, 0x0D, 0x19, 0x84, 0xDB, 0x02, 0xDC, 0x8E, 0xEC, 0xFD, 0x15, 0xA6, - 0x5E, 0xE4, 0xA0, 0x8F, 0x92, 0x0B, 0x80, 0x8D, 0x76, 0x27, 0xCF, 0x58, - 0xDC, 0x5B, 0x8F, 0x4C, 0xE4, 0xAF, 0xC9, 0x18, 0xDC, 0x7A, 0x64, 0xDF, - 0xAF, 0x9B, 0xB1, 0xAB, 0x2F, 0xDB, 0x42, 0x8C, 0x67, 0x47, 0xC5, 0x31, - 0xD9, 0xF0, 0x3A, 0xF0, 0x3B, 0x4B, 0x33, 0xA2, 0x0D, 0xF8, 0x06, 0x70, - 0x79, 0x46, 0xE0, 0x16, 0x90, 0xD2, 0xA3, 0x3B, 0x81, 0x99, 0x96, 0x43, - 0xDE, 0xE3, 0xD8, 0x1F, 0x55, 0x5B, 0x15, 0xC0, 0xE3, 0xC0, 0x9F, 0x91, - 0xC5, 0xD0, 0x36, 0xBA, 0x12, 0xF8, 0x26, 0xB2, 0x27, 0x56, 0xAD, 0xC3, - 0xBD, 0x0E, 0xD8, 0x80, 0xDD, 0x61, 0xD0, 0x00, 0xDB, 0x80, 0x1D, 0x71, - 0x47, 0x76, 0x71, 0xE8, 0x55, 0xE4, 0xAC, 0x23, 0x5B, 0x4F, 0x76, 0x1D, - 0xF0, 0x43, 0xE0, 0x06, 0xDC, 0x3C, 0xF8, 0x2A, 0x8E, 0x31, 0xF7, 0x46, - 0xE0, 0xDB, 0xC8, 0x01, 0x5F, 0x36, 0x3A, 0x01, 0x3C, 0x18, 0x57, 0x7A, - 0x14, 0x28, 0xCE, 0x99, 0x9A, 0x4D, 0xFA, 0xA1, 0xD6, 0x5A, 0xFE, 0xDE, - 0x1B, 0x35, 0x37, 0x9E, 0x05, 0x6C, 0x65, 0x62, 0x56, 0xA6, 0x8B, 0x9A, - 0xAF, 0x2F, 0xF0, 0x67, 0x89, 0x66, 0xF0, 0x3C, 0xAA, 0x2D, 0x18, 0x57, - 0x01, 0xF7, 0x02, 0xF7, 0x21, 0x1B, 0xA7, 0xCC, 0xB5, 0xB8, 0x3F, 0x07, - 0x5C, 0x05, 0xCC, 0xD0, 0x3C, 0x79, 0x0B, 0xF0, 0x22, 0xE2, 0xC1, 0xA6, - 0x51, 0xB3, 0x81, 0xE5, 0xFA, 0xE2, 0xAE, 0x21, 0x9A, 0x3D, 0xBB, 0x0B, - 0xF8, 0x19, 0x70, 0x32, 0xEE, 0x87, 0xCA, 0x19, 0x13, 0xEB, 0x44, 0xCD, - 0x24, 0xE0, 0x2B, 0xC0, 0x77, 0x88, 0xB6, 0xF3, 0xDB, 0x00, 0xB0, 0x1B, - 0x99, 0x22, 0xDC, 0x89, 0xD8, 0x74, 0x47, 0x90, 0xF2, 0x1D, 0x57, 0x37, - 0x46, 0xAB, 0x43, 0xAC, 0xC7, 0x79, 0x3A, 0xC6, 0xBE, 0x1B, 0xB1, 0x21, - 0xDB, 0x89, 0x36, 0x45, 0xFA, 0x06, 0xF0, 0x2D, 0x64, 0xE3, 0x19, 0x5C, - 0x07, 0x0C, 0x70, 0x1E, 0xF0, 0x3D, 0xE0, 0x8B, 0x13, 0xE8, 0x21, 0x4E, - 0xEA, 0x78, 0xBE, 0x07, 0xF1, 0xB9, 0x4F, 0x00, 0x47, 0x75, 0x5C, 0x72, - 0xA1, 0x56, 0x2B, 0xAF, 0x31, 0xC3, 0x5C, 0x1D, 0x5A, 0x66, 0x6A, 0x8F, - 0xB5, 0x14, 0x99, 0x44, 0x88, 0xBA, 0x0A, 0x63, 0x10, 0xB8, 0x1B, 0xB8, - 0x57, 0x23, 0xE8, 0x54, 0x00, 0x06, 0x39, 0xCF, 0xFE, 0x2E, 0x60, 0xFD, - 0x04, 0x03, 0xB9, 0x31, 0x85, 0x3B, 0x84, 0x9C, 0x48, 0x1A, 0x00, 0x36, - 0x0E, 0x01, 0x6E, 0xD5, 0x60, 0x6A, 0xFA, 0x04, 0x3F, 0xE3, 0x19, 0x1D, - 0xD2, 0x7E, 0x50, 0xC9, 0x61, 0xA9, 0x52, 0x80, 0x01, 0x2E, 0x06, 0xBE, - 0x0F, 0x7C, 0x34, 0xA6, 0x48, 0xD9, 0xA5, 0x0D, 0xC1, 0xCB, 0x55, 0x11, - 0x78, 0x48, 0x33, 0x89, 0x43, 0x15, 0x7D, 0xD8, 0x0A, 0x02, 0x06, 0x59, - 0xA9, 0xB0, 0x01, 0x31, 0xD9, 0x9D, 0xDC, 0x8D, 0x35, 0x01, 0x1D, 0x05, - 0x1E, 0x06, 0xEE, 0x01, 0x5E, 0xAE, 0xF8, 0xDB, 0x58, 0x61, 0xC0, 0x00, - 0x4B, 0x80, 0x2F, 0x20, 0x0B, 0xCA, 0x16, 0x64, 0x1C, 0x6E, 0x37, 0xF0, - 0x4B, 0xCD, 0x77, 0x8F, 0x54, 0xA5, 0xBB, 0xA9, 0x02, 0xE0, 0x20, 0x85, - 0x58, 0x07, 0xDC, 0x82, 0xD8, 0x94, 0x59, 0x9B, 0x70, 0x28, 0x22, 0x13, - 0x08, 0x8F, 0xA8, 0x5F, 0xD0, 0x5F, 0xB5, 0xF1, 0xA4, 0x4A, 0x80, 0x03, - 0x77, 0x67, 0x25, 0xF0, 0x29, 0xE0, 0x7D, 0xC8, 0x1A, 0xA4, 0x5A, 0xDF, - 0x61, 0x60, 0x54, 0x5B, 0xED, 0x56, 0x85, 0xFB, 0x02, 0x55, 0x3E, 0xD7, - 0xA1, 0x9A, 0x80, 0x03, 0x2D, 0x56, 0xD0, 0x1F, 0xD1, 0xD6, 0x1C, 0x9C, - 0xAC, 0x52, 0x6B, 0x2D, 0xF6, 0x00, 0xE2, 0xCF, 0x6F, 0x06, 0xFE, 0x05, - 0xBC, 0x96, 0x48, 0x44, 0x98, 0x00, 0x60, 0x10, 0x23, 0xFE, 0x42, 0xCD, - 0x21, 0x57, 0x29, 0xE8, 0x85, 0x88, 0x75, 0xD9, 0x98, 0x52, 0xA8, 0x43, - 0x1A, 0x40, 0x05, 0x60, 0x9F, 0x45, 0x1C, 0xAA, 0x83, 0x49, 0x66, 0x00, - 0x49, 0x01, 0x0E, 0x54, 0xA7, 0x79, 0xE4, 0x45, 0x7A, 0xAD, 0x54, 0xF0, - 0x6F, 0x53, 0xC3, 0x64, 0x0A, 0x30, 0xCD, 0x51, 0xA0, 0x7D, 0x88, 0x03, - 0xD7, 0xA7, 0x39, 0x7B, 0x27, 0x52, 0x08, 0xDF, 0xAD, 0xD7, 0x49, 0x1C, - 0x70, 0xE1, 0x92, 0x06, 0x7C, 0xB6, 0x1A, 0x10, 0x77, 0x68, 0x86, 0x9A, - 0x08, 0x33, 0x35, 0x38, 0x5B, 0x82, 0x7B, 0x4B, 0x4A, 0x8D, 0x02, 0xED, - 0x51, 0x93, 0x22, 0x38, 0x05, 0xAD, 0x0F, 0xC7, 0xAC, 0x55, 0x97, 0x00, - 0x9F, 0xAB, 0x1B, 0x6F, 0xD2, 0xD6, 0xEC, 0xE2, 0xCA, 0x86, 0x7E, 0xA4, - 0x64, 0xC9, 0xE9, 0x45, 0x72, 0x2E, 0x03, 0xF6, 0x8A, 0x41, 0x7E, 0x23, - 0x34, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x92, 0xD1, 0xFF, - 0x06, 0x00, 0x3D, 0x67, 0xD1, 0x66, 0xCA, 0xCF, 0x19, 0x9B, 0x00, 0x00, - 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static unsigned char* misc_icon = raw::misc; -} \ No newline at end of file diff --git a/gmod/icons/rage.hpp b/gmod/icons/rage.hpp deleted file mode 100644 index 00e0764..0000000 --- a/gmod/icons/rage.hpp +++ /dev/null @@ -1,1630 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\rage.png (4/1/2018 9:59:32 PM) - StartOffset: 00000000, EndOffset: 00004BD9, Length: 00004BDA */ - -namespace icons { -constexpr static size_t rage_size = 19418; -namespace raw { -static unsigned char rage[19418] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, - 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, - 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x65, - 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, 0x61, 0x36, - 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, 0x2D, 0x63, - 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, 0x39, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x65, 0x31, 0x37, 0x35, - 0x35, 0x65, 0x39, 0x63, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, - 0x31, 0x36, 0x37, 0x34, 0x65, 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, - 0x2D, 0x63, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, - 0x66, 0x31, 0x35, 0x61, 0x38, 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x31, 0x36, 0x37, 0x34, 0x65, - 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, 0x2D, 0x63, 0x39, 0x34, 0x38, - 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, 0x66, 0x31, 0x35, 0x61, 0x38, - 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, - 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x65, 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, - 0x61, 0x36, 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, - 0x2D, 0x63, 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, - 0x39, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xB3, 0x93, 0x52, 0x50, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x05, 0xFC, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x88, 0x94, 0x55, 0x18, 0xC7, - 0x7F, 0xB3, 0xAB, 0x6B, 0xA9, 0xD9, 0x62, 0xBA, 0x56, 0xBB, 0x62, 0x94, - 0x90, 0xD9, 0x05, 0xB5, 0x48, 0x4B, 0x14, 0xBB, 0x80, 0x5D, 0xB4, 0xD8, - 0xAF, 0xF5, 0xA1, 0x02, 0x23, 0xB0, 0x08, 0xA2, 0x0F, 0x51, 0x51, 0x1F, - 0xBA, 0x10, 0xA5, 0x11, 0x14, 0x51, 0x54, 0xC2, 0x16, 0x11, 0x44, 0xD1, - 0xE5, 0x43, 0x45, 0x37, 0x37, 0x8C, 0xCC, 0xB2, 0x02, 0xD3, 0xC8, 0x56, - 0xB0, 0xA2, 0xD6, 0x75, 0x6D, 0xD5, 0x35, 0x37, 0xDB, 0xD5, 0xD9, 0x99, - 0x3E, 0x3C, 0xCF, 0xA0, 0x81, 0xF3, 0x9E, 0x33, 0x7B, 0x19, 0xDF, 0x77, - 0xF6, 0xFF, 0x83, 0x61, 0x84, 0x79, 0x77, 0xDE, 0x71, 0x7E, 0xEF, 0x39, - 0xE7, 0x39, 0xCF, 0x7B, 0xCE, 0x33, 0xB9, 0x62, 0xB1, 0x88, 0xA8, 0x5D, - 0xEA, 0xF4, 0x15, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, - 0x04, 0x0B, 0x09, 0x16, 0x12, 0x2C, 0xC1, 0x42, 0x82, 0x85, 0x04, 0x0B, - 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, 0x16, - 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, - 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, - 0x0B, 0x09, 0x96, 0x60, 0x51, 0x4B, 0x8C, 0xAB, 0xF0, 0xF8, 0x1C, 0x30, - 0x03, 0xC8, 0x03, 0x3D, 0xC3, 0x38, 0xEF, 0x49, 0xC0, 0xE9, 0xC0, 0x78, - 0xA0, 0x50, 0xE3, 0xDF, 0xF1, 0x61, 0xE0, 0x90, 0x3F, 0xFA, 0x81, 0x62, - 0x5A, 0x05, 0xCF, 0x05, 0x2E, 0x02, 0x16, 0xFA, 0x07, 0xDD, 0x08, 0x7C, - 0x07, 0x74, 0x55, 0x78, 0xCE, 0x8B, 0x81, 0x45, 0xC0, 0x7C, 0xA0, 0xA1, - 0x86, 0x05, 0xE7, 0x5C, 0xE6, 0xBF, 0xC0, 0x3E, 0xA0, 0x13, 0xD8, 0x0D, - 0xF4, 0xF9, 0xF3, 0x4E, 0x97, 0x3E, 0xAA, 0xFF, 0xFF, 0x5C, 0xE4, 0x0E, - 0xFF, 0xF9, 0xC0, 0x83, 0xC0, 0x02, 0x6F, 0x79, 0x83, 0xC0, 0x1F, 0xC0, - 0x27, 0xC0, 0x5A, 0xE0, 0xCF, 0xC8, 0xF3, 0x2D, 0x01, 0x1E, 0x00, 0xE6, - 0x01, 0xD3, 0xFC, 0x4B, 0xA8, 0x75, 0x06, 0x81, 0x01, 0xE0, 0x1F, 0xE0, - 0x6F, 0x17, 0xFE, 0x3B, 0xB0, 0xC9, 0x25, 0xFF, 0xEC, 0xCF, 0x7D, 0x27, - 0x4A, 0x70, 0x33, 0xF0, 0x1C, 0xD0, 0x7A, 0x9C, 0xD7, 0xFA, 0x81, 0x67, - 0x81, 0xFB, 0x22, 0xCE, 0x35, 0x0B, 0x68, 0x03, 0x96, 0x69, 0x64, 0x04, - 0x97, 0xBD, 0x17, 0xF8, 0xD1, 0x65, 0x6F, 0x06, 0xBE, 0x07, 0x7A, 0xAB, - 0x2D, 0xB8, 0x15, 0x78, 0x0B, 0xA8, 0x2F, 0xF3, 0xFA, 0x5E, 0xE0, 0x72, - 0xA0, 0x23, 0xF0, 0x3E, 0xB7, 0x03, 0x2F, 0xC9, 0xEB, 0x71, 0xE9, 0x05, - 0xB6, 0x03, 0x1F, 0x03, 0x9F, 0xBB, 0xE8, 0x43, 0xD5, 0x8A, 0xA2, 0xCF, - 0x4D, 0x90, 0x0B, 0x70, 0x1A, 0xB0, 0x32, 0xE2, 0x3C, 0x0B, 0xE5, 0xB1, - 0x2C, 0x8D, 0x1E, 0x97, 0xDC, 0x03, 0x3C, 0x06, 0xAC, 0x02, 0x66, 0x56, - 0x2B, 0xC8, 0x9A, 0x18, 0x78, 0xBD, 0xE8, 0x01, 0x58, 0x48, 0xF0, 0x14, - 0x3F, 0x36, 0x27, 0x9F, 0x65, 0x99, 0x02, 0x2C, 0x05, 0xE6, 0xF8, 0x77, - 0xBA, 0xCE, 0x5B, 0x73, 0x61, 0x34, 0x5B, 0xF0, 0x60, 0xE0, 0xF5, 0x82, - 0x4F, 0x05, 0x42, 0x1C, 0x91, 0xBF, 0x68, 0x9A, 0x80, 0xDB, 0x80, 0x47, - 0x81, 0x1B, 0x80, 0x09, 0xA3, 0xD5, 0x82, 0x73, 0x91, 0x57, 0xCF, 0x40, - 0xC4, 0x31, 0x05, 0x79, 0xAB, 0x88, 0x06, 0x60, 0xB9, 0x07, 0xB9, 0x53, - 0x81, 0x37, 0x3C, 0xA8, 0x1D, 0xD5, 0x44, 0x47, 0xD2, 0x85, 0x10, 0xEA, - 0xC6, 0x89, 0xE8, 0xA2, 0x4B, 0x53, 0x89, 0x5A, 0xE8, 0xC6, 0x8B, 0x1E, - 0xBB, 0x34, 0x78, 0x4F, 0x39, 0x61, 0x88, 0x2D, 0xF1, 0x02, 0xE0, 0x61, - 0x6F, 0x20, 0xAF, 0x63, 0x49, 0xA6, 0xAA, 0x0B, 0x1E, 0x29, 0x36, 0x00, - 0x1F, 0xF8, 0xE7, 0xCA, 0xD5, 0x80, 0xE0, 0x06, 0xE0, 0x14, 0x7F, 0x6E, - 0x04, 0xCE, 0x07, 0xCE, 0xF4, 0x5C, 0xC2, 0xC4, 0x0A, 0xDE, 0x6B, 0x96, - 0xE7, 0x21, 0x7A, 0x81, 0xF7, 0xB2, 0x2C, 0x78, 0x23, 0xF0, 0x8A, 0x5F, - 0xF9, 0xB5, 0x20, 0xB8, 0x0E, 0x4B, 0xC7, 0xD6, 0x7B, 0xEB, 0x3D, 0x07, - 0x38, 0x1B, 0x4B, 0xF4, 0x2C, 0x72, 0xE1, 0x93, 0x23, 0xDF, 0x6F, 0x36, - 0xF0, 0x10, 0x96, 0x11, 0xDB, 0x9C, 0x55, 0xC1, 0xF9, 0xC8, 0xF1, 0x3C, - 0xAB, 0x74, 0xFA, 0x45, 0xFC, 0xA1, 0xCB, 0xBD, 0x16, 0xB8, 0xCE, 0x23, - 0xE6, 0x98, 0x0B, 0x7A, 0x01, 0x96, 0x09, 0x5C, 0x4D, 0x64, 0x8A, 0x38, - 0x6D, 0x82, 0x27, 0x8D, 0x81, 0xE0, 0x29, 0x0F, 0xEC, 0xF1, 0xC7, 0x56, - 0x2C, 0x8B, 0x75, 0x93, 0x8B, 0x3E, 0x39, 0xE2, 0xEF, 0x57, 0x60, 0xF7, - 0x00, 0x9E, 0x8C, 0x19, 0x8F, 0x75, 0xBB, 0xF0, 0xC4, 0xD2, 0x03, 0xBC, - 0xE3, 0xE3, 0x6B, 0x1B, 0x71, 0xF9, 0xE8, 0x71, 0xC0, 0x1D, 0xC0, 0xA5, - 0x23, 0x35, 0x0F, 0xAE, 0xF6, 0xB8, 0x35, 0x16, 0xF9, 0x05, 0xCB, 0x60, - 0xBD, 0x10, 0x29, 0x79, 0x26, 0x70, 0x67, 0x4C, 0xA0, 0xA6, 0x16, 0x9C, - 0x1E, 0x76, 0x01, 0x6B, 0x3C, 0xC8, 0x8C, 0x49, 0x0A, 0xDD, 0x88, 0xDD, - 0x03, 0x90, 0xE0, 0x0C, 0xF1, 0x17, 0xF0, 0x94, 0x4F, 0x15, 0x63, 0xE2, - 0x95, 0x5B, 0x7D, 0x0A, 0x26, 0xC1, 0x19, 0xA2, 0x0B, 0x78, 0x02, 0xF8, - 0x2D, 0xE2, 0xD8, 0x95, 0xC0, 0x79, 0x12, 0x9C, 0x3D, 0xBE, 0xF5, 0xAE, - 0x3A, 0x14, 0x93, 0x4C, 0x01, 0xAE, 0x4F, 0x9A, 0x0D, 0x49, 0x70, 0x7A, - 0x69, 0x03, 0x76, 0x44, 0x1C, 0xB7, 0x3C, 0x69, 0x7A, 0x25, 0xC1, 0xE9, - 0xA5, 0x13, 0x78, 0x33, 0x62, 0xAE, 0x3B, 0x17, 0x4B, 0x65, 0x4A, 0x70, - 0x06, 0x79, 0x9B, 0xF0, 0x12, 0x9E, 0xA9, 0x58, 0x86, 0x2B, 0x27, 0xC1, - 0xD9, 0x63, 0x07, 0xB6, 0x94, 0x27, 0x14, 0x47, 0xCD, 0xA6, 0xCC, 0xAA, - 0x1B, 0x09, 0x4E, 0x37, 0x87, 0xB1, 0x3B, 0x6C, 0x21, 0x9A, 0xCA, 0xB9, - 0x94, 0xE0, 0x74, 0x53, 0x00, 0xBE, 0x21, 0xBC, 0x58, 0xA2, 0x89, 0x32, - 0xF7, 0x9A, 0x25, 0x38, 0xDD, 0x14, 0x81, 0x6E, 0xC2, 0x99, 0xAD, 0xE9, - 0x94, 0x49, 0x5B, 0x4A, 0x70, 0x36, 0x5A, 0x71, 0x28, 0x92, 0x9E, 0x84, - 0xDD, 0x77, 0x96, 0xE0, 0x0C, 0x52, 0xDA, 0x02, 0x93, 0x44, 0xBD, 0xC6, - 0xE0, 0xEC, 0x92, 0x27, 0x79, 0x5D, 0x3A, 0xDE, 0x85, 0x17, 0x24, 0x38, - 0x9B, 0x4C, 0x20, 0xBC, 0x30, 0x63, 0x3F, 0x65, 0x76, 0x42, 0x48, 0x70, - 0xBA, 0xA9, 0xC3, 0x32, 0x55, 0x21, 0xC1, 0xDD, 0xD8, 0xA6, 0x36, 0x09, - 0xCE, 0x20, 0x57, 0x11, 0x5E, 0xAF, 0xB5, 0xAF, 0x5C, 0x20, 0x26, 0xC1, - 0xE9, 0xA6, 0x11, 0xB8, 0x24, 0xE2, 0xB8, 0x4E, 0x8D, 0xC1, 0xD9, 0x64, - 0x29, 0xB6, 0xB3, 0x21, 0x89, 0x7E, 0x60, 0x8B, 0x04, 0x67, 0x8F, 0x71, - 0xD8, 0x6A, 0xCB, 0xD0, 0xBA, 0xAB, 0x2E, 0x60, 0x5B, 0xB9, 0xA9, 0x94, - 0x04, 0xA7, 0x97, 0x25, 0xC0, 0x95, 0x11, 0xC7, 0x7D, 0x4D, 0x42, 0xBD, - 0x14, 0x09, 0x4E, 0xEF, 0xD8, 0x7B, 0x37, 0xB6, 0xF7, 0x3A, 0xC4, 0xBB, - 0x24, 0x6C, 0x16, 0x90, 0xE0, 0x74, 0x72, 0x0B, 0x70, 0x4D, 0xC4, 0x71, - 0x5B, 0x81, 0xAF, 0x48, 0xC8, 0x74, 0x49, 0x70, 0xFA, 0xB8, 0x1A, 0xB8, - 0x0B, 0x2B, 0x35, 0x15, 0xE2, 0x35, 0x9F, 0x03, 0x23, 0xC1, 0xD9, 0x60, - 0x19, 0xF0, 0x08, 0x76, 0x03, 0x3F, 0xC4, 0x4F, 0xDE, 0x3D, 0x17, 0x42, - 0x91, 0x9A, 0x38, 0xF1, 0x34, 0x78, 0xCB, 0xBD, 0x1F, 0xB8, 0x2C, 0xE2, - 0xF8, 0x22, 0xF0, 0x22, 0xF0, 0x6B, 0x4C, 0x28, 0x9E, 0x26, 0xEA, 0xC7, - 0xA0, 0xDC, 0x66, 0x6C, 0x43, 0xD9, 0x2A, 0xE2, 0x92, 0x1A, 0x00, 0xEB, - 0xB1, 0xCA, 0x47, 0x85, 0xAC, 0x09, 0x1E, 0x4B, 0x75, 0x3C, 0xA6, 0xBB, - 0xD0, 0x56, 0x6C, 0x1B, 0x69, 0x4B, 0xE4, 0xDF, 0x75, 0x62, 0xBB, 0x1F, - 0xBA, 0x63, 0x27, 0xD3, 0x69, 0x62, 0x7F, 0x8D, 0x4B, 0x9D, 0xEA, 0x53, - 0xA0, 0x79, 0xC0, 0x62, 0xE0, 0x0A, 0xEC, 0x66, 0x42, 0x6C, 0x69, 0x87, - 0x3E, 0xE0, 0x69, 0xA0, 0x3D, 0xF6, 0x84, 0x69, 0x13, 0xDC, 0x02, 0x5C, - 0xE8, 0xFF, 0xAE, 0x95, 0x72, 0x4B, 0x75, 0x1E, 0x11, 0xB7, 0xB8, 0xD8, - 0xB3, 0xFC, 0x79, 0x16, 0xF1, 0xBB, 0xFB, 0xC1, 0xAA, 0x1D, 0xAD, 0xF3, - 0xC7, 0x91, 0xAC, 0x0A, 0x5E, 0x41, 0x60, 0xAF, 0x4D, 0x06, 0xA9, 0x77, - 0xC1, 0x33, 0xB0, 0xFA, 0x1C, 0x13, 0x29, 0xB3, 0xBC, 0x26, 0x81, 0x02, - 0xB6, 0x08, 0x7E, 0x2D, 0x56, 0xA4, 0x86, 0xAC, 0x0A, 0x9E, 0xE3, 0x0F, - 0x71, 0x94, 0x7E, 0x6C, 0x01, 0xFC, 0xE3, 0xC4, 0x17, 0x7D, 0x8D, 0x16, - 0x3C, 0x52, 0xDD, 0x64, 0xEE, 0x98, 0x87, 0x88, 0xA7, 0x07, 0xAB, 0x8F, - 0xF5, 0x3C, 0xE1, 0x5A, 0xA0, 0x43, 0x6E, 0xC1, 0xA1, 0xEE, 0xA4, 0x9E, - 0xB8, 0xDA, 0x1A, 0xE3, 0xE5, 0xAB, 0x22, 0x3A, 0x80, 0x97, 0x5D, 0xF0, - 0xAE, 0xA1, 0xBE, 0x49, 0x48, 0x70, 0x91, 0xF0, 0x92, 0xCD, 0x41, 0xC2, - 0x65, 0x07, 0x0A, 0x84, 0x4B, 0x22, 0x8A, 0xA3, 0x33, 0x89, 0x0D, 0xC0, - 0xAB, 0xC0, 0xA7, 0x0C, 0xB3, 0x8E, 0x74, 0x8C, 0xE0, 0xDD, 0x11, 0x82, - 0x3F, 0x8B, 0x10, 0xBC, 0x53, 0x5D, 0x74, 0x70, 0x0A, 0xB4, 0x15, 0x78, - 0x1F, 0xF8, 0x08, 0xBB, 0xC7, 0x3B, 0xEC, 0xF2, 0x8F, 0x31, 0x5D, 0xF4, - 0x36, 0xEC, 0xA6, 0xF2, 0x19, 0x09, 0xAF, 0x7F, 0x11, 0xF1, 0x3E, 0xED, - 0x58, 0x12, 0xFD, 0x54, 0xB9, 0xFC, 0xDF, 0x85, 0xBF, 0x07, 0xDB, 0x60, - 0xB6, 0xDE, 0x5B, 0xEE, 0x0F, 0xC0, 0xC1, 0x91, 0x3A, 0x41, 0xAC, 0xE0, - 0x67, 0x80, 0x7B, 0xB1, 0x32, 0xFC, 0xA5, 0x74, 0xE2, 0x11, 0xAC, 0x34, - 0xFD, 0x9A, 0xC8, 0x6E, 0x64, 0x13, 0x56, 0x39, 0x7E, 0xB5, 0x4F, 0xF8, - 0xC7, 0x22, 0xA5, 0xF2, 0xFE, 0x3D, 0x3E, 0xAE, 0x6E, 0x07, 0xBE, 0xC4, - 0xAA, 0xBE, 0x77, 0x54, 0x3A, 0x05, 0x8A, 0x8A, 0x6E, 0x23, 0x7F, 0xB3, - 0xA1, 0x11, 0xB8, 0x19, 0xFB, 0xED, 0x86, 0x19, 0xC7, 0x7C, 0xC8, 0x76, - 0xAC, 0x76, 0x62, 0x6C, 0x75, 0xBA, 0x69, 0x58, 0xE1, 0x90, 0xC5, 0x3E, - 0xE1, 0xAF, 0xE5, 0x1F, 0xE5, 0x28, 0x71, 0x18, 0x38, 0x80, 0x55, 0xC6, - 0x3F, 0xE0, 0x63, 0xEC, 0x16, 0x1F, 0xB2, 0xBA, 0xB0, 0xDF, 0xBE, 0xC8, - 0x8F, 0xD6, 0xC9, 0x63, 0x05, 0x83, 0x95, 0x09, 0x68, 0xC2, 0xEA, 0x42, - 0x94, 0x02, 0xAB, 0xCE, 0x21, 0x04, 0x4F, 0x93, 0xB1, 0x2C, 0x4E, 0xF3, - 0x18, 0x11, 0x3C, 0xE0, 0x5D, 0xEE, 0x41, 0x6C, 0x71, 0x7A, 0xE9, 0x57, - 0x58, 0xF2, 0xD5, 0x38, 0x79, 0x25, 0x82, 0x45, 0x06, 0xD1, 0x0D, 0x7F, - 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, - 0x42, 0x82, 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, - 0x85, 0x04, 0x0B, 0x09, 0x96, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, - 0x0B, 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, - 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x12, - 0x2C, 0x6A, 0x8A, 0xFF, 0x06, 0x00, 0x0E, 0x16, 0x36, 0x06, 0x65, 0x03, - 0x35, 0x24, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, - 0x60, 0x82 -}; -} -static unsigned char* rage_icon = raw::rage; -} \ No newline at end of file diff --git a/gmod/icons/visuals.hpp b/gmod/icons/visuals.hpp deleted file mode 100644 index 8ee4589..0000000 --- a/gmod/icons/visuals.hpp +++ /dev/null @@ -1,1837 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\visuals.png (4/1/2018 10:00:00 PM) - StartOffset: 00000000, EndOffset: 00005593, Length: 00005594 */ - -namespace icons { -constexpr static size_t visuals_size = 21908; -namespace raw { -static unsigned char visuals[21908] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, - 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, - 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, - 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, 0x31, 0x61, - 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, 0x2D, 0x39, - 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, 0x34, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x36, 0x38, 0x37, - 0x35, 0x30, 0x30, 0x66, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x30, - 0x33, 0x31, 0x65, 0x39, 0x31, 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, - 0x2D, 0x30, 0x65, 0x34, 0x61, 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, - 0x32, 0x31, 0x36, 0x34, 0x33, 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, 0x33, 0x31, 0x65, 0x39, 0x31, - 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, 0x2D, 0x30, 0x65, 0x34, 0x61, - 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, 0x32, 0x31, 0x36, 0x34, 0x33, - 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, - 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x30, 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, - 0x31, 0x61, 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, - 0x2D, 0x39, 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, - 0x34, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x52, 0x1E, 0x40, 0x1C, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0F, 0xB6, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x94, 0x1C, 0x55, 0x15, 0xC6, - 0x7F, 0x3D, 0x7B, 0xB6, 0x21, 0x99, 0x6C, 0x10, 0x82, 0xC3, 0x12, 0x96, - 0x84, 0x18, 0x59, 0x13, 0x20, 0x91, 0x7D, 0x09, 0x04, 0x10, 0x34, 0x78, - 0x3C, 0x08, 0x02, 0xC1, 0x13, 0x8E, 0xE2, 0x71, 0x41, 0x51, 0x96, 0x28, - 0x22, 0xCA, 0x2E, 0x02, 0x46, 0x59, 0xC4, 0x05, 0x3D, 0x0A, 0x82, 0xEC, - 0x08, 0x42, 0x02, 0xB2, 0xC8, 0x2E, 0xA0, 0x01, 0x02, 0x21, 0x81, 0x24, - 0x98, 0x90, 0x90, 0x6D, 0x92, 0xC9, 0x4C, 0x66, 0xA6, 0x33, 0x33, 0xD7, - 0x3F, 0xEE, 0xED, 0x33, 0xCD, 0xD0, 0x5D, 0xFD, 0xAA, 0xA7, 0xAA, 0xBA, - 0x66, 0xA6, 0xEE, 0x39, 0x75, 0xD2, 0x67, 0x52, 0x5D, 0xFD, 0xDE, 0xFB, - 0xEA, 0xDD, 0x77, 0xEF, 0x7D, 0xDF, 0xBD, 0x2F, 0x25, 0x22, 0x24, 0xD2, - 0x77, 0xA5, 0x2C, 0x19, 0x82, 0x04, 0xE0, 0x44, 0x12, 0x80, 0x13, 0x89, - 0xAB, 0x54, 0xF4, 0x93, 0x7E, 0x6E, 0x03, 0x0C, 0x06, 0x52, 0x40, 0x03, - 0xD0, 0x9C, 0x00, 0xDC, 0x37, 0x64, 0x30, 0x30, 0x1D, 0x38, 0x1A, 0xA8, - 0x05, 0x04, 0xD8, 0x08, 0x3C, 0x08, 0x3C, 0xD3, 0x1F, 0x80, 0x4E, 0xF5, - 0x61, 0x2B, 0xBA, 0x12, 0xF8, 0x16, 0x70, 0x26, 0x50, 0x0F, 0x94, 0xDB, - 0xDF, 0xDB, 0x81, 0x45, 0xC0, 0x6D, 0x76, 0x75, 0x24, 0x00, 0xF7, 0x4E, - 0xDB, 0xE2, 0x18, 0x60, 0x2E, 0xB0, 0x93, 0xA9, 0xE6, 0x6C, 0xE9, 0x04, - 0xDE, 0x04, 0xCE, 0x05, 0x9E, 0xB3, 0x99, 0x9D, 0x18, 0x59, 0xBD, 0x48, - 0xAA, 0x80, 0x19, 0x79, 0xC0, 0xCD, 0xF4, 0x7B, 0x82, 0xA9, 0xEF, 0x3E, - 0xBD, 0x4C, 0xF5, 0x55, 0x80, 0x2B, 0x81, 0x1D, 0xF3, 0x80, 0x9B, 0x6D, - 0x7F, 0x8C, 0x49, 0x00, 0xEE, 0xBD, 0xFD, 0x72, 0x01, 0xAE, 0x3C, 0xF1, - 0x83, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x91, 0x04, 0xE0, 0x44, - 0x12, 0x80, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x01, 0xB8, 0x8F, - 0x48, 0x2A, 0x81, 0x37, 0xBC, 0x28, 0xCE, 0xA7, 0xD0, 0x30, 0x21, 0xC0, - 0x1B, 0xC0, 0x86, 0x64, 0xA8, 0x3F, 0x26, 0x93, 0x80, 0xA1, 0xF6, 0x79, - 0x31, 0xB0, 0xAA, 0xB7, 0x00, 0x3C, 0x08, 0xDD, 0xBD, 0x39, 0x06, 0xD8, - 0xD6, 0xFE, 0xB6, 0x04, 0x78, 0x1A, 0x78, 0x18, 0x58, 0x19, 0xD1, 0x00, - 0x0A, 0xBA, 0x6B, 0x54, 0x48, 0xCA, 0x89, 0x76, 0xA3, 0xA1, 0x1E, 0x98, - 0x89, 0x6E, 0x5F, 0x0E, 0xB3, 0xBF, 0x7D, 0x60, 0x63, 0x73, 0x27, 0xD0, - 0x1A, 0x67, 0x80, 0x6B, 0x81, 0x0B, 0x81, 0xD3, 0x81, 0x91, 0x59, 0xCF, - 0x9E, 0x08, 0x4C, 0xB5, 0xCE, 0xDD, 0x6C, 0x1D, 0x0A, 0x5B, 0xD2, 0xC0, - 0x6A, 0x87, 0xFB, 0x3E, 0x8C, 0x10, 0xE0, 0x5D, 0xD1, 0xED, 0xCB, 0x93, - 0x81, 0x11, 0x59, 0xE3, 0x33, 0x09, 0xD8, 0x1B, 0xD8, 0x0E, 0xB8, 0x0E, - 0x68, 0x0B, 0xF6, 0x55, 0x17, 0x09, 0xE2, 0xAA, 0x12, 0x91, 0xD9, 0x22, - 0xB2, 0x46, 0x72, 0x4B, 0xA7, 0x88, 0xAC, 0x12, 0x91, 0xAB, 0x45, 0xA4, - 0x3E, 0xA0, 0xDF, 0xF4, 0xBA, 0xCA, 0x45, 0x64, 0xBA, 0xFD, 0x66, 0x3E, - 0x59, 0x24, 0x22, 0x53, 0x45, 0xA4, 0x2C, 0x82, 0xF6, 0xEC, 0x26, 0x22, - 0xB7, 0x88, 0xC8, 0x3A, 0x8F, 0xF1, 0x59, 0x6A, 0xED, 0x09, 0xF4, 0xB7, - 0x83, 0x32, 0xB2, 0x06, 0x02, 0x87, 0xD8, 0xCC, 0xCD, 0x67, 0xF0, 0x8C, - 0xB6, 0xD9, 0x7D, 0x2E, 0xB0, 0x43, 0xC8, 0xB3, 0xA5, 0x03, 0x78, 0x01, - 0xB8, 0x01, 0x58, 0x9E, 0xE3, 0xFF, 0x17, 0x01, 0xBF, 0x32, 0xFB, 0xA0, - 0x33, 0xE4, 0xB6, 0xEC, 0x02, 0x7C, 0xD7, 0x54, 0xF3, 0x70, 0x8F, 0xF1, - 0xA9, 0xB7, 0xD9, 0x3D, 0x20, 0x8E, 0x2A, 0xBA, 0x3C, 0x6B, 0x4D, 0xA1, - 0x00, 0xC8, 0x67, 0xDA, 0xE7, 0x1B, 0x80, 0x15, 0x21, 0x0E, 0x6C, 0x23, - 0xF0, 0x5B, 0x60, 0x21, 0x70, 0x7C, 0xD6, 0xE0, 0x7E, 0x68, 0x6B, 0xDE, - 0xAB, 0xC0, 0xE6, 0x90, 0xC1, 0xDD, 0x19, 0xF8, 0x01, 0xF0, 0x05, 0xA0, - 0xCE, 0x61, 0x7C, 0x76, 0x01, 0x6A, 0x80, 0x96, 0xB8, 0x01, 0xDC, 0xE9, - 0x38, 0x13, 0x52, 0x36, 0xCB, 0xBF, 0x62, 0x9F, 0xAF, 0x0F, 0x11, 0x64, - 0x01, 0xD6, 0x02, 0xF3, 0x80, 0xFF, 0x02, 0xD5, 0xF6, 0xF7, 0x16, 0xE0, - 0x23, 0x5B, 0xA7, 0xC3, 0x06, 0xF7, 0x42, 0x03, 0x77, 0x98, 0xE3, 0x77, - 0x36, 0x38, 0x1A, 0x87, 0x91, 0x03, 0xBC, 0x05, 0x78, 0x05, 0x65, 0x51, - 0xB8, 0xC8, 0xA8, 0x2C, 0x90, 0xAF, 0x0B, 0xD9, 0xBA, 0x6E, 0xC9, 0x61, - 0xD8, 0x49, 0x44, 0xE0, 0xCE, 0xCC, 0x72, 0x87, 0x5C, 0xE4, 0x31, 0x1B, - 0xCB, 0xD8, 0x05, 0x3A, 0xDA, 0x80, 0xBF, 0x02, 0x2F, 0xFA, 0xF8, 0x4E, - 0x66, 0x26, 0x9F, 0x1F, 0xC1, 0x9A, 0x2C, 0xDD, 0xAE, 0xB0, 0xD7, 0xDC, - 0x39, 0xC0, 0x29, 0x3E, 0xC1, 0x7D, 0xC8, 0xEC, 0x86, 0x8E, 0x38, 0x02, - 0x9C, 0xF1, 0x77, 0x7F, 0x02, 0xBC, 0xEE, 0xE3, 0x3B, 0x23, 0x80, 0x2F, - 0x03, 0xDF, 0xF6, 0x30, 0xD0, 0x7A, 0x93, 0x8C, 0x06, 0x2E, 0x02, 0x3E, - 0x8F, 0x72, 0xB1, 0x5D, 0x65, 0x3E, 0x70, 0xB5, 0xA3, 0x6B, 0x57, 0x32, - 0x80, 0xDB, 0x81, 0xA7, 0xEC, 0xED, 0x7D, 0xCD, 0x27, 0xC8, 0xA7, 0x03, - 0x27, 0xA1, 0x64, 0xB9, 0xDE, 0x2A, 0xD5, 0xC0, 0x19, 0x45, 0x80, 0x3B, - 0x0F, 0xB8, 0xCC, 0x96, 0xB8, 0xAD, 0x71, 0x8F, 0x64, 0xB5, 0x00, 0x4F, - 0x9A, 0x9A, 0xF9, 0x29, 0xB0, 0x9F, 0x0F, 0x75, 0x7D, 0x22, 0xF0, 0x68, - 0xC0, 0x46, 0xD7, 0x00, 0xB3, 0x4A, 0xB7, 0xCD, 0x8A, 0xAC, 0xAD, 0xB6, - 0xD0, 0xE0, 0x96, 0x80, 0x0D, 0xAD, 0xED, 0x81, 0x13, 0x8A, 0x58, 0x73, - 0x33, 0xE0, 0x86, 0x62, 0xF4, 0x85, 0x11, 0x8B, 0x6E, 0x45, 0x43, 0x93, - 0x73, 0x80, 0x9F, 0x01, 0xFB, 0xFA, 0x50, 0x6F, 0x83, 0x7A, 0xF0, 0xBB, - 0xDB, 0x00, 0x7B, 0x02, 0x7B, 0xD9, 0x20, 0x6F, 0x6B, 0xCF, 0xAC, 0xB2, - 0xFF, 0xAB, 0xCD, 0x72, 0x9F, 0x36, 0xA1, 0x59, 0x0D, 0x6B, 0xCD, 0x6D, - 0x6A, 0x34, 0xAD, 0xB3, 0x90, 0xE2, 0xB3, 0x1D, 0x86, 0xD9, 0xEF, 0xB9, - 0xCA, 0xE3, 0x36, 0x09, 0x42, 0x03, 0x37, 0x2C, 0x80, 0xB3, 0x41, 0xBE, - 0xD8, 0xDE, 0xD0, 0xFD, 0x43, 0x6A, 0x4B, 0x2D, 0x30, 0x05, 0x38, 0x0A, - 0xDD, 0xDC, 0xA8, 0x37, 0x60, 0xAB, 0xED, 0xAA, 0xB2, 0x65, 0xA8, 0x2C, - 0x6B, 0x39, 0xEA, 0xCC, 0xBA, 0xDA, 0xAC, 0xAD, 0x6D, 0x36, 0xAB, 0x97, - 0x01, 0x0B, 0x6C, 0xF0, 0x17, 0x01, 0x4D, 0x3E, 0x0D, 0x39, 0xD7, 0x1D, - 0xAC, 0x47, 0x81, 0xCB, 0x81, 0x97, 0xC3, 0x76, 0xD7, 0xC2, 0xCE, 0x6C, - 0xA8, 0x01, 0xA6, 0x01, 0x97, 0xD8, 0xBF, 0x5E, 0x72, 0x37, 0x1A, 0xE5, - 0x5A, 0xEB, 0xF0, 0xDC, 0x09, 0xC0, 0x64, 0xE0, 0x38, 0xFB, 0x3C, 0xC6, - 0xD4, 0x71, 0xA5, 0x01, 0xE9, 0x77, 0xAB, 0x50, 0x0C, 0xF0, 0xB4, 0x05, - 0x3F, 0x56, 0x00, 0x6F, 0x03, 0xF7, 0x03, 0xFF, 0x04, 0xD6, 0x3B, 0x3C, - 0x63, 0x2C, 0xF0, 0x47, 0xE0, 0xB0, 0x02, 0xF7, 0xDD, 0x6F, 0x06, 0xD5, - 0xAB, 0x11, 0xF8, 0xE2, 0x10, 0x41, 0x1C, 0xB6, 0x5A, 0x44, 0x0E, 0x17, - 0x91, 0xE7, 0x3C, 0xE2, 0xC2, 0x2B, 0x44, 0xE4, 0x04, 0x8B, 0x21, 0x7B, - 0x3D, 0xAB, 0x4E, 0x44, 0x4E, 0x15, 0x91, 0x47, 0x45, 0x64, 0xB9, 0x88, - 0x34, 0x5B, 0x1C, 0x37, 0x68, 0x69, 0x17, 0x91, 0x26, 0x11, 0x79, 0x4F, - 0x44, 0xEE, 0x11, 0x91, 0x13, 0x45, 0xA4, 0xB6, 0x40, 0xDB, 0x2A, 0x45, - 0xE4, 0x0C, 0x11, 0xD9, 0xE0, 0xF1, 0xDC, 0x07, 0x44, 0x64, 0x8A, 0xC5, - 0xEE, 0xA3, 0x18, 0xFB, 0x48, 0x00, 0xCE, 0x80, 0x7C, 0xA4, 0x0D, 0x56, - 0x73, 0xB7, 0x81, 0x7C, 0x43, 0x44, 0xCE, 0x15, 0x91, 0x11, 0x1E, 0xDF, - 0x1F, 0x28, 0x22, 0x07, 0x8B, 0xC8, 0x1D, 0x16, 0x94, 0x6F, 0x09, 0x09, - 0xD8, 0x5C, 0x9B, 0x00, 0x2D, 0x22, 0xB2, 0xD8, 0x36, 0x0B, 0xF6, 0x2E, - 0xD0, 0xCF, 0x51, 0x22, 0x72, 0x81, 0x88, 0xBC, 0xDF, 0xED, 0x39, 0x8D, - 0x22, 0xF2, 0x7B, 0x11, 0x99, 0x16, 0x25, 0xB8, 0x22, 0x12, 0x69, 0xF2, - 0x59, 0x0D, 0xBA, 0x25, 0x36, 0xDD, 0x54, 0x6A, 0x95, 0xA9, 0xBE, 0x97, - 0x2C, 0x94, 0xD8, 0x98, 0x27, 0xDC, 0x39, 0x1A, 0x98, 0x05, 0x9C, 0x86, - 0xA6, 0xA3, 0x0C, 0x20, 0x7A, 0xB6, 0x86, 0xD8, 0x7A, 0xFC, 0x0E, 0xF0, - 0x6B, 0xE0, 0x01, 0x34, 0xCF, 0x38, 0x57, 0x28, 0xB6, 0xCE, 0x0C, 0xCB, - 0xC9, 0x66, 0x23, 0xB4, 0x00, 0x4B, 0xCD, 0xD7, 0x5D, 0x13, 0x89, 0x5A, - 0x8E, 0x70, 0x0D, 0xCE, 0x35, 0x00, 0x43, 0xCC, 0x00, 0x4A, 0x99, 0xDF, - 0xD7, 0xEC, 0xD1, 0xE9, 0x4F, 0x99, 0x35, 0xFE, 0x39, 0x73, 0xA5, 0x4A, - 0x4D, 0xC3, 0xE9, 0x30, 0x63, 0xEC, 0x2F, 0x16, 0x62, 0xFD, 0x28, 0xCF, - 0x7D, 0x55, 0xD6, 0xCF, 0x72, 0x7B, 0x69, 0x5B, 0xAD, 0x9F, 0x91, 0x67, - 0x31, 0xC6, 0x35, 0x7D, 0x34, 0x05, 0x7C, 0xC6, 0xC0, 0x3D, 0xD2, 0x67, - 0xE0, 0x20, 0x8A, 0xD9, 0xDC, 0x60, 0xB3, 0xF8, 0x12, 0xE0, 0x7F, 0x71, - 0x8E, 0xBE, 0xC4, 0x15, 0xE0, 0xC3, 0xCD, 0xC5, 0x3A, 0x90, 0x80, 0xF7, - 0x47, 0x03, 0x94, 0xCD, 0xC0, 0xDF, 0x81, 0xEF, 0xC7, 0x19, 0xE4, 0x38, - 0x02, 0x3C, 0x05, 0xB8, 0x02, 0xA5, 0xF9, 0x14, 0x1B, 0xBA, 0x6C, 0x44, - 0x37, 0xF3, 0xD7, 0x98, 0x8F, 0xBB, 0xD2, 0xAE, 0x32, 0x8B, 0x38, 0x8D, - 0x31, 0x9B, 0x60, 0x14, 0xB0, 0x0F, 0x5D, 0x5B, 0x89, 0x7E, 0x65, 0x8B, - 0xCD, 0xE4, 0xF3, 0xC2, 0x88, 0x23, 0xC7, 0x39, 0xD0, 0x51, 0xAC, 0x8C, - 0x02, 0xBE, 0x07, 0x1C, 0x54, 0x04, 0xB8, 0x9D, 0x16, 0x38, 0xF8, 0x17, - 0xBA, 0xF1, 0xF1, 0x1A, 0x5D, 0xFB, 0xAB, 0x2D, 0x74, 0x71, 0x9D, 0xAA, - 0xB3, 0x7C, 0xE6, 0xE1, 0x16, 0x84, 0xD9, 0x15, 0x38, 0x14, 0xE5, 0x47, - 0xF9, 0x91, 0x81, 0x16, 0x9E, 0xDC, 0x00, 0x5C, 0xE0, 0x33, 0x30, 0xD2, - 0xEF, 0x66, 0xF0, 0x60, 0xE0, 0xC7, 0xC0, 0x39, 0xF6, 0xD9, 0x8F, 0xE1, - 0xF3, 0x92, 0x05, 0x4A, 0x5E, 0x04, 0xDE, 0x33, 0xA3, 0xAD, 0x29, 0xCB, - 0x2A, 0x97, 0x1C, 0x6B, 0x3C, 0x66, 0x04, 0x0D, 0xB2, 0xD9, 0xBC, 0x87, - 0xBD, 0x58, 0x33, 0x6D, 0x56, 0xFB, 0x91, 0x8D, 0x16, 0x76, 0xFC, 0x79, - 0x02, 0x70, 0x7E, 0x99, 0x6D, 0xAA, 0xB9, 0xCE, 0xC7, 0x77, 0x96, 0xA1, - 0x4C, 0xCD, 0x79, 0x06, 0x6C, 0x33, 0xC5, 0x33, 0x22, 0xAA, 0x6C, 0x66, - 0xEF, 0x81, 0x12, 0x17, 0xCE, 0x31, 0x8D, 0xE2, 0x2A, 0xCB, 0x81, 0xAF, - 0x03, 0x8F, 0xC4, 0x0A, 0xE1, 0x28, 0x9D, 0x6E, 0x8F, 0x6B, 0x3F, 0x11, - 0x79, 0xC5, 0x67, 0x10, 0xE2, 0x31, 0x11, 0x99, 0x21, 0x22, 0x43, 0x1D, - 0x22, 0x60, 0x7E, 0xAE, 0x0A, 0x0B, 0xBA, 0x9C, 0x2E, 0x22, 0xAF, 0xFA, - 0x68, 0x4F, 0x87, 0xB5, 0x69, 0xE7, 0x98, 0x8C, 0x69, 0xA0, 0xAC, 0xCA, - 0x9E, 0x48, 0x1D, 0xF0, 0x55, 0x73, 0x8B, 0x5C, 0xE5, 0xCF, 0x28, 0xC7, - 0xF8, 0x09, 0x53, 0x8F, 0x41, 0xB2, 0x20, 0xDA, 0x81, 0x75, 0xC0, 0x7D, - 0xC0, 0x0F, 0xED, 0x37, 0x5C, 0xA4, 0xCC, 0xE2, 0xED, 0x27, 0x13, 0xA3, - 0xB4, 0x99, 0x38, 0x00, 0x7C, 0x98, 0xA9, 0xC4, 0x4A, 0xC7, 0xFB, 0x7F, - 0x63, 0x06, 0xCD, 0xBB, 0x84, 0x90, 0x09, 0x90, 0x25, 0x4D, 0xE8, 0x46, - 0xC3, 0x37, 0xD1, 0x0D, 0x02, 0x57, 0xA3, 0x6B, 0x16, 0x4A, 0x64, 0x4F, - 0x00, 0x36, 0x77, 0xE5, 0x44, 0x34, 0x84, 0xE9, 0x22, 0x77, 0x02, 0x97, - 0x9A, 0xCB, 0xD3, 0x19, 0x41, 0xFB, 0x5A, 0xD0, 0xF0, 0xE4, 0xB5, 0xC0, - 0xB3, 0x8E, 0xDF, 0xD9, 0x0D, 0x65, 0x52, 0x56, 0x25, 0x00, 0x6B, 0x20, - 0xE3, 0x68, 0xDC, 0xAA, 0xDD, 0xBC, 0x82, 0x6E, 0xB3, 0x45, 0x99, 0x6E, - 0x92, 0x71, 0xBF, 0xFE, 0x0D, 0x5C, 0x69, 0x86, 0x9C, 0x8B, 0xEB, 0x79, - 0x02, 0x9A, 0xB2, 0xD3, 0xAF, 0x01, 0x1E, 0x08, 0x1C, 0xE0, 0x68, 0xA9, - 0xAE, 0x32, 0x0B, 0x7B, 0x21, 0xA5, 0xA9, 0x4A, 0xD7, 0x86, 0x52, 0x91, - 0xAE, 0xC2, 0x8D, 0x2C, 0xBF, 0x87, 0x45, 0xE3, 0xCA, 0xFB, 0x33, 0xC0, - 0xE3, 0xD0, 0x0D, 0xFB, 0x42, 0x6D, 0x68, 0xB7, 0x35, 0xF0, 0x31, 0x82, - 0x4E, 0xCC, 0xF2, 0x27, 0xAD, 0xB6, 0x44, 0xCC, 0x77, 0xB8, 0xB7, 0xD2, - 0x6C, 0x8B, 0xD1, 0xFD, 0x19, 0xE0, 0x09, 0xB6, 0x5E, 0xB9, 0xF8, 0x97, - 0x7F, 0x20, 0x60, 0x42, 0x78, 0x91, 0xB2, 0x19, 0xB8, 0x05, 0xB7, 0x7C, - 0xE7, 0x43, 0x2D, 0x42, 0xD6, 0x2F, 0x01, 0xAE, 0x03, 0x8E, 0xC0, 0x2D, - 0x54, 0xFA, 0x28, 0xFE, 0xB8, 0xD6, 0x61, 0xCB, 0x53, 0x68, 0x29, 0x62, - 0x97, 0x25, 0x68, 0x9F, 0x52, 0x1B, 0x5B, 0xA5, 0x02, 0xB8, 0x16, 0xB7, - 0x70, 0x60, 0x0B, 0x70, 0x2F, 0x01, 0xE7, 0xEB, 0x04, 0xB0, 0x1E, 0xDF, - 0xE1, 0xE8, 0x7B, 0x1F, 0x89, 0xBF, 0xC8, 0x5C, 0x9F, 0x01, 0x78, 0x88, - 0x63, 0xC7, 0x5F, 0x44, 0xC9, 0x69, 0x71, 0xDB, 0xF2, 0x7A, 0x0D, 0xB7, - 0x44, 0xF6, 0x1D, 0xE9, 0x19, 0x15, 0xB8, 0xC7, 0x92, 0x4F, 0x45, 0x0E, - 0x46, 0xB7, 0xEB, 0x46, 0xE3, 0x56, 0xE6, 0x20, 0x65, 0xEE, 0x44, 0x33, - 0x4A, 0xBF, 0x59, 0x5C, 0xE0, 0xFE, 0x51, 0x74, 0x11, 0xD1, 0xBD, 0x64, - 0x3E, 0xBA, 0xF5, 0x17, 0x37, 0xF9, 0xD0, 0x82, 0x20, 0x3B, 0x39, 0xBC, - 0xC8, 0x43, 0x1D, 0xED, 0x91, 0x89, 0xB8, 0xD1, 0x91, 0x52, 0x74, 0xB1, - 0x40, 0x57, 0xA0, 0xF9, 0x4C, 0x2D, 0x7E, 0x00, 0x1E, 0x0F, 0x7C, 0xCD, - 0xFC, 0xD3, 0x81, 0x3E, 0x67, 0x79, 0x1A, 0xA5, 0x9B, 0x5E, 0xE5, 0xB1, - 0x4E, 0x55, 0xA0, 0x04, 0xF5, 0x1A, 0x87, 0xE7, 0x2D, 0x23, 0x9E, 0xB2, - 0x05, 0xDD, 0x9A, 0x9C, 0x55, 0xE0, 0xBE, 0x11, 0x78, 0xA7, 0x8E, 0xD6, - 0xA2, 0x74, 0xA4, 0x59, 0x36, 0xDB, 0x2B, 0x7D, 0xB4, 0xA1, 0x13, 0xE5, - 0xB4, 0x3D, 0x62, 0x46, 0xE8, 0x62, 0x17, 0x80, 0xEB, 0xD0, 0x6C, 0xBF, - 0x99, 0xA6, 0x5A, 0x8A, 0xE1, 0x17, 0x8F, 0x41, 0xF9, 0x53, 0xDF, 0xB0, - 0x41, 0xC8, 0xF5, 0x9B, 0xE3, 0x1D, 0x9E, 0xD5, 0x88, 0x46, 0x91, 0xE2, - 0x2A, 0x9B, 0x1C, 0xEE, 0x19, 0x60, 0xDA, 0x2A, 0x95, 0x43, 0x0B, 0x96, - 0xA3, 0xC5, 0x6A, 0x2E, 0x41, 0xB9, 0x67, 0xE5, 0x45, 0x8C, 0xF7, 0x18, - 0x94, 0xEC, 0x5F, 0x85, 0x6E, 0x57, 0x6E, 0x2A, 0xB4, 0x06, 0xCF, 0x30, - 0x70, 0x87, 0xD0, 0x45, 0x20, 0xF7, 0x73, 0x95, 0xA1, 0x1B, 0xEA, 0x7B, - 0xA3, 0x89, 0x58, 0x43, 0xF2, 0x34, 0xCC, 0x85, 0x41, 0xB1, 0x94, 0xDC, - 0xE5, 0x17, 0xE2, 0x22, 0x6B, 0x71, 0x4B, 0x73, 0xC9, 0x37, 0x51, 0x76, - 0x04, 0xCE, 0x32, 0x35, 0x5F, 0x59, 0xE4, 0x78, 0x67, 0x2A, 0x2B, 0x9C, - 0x46, 0x1E, 0xC2, 0x7D, 0x77, 0x80, 0x27, 0x7B, 0x80, 0xE2, 0x77, 0x6D, - 0x3F, 0xCC, 0x82, 0x19, 0xB9, 0xD6, 0x10, 0x17, 0xF7, 0x68, 0x23, 0xD1, - 0xC4, 0x9B, 0x8B, 0x95, 0x77, 0x71, 0xCB, 0x78, 0xC8, 0xB7, 0xAE, 0x8E, - 0x45, 0xF3, 0xA8, 0x82, 0x30, 0x74, 0x47, 0x03, 0x9F, 0x76, 0x01, 0x78, - 0x48, 0x80, 0x03, 0x30, 0xCC, 0xC3, 0x82, 0x74, 0x51, 0x45, 0x5B, 0x63, - 0x0E, 0x70, 0x13, 0x6E, 0x1C, 0xE7, 0x7C, 0x06, 0x6A, 0x15, 0xC1, 0x51, - 0xA6, 0x52, 0xE4, 0x21, 0x27, 0x76, 0x07, 0x38, 0xC8, 0x8A, 0x74, 0xAB, - 0xC8, 0x4D, 0x0E, 0x17, 0x47, 0x1F, 0x32, 0xEE, 0xE5, 0xF6, 0x47, 0x3A, - 0xBA, 0x40, 0xE2, 0xE1, 0x4F, 0x07, 0x49, 0x82, 0x6F, 0x71, 0x01, 0x78, - 0x81, 0xA9, 0xC6, 0x20, 0xE4, 0x31, 0x53, 0x63, 0x7E, 0x3A, 0xDD, 0xDD, - 0x02, 0x8D, 0x73, 0x42, 0xF8, 0xEE, 0xE4, 0x2F, 0x8B, 0xD4, 0x5D, 0x13, - 0xE5, 0xEA, 0xEF, 0x62, 0xE0, 0xF9, 0x80, 0xDA, 0xB2, 0x0C, 0x8D, 0xB0, - 0x15, 0x04, 0xF8, 0x49, 0xB4, 0xF4, 0x50, 0x4F, 0xCB, 0xF8, 0x3C, 0x87, - 0xD6, 0x9C, 0xD8, 0x9A, 0xC7, 0xBC, 0x77, 0x61, 0x1F, 0xEE, 0x82, 0x5B, - 0xAC, 0xBA, 0x54, 0x52, 0xED, 0xF0, 0x02, 0x8A, 0x79, 0x03, 0xB9, 0x00, - 0x5E, 0x03, 0xDC, 0x6A, 0x71, 0x83, 0x9E, 0xC8, 0x06, 0x94, 0x04, 0xF1, - 0xB2, 0x8B, 0x9B, 0xB4, 0x12, 0x2D, 0x10, 0xD6, 0x66, 0x7E, 0xF0, 0x10, - 0xC7, 0x59, 0x24, 0x59, 0xC0, 0xBD, 0x02, 0xFC, 0x0E, 0x3D, 0x78, 0x2A, - 0x97, 0x7B, 0xB0, 0x15, 0xF8, 0x8F, 0xC3, 0x33, 0x07, 0x9A, 0xFB, 0xF0, - 0x7C, 0x0C, 0x23, 0x59, 0x65, 0xB8, 0xD5, 0x14, 0x69, 0x36, 0x43, 0x2C, - 0x57, 0xFB, 0x33, 0xC5, 0xDA, 0xBE, 0x63, 0x7E, 0xF0, 0x5E, 0x16, 0x1B, - 0x70, 0x5D, 0x9A, 0xDA, 0x50, 0x2E, 0xF6, 0x9D, 0x28, 0x37, 0x3B, 0xED, - 0x02, 0x70, 0x87, 0xB9, 0x26, 0xD7, 0xA2, 0x34, 0xD4, 0xC1, 0x8E, 0xCE, - 0x77, 0xCA, 0xBE, 0xDB, 0x6C, 0xEE, 0xCD, 0x46, 0x8F, 0x75, 0x56, 0x4C, - 0x3D, 0x35, 0x51, 0x98, 0x1E, 0xBB, 0xBB, 0x0D, 0x66, 0xDC, 0x8E, 0x9F, - 0xDB, 0x06, 0xAD, 0xEC, 0xE7, 0xE2, 0x09, 0xAC, 0x2D, 0xF0, 0x02, 0x3C, - 0x63, 0xC1, 0xA1, 0x7A, 0xFC, 0x25, 0xD6, 0xA5, 0xED, 0xD9, 0xCB, 0xBC, - 0xD6, 0xF2, 0x8A, 0x3C, 0x2A, 0xB4, 0x81, 0xE2, 0x43, 0x84, 0x2E, 0x60, - 0x34, 0x98, 0x6A, 0x29, 0x04, 0xF0, 0x74, 0xE0, 0x97, 0x76, 0x6F, 0x9C, - 0x66, 0xF1, 0x48, 0x0A, 0x27, 0xB4, 0x67, 0x82, 0x21, 0x8D, 0x0E, 0xE3, - 0xB5, 0x1A, 0xB7, 0xC4, 0x77, 0xDF, 0xE3, 0x5D, 0x56, 0xE0, 0x8B, 0xC5, - 0x5C, 0x2E, 0xD2, 0xE8, 0xD8, 0xA1, 0x3D, 0xD1, 0x54, 0x96, 0xB8, 0xA9, - 0xE8, 0xA9, 0xB8, 0x31, 0x51, 0xDE, 0x72, 0x8C, 0x78, 0x85, 0x36, 0xDE, - 0xA5, 0xDA, 0x4D, 0x5A, 0x8F, 0x06, 0xEB, 0x5D, 0xA2, 0x40, 0xA7, 0x50, - 0xE2, 0x1D, 0x99, 0x6E, 0x52, 0x0B, 0x7C, 0xC9, 0x71, 0xE9, 0x9A, 0x4F, - 0x89, 0x8B, 0xA1, 0x97, 0x0A, 0xE0, 0x26, 0x33, 0x30, 0x5C, 0x76, 0xA9, - 0x0E, 0x45, 0xC9, 0x79, 0x71, 0x91, 0x63, 0xD1, 0x88, 0x9F, 0x8B, 0x96, - 0x5A, 0x5A, 0xEA, 0x60, 0x4D, 0x29, 0x29, 0x3B, 0x0B, 0x51, 0xB6, 0x62, - 0x21, 0x19, 0x0B, 0x9C, 0x6A, 0x56, 0x75, 0xA9, 0x65, 0x04, 0x1A, 0x63, - 0x1F, 0xEA, 0x70, 0xEF, 0xB3, 0xC4, 0x60, 0x37, 0xAC, 0x94, 0x00, 0xBF, - 0x6F, 0xC1, 0x90, 0x42, 0x52, 0x81, 0x72, 0xA7, 0xCF, 0xC2, 0xDF, 0x76, - 0x5A, 0xD0, 0x52, 0x85, 0x56, 0x01, 0x3A, 0xD8, 0xF1, 0xFE, 0x7F, 0x58, - 0x1F, 0xFB, 0x2D, 0xC0, 0x69, 0xBA, 0x52, 0x3D, 0x0B, 0xC9, 0x70, 0x34, - 0xB1, 0xAB, 0x94, 0xAA, 0xFA, 0x38, 0x7B, 0xC9, 0x5C, 0xEC, 0x81, 0x97, - 0x6C, 0xFD, 0xED, 0xEC, 0xCF, 0x00, 0x63, 0xD1, 0x97, 0x27, 0x1C, 0xAD, - 0xE4, 0xF1, 0x68, 0xA1, 0xCF, 0x09, 0x25, 0x68, 0xE7, 0x01, 0x68, 0x39, - 0x89, 0x7A, 0xC7, 0xFB, 0x9F, 0x26, 0x9A, 0xB3, 0x29, 0x62, 0x0F, 0x70, - 0x03, 0x70, 0x8F, 0xE3, 0x60, 0xA4, 0x50, 0x12, 0xDB, 0x15, 0x44, 0x97, - 0x35, 0x90, 0x32, 0x37, 0xED, 0x7A, 0xDC, 0x4B, 0x32, 0xBE, 0x00, 0xDC, - 0x45, 0x3C, 0x68, 0xBE, 0xB1, 0x48, 0x3E, 0x7B, 0x0E, 0xF8, 0x1B, 0xEE, - 0xC7, 0xE0, 0xCC, 0x40, 0x13, 0xAD, 0xA7, 0x52, 0x7C, 0xE9, 0x05, 0x17, - 0xA9, 0xB6, 0x40, 0xCB, 0x5C, 0x03, 0xD9, 0x45, 0x5A, 0x81, 0x3F, 0xA1, - 0x44, 0xC1, 0x58, 0x48, 0x5C, 0x12, 0xC0, 0x77, 0x45, 0x03, 0xE6, 0x87, - 0x38, 0xDE, 0xDF, 0x81, 0x86, 0xF7, 0x6E, 0x45, 0x29, 0xAC, 0xEB, 0x02, - 0x6E, 0xCF, 0x76, 0x68, 0xB1, 0xF2, 0xD9, 0x68, 0xF5, 0x76, 0x57, 0xB9, - 0x0F, 0x4D, 0x1C, 0x5F, 0x9B, 0x00, 0xFC, 0x49, 0x39, 0x19, 0x0D, 0x4B, - 0x6E, 0xEF, 0xE3, 0x3B, 0x1B, 0xD1, 0x60, 0xFB, 0xFD, 0xB6, 0x9E, 0x37, - 0x04, 0xE0, 0x06, 0x4D, 0x45, 0xB3, 0x03, 0x67, 0xE2, 0xAF, 0xC2, 0xCF, - 0x22, 0x94, 0x87, 0x36, 0x9F, 0x18, 0x49, 0x9C, 0x00, 0xAE, 0x46, 0x09, - 0x7F, 0x17, 0xE1, 0xBF, 0x74, 0xD2, 0x5B, 0x68, 0x64, 0xEC, 0x61, 0xFB, - 0xBC, 0x12, 0xF7, 0xF0, 0x66, 0x39, 0xBA, 0x6B, 0x35, 0xC9, 0xD4, 0xFF, - 0x11, 0x3E, 0x67, 0x6D, 0xE6, 0x45, 0x3B, 0xCF, 0xD4, 0x73, 0x7B, 0x02, - 0x70, 0x7E, 0x19, 0x83, 0xB2, 0x03, 0x4F, 0x2B, 0xC2, 0xE7, 0x15, 0x94, - 0x60, 0xF0, 0x8E, 0x59, 0xE6, 0xEF, 0xA2, 0x61, 0xC2, 0x15, 0xE8, 0xFE, - 0x76, 0x47, 0x96, 0xDD, 0xB1, 0x3D, 0xBA, 0x23, 0x34, 0xD4, 0x0C, 0xB6, - 0x23, 0xD1, 0xBD, 0xE7, 0x1D, 0x8B, 0x68, 0x73, 0x0B, 0x9A, 0x5A, 0x7A, - 0x15, 0xA5, 0x4D, 0x8E, 0xEB, 0x15, 0x00, 0x63, 0x6E, 0xD0, 0x1C, 0x34, - 0xDE, 0x5B, 0x6C, 0x29, 0x84, 0xCC, 0x2E, 0x4E, 0x93, 0x01, 0x9D, 0x39, - 0x46, 0x27, 0x65, 0x9A, 0x62, 0x77, 0x5B, 0x67, 0xAB, 0x51, 0xEE, 0xD8, - 0xE0, 0x1E, 0xB4, 0xF7, 0x66, 0xB4, 0x18, 0xDA, 0x66, 0x62, 0x28, 0x71, - 0xAD, 0x74, 0x37, 0xC9, 0x54, 0xF5, 0xC9, 0x04, 0x43, 0xDB, 0xC9, 0x14, - 0x00, 0xCF, 0x50, 0x7B, 0x83, 0xA8, 0xA1, 0x91, 0x06, 0x6E, 0x37, 0x8B, - 0x7E, 0x11, 0x31, 0x95, 0x38, 0xD7, 0xAA, 0x9C, 0x48, 0xD7, 0x91, 0x70, - 0x83, 0x62, 0xD6, 0xBE, 0xF5, 0xC0, 0x4D, 0xE8, 0xE9, 0x6D, 0x0D, 0xC4, - 0x8F, 0x90, 0x50, 0x52, 0x80, 0x33, 0x2C, 0x91, 0x32, 0x9B, 0x05, 0x69, - 0x8F, 0xB5, 0x6B, 0x9C, 0xA9, 0xEA, 0xD9, 0x84, 0x7F, 0xB6, 0x92, 0xAB, - 0x7B, 0xB6, 0xC4, 0xD4, 0xF2, 0x4D, 0x1E, 0xED, 0xAE, 0x44, 0x37, 0x47, - 0xAA, 0x50, 0x8A, 0x52, 0x3B, 0x25, 0xAA, 0x82, 0x17, 0x25, 0xC0, 0x83, - 0xD0, 0xD2, 0x06, 0xA7, 0xD2, 0xC5, 0xE6, 0x6F, 0x40, 0xCF, 0x47, 0x98, - 0x67, 0xBE, 0x63, 0xAE, 0xD8, 0x6D, 0x15, 0xBA, 0x27, 0x3C, 0xCB, 0xFC, - 0xE4, 0x52, 0xD1, 0x69, 0x5B, 0xAC, 0x9D, 0xB7, 0x03, 0x0F, 0xE6, 0xB1, - 0x96, 0x53, 0x68, 0x52, 0xDD, 0xF1, 0x28, 0xF1, 0xBF, 0xD6, 0x5E, 0xE0, - 0x85, 0x28, 0x05, 0x6A, 0x09, 0xC5, 0x1F, 0xFA, 0x51, 0x9C, 0x44, 0x58, - 0xF1, 0xFD, 0x14, 0x2B, 0xEB, 0x9F, 0xEE, 0x56, 0x40, 0xEC, 0x03, 0x11, - 0xB9, 0x52, 0x44, 0xB6, 0xF3, 0xF8, 0x7E, 0x99, 0x88, 0x8C, 0x17, 0x91, - 0xEB, 0xAD, 0xE2, 0x7B, 0x5A, 0xA2, 0x93, 0x56, 0x11, 0x59, 0x28, 0x22, - 0x97, 0x89, 0xC8, 0x4E, 0x05, 0x8E, 0xA3, 0x1D, 0x2B, 0x22, 0x73, 0x45, - 0x64, 0x7D, 0xB7, 0x67, 0x6C, 0x16, 0x91, 0xF9, 0x56, 0xB8, 0xAD, 0x3A, - 0xCA, 0x42, 0x68, 0x51, 0x82, 0xFB, 0xBA, 0xC7, 0x20, 0xAE, 0x11, 0x91, - 0xB3, 0x1D, 0xCE, 0xF2, 0x1D, 0x64, 0xE7, 0x27, 0xDC, 0x6A, 0xE7, 0x29, - 0xB4, 0xDA, 0xB1, 0x00, 0x61, 0x9C, 0xD9, 0xD0, 0x2C, 0x22, 0x6F, 0x8B, - 0xC8, 0x8D, 0x22, 0x72, 0x8C, 0x1D, 0x2B, 0x40, 0x81, 0x97, 0xF0, 0xFC, - 0x6E, 0x47, 0x16, 0x74, 0x97, 0x67, 0x44, 0xE4, 0x58, 0x11, 0xA9, 0x89, - 0x0A, 0xE0, 0xB0, 0xAB, 0xCD, 0x0E, 0xB0, 0xA8, 0xD0, 0x45, 0x78, 0x67, - 0x14, 0x8E, 0x34, 0x35, 0xFC, 0x38, 0xDE, 0xB5, 0x97, 0x9B, 0x4D, 0x3D, - 0x3E, 0x85, 0x16, 0x0E, 0x3D, 0xCC, 0xFE, 0xDD, 0xDD, 0x96, 0x80, 0xEA, - 0x22, 0x55, 0x78, 0x86, 0xF6, 0xDB, 0x6A, 0x6B, 0xE5, 0x02, 0x8B, 0x8C, - 0x3D, 0x89, 0xD2, 0x80, 0x5D, 0x5C, 0xA0, 0x9D, 0xAD, 0xAF, 0x5E, 0xC4, - 0x84, 0xCF, 0x5A, 0x1B, 0x2B, 0x89, 0xA8, 0xA8, 0x4C, 0x98, 0x00, 0xD7, - 0x58, 0x87, 0xE7, 0x18, 0x00, 0x85, 0xA4, 0x0E, 0x77, 0xD6, 0x46, 0x23, - 0xBA, 0xA1, 0xFE, 0x84, 0xAD, 0xEB, 0x93, 0x51, 0x82, 0xDE, 0x34, 0x0B, - 0x37, 0xD6, 0xD0, 0x55, 0x45, 0xB6, 0xDC, 0xC3, 0x60, 0xDA, 0x62, 0x57, - 0xE6, 0xC8, 0xD9, 0x67, 0x2D, 0x12, 0xF6, 0x32, 0x5A, 0x13, 0xCB, 0x4F, - 0x54, 0x2A, 0x13, 0x38, 0x29, 0x24, 0x93, 0xD1, 0x12, 0x89, 0x62, 0x20, - 0xA7, 0x7B, 0x23, 0xC0, 0x35, 0xE8, 0x19, 0x7E, 0x17, 0x3B, 0x82, 0x4B, - 0x91, 0xBE, 0xE9, 0x56, 0xB4, 0xF0, 0xF7, 0x1B, 0x66, 0x8C, 0x4D, 0xB0, - 0x41, 0x1E, 0x63, 0xE1, 0xC7, 0xDD, 0xD0, 0xCC, 0xBB, 0x4E, 0xBA, 0x76, - 0xCE, 0x3A, 0xEC, 0xF3, 0x6A, 0xF3, 0x5F, 0x97, 0xD3, 0x75, 0xFA, 0xD9, - 0xC2, 0x1E, 0x86, 0x1A, 0x5D, 0xFB, 0xB0, 0x5F, 0x37, 0x90, 0xB7, 0xF6, - 0x26, 0x80, 0x33, 0x6A, 0xF9, 0x47, 0xB8, 0x97, 0x11, 0x12, 0x94, 0xA0, - 0xD6, 0x13, 0x06, 0x62, 0x9A, 0x4F, 0x66, 0x4C, 0xD4, 0x9A, 0x5B, 0xD6, - 0x91, 0x35, 0x93, 0x33, 0x00, 0x6F, 0x0E, 0xD8, 0x75, 0x59, 0x83, 0x72, - 0xB0, 0x5C, 0xD3, 0x6D, 0xF6, 0x47, 0xEB, 0x63, 0x57, 0xA1, 0x59, 0xFA, - 0xAD, 0xBD, 0x01, 0xE0, 0x01, 0xC0, 0x17, 0x4D, 0x2D, 0x8F, 0xF3, 0xF1, - 0xBD, 0x95, 0xE8, 0x49, 0x26, 0xEB, 0x03, 0x6E, 0x4F, 0x23, 0xD1, 0xD5, - 0xF8, 0x58, 0x81, 0xEE, 0x6C, 0x4D, 0xC1, 0xFD, 0x10, 0x91, 0x7D, 0x6D, - 0xAC, 0x52, 0xE8, 0xF9, 0x0F, 0x81, 0x83, 0x5C, 0x16, 0xF0, 0xCB, 0x32, - 0xB3, 0x08, 0x70, 0x3F, 0x42, 0xF3, 0xA1, 0xE6, 0x11, 0xEF, 0x7C, 0x60, - 0x17, 0x2D, 0x74, 0x2F, 0x70, 0x1B, 0xFE, 0xD8, 0x1C, 0x7B, 0x9B, 0x11, - 0x3A, 0x9D, 0x30, 0x98, 0xA3, 0x01, 0x9A, 0xE4, 0x07, 0x99, 0xBF, 0xE8, - 0xE7, 0x54, 0xB1, 0x95, 0x76, 0x52, 0x58, 0x6D, 0x9C, 0x8A, 0x68, 0xF7, - 0xF0, 0xAA, 0x13, 0x91, 0x6B, 0xEC, 0xB4, 0x33, 0x3F, 0xF2, 0xBC, 0x88, - 0x8C, 0x8B, 0x6B, 0x41, 0xF0, 0xC1, 0xE6, 0xE6, 0x8C, 0xF7, 0xF1, 0xB6, - 0x7F, 0x08, 0xDC, 0x68, 0xB3, 0x37, 0x0A, 0x35, 0x5A, 0x1E, 0x51, 0x14, - 0x6C, 0x03, 0x7A, 0xB2, 0xE8, 0x2D, 0xF8, 0xDB, 0x61, 0x3A, 0x10, 0xDD, - 0x8B, 0x2E, 0x8B, 0xA3, 0x8A, 0xAE, 0xF2, 0x61, 0x2D, 0x67, 0x83, 0x7B, - 0x33, 0xE1, 0x6E, 0xB3, 0x95, 0x9B, 0x45, 0x3F, 0x1A, 0xAD, 0xAC, 0xB7, - 0x17, 0x4A, 0xC1, 0x0D, 0x3B, 0xB1, 0xBC, 0x01, 0xDD, 0x23, 0xBE, 0xD9, - 0xA7, 0x21, 0x37, 0x8D, 0x80, 0x37, 0x56, 0x82, 0xAC, 0x11, 0xE1, 0xE2, - 0x5E, 0x74, 0x1A, 0xB8, 0x37, 0xD8, 0x5A, 0xB5, 0x29, 0xC4, 0x41, 0xAE, - 0xB0, 0x98, 0xF7, 0xA1, 0x68, 0xAE, 0xF3, 0x78, 0x7B, 0xB9, 0x16, 0xA0, - 0xDC, 0xA9, 0xC7, 0x43, 0xD6, 0x1C, 0xEB, 0x51, 0x06, 0x68, 0x07, 0x5A, - 0x77, 0xCC, 0xC5, 0xF0, 0xAA, 0x0E, 0xDA, 0xF0, 0x0D, 0xEA, 0x61, 0x69, - 0xEB, 0x50, 0xA7, 0x87, 0x56, 0xC8, 0x54, 0x66, 0x9B, 0x6B, 0xE0, 0x6E, - 0x0C, 0x79, 0x16, 0x0D, 0x43, 0xCB, 0xF1, 0x9F, 0xCD, 0xC7, 0x29, 0x40, - 0x13, 0xD1, 0xFC, 0xA2, 0x4B, 0xAD, 0x1D, 0xCD, 0x21, 0xCF, 0xE4, 0x6B, - 0xEC, 0xC5, 0x9A, 0x8D, 0x77, 0xC9, 0x87, 0x0E, 0x34, 0xDB, 0x3F, 0xD8, - 0xF6, 0x04, 0xB4, 0x98, 0x97, 0x89, 0xC8, 0x49, 0x76, 0x0E, 0x70, 0x67, - 0x9E, 0x13, 0x49, 0x96, 0x8A, 0xC8, 0x79, 0x22, 0xB2, 0x4D, 0x04, 0x86, - 0x4E, 0xCA, 0xCE, 0xF2, 0xF5, 0x32, 0x74, 0x96, 0x59, 0x9B, 0x53, 0x11, - 0x19, 0x5E, 0x97, 0x8B, 0xC8, 0x3A, 0x8F, 0xF1, 0x79, 0x53, 0x44, 0x26, - 0xC5, 0xD5, 0xC8, 0xEA, 0xB4, 0xF8, 0xF0, 0x6D, 0x36, 0x4B, 0x5B, 0x2D, - 0x3A, 0xB3, 0xD5, 0x3E, 0x2F, 0x41, 0xC9, 0xE3, 0x61, 0xAB, 0xE5, 0x6C, - 0x7F, 0xFC, 0x28, 0xBC, 0xCB, 0x42, 0xD5, 0xA3, 0x5C, 0xAC, 0x28, 0xF2, - 0x9D, 0x36, 0xD8, 0x4C, 0x9E, 0x8B, 0xC6, 0xDA, 0xBB, 0x8F, 0xCF, 0xFB, - 0x28, 0x17, 0x6D, 0x41, 0x9C, 0x03, 0x1D, 0x9B, 0x50, 0xDA, 0xEB, 0x5B, - 0x68, 0xB2, 0xD8, 0xF0, 0x2C, 0x3F, 0xF7, 0x2E, 0x34, 0x0F, 0x29, 0x2A, - 0xDE, 0x52, 0x05, 0x6E, 0xD5, 0x6C, 0x6B, 0x89, 0x8E, 0xFC, 0xDF, 0x80, - 0x1E, 0x49, 0xBB, 0xC0, 0xE2, 0x05, 0x43, 0xCD, 0x76, 0x59, 0x8D, 0x72, - 0xBB, 0x1F, 0x8F, 0x7B, 0x24, 0x4B, 0x6C, 0x1D, 0xBE, 0xDB, 0x82, 0x16, - 0x99, 0x7A, 0x13, 0x4D, 0x44, 0x5F, 0x31, 0x36, 0xE5, 0xA3, 0x6F, 0x51, - 0x9E, 0x71, 0xD4, 0x68, 0xC1, 0x90, 0x27, 0x2D, 0xA8, 0x21, 0x16, 0x14, - 0xD9, 0x14, 0xE6, 0x9B, 0x1E, 0x86, 0x6C, 0x8C, 0xC0, 0x88, 0x72, 0x79, - 0xE1, 0xE2, 0x2A, 0x91, 0x8D, 0x4F, 0x19, 0x7D, 0x57, 0xA4, 0x97, 0xBF, - 0x04, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x27, 0x00, 0x27, 0x43, 0x90, 0x00, - 0x9C, 0x48, 0x02, 0x70, 0x22, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x07, 0x2C, - 0xA9, 0x80, 0xEE, 0x49, 0x00, 0x8E, 0xA1, 0x74, 0xE2, 0x56, 0xF3, 0x3A, - 0x9D, 0x00, 0xDC, 0x3B, 0x25, 0x8D, 0xD2, 0x61, 0xBD, 0xF6, 0xA8, 0xDB, - 0xF0, 0xCF, 0x7D, 0x4E, 0x00, 0x8E, 0x89, 0xB4, 0xA3, 0xB5, 0x32, 0xDE, - 0xCE, 0x03, 0x60, 0x1A, 0xCD, 0x58, 0xB8, 0xAF, 0xAF, 0x03, 0x5C, 0xD1, - 0x47, 0xFB, 0xD5, 0x81, 0x12, 0xCA, 0x87, 0xA1, 0xB5, 0x33, 0x76, 0xA0, - 0x8B, 0x8F, 0x95, 0x21, 0xCB, 0xFF, 0x02, 0x25, 0xBE, 0xF7, 0xE9, 0x70, - 0x65, 0x5C, 0x13, 0xC0, 0x83, 0xD4, 0x50, 0x87, 0xA3, 0x95, 0xEA, 0x86, - 0xD3, 0xC5, 0x07, 0x7B, 0x88, 0x18, 0x67, 0xE5, 0x27, 0x00, 0xF7, 0xCC, - 0xAA, 0xEE, 0x37, 0x1D, 0xEE, 0xCB, 0x2A, 0x3A, 0x97, 0xF4, 0x2B, 0x60, - 0xFB, 0x83, 0x1F, 0x9C, 0x48, 0x02, 0x70, 0xDF, 0x97, 0xFF, 0x0F, 0x00, - 0xAE, 0x7B, 0xCD, 0x15, 0x78, 0xF2, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, - 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static unsigned char* visuals_icon = raw::visuals; -} \ No newline at end of file diff --git a/gmod/identity.cpp b/gmod/identity.cpp deleted file mode 100644 index de047cf..0000000 --- a/gmod/identity.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "identity.hpp" -#include "settings.hpp" -#include "interface.hpp" -#include "pattern.hpp" - -namespace features -{ - void c_identity::clantag_changer( ) { - static auto fn_offset = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "53 56 57 8B DA 8B F9 FF 15" ) ); - static auto fn = reinterpret_cast< void( __fastcall* )( const char*, const char* ) >( fn_offset ); - static bool was_enabled = false; - - if ( !g_settings.misc.clantag_changer( ) ) { - if ( was_enabled ) { - fn( "", " " ); - static cvar_t* cl_clanid = g_csgo.m_cvar( )->FindVar( xors( "cl_clanid" ) ); - auto backup_val = cl_clanid->get_int( ); - cl_clanid->set_value( 0 ); - cl_clanid->set_value( backup_val ); - was_enabled = false; - } - - return; - } - - was_enabled = true; - - //fn( xors( "#freeshkreli $" ), xors( "#freeshkreli $" ) ); - - //basically make it completely fade out - static const std::string moneybot_string = xors( "moneybot " ); - static std::string clantag_str = moneybot_string; - - static auto next_settime = g_csgo.m_globals->m_realtime; - auto curtime = g_csgo.m_globals->m_realtime; - - if ( curtime > next_settime ) { - const int length = clantag_str.length( ); - clantag_str.insert( 0, 1, clantag_str[ length - 2 ] ); - clantag_str.erase( length - 1, 1 ); - - std::string set = clantag_str; - set.resize( 15 ); - set[ 14 ] = '$'; - - auto is_full = set.find( xors( "moneybot" ) ) != std::string::npos; - - next_settime = curtime + ( is_full ? 0.85f : 0.4f ); - fn( set.c_str( ), set.c_str( ) ); - } - } - - void c_identity::name_changer( ) { - static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "name" ) ); - auto set_name = [ ]( const char* name ) { - *( int* )( uintptr_t( &cvar->m_change_callback ) + 0xc ) = 0; - cvar->set_value( name ); - }; - - static bool activated = false; - static char original_name[ 100 ]{ }; - - if( !g_settings.misc.name_changer ) { - if( activated ) { - set_name( original_name ); - } - - activated = false; - return; - } - - if( !activated ) { - strcpy( original_name, cvar->get_string( ) ); - if( g_settings.misc.name_changer == 1 ) { - char new_name[ 128 ]; - memset( new_name, '$', sizeof( new_name ) ); - set_name( new_name ); - } - if( g_settings.misc.name_changer == 2 ) { - set_name( xors( "moneybot.cc" ) ); - } - if( g_settings.misc.name_changer == 101 ) { - set_name( "­­­\n\xAD\xAD\xAD" ); - } - } - else if( g_settings.misc.name_changer == 101 ) { - char new_name[ 15 ]; - for( size_t i{ }; i < 15; ++i ) { - auto is_upper = !( math::random_number( 0, 256 ) & 1 ); - new_name[ i ] = is_upper ? math::random_number( 65, 90 ) : math::random_number( 97, 122 ); - } - - set_name( new_name ); - } - - activated = true; - } -} \ No newline at end of file diff --git a/gmod/identity.hpp b/gmod/identity.hpp deleted file mode 100644 index 0d6e778..0000000 --- a/gmod/identity.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "sdk.hpp" - -namespace features -{ - class c_identity { - private: - void clantag_changer( ); - void name_changer( ); - public: - void operator()( ) { - clantag_changer( ); - name_changer( ); - } - }; -} \ No newline at end of file diff --git a/gmod/iface_dllmain_impl.hpp b/gmod/iface_dllmain_impl.hpp deleted file mode 100644 index 761c215..0000000 --- a/gmod/iface_dllmain_impl.hpp +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once - -namespace factory -{ - namespace interfaces - { - class c_interface_manager - { - struct reg - { - char m_key; - uintptr_t m_ptr; - uintptr_t m_module; - char m_module_name[ 64 ]; - char m_name[ 64 ]; - }; - - size_t m_count; - reg* m_regs; - - void decrypt_str( char* buf, size_t size, char key ) { - for( size_t i{ }; i < size; ++i ) { - buf[ i ] ^= key; - } - } - - public: - void init( uintptr_t iface_addr ) { - m_count = *( size_t* )( iface_addr ); - m_regs = ( reg* )( iface_addr + 4 ); - } - - template < typename t = void* > - t find_interface( const std::string& module_, std::string name ) { - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += '0'; - - char name_buf[ 64 ]; - char module_buf[ 64 ]; - - for( size_t i{ }; i < m_count; ++i ) { - auto& reg = m_regs[ i ]; - - memcpy( name_buf, reg.m_name, 64 ); - memcpy( module_buf, reg.m_module_name, 64 ); - - decrypt_str( name_buf, 64, reg.m_key ); - decrypt_str( module_buf, 64, reg.m_key ); - - if( !module_.compare( module_buf ) && strstr( name_buf, name.c_str( ) ) ) { - return ( t )( reg.m_ptr ); - } - } - - return t{ }; - } - - template < typename t = void* > - t find_interface( std::string name ) { - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += '0'; - - char name_buf[ 64 ]; - char module_buf[ 64 ]; - - for( size_t i{ }; i < m_count; ++i ) { - auto& reg = m_regs[ i ]; - - memcpy( name_buf, reg.m_name, 64 ); - memcpy( module_buf, reg.m_module_name, 64 ); - - decrypt_str( name_buf, 64, reg.m_key ); - decrypt_str( module_buf, 64, reg.m_key ); - - if( strstr( name_buf, name.c_str( ) ) ) { - return ( t )( reg.m_ptr ); - } - } - - return t{ }; - } - }; - } -} \ No newline at end of file diff --git a/gmod/in_prediction.cpp b/gmod/in_prediction.cpp deleted file mode 100644 index cb5a7bf..0000000 --- a/gmod/in_prediction.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "mem.hpp" -#include "hooks.hpp" -#include "context.hpp" - -#undef max - -bool __fastcall hooks::in_prediction( void* ecx_, void* edx_ ) { - static auto in_prediction_o = g_csgo.m_prediction->get_old_function< decltype( &hooks::in_prediction ) >( 14 ); - static auto ret_address = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "84 C0 75 08 57 8B CE E8 ? ? ? ? 8B 06" ) ); - - if( g_ctx.m_local && ret_address && g_settings.rage.enabled && g_settings.rage.resolver ) { - stack_t stack( get_baseptr( ) ); - int local_team = g_ctx.m_local->m_iTeamNum( ); - - if( stack.return_address( ) == ret_address ) { - for( size_t i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_valid( ) || ent == g_ctx.m_local ) - continue; - - if( ent->m_iTeamNum( ) != local_team || g_settings.rage.friendlies ) { - ent->m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); - ent->m_iMostRecentModelBoneCounter( ) -= 1; - } - } - } - } - - return in_prediction_o( ecx_, 0 ); -} \ No newline at end of file diff --git a/gmod/input_system.cpp b/gmod/input_system.cpp deleted file mode 100644 index 881fa02..0000000 --- a/gmod/input_system.cpp +++ /dev/null @@ -1,527 +0,0 @@ -#include - -#include "input_system.hpp" -#include "util.hpp" - -util::c_input_manager g_input; - -NAMESPACE_REGION( util ) - -const char* const key_names_short[] = { - "unk", - "m1", - "m2", - "can", - "m3", - "m4", - "m5", - "unk", - "back", - "tab", - "unk", - "unk", - "clr", - "ret", - "unk", - "unk", - "shift", - "ctrl", - "alt", - "pause", - "caps", - "kana", - "unk", - "junja", - "final", - "kanji", - "unk", - "esc", - "convert", - "nonconvert", - "accept", - "modechange", - " ", - "prior", - "next", - "end", - "home", - "left", - "up", - "right", - "down", - "slct", - "prnt", - "execute", - "snapshot", - "ins", - "del", - "help", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "lwin", - "rwin", - "apps", - "unk", - "unk", - "num0", - "num1", - "num2", - "num3", - "num4", - "num5", - "num6", - "num7", - "num8", - "num9", - "*", - "+", - "sep", - "-", - ",", - "/", - "f1", - "f2", - "f3", - "f4", - "f5", - "f6", - "f7", - "f8", - "f9", - "f10", - "f11", - "f12", - "f13", - "f14", - "f15", - "f16", - "f17", - "f18", - "f19", - "f20", - "f21", - "f22", - "f23", - "f24", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "numlock", - "scroll", - "oem_nec_equal", - "oem_fj_masshou", - "oem_fj_touroku", - "oem_fj_loya", - "oem_fj_roya", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "lshift", - "rshift", - "lctrl", - "rctrl", - "lalt", - "ralt", -}; - -const char* const key_names[] = { - "unknown", - "mouse_1", - "mouse_2", - "cancel", - "mouse_3", - "mouse_4", - "mouse_5", - "unknown", - "back", - "tab", - "unknown", - "unknown", - "clear", - "return", - "unknown", - "unknown", - "shift", - "control", - "alt", - "pause", - "capital", - "kana", - "unknown", - "junja", - "final", - "kanji", - "unknown", - "escape", - "convert", - "nonconvert", - "accept", - "modechange", - "space", - "prior", - "next", - "end", - "home", - "left", - "up", - "right", - "down", - "select", - "print", - "execute", - "snapshot", - "insert", - "delete", - "help", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "lwin", - "rwin", - "apps", - "unknown", - "unknown", - "numpad0", - "numpad1", - "numpad2", - "numpad3", - "numpad4", - "numpad5", - "numpad6", - "numpad7", - "numpad8", - "numpad9", - "multiply", - "add", - "separator", - "subtract", - "decimal", - "divide", - "f1", - "f2", - "f3", - "f4", - "f5", - "f6", - "f7", - "f8", - "f9", - "f10", - "f11", - "f12", - "f13", - "f14", - "f15", - "f16", - "f17", - "f18", - "f19", - "f20", - "f21", - "f22", - "f23", - "f24", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "numlock", - "scroll", - "oem_nec_equal", - "oem_fj_masshou", - "oem_fj_touroku", - "oem_fj_loya", - "oem_fj_roya", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "lshift", - "rshift", - "lcontrol", - "rcontrol", - "lmenu", - "rmenu", -}; - -void c_input_manager::capture_mouse_move( ulong_t lparam ) { - m_mouse_pos[ 0 ] = LOWORD( lparam ); - m_mouse_pos[ 1 ] = HIWORD( lparam ); -} - -void c_input_manager::clear_keys( ) { - memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) ); -} - -bool c_input_manager::register_key_press( int key_event, int key ) -{ - switch ( key_event ) { - case KEYDOWN: { - if ( is_valid_key( key ) ) - m_pressed_keys[ key ] = true; - return true; - } - case KEYUP: { - if ( is_valid_key( key ) ) - m_pressed_keys[ key ] = false; - return true; - } - case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? - if ( key == KEYS_ALT ) - m_pressed_keys[ key ] = true; - break; - } - case SYSKEYUP: { - if ( key == KEYS_ALT ) - m_pressed_keys[ key ] = false; - break; - } - case LBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE1 ] = true; - return true; - case LBUTTONUP: - m_pressed_keys[ KEYS_MOUSE1 ] = false; - return true; - case RBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE2 ] = true; - return true; - case RBUTTONUP: - m_pressed_keys[ KEYS_MOUSE2 ] = false; - return true; - case MBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE3 ] = true; - return true; - case MBUTTONUP: - m_pressed_keys[ KEYS_MOUSE3 ] = false; - return true; - case XBUTTONDOWN: { - bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true - m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; - return true; - } - case XBUTTONUP: { - bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true - m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; - return true; - } - case MOUSEWHEEL: { - short scroll_input = ( short )HIWORD( key ); - m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; - return true; - } - } - - return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK -} - -bool c_input_manager::is_key_pressed( int key ) { - auto k = key; - return is_valid_key( k ) && m_pressed_keys[ k ]; -} - -const char* c_input_manager::get_key_name( int key ) { - if ( !is_valid_key( key ) || key > KEYS_MAX ) - return key_names[ KEYS_NONE ]; - - return key_names[ key ]; -} - -const char* c_input_manager::get_short_name( int key ) { - return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; -} - -VirtualKeys_t c_input_manager::is_any_key_pressed( ) { - for ( size_t i{ }; i < KEYS_MAX; ++i ) { - if ( m_pressed_keys[ i ] ) { - return VirtualKeys_t( i ); - } - } - - return KEYS_NONE; -} - -int c_input_manager::get_scroll_state( ) { - int current_state = m_scroll_wheel_state; - m_scroll_wheel_state = 0; - return current_state; -} - -char c_input_manager::get_pressed_char( int* out ) { - size_t pressed_character{ }; - for ( size_t i{ }; i < KEYS_MAX; ++i ) { - if ( is_key_pressed( VirtualKeys_t( i ) ) ) { - if ( ( i >= KEYS_A && i <= KEYS_Z ) - || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { - pressed_character = i; - } - } - } - - if ( pressed_character ) { - if ( out ) { - *out = int( pressed_character ); - } - - if ( is_key_pressed( KEYS_SHIFT ) ) { - if ( pressed_character >= KEYS_A - && pressed_character <= KEYS_Z ) - return char( pressed_character ); - - //gay way to shift it to symbols - if ( pressed_character >= KEYS_N0 - && pressed_character <= KEYS_N9 ) { - switch ( pressed_character ) { - case KEYS_N0: - return ')'; - case KEYS_N1: - return '!'; - case KEYS_N2: - return '@'; - case KEYS_N3: - return '#'; - case KEYS_N4: - return '$'; - case KEYS_N5: - return '%'; - case KEYS_N6: - return '^'; - case KEYS_N7: - return '&'; - case KEYS_N8: - return '*'; - case KEYS_N9: - return '('; - } - } - } - else { - if ( pressed_character >= KEYS_A - && pressed_character <= KEYS_Z ) - return char( ::tolower( pressed_character ) ); - - if ( pressed_character >= KEYS_N0 - && pressed_character <= KEYS_N9 ) - return char( pressed_character ); - } - } - else if ( is_key_pressed( KEYS_SPACE ) ) { - if ( out ) - *out = KEYS_SPACE; - - return ' '; - } - else if ( is_key_pressed( KEYS_BACK ) ) { - if ( out ) - *out = KEYS_BACK; - - return 0; - } - - if ( out ) - *out = KEYS_NONE; - - return 0; -} - -END_REGION \ No newline at end of file diff --git a/gmod/input_system.hpp b/gmod/input_system.hpp deleted file mode 100644 index a237667..0000000 --- a/gmod/input_system.hpp +++ /dev/null @@ -1,186 +0,0 @@ -#pragma once -#include "util.hpp" - -enum VirtualKeyEvents_t { - KEYDOWN = 0x0100, - KEYUP = 0x0101, - SYSKEYDOWN = 0x104, - SYSKEYUP = 0x105, - LBUTTONDOWN = 0x0201, - LBUTTONUP = 0x0202, - RBUTTONDOWN = 0x0204, - RBUTTONUP = 0x0205, - MBUTTONDOWN = 0x0207, - MBUTTONUP = 0x0208, - MOUSEWHEEL = 0x020A, - XBUTTONDOWN = 0x020B, - XBUTTONUP = 0x020C, -}; - -enum VirtualKeys_t { - KEYS_NONE = 0, - KEYS_MOUSE1 = 0X01, - KEYS_MOUSE2 = 0X02, - KEYS_CANCEL = 0X03, - KEYS_MOUSE3 = 0X04, - KEYS_MOUSE4 = 0X05, - KEYS_MOUSE5 = 0X06, - KEYS_BACK = 0X08, - KEYS_TAB = 0X09, - KEYS_CLEAR = 0X0C, - KEYS_RETURN = 0X0D, - KEYS_SHIFT = 0X10, - KEYS_CONTROL = 0X11, - KEYS_ALT = 0X12, - KEYS_PAUSE = 0X13, - KEYS_CAPSLOCK = 0X14, - KEYS_ESCAPE = 0X1B, - KEYS_CONVERT = 0X1C, - KEYS_NONCONVERT = 0X1D, - KEYS_ACCEPT = 0X1E, - KEYS_MODECHANGE = 0X1F, - KEYS_SPACE = 0X20, - KEYS_PRIOR = 0X21, - KEYS_NEXT = 0X22, - KEYS_END = 0X23, - KEYS_HOME = 0X24, - KEYS_LEFT = 0X25, - KEYS_UP = 0X26, - KEYS_RIGHT = 0X27, - KEYS_DOWN = 0X28, - KEYS_SELECT = 0X29, - KEYS_PRINT = 0X2A, - KEYS_EXECUTE = 0X2B, - KEYS_SNAPSHOT = 0X2C, - KEYS_INSERT = 0X2D, - KEYS_DELETE = 0X2E, - KEYS_HELP = 0X2F, - KEYS_N0 = 0X30, - KEYS_N1 = 0X31, - KEYS_N2 = 0X32, - KEYS_N3 = 0X33, - KEYS_N4 = 0X34, - KEYS_N5 = 0X35, - KEYS_N6 = 0X36, - KEYS_N7 = 0X37, - KEYS_N8 = 0X38, - KEYS_N9 = 0X39, - KEYS_A = 0X41, - KEYS_B = 0X42, - KEYS_C = 0X43, - KEYS_D = 0X44, - KEYS_E = 0X45, - KEYS_F = 0X46, - KEYS_G = 0X47, - KEYS_H = 0X48, - KEYS_I = 0X49, - KEYS_J = 0X4A, - KEYS_K = 0X4B, - KEYS_L = 0X4C, - KEYS_M = 0X4D, - KEYS_N = 0X4E, - KEYS_O = 0X4F, - KEYS_P = 0X50, - KEYS_Q = 0X51, - KEYS_R = 0X52, - KEYS_S = 0X53, - KEYS_T = 0X54, - KEYS_U = 0X55, - KEYS_V = 0X56, - KEYS_W = 0X57, - KEYS_X = 0X58, - KEYS_Y = 0X59, - KEYS_Z = 0X5A, - KEYS_LEFTWINDOWS = 0X5B, - KEYS_RIGHTWINDOWS = 0X5C, - KEYS_APPLICATION = 0X5D, - KEYS_NUMPAD0 = 0X60, - KEYS_NUMPAD1 = 0X61, - KEYS_NUMPAD2 = 0X62, - KEYS_NUMPAD3 = 0X63, - KEYS_NUMPAD4 = 0X64, - KEYS_NUMPAD5 = 0X65, - KEYS_NUMPAD6 = 0X66, - KEYS_NUMPAD7 = 0X67, - KEYS_NUMPAD8 = 0X68, - KEYS_NUMPAD9 = 0X69, - KEYS_MULTIPLY = 0X6A, - KEYS_ADD = 0X6B, - KEYS_SEPARATOR = 0X6C, - KEYS_SUBTRACT = 0X6D, - KEYS_DECIMAL = 0X6E, - KEYS_DIVIDE = 0X6F, - KEYS_F1 = 0X70, - KEYS_F2 = 0X71, - KEYS_F3 = 0X72, - KEYS_F4 = 0X73, - KEYS_F5 = 0X74, - KEYS_F6 = 0X75, - KEYS_F7 = 0X76, - KEYS_F8 = 0X77, - KEYS_F9 = 0X78, - KEYS_F10 = 0X79, - KEYS_F11 = 0X7A, - KEYS_F12 = 0X7B, - KEYS_NUMLOCK = 0X90, - KEYS_SCROLLLOCK = 0X91, - KEYS_LEFTSHIFT = 0XA0, - KEYS_RIGHTSHIFT = 0XA1, - KEYS_LEFTCONTROL = 0XA2, - KEYS_RIGHTCONTROL = 0XA3, - KEYS_LEFTMENU = 0XA4, - KEYS_RIGHTMENU = 0XA5, - KEYS_PERIOD = 0xBE, - KEYS_MAX = 0XA6, - KEYS_LAST = 0xfe -}; - -namespace util -{ - class c_input_manager { - public: - bool m_pressed_keys[ KEYS_LAST ]{ }; - int m_mouse_pos[ 2 ]{ }; - int m_scroll_wheel_state{ }; - - - c_input_manager( ) { - memset( m_pressed_keys, 0, KEYS_LAST ); - } - - void capture_mouse_move( ulong_t lparam ); - - //resets all keys so unpressed - void clear_keys( ); - - //registers a key press from wndproc - bool register_key_press( int key_event, int key ); - - //checks if the key is pressed - bool is_key_pressed( int key ); - - //returns the first found key pressed, or KEY_NONE if none are - VirtualKeys_t is_any_key_pressed( ); - - //returns the last scroll state and resets it to 0 - int get_scroll_state( ); - - //returns the key's name - const char* get_key_name( int key ); - const char* get_short_name( int key ); - - //returns the first found currently pressed key - char get_pressed_char( int* pressed_key = nullptr ); - - //check if a key is valid - inline bool is_valid_key( int key ) { return key > KEYS_NONE && key < KEYS_LAST; } - - //get cursor pos - inline void get_cursor_pos( int& x, int& y ) { - x = m_mouse_pos[ 0 ]; - y = m_mouse_pos[ 1 ]; - } - }; -} - -extern util::c_input_manager g_input; \ No newline at end of file diff --git a/gmod/interface.cpp b/gmod/interface.cpp deleted file mode 100644 index 0d1cfac..0000000 --- a/gmod/interface.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include - -#include "interface.hpp" -#include "console.hpp" -#include "hooks.hpp" -#include "renderer.hpp" -#include "pattern.hpp" -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "settings.hpp" - -using namespace factory; - -interfaces::c_interface_manager g_factory; -factory::c_gmod g_gmod; - -bool factory::create_interfaces( c_gmod* instance ) { - - auto d3d_device = pattern::first_code_match( GetModuleHandleA( - xors( "shaderapidx9.dll" ) ), - xors( "FF 90 ?? ?? ?? ?? A1 ?? ?? ?? ?? 6A 00" ), 0x7 - ); - - auto engine_render = pattern::first_code_match( GetModuleHandleA( - xors( "engine.dll" ) ), - xors( "8B 0D ? ? ? ? FF 75 0C FF 75 08 8B 01 FF 50 0C" ), 2 - ); - - auto view_render = pattern::first_code_match( GetModuleHandleA( - xors( "client.dll" ) ), - xors( "8B 0D ? ? ? ? 56 57 8B 01 FF 50 30" ), 2 - ); - - instance->create( &instance->m_d3d, **reinterpret_cast< uintptr_t** >( d3d_device ) ); - instance->create( &instance->m_engine_render, **reinterpret_cast< uintptr_t** >( engine_render ) ); - instance->create( &instance->m_view_render, **reinterpret_cast< uintptr_t** >( view_render ) ); - instance->create( &instance->m_chl, xors( "VClient" ) ); - instance->create( &instance->m_surface, xors( "VGUI_Surface" ) ); - instance->create( &instance->m_panel, xors( "VGUI_Panel" ) ); - instance->create( &instance->m_engine, xors( "VEngineClient" ) ); - instance->create( &instance->m_entlist, xors( "VClientEntityList" ) ); - instance->create( &instance->m_prediction, xors( "VClientPrediction" ) ); - instance->create( &instance->m_cvar, xors( "VEngineCvar" ) ); - instance->create( &instance->m_game_movement, xors( "GameMovement" ) ); - instance->create( &instance->m_model_info, xors( "VModelInfoClient" ) ); - instance->create( &instance->m_trace, xors( "EngineTraceClient" ) ); - instance->create( &instance->m_model_render, xors( "VEngineModel" ) ); - instance->create( &instance->m_mat_system, xors( "VMaterialSystem" ) ); - instance->create( &instance->m_render_view, xors( "VEngineRenderView" ) ); - instance->create( &instance->m_phys_props, xors( "VPhysicsSurfaceProps" ) ); - instance->create( &instance->m_engine_sound, xors( "IEngineSoundClient" ) ); - instance->create( &instance->m_event_mgr, xors( "GAMEEVENTSMANAGER002" ) ); - instance->create( &instance->m_engine_vgui, xors( "VEngineVGui" ) ); - instance->create( &instance->m_lua_shared, xors( "LUASHARED" ) ); - - //auto kv_fn = ( void*( __cdecl* )( ) )( GetProcAddress( - // GetModuleHandleA( xors( "vstdlib.dll" ) ), - // xors( "KeyValuesSystem" ) ) ); - // - //instance->m_keyvalues = ( IKeyValuesSystem* )kv_fn( ); - // - //instance->m_alloc = *( IMemAlloc** )GetProcAddress( - // GetModuleHandleA( xors( "tier0.dll" ) ), - // xors( "g_pMemAlloc" ) ); - // - uintptr_t* globals = **reinterpret_cast< uintptr_t*** >( - instance->m_chl->get_old_function( 0 ) + 0x53 ); - instance->m_globals = reinterpret_cast< global_vars_t* >( globals ); - - uintptr_t* client_mode = **reinterpret_cast< uintptr_t*** >( - instance->m_chl->get_old_function( 10 ) + 0x5 ); - instance->create( &instance->m_clientmode, uintptr_t( client_mode ) ); - - uintptr_t* input = **reinterpret_cast< uintptr_t*** >( - instance->m_chl->get_old_function( 15 ) + 0x2 ); - instance->m_input = reinterpret_cast< CInput* >( input ); - - //uintptr_t** global_state = pattern::first_code_match< uintptr_t** >( instance->m_engine.dll( ), - // xors( "B9 ? ? ? ? 56 FF 50 14 8B 34 85" ), 0x1 ); - //instance->m_global_state = reinterpret_cast< CGlobalState* >( *global_state ); - // - //auto clientstate = instance->m_global_state->get_client_state( ); - //if( clientstate && clientstate->netchannel ) - // instance->create( &instance->m_net_channel, ( uintptr_t )clientstate->netchannel ); - // - //uintptr_t var_ptr = ( uintptr_t )instance->m_cvar( )->FindVar( xors( "weapon_debug_spread_show" ) ); - //instance->create( &instance->m_debug_show_spread, var_ptr ); - - //instance->listeners.bullet_impact.init( ); - //instance->listeners.player_hurt.init( ); - //instance->listeners.round_start.init( ); - - return true; -} - - -con_fn clear_fn{ fnv( "clear" ), [ ]( const char*, const char* ) { g_con->m_logs.clear( ); }, "" }; -con_fn enable_logs_fn{ fnv( "log_enable" ), - [ ]( const char* a, const char* ) { - g_settings.menu.logs_enable ^= 1; - g_con->log( g_settings.menu.logs_enable ? xors( "logs enabled" ) : xors( "logs disabled" ) ); - }, - "" -}; - -con_fn fnv_fn{ fnv( "fnv" ), - [ ]( const char* a, const char* ) { - auto print = hash::fnv1a( a ); - g_con->log( "%08x", print ); - }, - "%S" -}; - -con_fn sum_fn{ fnv( "sum" ), - [ ]( const char* a, const char* syntax ) { - auto arg_1 = con_fn::get_arg< int >( a, 0, syntax ); - auto arg_2 = con_fn::get_arg< int >( a, 1, syntax ); - g_con->log( "%d + %d = %d", arg_1, arg_2, arg_1 + arg_2 ); - }, - "%D %D" -}; - -con_fn dump_cfg{ fnv( "dump_cfg" ), - [ ]( const char* , const char* ) { - for( auto& it : data::holder_.get_nodes( ) ) { - auto setting = static_cast< ISetting* >( it ); - g_con->log( "%08x: %s", setting->get_hash( ), setting->get_string( ).c_str( ) ); - } - }, - "" -}; - -con_fn retard_fn{ fnv( "retard" ), - [ ]( const char*, const char* ) { - g_con->log( "snuze" ); - }, - "" -}; - -con_fn unload_fn{ fnv( "unload" ), - [ ]( const char*, const char* ) { - g_gmod.m_panic = true; - }, - "" -}; - -/*con_fn alias_fn{ fnv( "alias" ), - [ ]( const char* a, const char* b ) { - auto var_type = std::string( b ); - if( var_type.length( ) > 1 ) { - g_con->log( xors( "unknown var type: %s" ), var_type.c_str( ) ); - return; - } - - switch( b[ 0 ] ) { - case TYPE_STRING: { - std::shared_ptr< con_alias< const char* > >( fnv( ) ) - } - } - }, - "%S %S" -};*/ - -void factory::c_gmod::initialize( ) { - m_panic = true; - g_con->create( ); - auto now = std::chrono::high_resolution_clock::now( ); - g_con->print( xors( "hello\n" ) ); - - factory::create_interfaces( &g_gmod ); - - //g_fonts.initialize( ); - // - g_netvars.init( ); - //g_settings.load( ); - g_con->register_fn( &clear_fn ); - g_con->register_fn( &enable_logs_fn ); - g_con->register_fn( &fnv_fn ); - g_con->register_fn( &sum_fn ); - g_con->register_fn( &dump_cfg ); - g_con->register_fn( &retard_fn ); - g_con->register_fn( &unload_fn ); - // - hooks::commit( &g_gmod ); - - - ////g_cheat.m_chams.m_materials.initialize_materials( ); - // - //auto offset = g_netvars.get_netvar( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ); - //g_con->log( "lastshottime: %08x", offset ); - //g_con->log( "prop: %08x", g_netvars.get_prop( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ) ); - // - auto after = std::chrono::high_resolution_clock::now( ); - std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); - - std::chrono::duration< float > delta = after - now; - g_con->print( xors( "cheat initialized\n" ) ); - g_con->print( xors( "time taken: %f\n" ), delta.count( ) ); - m_panic = false; -} - -void factory::c_gmod::uninitialize( ) { - m_panic = true; - g_con->destroy( ); - //Sleep( 100 ); - - //restore wndproc - if ( hooks::window_procedure_o ) { - SetWindowLongA( m_hwnd, GWLP_WNDPROC, ( long )hooks::window_procedure_o ); - } - - //restore all interfaces - restore( ); - - //free the library - FreeLibraryAndExitThread( g_dll, 0 ); -} \ No newline at end of file diff --git a/gmod/interface.hpp b/gmod/interface.hpp deleted file mode 100644 index 49fa015..0000000 --- a/gmod/interface.hpp +++ /dev/null @@ -1,165 +0,0 @@ -#pragma once -#include "factory.hpp" -#include "sdk.hpp" -#include "listener.hpp" - -NAMESPACE_REGION( factory ) - -struct IDirect3DDevice9; - -//interface holder -template < typename t > -class c_interface_base { - friend class c_gmod; -public: - t* operator( )( ) { - return m_interface; - } - - //calls a virtual - template< size_t index, typename ret = void, - class... Args > - ret call( Args... args ) { - return util::get_vfunc< ret( __thiscall* )( void*, Args... ) > - ( m_interface, index )( m_interface, args... ); - } - - //also calls a virtual but you supply the typedef instead of return type - template< typename def, size_t index, class... Args > - auto call( Args... args ) { - return util::get_vfunc< def > - ( m_interface, index )( m_interface, args... ); - } - - //allows you to cast the interface - template< typename t0 = t* > - t0 get( ) { - return ( t0 )m_interface; - } - - void operator( )( t* ptr ) { - m_interface = ptr; - m_hook.reset( ); - m_hook = std::make_shared< hooks::c_vmt >( static_cast< void* >( ptr ) ); - - /*find the module the interface is located in - i know i could just pass the pointer but traps are gay*/ - MEMORY_BASIC_INFORMATION info; - VirtualQuery( ptr, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); - - m_dll = static_cast< HMODULE >( info.AllocationBase ); - } - - void operator( )( void* ptr ) { - operator( )( static_cast< t* >( ptr ) ); - } - - decltype( auto ) operator->( ) { - return m_hook; - } - - template< typename t2 = decltype( m_dll ) > - t2 dll( ) { - return ( t2 )m_dll; - } - -protected: - t* m_interface; - HMODULE m_dll; - std::shared_ptr< hooks::c_vmt > m_hook; -}; - -//declare your interfaces here -class c_gmod { -public: - c_interface_base< IBaseClientDLL > m_chl; - c_interface_base< ISurface > m_surface; - c_interface_base< IPanel > m_panel; - c_interface_base< IClientMode > m_clientmode; - c_interface_base< IVEngineClient > m_engine; - c_interface_base< IClientEntityList > m_entlist; - c_interface_base< IDirect3DDevice9 > m_d3d; - c_interface_base< IPrediction > m_prediction; - c_interface_base< ICSGameMovement > m_game_movement; - c_interface_base< IMoveHelper > m_move_helper; - c_interface_base< IVModelInfoClient > m_model_info; - c_interface_base< IVModelRender > m_model_render; - c_interface_base< IMaterialSystem > m_mat_system; - c_interface_base< IEngineTrace > m_trace; - c_interface_base< IPhysicsSurfaceProps > m_phys_props; - c_interface_base< IVRenderView > m_render_view; - c_interface_base< ICVar > m_cvar; - c_interface_base< IGameEventManager2 > m_event_mgr; - c_interface_base< CHudChat > m_hud_chat; - c_interface_base< uintptr_t > m_engine_sound; - c_interface_base< INetChannel > m_net_channel; - c_interface_base< cvar_t > m_debug_show_spread; - c_interface_base< CLuaShared > m_lua_shared; - c_interface_base< uintptr_t > m_engine_render; - c_interface_base< uintptr_t > m_engine_vgui; - c_interface_base< uintptr_t > m_view_render; - IKeyValuesSystem* m_keyvalues; - global_vars_t* m_globals; - CGlobalState* m_global_state; - CInput* m_input; - IMemAlloc* m_alloc; - float m_frametime; - - HWND m_hwnd{ }; - bool m_panic{ }; - - // struct { - // generic_listener_t bullet_impact{ xors( "bullet_impact" ), &listeners::bullet_impact }; - // generic_listener_t player_hurt{ xors( "player_hurt" ), &listeners::player_hurt }; - // generic_listener_t round_start{ xors( "round_start" ), &listeners::round_start }; - // } listeners; -public: - //find the interface inside of the module - void create( void* iface, const std::string& name, const std::string& mod ) { - auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); - auto ptr = g_factory.find_interface( mod, name ); - if( !ptr ) - return; - - ( *interface_ )( ptr ); - m_container.push_back( interface_ ); - } - - void create( void* iface, uintptr_t pointer ) { - auto interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); - - //msvc is retarded - ( *interface_ )( ( void* )pointer ); - m_container.push_back( interface_ ); - } - - void create( void* iface, const std::string& name ) { - auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); - auto ptr = g_factory.find_interface( name ); - if( !ptr ) - return; - - ( *interface_ )( ptr ); - m_container.push_back( interface_ ); - } - - void __cdecl initialize( ); - void __cdecl uninitialize( ); - -private: - //restore the vmts to their original - void restore( ) { - for ( const auto& it : m_container ) { - it->m_hook->restore( ); - } - } - -private: - std::vector< c_interface_base< uintptr_t >* > m_container; -}; - -bool create_interfaces( c_gmod* instance ); - -END_REGION - -extern factory::c_gmod g_gmod; \ No newline at end of file diff --git a/gmod/is_connected.cpp b/gmod/is_connected.cpp deleted file mode 100644 index 7b1055a..0000000 --- a/gmod/is_connected.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "mem.hpp" -#include "hooks.hpp" - -bool __fastcall hooks::is_connected( void* ecx_, void* edx_ ) { - static auto inventory = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 75 04 B0 01 5F" ) ); - static auto is_connected_o = g_csgo.m_engine->get_old_function< decltype( &is_connected ) >( 27 ); - stack_t stack( get_baseptr( ) ); - - if( stack.return_address( ) == inventory && g_settings.misc.unlock_inventory( ) ) - return false; - - - return is_connected_o( ecx_, 0 ); -} \ No newline at end of file diff --git a/gmod/is_hltv.cpp b/gmod/is_hltv.cpp deleted file mode 100644 index a611d2e..0000000 --- a/gmod/is_hltv.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "hooks.hpp" -#include "pattern.hpp" -#include "mem.hpp" - -bool __fastcall hooks::is_hltv( void* ecx, uintptr_t pvs_ent ) { - static auto is_hltv_o = g_csgo.m_engine->get_old_function< decltype( &hooks::is_hltv ) >( 93 ); - static auto pvs_retaddr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 0F 85 ? ? ? ? A1 ? ? ? ? 8B B7" ) ); - - if ( !g_csgo.m_panic && pvs_retaddr ) { - stack_t stack( get_baseptr( ) ); - auto return_address = stack.return_address( ); - - if ( return_address == pvs_retaddr ) { - if ( pvs_ent && reinterpret_cast< c_base_player* >( pvs_ent )->is_valid( ) ) { - *( int* )( pvs_ent + 0xa24 ) = -1; - *( int* )( pvs_ent + 0xa2c ) = *( int* )( pvs_ent + 0xa28 ); - *( int* )( pvs_ent + 0xa28 ) = 0; - return true; - } - } - } - - return is_hltv_o( ecx, pvs_ent ); -} - -bool __declspec( naked ) __fastcall hooks::is_hltv_proxy( void*, void* ) { - __asm { - mov edx, edi; - jmp is_hltv; - } -} \ No newline at end of file diff --git a/gmod/is_paused.cpp b/gmod/is_paused.cpp deleted file mode 100644 index 48916a4..0000000 --- a/gmod/is_paused.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "mem.hpp" -#include "hooks.hpp" - -bool __fastcall hooks::is_paused( void* ecx_, void* edx_ ) { - static auto return_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "FF D0 A1 ? ? ? ? B9 ? ? ? ? D9 1D ? ? ? ? FF 50 34 85 C0 74 22 8B 0D" ), 0x29 ); - static auto is_paused_o = g_csgo.m_engine->get_old_function< decltype( &is_paused ) >( 91 ); - - stack_t stack( get_baseptr( ) ); - uintptr_t return_address = stack.return_address( ); - - //printf( "return address: %08x sig: %08x deref: %08x delta: %08x delta: %08x\n", return_address, return_addr, *( uintptr_t* )return_addr, return_address - return_addr, return_addr - return_address ); - - if( return_address == return_addr ) { - printf( "extrapolate\n" ); - return true; - } - - return is_paused_o( ecx_, 0 ); -} \ No newline at end of file diff --git a/gmod/lag_mgr.cpp b/gmod/lag_mgr.cpp deleted file mode 100644 index 4f9d04b..0000000 --- a/gmod/lag_mgr.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "lag_mgr.hpp" -#include "c_base_player.hpp" -#include "context.hpp" -#include "interface.hpp" -#include "base_cheat.hpp" - -namespace features -{ - void c_lagmgr::on_antiaim( ) { - static bool lag_flip{ }; //fuck you and ur cmdnr - *m_sendpacket = lag_flip; - lag_flip ^= 1; - - if( m_sent_ticks ) { - *m_sendpacket = false; - } - } - - - void c_lagmgr::fakelag( ) { - //2017 sucked - //i hope 2018 goes better - - if( !g_settings.rage.fakelag.mode( ) || - !g_settings.rage.fakelag.ticks( ) ) { - m_breaking_lc = false; - return; - } - - auto& settings = g_settings.rage.fakelag; - - if( g_ctx.m_local->m_vecVelocity( ).length( ) < 0.1f ) { - return; - } - - vec3_t delta = g_ctx.m_last_origin - g_ctx.m_local->m_vecOrigin( ); - int max_ticks = math::min( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ? 10 : 16, g_settings.rage.fakelag.ticks( ) ); - bool force_send = m_held_ticks > max_ticks; - if( settings.mode == 1 ) { - if( delta.length2dsqr( ) > 4096.f ) { - force_send = get_choked( ) > 3; - } - } - - if( settings.mode == 2 ) { - auto fluc = math::random_number( -settings.fluctuate( ), settings.fluctuate( ) ) * 0.01f; - force_send = m_held_ticks > math::min( max_ticks + ( int )fluc, 15 ); - } - - bool send = false; - static bool was_onground{ }; - - if( !settings.in_move ) { - send = true; - } - - if( settings.in_air && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - send = false; - } - - if( settings.avoid_ground ) { - if( !was_onground && g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { - send = false; - } - } - - was_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - - if( ( m_cmd->m_buttons & IN_ATTACK ) && - !settings.in_attack ) { - send = true; - } - - *m_sendpacket = ( send || force_send ) && !get_sent( ); - if( *m_sendpacket ) { - m_breaking_lc = delta.length2dsqr( ) > 4096.f; - } - } -} \ No newline at end of file diff --git a/gmod/lag_mgr.hpp b/gmod/lag_mgr.hpp deleted file mode 100644 index ae5fb6c..0000000 --- a/gmod/lag_mgr.hpp +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once -#include "sdk.hpp" -#include "settings.hpp" -#include "console.hpp" - -namespace features -{ - class c_lagmgr { - public: - void operator()( user_cmd_t* cmd, byte* sendpacket ) { - if( !sendpacket ) return; - if( !cmd ) return; - - m_cmd = cmd; - m_sendpacket = sendpacket; - - if( g_settings.rage.anti_aim( ) ) { - on_antiaim( ); - } - - //let fakelag override whatever happened in antiaim - //this also means we will call stuff like fakewalk etc - //after this - fakelag( ); - } - - void on_cmove_end( ) { - if( !m_sendpacket ) return; - - if( *m_sendpacket ) { - ++m_sent_ticks; - m_held_ticks = 0; - } - else { - ++m_held_ticks; - m_sent_ticks = 0; - } - } - - void set_state( bool state ) { - *m_sendpacket = state; - } - - int get_choked( ) const { - return m_held_ticks; - } - - int get_sent( ) const { - return m_sent_ticks; - } - - bool get_state( ) const { - return m_sendpacket ? !!*m_sendpacket : true; - } - - bool is_breaking_lc( ) const { - return m_breaking_lc; - } - - private: - void on_antiaim( ); - void fakelag( ); - - user_cmd_t* m_cmd{ }; - byte* m_sendpacket{ }; - int m_sent_ticks{ }; - int m_held_ticks{ }; - bool m_breaking_lc{ }; - }; -} \ No newline at end of file diff --git a/gmod/legitbot.cpp b/gmod/legitbot.cpp deleted file mode 100644 index fe819cf..0000000 --- a/gmod/legitbot.cpp +++ /dev/null @@ -1,309 +0,0 @@ -#include "interface.hpp" -#include "input_system.hpp" -#include "context.hpp" -#include "legitbot.hpp" -#include "settings.hpp" -#include "math.hpp" - -namespace features -{ - int c_legitbot::get_aim_target( float fov ) { - float best_fov = fov ? fov : g_settings.legit.active->m_fov; - int target{ -1 }; - vec3_t aim_angle{ }; - vec3_t cur_angle{ }; - vec3_t local_pos{ }; - vec3_t aim_pos{ }; - - g_csgo.m_engine( )->GetViewAngles( cur_angle ); - local_pos = g_ctx.m_local->get_eye_pos( ); - - for ( int i{ 1 }; i <= g_csgo.m_globals->m_maxclients; ++i ) { - auto entity = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if ( !entity ) continue; - if ( entity == g_ctx.m_local ) continue; - if ( !entity->is_valid( ) ) continue; - int team = entity->m_iTeamNum( ); - if ( team == g_ctx.m_local->m_iTeamNum( ) - && !g_settings.legit.friendlies( ) ) { - continue; - } - - bool visible = entity->is_visible( 0 ); - if( !visible && g_settings.legit.backtracking_target( ) ) { - auto record = m_lagcomp.find_best_record( i ); - if( record ) { - visible = util::trace_ray( local_pos, record->m_position, - g_ctx.m_local->ce( ), entity->ce( ) ); - } - } - - if ( !visible ) { - continue; - } - - aim_angle = math::vector_angles( local_pos, entity->get_hitbox_pos( 0 ) ); - aim_angle.clamp( ); - - float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); - if ( fov < best_fov ) { - best_fov = fov; - target = i; - } - } - - return target; - } - - void c_legitbot::assist( c_base_player* target, float* x, float* y ) { - vec3_t aim_ang; - vec3_t move_ang; - vec3_t view_ang; - vec3_t enemy_pos; - vec3_t local_pos; - vec3_t view_delta; - vec3_t delta; - vec2_t pixels; - - local_pos = g_ctx.m_local->get_eye_pos( ); - enemy_pos = target->get_hitbox_pos( 0 ); - - aim_ang = math::vector_angles( local_pos, enemy_pos ); - aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * g_settings.legit.active->m_rcs; - - move_ang = pixels_to_angle( vec2_t( *x, *y ) ); - g_csgo.m_engine( )->GetViewAngles( view_ang ); - - view_delta = ( aim_ang - view_ang ).clamp( ); - - move_ang *= g_settings.legit.active->m_assist_strength; - float delta_y = std::abs( move_ang.y ); - float delta_x = std::abs( move_ang.x ); - - delta.x = std::clamp( view_delta.x, -delta_x, delta_x ); - delta.y = std::clamp( view_delta.y, -delta_y, delta_y ); - - pixels = angle_to_pixels( delta ); - *x += pixels.x; *y += pixels.y; - } - - void c_legitbot::triggerbot( user_cmd_t* cmd ) { - if( !g_settings.legit.triggerbot( ) ) - return; - - if( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.trigger_key( ) ) ) - return; - - vec3_t viewangles{ }; - vec3_t forward{ }; - g_csgo.m_engine( )->GetViewAngles( viewangles ); - - auto wep = g_ctx.m_local->get_weapon( ); - if( !wep ) return; - if( wep->is_knife( ) ) return; - - auto wpn_info = wep->get_wpn_info( ); - if( !wpn_info ) return; - - float length = wpn_info->range; - - if( length > 1.0f ) { - viewangles += g_ctx.m_local->m_aimPunchAngle( ) * 2.f; - - forward = math::angle_vectors( viewangles ); - forward *= length; - - vec3_t src = g_ctx.m_local->get_eye_pos( ); - vec3_t dst = src + forward; - - CTraceFilter filter{ }; - CGameTrace tr{ }; - Ray_t ray{ }; - - filter.pSkip = g_ctx.m_local; - ray.Init( src, dst ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); - - if( tr.m_pEnt ) { - auto ent = tr.m_pEnt->as< c_base_player >( ); - if( ent->is_valid( ) ) { - if( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.legit.friendlies ) - cmd->m_buttons |= IN_ATTACK; - } - } - } - } - - void c_legitbot::sample_angle_data( const vec3_t& cur_angles ) { - auto time = g_csgo.m_globals->m_curtime; - - if ( !m_aiming ) { - m_angle_samples.push_front( { cur_angles, time } ); - } - - while ( m_angle_samples.size( ) > g_settings.legit.sample_size( ) ) { - m_angle_samples.pop_back( ); - } - } - - float c_legitbot::get_avg_delta( ) { - if ( m_angle_samples.empty( ) ) - return 0.f; - - float avg_delta{ }; - - for ( auto& it : m_angle_samples ) { - static vec3_t last_angle = it.m_viewangles; - - //doing this implements nonsticky aswell - //once you already are at the target - //after lets say a flick - //it will reduce the aim speed - //making it not "stick" to the bone - //as we dont store records when aiming - float time_delta = g_csgo.m_globals->m_curtime - it.m_time; - float delta_diff = m_deltatime / ( time_delta * 2.f ); - - vec3_t angle_delta = ( last_angle - it.m_viewangles ).clamp( ); - float delta_length = angle_delta.length( ) * delta_diff; - - avg_delta += delta_length; - last_angle = it.m_viewangles; - } - - //scale the delta down - return avg_delta / float( g_settings.legit.sample_size( ) ); - } - - vec2_t c_legitbot::angle_to_pixels( const vec3_t& angle ) { - static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); - static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); - - float x = angle.x / m_pitch->get_float( ); - float y = angle.y / m_yaw->get_float( ); - - return vec2_t( -y, x ); - } - - vec3_t c_legitbot::pixels_to_angle( const vec2_t& pixel ) { - static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); - static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); - - float x = pixel.x * m_pitch->get_float( ); - float y = pixel.y * m_yaw->get_float( ); - - return vec3_t( -y, x, 0.f ).clamp( ); - } - - bool c_legitbot::update_settings( ) { - if ( !g_ctx.run_frame( ) ) return false; - - auto weapon = g_ctx.m_local->get_weapon( ); - if ( !weapon ) return false; - - if ( weapon->is_grenade( ) || weapon->is_knife( ) ) { - return false; - } - - if ( weapon->is_rifle( ) ) { - g_settings.legit.active = &g_settings.legit.rifles; - } - else if ( weapon->is_sniper( ) ) { - g_settings.legit.active = &g_settings.legit.snipers; - } - else if ( weapon->is_pistol( ) ) { - g_settings.legit.active = &g_settings.legit.pistols; - } - else { - g_settings.legit.active = &g_settings.legit.general; - } - - return true; - } - - void c_legitbot::aim_at_target( c_base_player* target, float* x, float* y ) { - vec3_t aim_ang; - vec3_t cur_ang; - vec3_t delta; - vec2_t pixels; - vec2_t mouse; - - g_csgo.m_engine( )->GetViewAngles( cur_ang ); - - if ( g_settings.legit.backtracking( ) && m_lagcomp.find_best_record( target->ce( )->GetIndex( ) ) ) { - aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), - m_lagcomp.get_backtracked_position( target->ce( )->GetIndex( ) ) ).clamp( ); - } - else { - aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), - target->get_hitbox_pos( 0 ) ).clamp( ); - } - - aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * ( g_settings.legit.active->m_rcs / 100.f ); - - delta = ( aim_ang - cur_ang ).clamp( ); - float delta_length = delta.length( ); - - if ( delta_length ) { - float final_time = delta_length / ( g_settings.legit.active->m_speed( ) / 100.f ); - m_curtime += m_deltatime; - - if ( m_curtime > final_time ) { - m_curtime = final_time; - } - - float aim_progress = m_curtime / final_time; - delta *= aim_progress; - aim_ang = delta; - - pixels = angle_to_pixels( delta ); - *x += pixels.x; - *y += pixels.y; - } - } - - void c_legitbot::aimbot( float* x, float* y ) { - if ( !g_settings.legit.enabled( ) ) return; - if ( !update_settings( ) ) return; - - m_aiming = false; - static float old_time = g_csgo.m_globals->m_curtime; - float time = g_csgo.m_globals->m_curtime; - - m_deltatime = time - old_time; - if ( g_settings.legit.dynamic_smoothing( ) ) { - float avg_delta = get_avg_delta( ) * g_settings.legit.smooth_factor( ); - if ( avg_delta > m_deltatime ) { - m_deltatime = avg_delta; - } - } - - old_time = time; - - bool in_attack = false; - if ( g_settings.legit.activation_type == 0 ) - in_attack = true; - if ( g_settings.legit.activation_type == 1 - && g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) { - in_attack = true; - } - - int target_index = get_aim_target( ); - auto target = g_csgo.m_entlist( )->GetClientEntity< >( target_index ); - - if ( target_index != -1 ) { - if( in_attack ) { - m_aiming = true; - aim_at_target( target, x, y ); - } - if( g_settings.legit.assist ) { - assist( target, x, y ); - } - } - else { - m_curtime = 0; - } - } -} \ No newline at end of file diff --git a/gmod/legitbot.hpp b/gmod/legitbot.hpp deleted file mode 100644 index f5d4243..0000000 --- a/gmod/legitbot.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once -#include -#include - -#include "sdk.hpp" - -namespace features -{ - class c_legitbot { - public: - void operator()( float* x, float* y ) { - aimbot( x, y ); - } - - //call once per tick - void sample_angle_data( const vec3_t& angle ); - void triggerbot( user_cmd_t* cmd ); - private: - struct aim_record_t { - vec3_t m_viewangles; - float m_time; - }; - - struct lag_record_t { - int m_tickcount{ }; - vec3_t m_position{ }; - matrix3x4 m_matrix[ 128 ]{ }; - - bool is_valid( ); - }; - - class c_lagcomp { - public: - friend class c_legitbot; - using lag_deque_t = std::deque< lag_record_t >; - - lag_record_t* find_best_record( int ent_index ); - vec3_t get_backtracked_position( int ent_index ); - auto& get_records( int ent_index ) { - return m_data[ ent_index ]; - } - - void store( ); - void operator()( user_cmd_t* cmd ); - - private: - bool backtrack_entity( int ent_index ); - bool can_backtrack_entity( int ent_index ); - void store_player( int ent_index ); - - lag_deque_t m_data[ 65 ]; - user_cmd_t* m_cmd; - }; - - vec2_t angle_to_pixels( const vec3_t& angle ); - vec3_t pixels_to_angle( const vec2_t& pixel ); - void aimbot( float* x, float* y ); - void assist( c_base_player* player, float* x, float* y ); - void aim_at_target( c_base_player*, float*, float* ); - - bool update_settings( ); - float get_avg_delta( ); - int get_aim_target( float fov = 0.f ); - - private: - float m_deltatime{ }; - float m_curtime{ }; - bool m_aiming{ }; - - std::deque< aim_record_t > m_angle_samples; - - public: - c_lagcomp m_lagcomp; - }; -} \ No newline at end of file diff --git a/gmod/legitbot_lagcomp.cpp b/gmod/legitbot_lagcomp.cpp deleted file mode 100644 index b2ab3c0..0000000 --- a/gmod/legitbot_lagcomp.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "legitbot.hpp" -#include "interface.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "math.hpp" -#include "base_cheat.hpp" -#include "input_system.hpp" -#include "d3d.hpp" - -namespace features -{ - bool c_legitbot::lag_record_t::is_valid( ) { - return util::is_tick_valid( m_tickcount ); - } - - void c_legitbot::c_lagcomp::store_player( int ent_index ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - vec3_t pos = ent->get_hitbox_pos( 0 ); - int tickcount = TIME_TO_TICKS( ent->m_flSimulationTime( ) ); - - lag_record_t new_record; - if ( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { - new_record.m_position = pos; - new_record.m_tickcount = tickcount; - - m_data[ ent_index ].push_front( new_record ); - } - - while ( !m_data[ ent_index ].empty( ) && - ( m_data[ ent_index ].size( ) > TIME_TO_TICKS( 1.0f ) ) ) { - m_data[ ent_index ].pop_back( ); - } - } - - bool c_legitbot::c_lagcomp::can_backtrack_entity( int ent_index ) { - if ( m_data[ ent_index ].empty( ) ) { - return false; - } - - for( auto& it : m_data[ ent_index ] ) { - if( it.is_valid( ) ) return true; - } - - return false; - } - - c_legitbot::lag_record_t* c_legitbot::c_lagcomp::find_best_record( int ent_index ) { - c_legitbot::lag_record_t* best_record = nullptr; - float best_fov{ g_settings.legit.backtracking_fov( ) }; - vec3_t cur_angle; - vec3_t aim_angle; - vec3_t aim_pos; - vec3_t cur_pos; - int cur_tick; - - if( m_data[ ent_index ].empty( ) ) { - return nullptr; - } - - if( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) { - best_fov = 360.f; - } - - g_csgo.m_engine( )->GetViewAngles( cur_angle ); - cur_pos = g_ctx.m_local->get_eye_pos( ); - cur_tick = g_csgo.m_globals->m_tickcount; - - for( auto& it : m_data[ ent_index ] ) { - int delta = std::abs( cur_tick - it.m_tickcount ); - - if( !( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) ) { - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - float max_latency = g_settings.legit.backtracking_time + nci->GetLatency( 0 ); - if( delta > TIME_TO_TICKS( max_latency ) ) - continue; - } - } - - if( !it.is_valid( ) ) - continue; - - aim_pos = it.m_position; - aim_angle = math::vector_angles( cur_pos, aim_pos ).clamp( ); - - float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); - if ( fov < best_fov ) { - best_fov = fov; - best_record = ⁢ - } - } - - return best_record; - } - - vec3_t c_legitbot::c_lagcomp::get_backtracked_position( int ent_index ) { - if( !m_data[ ent_index ].size( ) ) return vec3_t( ); - auto lag_record = find_best_record( ent_index ); - - vec3_t last_position{ }; - for( auto& it : util::reverse_iterator( m_data[ ent_index ] ) ) { - if( it.is_valid( ) ) last_position = it.m_position; break; - } - - return lag_record ? lag_record->m_position : last_position; - } - - void c_legitbot::c_lagcomp::store( ) { - for ( int i = 1; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if ( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { - store_player( i ); - } - else { - m_data[ i ].clear( ); - } - } - } - - bool c_legitbot::c_lagcomp::backtrack_entity( int ent_index ) { - if ( !m_cmd ) return false; - - if ( !can_backtrack_entity( ent_index ) ) return false; - - auto best_record = find_best_record( ent_index ); - - if ( best_record ) { - m_cmd->m_tick_count = best_record->m_tickcount; - return true; - } - - return false; - } - - void c_legitbot::c_lagcomp::operator()( user_cmd_t* cmd ) { - if ( !g_settings.legit.enabled( ) || !g_settings.legit.backtracking( ) ) - return; - - m_cmd = cmd; - store( ); - - auto target = g_cheat.m_legitbot.get_aim_target( g_settings.legit.backtracking_fov( ) ); - bool active = false; - - if ( g_settings.legit.activation_type( ) == 0 ) - active = true; - if ( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) - active = true; - - if ( active && target != -1 ) { - backtrack_entity( target ); - } - } -} \ No newline at end of file diff --git a/gmod/listener.cpp b/gmod/listener.cpp deleted file mode 100644 index a1939aa..0000000 --- a/gmod/listener.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include "listener.hpp" -#include "interface.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -#undef PlaySound - -generic_listener_t::generic_listener_t( const char* name, void( *function )( IGameEvent* ) ) : - m_function( function ), m_name( name ) { } - -generic_listener_t::~generic_listener_t( ) { - if( m_registered ) - g_csgo.m_event_mgr( )->RemoveListener( this ); - -} - -void generic_listener_t::init( ) { - g_csgo.m_event_mgr( )->AddListener( this, m_name, false ); - m_registered = true; -} - -namespace listeners -{ - bool dbg_spread( ) { - static con_var< bool > var{ &data::holder_, fnv( "dbg_spread" ), 0 }; - return var( ); - } - - void bullet_impact( IGameEvent* e ) { - if( !g_csgo.m_panic && e ) { - static float last_time = g_csgo.m_globals->m_curtime; - float x = e->GetFloat( xors( "x" ) ); - float y = e->GetFloat( xors( "y" ) ); - float z = e->GetFloat( xors( "z" ) ); - int user_id = e->GetInt( xors( "userid" ) ); - int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); - - vec3_t impact{ x, y, z }; - if( std::abs( last_time - g_csgo.m_globals->m_curtime ) > ( 1.f / 64.f ) && - player_id == g_csgo.m_engine( )->GetLocalPlayer( ) ) { - - - g_ctx.m_last_shot_ack++; - g_ctx.m_last_shot_ack %= 128; - - if( std::abs( last_time - g_csgo.m_globals->m_curtime ) > 1.0f ) { - if( std::abs( g_ctx.m_last_shot - g_ctx.m_last_shot_ack ) ) { - //if( dbg_spread( ) ) - //g_con->log( "shot queue desynced: delta too high ( %d %d )", g_ctx.m_last_shot_ack, g_ctx.m_last_shot ); - g_ctx.reset_shot_queue( ); - } - } - - if( g_ctx.m_last_shot_ack > g_ctx.m_last_shot ) { - //if( dbg_spread( ) ) - //g_con->log( "shot queue desynced: ack > last" ); - g_ctx.reset_shot_queue( ); - } - - auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack ]; - //if( dbg_spread( ) ) - //g_con->log( "shot: %d ack shot: %d", g_ctx.m_last_shot, g_ctx.m_last_shot_ack ); - - if( shot.m_enemy_index ) { - auto ang = math::vector_angles( shot.m_local_pos, shot.m_enemy_pos ); - auto shot_ang = math::vector_angles( shot.m_local_pos, impact ); - - auto dist = shot.m_local_pos.dist_to( shot.m_enemy_pos ); - auto ang_delta = ( ang - shot_ang ).clamp( ); - - float pitch_delta = sin( DEG2RAD( std::abs( ang_delta.x ) ) ) * dist; - float yaw_delta = sin( DEG2RAD( std::abs( ang_delta.y ) ) ) * dist; - - float delta = sqrtf( pitch_delta * pitch_delta + yaw_delta * yaw_delta ); - //scale it up a bit, hitboxes arent *really* boxes anymore - float max = shot.m_hitbox_radius; - - if( delta > max ) { - if( dbg_spread( ) ) - g_con->log( xors( "missed shot due to spread: %f > %f" ), delta, max ); - if( g_settings.misc.log_hits ) { - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, xors( "[\3moneybot\1] missed shot due to spread" ) ); - } - - if( shot.m_resolver_state ) { - g_cheat.m_ragebot.m_resolver->on_missed_spread( shot.m_enemy_index, shot.m_resolver_shots ); - } - } - else { - shot.m_missed = false; - } - } - - last_time = g_csgo.m_globals->m_curtime; - } - - if( g_settings.visuals.bullet_tracers( ) ) { - g_cheat.m_visuals.store_tracer( player_id, vec3_t( x, y, z ) ); - } - } - } - - void player_hurt( IGameEvent* e ) { - if( !g_csgo.m_panic && e ) { - int user_id = e->GetInt( xors( "userid" ) ); - int attacker = e->GetInt( xors( "attacker" ) ); - int hitgroup = e->GetInt( xors( "hitgroup" ) ); - int dmg = e->GetInt( xors( "dmg_health" ) ); - int hp = e->GetInt( xors( "health" ) ); - int attacker_id = g_csgo.m_engine( )->GetPlayerForUserID( attacker ); - int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); - - - if( attacker_id == g_csgo.m_engine( )->GetLocalPlayer( ) && user_id != attacker_id ) { - g_cheat.m_visuals.store_hit( ); - - auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack % 128 ]; - if( hitgroup == shot.m_hitgroup && shot.m_resolver_state && !shot.m_missed ) { - g_cheat.m_ragebot.m_resolver->listener( player_id, shot.m_resolver_shots ); - } - - if( !shot.m_missed || !shot.m_resolver_state ) { - //if( dbg_spread( ) ) - //g_con->log( xors( "hit enemy in %s" ), util::hitgroup_to_string( hitgroup ).c_str( ) ); - - if( g_settings.misc.log_hits ) { - char hit_str[ 100 ]; - if( hitgroup == HITGROUP_HEAD && hp <= 0 ) { - strenc::w_sprintf_s( hit_str, 100, xors( "[\3moneybot\1] pHit" ) ); - } - else { - strenc::w_sprintf_s( hit_str, 100, xors( "[\3moneybot\1] hit player in %s for %d" ), util::hitgroup_to_string( hitgroup ).c_str( ), dmg ); - } - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, hit_str ); - } - } - } - } - } - - void round_start( IGameEvent * e ) { - if( g_ctx.run_frame( ) ) { - switch( g_settings.misc.autobuy.main_weapon ) { - case 1: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy g3sg1" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy scar20" ) ); - break; - case 2: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg08" ) ); - break; - case 3: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy awp" ) ); - break; - case 4: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ak47" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy m4a1" ) ); - break; - case 5: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg556" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy aug" ) ); - break; - case 6: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mac10" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mp9" ) ); - break; - } - - switch( g_settings.misc.autobuy.secondary_weapon ) { - case 1: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy deagle" ) ); - break; - case 2: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy elite" ) ); - break; - } - - if( g_ctx.m_local->m_iAccount( ) > 1000 ) { - if( g_settings.misc.autobuy.armor( ) ) { - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vest" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vesthelm" ) ); - } - - if( g_settings.misc.autobuy.zeus( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy taser 34" ) ); - - - if( g_settings.misc.autobuy.defuser( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy defuser" ) ); - - - if( g_settings.misc.autobuy.molly( ) ) { - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy molotov" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy incgrenade" ) ); - } - - if( g_settings.misc.autobuy.smoke( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy smokegrenade" ) ); - - - if( g_settings.misc.autobuy.grenade( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy hegrenade" ) ); - - - if( g_settings.misc.autobuy.flash( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); - - - if( g_settings.misc.autobuy.decoy( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy decoy" ) ); - - - if( g_settings.misc.autobuy.flash( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); - } - } - } -} \ No newline at end of file diff --git a/gmod/listener.hpp b/gmod/listener.hpp deleted file mode 100644 index 182a615..0000000 --- a/gmod/listener.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -#include "sdk.hpp" - -struct generic_listener_t : public IGameEventListener2 { - generic_listener_t( const char* event_name, - void( *function )( IGameEvent* ) ); - - generic_listener_t( ) = default; - - ~generic_listener_t( ); - - void init( ); - - void FireGameEvent( IGameEvent* event ) override { m_function( event ); } - int GetEventDebugID( ) override { return 0x2a; } -private: - void( *m_function )( IGameEvent* ); - const char* m_name{ }; - bool m_registered{ }; -}; - -namespace listeners { - extern void bullet_impact( IGameEvent* e ); - extern void player_hurt( IGameEvent* e ); - extern void round_start( IGameEvent* e ); -} \ No newline at end of file diff --git a/gmod/lock_cursor.cpp b/gmod/lock_cursor.cpp deleted file mode 100644 index 477847d..0000000 --- a/gmod/lock_cursor.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "hooks.hpp" - -void __fastcall hooks::lock_cursor( void* ecx, void* edx ) { - static auto lock_cursor_o = g_gmod.m_surface->get_old_function< decltype( &hooks::lock_cursor ) >( 62 ); - if( g_gmod.m_panic ) return lock_cursor_o( ecx, edx ); - - if( g_settings.menu.open ) { - g_gmod.m_surface( )->UnlockCursor( ); - } - else { - lock_cursor_o( ecx, edx ); - } -} \ No newline at end of file diff --git a/gmod/math.cpp b/gmod/math.cpp deleted file mode 100644 index 5326fdd..0000000 --- a/gmod/math.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "math.hpp" -#include "interface.hpp" - -namespace math -{ - uint32_t md5_pseudorandom( uint32_t seed ) { - using fn = uint32_t( __thiscall * )( uint32_t seed ); - - static auto func = pattern::first_code_match< uint32_t( __cdecl* )( uint32_t ) >( g_gmod.m_chl.dll( ), xors( "55 8B EC 83 EC 68 6A 58 8D 45 98 6A 00 50 E8 ? ? ? ? 6A" ) ); - if( !func ) { - return 0; - } - - return func( seed ); - } -} \ No newline at end of file diff --git a/gmod/math.hpp b/gmod/math.hpp deleted file mode 100644 index 4d5003e..0000000 --- a/gmod/math.hpp +++ /dev/null @@ -1,137 +0,0 @@ -#pragma once -#include -#include "util.hpp" -#include "pattern.hpp" -#include "sdk.hpp" - -static constexpr long double M_PI = 3.14159265358979323846f; -static constexpr long double M_RADPI = 57.295779513082f; -static constexpr long double M_PIRAD = 0.01745329251f; -static constexpr float M_PI_F = ( ( float )( M_PI ) ); -__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } -__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } - -namespace { - //make a random generator and seed it with a p random number - static std::random_device rd; - static std::mt19937 gen( rd( ) ); -} - -NAMESPACE_REGION( math ) - -#undef min -#undef max - -template < typename t > -t min( const t& t1, const t& t2 ) { - return t1 < t2 ? t1 : t2; -} - -template < typename t, typename... ts_ > -t min( const t& t1, const t& t2, ts_&&... ts ) { - return t1 < t2 ? - min( t1, std::forward< ts_ >( ts )... ) : - min( t2, std::forward< ts_ >( ts )... ); -} - -template < typename t > -t max( const t& t1, const t& t2 ) { - return t1 > t2 ? t1 : t2; -} - -template < typename t, typename... ts_ > -t max( const t& t1, const t& t2, ts_&&... ts ) { - return t1 > t2 ? - max( t1, std::forward< ts_ >( ts )... ) : - max( t2, std::forward< ts_ >( ts )... ); -} - -// todo - dex; make 2 random generator funcs here, this one only works for floats normally - -template < typename t > -__forceinline t random_number( t min, t max ) { - if constexpr( !std::is_integral_v< t > ) { - std::uniform_real_distribution< t > dist( min, max ); - return dist( gen ); - } - else { - std::uniform_int_distribution< t > dist( min, max ); - return dist( gen ); - } -} - -__forceinline vec3_t get_rotated_pos( vec3_t start, float rotation, float distance ) { - float rad = DEG2RAD( rotation ); - start.x += cos( rad ) * distance; - start.y += sin( rad ) * distance; - - return start; -} - -__forceinline vec3_t vector_angles( const vec3_t& start, const vec3_t& end ) { - vec3_t delta = end - start; - - float magnitude = sqrtf( delta.x * delta.x + delta.y * delta.y ); - float pitch = atan2f( -delta.z, magnitude ) * M_RADPI; - float yaw = atan2f( delta.y, delta.x ) * M_RADPI; - - vec3_t angle( pitch, yaw, 0.0f ); - return angle.clamp( ); -} - -__forceinline vec3_t angle_vectors( const vec3_t& angles ) { - float sp, sy, cp, cy; - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - - return vec3_t{ cp * cy, cp * sy, -sp }; -} - -__forceinline void angle_vectors( const vec3_t& angles, vec3_t* forward, vec3_t* right, vec3_t* up ) { - float sr, sp, sy, cr, cp, cy; - - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - sr = sinf( angles.z * M_PIRAD ); - cr = cosf( angles.z * M_PIRAD ); - - if ( forward ) { - forward->x = cp * cy; - forward->y = cp * sy; - forward->z = -sp; - } - - if ( right ) { - right->x = -1 * sr * sp * cy + -1 * cr * -sy; - right->y = -1 * sr * sp * sy + -1 * cr * cy; - right->z = -1 * sr * cp; - } - - if ( up ) { - up->x = cr * sp * cy + -sr * -sy; - up->y = cr * sp * sy + -sr * cy; - up->z = cr * cp; - } -} - -__forceinline float find_closest_step( float angle, float step ) { - int steps = ( int )( angle / step + 0.5f ); - - return steps * step; -} - -__forceinline vec3_t vector_transform( const vec3_t& in, const matrix3x4& matrix ) { - vec3_t out; - for ( int i{ }; i < 3; i++ ) - out[ i ] = in.dot( ( const vec3_t& )matrix[ i ] ) + matrix[ i ][ 3 ]; - - return out; -} - -extern uint32_t md5_pseudorandom( uint32_t seed ); - -END_REGION \ No newline at end of file diff --git a/gmod/mem.hpp b/gmod/mem.hpp deleted file mode 100644 index f5c8ec4..0000000 --- a/gmod/mem.hpp +++ /dev/null @@ -1,66 +0,0 @@ -#pragma once -#include -#include "util.hpp" - -#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) - -class stack_t { - uintptr_t m_ptr; - -public: - __forceinline stack_t( ) : m_ptr( get_baseptr( ) ) { } - - __forceinline stack_t( uintptr_t ptr ) : m_ptr( ptr ) { } - - template < typename t = uintptr_t > - __forceinline t get( ) { - return ( t )m_ptr; - } - - template < typename t = uintptr_t > - __forceinline t return_address( ) { - return *( t* )( m_ptr + sizeof( void* ) ); - } - - template < typename t = uintptr_t > - __forceinline t address_of_return_address( ) { - return ( t )( m_ptr + sizeof( uintptr_t ) ); - } - - __forceinline stack_t& next( ) { - return *( stack_t* )( m_ptr ); - } - - template < typename t = uintptr_t > - __forceinline t local( size_t at ) { - return ( t )( m_ptr - at ); - } - - template < typename t = uintptr_t > - __forceinline t arg( size_t at ) { - return ( t )( m_ptr + at ); - } -}; - -namespace util { - template < typename t = uint8_t > - __forceinline t* memcpy( t* dst, t* src, size_t size = sizeof( t ) ) { - __movsb( - ( uint8_t* )dst, - ( uint8_t* )src, - size - ); - - return dst; - } - - __forceinline void* memset( uint8_t* dst, uint8_t val, size_t size ) { - __stosb( - dst, - val, - size - ); - - return dst; - } -} \ No newline at end of file diff --git a/gmod/movement.cpp b/gmod/movement.cpp deleted file mode 100644 index 2815767..0000000 --- a/gmod/movement.cpp +++ /dev/null @@ -1,269 +0,0 @@ -#include "movement.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "context.hpp" - -#include -#include "base_cheat.hpp" -#include "input_system.hpp" - -NAMESPACE_REGION( features ) - -void c_movement::bhop( ) { - if ( !g_settings.misc.bunny_hop ) - return; - - if ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || - g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) - return; - - //jump like you nohat - if ( m_ucmd->m_buttons & IN_JUMP && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - m_ucmd->m_buttons &= ~IN_JUMP; - } -} - -void c_movement::auto_strafer( ) { - if ( !g_settings.misc.auto_strafe ) - return; - - float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); - - if ( m_ucmd->m_buttons & IN_JUMP && speed > 1.0f ) { - if ( !m_ucmd->m_forwardmove && !m_ucmd->m_sidemove ) { - if ( !m_ucmd->m_mousedx ) { - m_ucmd->m_forwardmove = std::min< float >( 450.f, 5850.f / speed ); - m_ucmd->m_sidemove = ( m_ucmd->m_cmd_nr % 2 ) == 0 ? -450.f : 450.f; - } - else { - m_ucmd->m_sidemove = m_ucmd->m_mousedx < 0.f ? -450.f : 450.f; - } - } - } -} - -void c_movement::edge_jump( ) { - if ( !g_settings.misc.edge_jump ) - return; - - if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.edge_jump_key( ) ) ) - return; - - //needs key check here so its not always on - //what?? - bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; - - if ( pre_onground && !post_onground ) { - m_ucmd->m_buttons |= IN_JUMP; - } -} - -void c_movement::auto_jumpbug( ) { - if ( !g_settings.misc.auto_jumpbug( ) ) - return; - - if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.auto_jumpbug_key( ) ) ) - return; - - static bool jumped = false; - static bool jump_next = false; - - m_ucmd->m_buttons |= IN_DUCK; - - bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; - - if ( jump_next ) { - m_ucmd->m_buttons &= ~IN_DUCK; - jump_next = false; - } - else if ( !pre_onground && post_onground && !jumped ) { - jump_next = true; - jumped = true; - } - else if ( !pre_onground && !post_onground ) { - jumped = false; - } -} - -//fuck hardcode -const vec3_t mins( -17.f, -17.f, 0 ); -const vec3_t maxs( 17.f, 17.f, 42.f ); - -void rotate_movement( user_cmd_t* cmd, float rotation ) { - rotation = rotation * M_PIRAD; - - float cos_rot = cos( rotation ); - float sin_rot = sin( rotation ); - - float new_forwardmove = ( cos_rot * cmd->m_forwardmove ) - ( sin_rot * cmd->m_sidemove ); - float new_sidemove = ( sin_rot * cmd->m_forwardmove ) + ( cos_rot * cmd->m_sidemove ); - - cmd->m_forwardmove = new_forwardmove; - cmd->m_sidemove = new_sidemove; -} - -float get_ideal_strafe_step( float speed ) { - static auto* sv_airaccelerate = g_gmod.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); - float airaccel = std::min< float >( sv_airaccelerate->get_float( ), 30.f ); - - float step = std::atan2( airaccel, speed ) * M_RADPI; - - //tickcount correction - float tickcount = 1.0f / g_gmod.m_globals->m_interval_per_tick; - step *= ( 64.f / tickcount ); - - return step; -} - -float trace_ideal_step( bool direction, vec3_t direction_vec, float ideal_step, float multiplier, float max_correction ) { - Ray_t ray; - CTraceFilterWorldOnly filter; - filter.pSkip = g_ctx.m_local; - vec3_t start = g_ctx.m_local->m_vecOrigin( ); - start.z += 5.0f; - - CGameTrace trace; - - float step = ideal_step; - float correction = 0.5f; - - if( direction ) { - step = -step; - correction = -correction; - max_correction = -max_correction; - } - - while( true ) { - vec3_t new_dir = direction_vec; - new_dir.y += step; - - vec3_t forward = math::angle_vectors( new_dir ); - forward *= multiplier; - - vec3_t end = start + forward; - ray.Init( start, end, mins, maxs ); - - g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &trace ); - - if( !trace.DidHit( ) ) { - break; - } - else { - new_dir.x -= 20.f; - vec3_t forward_up = math::angle_vectors( new_dir ); - forward_up *= multiplier; - - vec3_t endUp = start + forward_up; - ray.Init( start, endUp, mins, maxs ); - - CGameTrace trace_up; - g_gmod.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &trace_up ); - if( !trace_up.DidHit( ) ) { - break; - } - } - - step += correction; - - if( direction && step <= max_correction ) { - break; - } - if( !direction && step >= max_correction ) { - break; - } - } - - return step; -} - -float get_trace_length_multiplier( float speed ) { - float multiplier = speed * 0.2f; - if( multiplier < 32.f ) multiplier = 32.f; - if( multiplier > 256.f ) multiplier = 256.f; - - return multiplier; -} - -bool c_movement::get_best_direction( float ideal_step, float left, float right, float weight ) { - float left_delta = std::fabs( ideal_step - left ); - float right_delta = std::fabs( -ideal_step - right ); - - if( m_direction ) right_delta -= weight; - else left_delta -= weight; - - return ( left_delta > right_delta ); -} - -float c_movement::get_best_strafe_step( float speed, vec3_t direction ) { - float multiplier = get_trace_length_multiplier( speed ); - float ideal_step = get_ideal_strafe_step( speed ); - - float left_step = trace_ideal_step( false, direction, ideal_step, multiplier, 90.f ); - float right_step = trace_ideal_step( true, direction, ideal_step, multiplier, 90.f ); - - m_direction = get_best_direction( ideal_step, left_step, right_step, 25.f ); - - if( m_direction ) { - float max_clamped_correction = -ideal_step - 5.0f; - if( right_step < max_clamped_correction ) right_step = max_clamped_correction; - return right_step; - } - else { - float max_clamped_correction = ideal_step + 5.0f; - if( left_step > max_clamped_correction ) left_step = max_clamped_correction; - return left_step; - } -} - -float c_movement::get_best_strafe_angle( ) { - vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); - velocity.z = 0.0f; - float speed = velocity.length2d( ); - - vec3_t direction = math::vector_angles( vec3_t( 0.0f, 0.0f, 0.0f ), velocity ); - float step = get_best_strafe_step( speed, direction ); - - return direction.y + step; -} - -void c_movement::circle_strafe( ) { - if( g_settings.misc.circle_strafe ) { - if( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) - return; - - static bool can_finish = true; - auto cmd = g_ctx.get_last_cmd( ); - if( g_input.is_key_pressed( g_settings.misc.circle_strafe_key ) || !can_finish ) { - m_ucmd->m_buttons |= IN_JUMP; - cmd->m_forwardmove = 450.f; - - float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); - if( speed > 1.f ) { - can_finish = false; - float angle = get_best_strafe_angle( ); - - float delta = std::remainderf( m_ucmd->m_viewangles.y - angle, 360.f ); - - cmd->m_forwardmove = 5850.f / speed; - cmd->m_sidemove = m_direction ? 450.f : -450.f; - rotate_movement( cmd, delta ); - - vec3_t current_view; - g_gmod.m_engine( )->GetViewAngles( current_view ); - float view_delta = std::remainderf( current_view.y - angle, 360.f ); - - if( std::fabs( view_delta ) < 10.0f || speed < 250.f ) { - can_finish = true; - } - } - else { - can_finish = true; - } - } - } -} - - -END_REGION \ No newline at end of file diff --git a/gmod/movement.hpp b/gmod/movement.hpp deleted file mode 100644 index f9e3ced..0000000 --- a/gmod/movement.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#include "util.hpp" - -//forward declarations -class user_cmd_t; - -NAMESPACE_REGION( features ) - -class c_movement { - user_cmd_t* m_ucmd{ }; - bool m_direction{ }; - - void bhop( ); - void auto_strafer( ); - void edge_jump( ); - void auto_jumpbug( ); - void jump_stats( ); - - bool get_best_direction( float ideal_step, float left, float right, float weight ); - float get_best_strafe_step( float speed, vec3_t direction ); - float get_best_strafe_angle( ); - void circle_strafe( ); - -public: - void operator()( user_cmd_t* ucmd ) { - m_ucmd = ucmd; - auto_strafer( ); - //circle_strafe( ); - bhop( ); - edge_jump( ); - //auto_jumpbug( ); - //jump_stats( ); - } -}; - -END_REGION \ No newline at end of file diff --git a/gmod/movement_recorder.cpp b/gmod/movement_recorder.cpp deleted file mode 100644 index 60f082e..0000000 --- a/gmod/movement_recorder.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "movement_recorder.hpp" -#include "input_system.hpp" -#include "settings.hpp" -#include "interface.hpp" - -namespace features -{ - void c_move_recorder::operator()( user_cmd_t* cmd ) { - if( !g_settings.misc.recorder_enable ) - return; - - if( g_input.is_key_pressed( g_settings.misc.recording_start_key( ) ) ) - start_recording( ); - - if( g_input.is_key_pressed( g_settings.misc.recording_stop_key( ) ) ) - stop_recording( ); - - if( m_recording ) { - record_cmd( cmd ); - } - - if( m_playing ) { - if( m_move_data.empty( ) ) { - m_playing = false; - } - else if( ++m_record_index >= m_move_data.size( ) ) { - m_playing = false; - } - else { - auto& old_cmd = m_move_data.at( m_record_index ); - - if( g_settings.misc.recording_show_angles == 1 && ( old_cmd.m_buttons & IN_ATTACK ) || - g_settings.misc.recording_show_angles == 2 ) { - g_csgo.m_engine( )->SetViewAngles( old_cmd.m_viewangles ); - } - - cmd->m_buttons = old_cmd.m_buttons; - cmd->m_aimdirection = old_cmd.m_aimdirection; - cmd->m_forwardmove = old_cmd.m_forwardmove; - cmd->m_impulse = old_cmd.m_impulse; - cmd->m_mousedx = old_cmd.m_mousedx; - cmd->m_mousedy = old_cmd.m_mousedy; - cmd->m_sidemove = old_cmd.m_sidemove; - cmd->m_upmove = old_cmd.m_upmove; - cmd->m_viewangles = old_cmd.m_viewangles; - cmd->m_weaponselect = old_cmd.m_weaponselect; - cmd->m_weaponsubtype = old_cmd.m_weaponsubtype; - } - } - else { - m_record_index = 0; - } - } - - void c_move_recorder::record_cmd( user_cmd_t* cmd ) { - m_move_data.push_back( *cmd ); - } - - void c_move_recorder::start_recording( ) { - m_recording = true; - } - - void c_move_recorder::stop_recording( ) { - m_recording = false; - } - - void c_move_recorder::play_back( ) { - m_recording = false; - m_playing = true; - } - - void c_move_recorder::stop_playback( ) { - m_playing = false; - } - - void c_move_recorder::clear_recording( ) { - m_move_data.clear( ); - } -} \ No newline at end of file diff --git a/gmod/movement_recorder.hpp b/gmod/movement_recorder.hpp deleted file mode 100644 index dcfe511..0000000 --- a/gmod/movement_recorder.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include "sdk.hpp" -#include "vector.hpp" - -namespace features -{ - class c_move_recorder { - public: - void play_back( ); - void stop_playback( ); - void clear_recording( ); - - bool is_recording( ) const { return m_recording; } - bool is_playing( ) const { return m_playing; } - int get_record_count( ) const { return m_move_data.size( ); } - auto get_current_record( ) const { return m_record_index; } - - void operator()( user_cmd_t* ); - private: - void record_cmd( user_cmd_t* cmd ); - void start_recording( ); - void stop_recording( ); - - bool m_recording = false; - bool m_playing = false; - size_t m_record_index = 0; - std::vector< user_cmd_t > m_move_data; - }; -} \ No newline at end of file diff --git a/gmod/netvar_proxy.hpp b/gmod/netvar_proxy.hpp deleted file mode 100644 index cb329c3..0000000 --- a/gmod/netvar_proxy.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "Valve/dt_recv.h" - -//dont leave things out of namespaces -namespace hooks -{ - class c_netvar_proxy { - public: - c_netvar_proxy( RecvProp* target_property, RecvVarProxyFn new_proxy ) { - m_target = target_property; - m_original = target_property->m_ProxyFn; - m_target->m_ProxyFn = new_proxy; - } - - c_netvar_proxy( ) = default; - - void init( RecvProp* target, RecvVarProxyFn new_proxy ) { - m_target = target; - m_original = target->m_ProxyFn; - m_target->m_ProxyFn = new_proxy; - } - - ~c_netvar_proxy( ) { - if( !m_target ) return; - m_target->m_ProxyFn = m_original; - } - - RecvVarProxyFn get_old_function( ) const { - return m_original; - } - - private: - //overcomplicated... - RecvProp* m_target; - RecvVarProxyFn m_original; - }; -} \ No newline at end of file diff --git a/gmod/netvars.cpp b/gmod/netvars.cpp deleted file mode 100644 index 19ab6d1..0000000 --- a/gmod/netvars.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "netvars.hpp" -#include "interface.hpp" - -factory::c_netvars g_netvars; - -NAMESPACE_REGION( factory ) - -void c_netvars::init( ) { - for ( auto client_class = g_gmod.m_chl( )->GetAllClasses( ); - !!client_class; - client_class = client_class->m_next - ) { - auto table = client_class->m_rt_table; - m_tables.push_back( table ); - } -} - -RecvTable* c_netvars::get_table( hash_t hash ) const { - if ( m_tables.empty( ) ) return nullptr; - - for ( auto& table : m_tables ) { - if ( !table ) continue; - - if ( hash == hash::fnv1a( table->m_pNetTableName ) ) { - return table; - } - } - - return nullptr; -} - -//iterating this too much results in a stack overflow, so thats cool -RecvProp* c_netvars::get_prop( hash_t data, hash_t name ) const { - RecvProp* prop{ }; - RecvTable* child{ }; - - auto table = get_table( data ); - if( !table ) return nullptr; - - for( int i{ }; i < table->m_nProps; ++i ) { - prop = &table->m_pProps[ i ]; - child = prop->GetDataTable( ); - - if( child && child->m_nProps ) { - auto tmp = get_prop( hash::fnv1a( child->m_pNetTableName ), name ); - if( tmp ) return tmp; - } - - if( name != hash::fnv1a( prop->m_pVarName ) ) - continue; - - return prop; - } - - return nullptr; -} - -std::ptrdiff_t c_netvars::get_entry( hash_t name, RecvTable* table ) const { - std::ptrdiff_t ret{ }; - RecvProp* prop; - RecvTable* child; - - for ( int i{ }; i < table->m_nProps; ++i ) { - prop = &table->m_pProps[ i ]; - child = prop->GetDataTable( ); - - if ( child && child->m_nProps ) { - auto tmp = get_entry( name, child ); - if ( tmp ) ret += prop->GetOffset( ) + tmp; - } - - if ( name != hash::fnv1a( prop->m_pVarName ) ) - continue; - - return prop->GetOffset( ) + ret; - } - - return ret; -} - -std::ptrdiff_t c_netvars::get_netvar( hash_t data, hash_t name ) const { - std::ptrdiff_t ret{ }; - auto table = get_table( data ); - if ( !table ) return 0; - - ret = get_entry( name, table ); -#ifdef DEBUG - printf( "%s:\t\t 0x%05x\n", name.c_str( ), ret ); -#endif - return ret; -} - -END_REGION \ No newline at end of file diff --git a/gmod/netvars.hpp b/gmod/netvars.hpp deleted file mode 100644 index 9924b43..0000000 --- a/gmod/netvars.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once -#include - -#include "Valve\dt_recv.h" -#include "util.hpp" -#include "fnv.hpp" - -class RecvTable; - -#define NETVAR( funcname, name, table, extra, type ) \ -__forceinline auto& funcname( ) { \ - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ - return get< type >( offset + extra ); \ -} - -#define PNETVAR( funcname, name, table, extra, type ) \ -__forceinline type* funcname( ) { \ - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ - return reinterpret_cast< type* >( uintptr_t( this ) + offset + extra ); \ -} - -#define OFFSET( funcname, offset, type ) \ -__forceinline auto& funcname( ) { \ - return get< type >( offset ); \ -} - -NAMESPACE_REGION( factory ) - -class c_netvars { -public: - void init( ); - //search through the netvar list - std::ptrdiff_t get_netvar( hash_t table, hash_t hash ) const; - RecvProp* get_prop( hash_t table, hash_t name ) const; -public: - std::ptrdiff_t get_entry( hash_t hash, RecvTable* table ) const; - RecvTable* get_table( hash_t hash ) const; -private: - std::vector< RecvTable* > m_tables; -}; - -END_REGION - -extern factory::c_netvars g_netvars; \ No newline at end of file diff --git a/gmod/on_screen_size_changed.cpp b/gmod/on_screen_size_changed.cpp deleted file mode 100644 index 7b33762..0000000 --- a/gmod/on_screen_size_changed.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "hooks.hpp" - -void __fastcall hooks::on_screen_size_changed( void* ecx_, void* edx_, int old_w, int old_h ) { - static auto old_fn = g_csgo.m_surface->get_old_function< decltype( &on_screen_size_changed ) >( 116 ); - - old_fn( ecx_, nullptr, old_w, old_h ); - - g_fonts.initialize( ); -} \ No newline at end of file diff --git a/gmod/override_mouse_input.cpp b/gmod/override_mouse_input.cpp deleted file mode 100644 index 792c5d2..0000000 --- a/gmod/override_mouse_input.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::override_mouse_input( void* ecx_, void* edx_, float* x, float* y ) { - static auto omi_o = g_csgo.m_clientmode->get_old_function< decltype( &hooks::override_mouse_input ) >( 23 ); - omi_o( ecx_, edx_, x, y ); - - if( g_csgo.m_panic ) return; - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { - g_cheat.m_legitbot( x, y ); - } -} \ No newline at end of file diff --git a/gmod/override_view.cpp b/gmod/override_view.cpp deleted file mode 100644 index 92b559d..0000000 --- a/gmod/override_view.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "base_cheat.hpp" -#include "context.hpp" -#include "hooks.hpp" -#include "settings.hpp" - -void __fastcall hooks::override_view( void* ecx_, void* edx_, CViewSetup* setup ) { - static auto override_view_o = g_gmod.m_clientmode->get_old_function< decltype( &hooks::override_view ) >( 16 ); - if( g_gmod.m_panic ) { - return override_view_o( ecx_, edx_, setup ); - } - - //g_ctx.m_fov = setup->m_flFov; - //if ( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( )) { - // setup->m_flFov = g_settings.misc.fov_changer( ); - //} - //g_cheat.m_extra.third_person( ); - override_view_o( ecx_, edx_, setup ); - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) && g_settings.misc.no_recoil ) { - setup->angles -= g_ctx.m_local->m_vecPunchAngle( ); - } -} \ No newline at end of file diff --git a/gmod/paint.cpp b/gmod/paint.cpp deleted file mode 100644 index d744d9d..0000000 --- a/gmod/paint.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -#include "hooks.hpp" -#include "interface.hpp" -#include "context.hpp" -#include "math.hpp" - -#include "base_cheat.hpp" - -void __fastcall hooks::paint( void* ecx, void* edx, int mode ) { - static auto paint_o = g_gmod.m_engine_vgui->get_old_function< decltype( &hooks::paint ) >( 13 ); - if( g_gmod.m_panic ) return paint_o( ecx, edx, mode ); - - paint_o( ecx, edx, mode ); - - if( mode & 2 ) { - if( g_ctx.run_frame( ) ) { - g_cheat.m_visuals.store_data( ); - } - } -} \ No newline at end of file diff --git a/gmod/paint_traverse.cpp b/gmod/paint_traverse.cpp deleted file mode 100644 index c3dd47e..0000000 --- a/gmod/paint_traverse.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "hooks.hpp" -#include "renderer.hpp" -#include "context.hpp" -#include "console.hpp" -#include "base_cheat.hpp" -#include "math.hpp" -#include "settings.hpp" - -void __fastcall hooks::paint_traverse( void* ecx_, void* edx_, unsigned int panel, bool force_repaint, bool allowforce ) { - static auto paint_traverse_o = g_gmod.m_panel->get_old_function< decltype( &hooks::paint_traverse ) >( 41 ); - if( g_gmod.m_panic ) return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); - - - static uint32_t mat_system_top_panel{ }; - if( !mat_system_top_panel ) { - auto panel_name = g_gmod.m_panel( )->GetName( panel ); - auto panel_hash = hash::fnv1a( panel_name ); - if( fnv( "MatSystemTopPanel" ) == panel_hash ) { - mat_system_top_panel = panel; - } - } - - if( panel && panel == mat_system_top_panel ) { - g_gmod.m_panel( )->SetMouseInputEnabled( panel, g_settings.menu.open ); - } - - return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); -} \ No newline at end of file diff --git a/gmod/pattern.hpp b/gmod/pattern.hpp deleted file mode 100644 index 0bc4b1b..0000000 --- a/gmod/pattern.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#pragma warning ( disable : 4018 ) - -namespace pattern -{ - inline bool bin_match( uint8_t* code, uint8_t* pattern, size_t size ) { - for( size_t j = 0; j < size; j++ ) { - if( pattern[ j ] && code[ j ] != pattern[ j ] ) { - return false; - } - } - return true; - } - - template< typename t = uintptr_t > static t first_match( uintptr_t start, std::string sig, size_t len, std::ptrdiff_t offset = 0 ) { - std::istringstream iss( sig ); - std::vector< std::string > tokens{ std::istream_iterator< std::string >{ iss }, std::istream_iterator< std::string >{} }; - std::vector< uint8_t > sig_bytes; - - for( const auto& hex_byte : tokens ) { - sig_bytes.push_back( static_cast< uint8_t >( std::strtoul( hex_byte.c_str( ), nullptr, 16 ) ) ); - } - - if( sig_bytes.empty( ) || sig_bytes.size( ) < 2 ) { - return t{ }; - } - - auto sig_data = sig_bytes.data( ); - auto sig_size = sig_bytes.size( ); - - for( size_t i{ }; i < len; i++ ) { - uint8_t* code_ptr = reinterpret_cast< uint8_t* >( start + i ); - - if( bin_match( code_ptr, sig_data, sig_size ) ) { - return( ( t )( start + i + offset ) ); - } - } - - return t{ }; - } - - //ultimately the function you want to call to sigscan ( ida style ) - template< typename t = uintptr_t > static t first_code_match( HMODULE start, std::string sig, std::ptrdiff_t offset = 0 ) { - auto dos_hdr = reinterpret_cast< PIMAGE_DOS_HEADER >( start ); - - if( !dos_hdr ) return t{ }; - - //DOS header, verifies if module is valid - if( dos_hdr->e_magic != 0x5a4d ) { - return t{ }; - } - - auto nt_hdrs = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< uintptr_t >( dos_hdr ) + dos_hdr->e_lfanew ); - - return first_match< t >( reinterpret_cast< uintptr_t >( dos_hdr ) + nt_hdrs->OptionalHeader.BaseOfCode, sig, nt_hdrs->OptionalHeader.SizeOfCode, offset ); - } -}; \ No newline at end of file diff --git a/gmod/play_sound.cpp b/gmod/play_sound.cpp deleted file mode 100644 index 7a701ad..0000000 --- a/gmod/play_sound.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "hooks.hpp" - -void __fastcall hooks::play_sound( void* ecx_, void*, const char* file ) { - static auto play_sound_o = g_csgo.m_surface->get_old_function< decltype( &play_sound ) >( 82 ); - static auto is_ready = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 08 56 8B 35 00 00 00 00 57 83 BE" ), 0 ); - static bool was_played = false; - static float played_tick = 0.f; - - play_sound_o( ecx_, 0, file ); - - if( !g_settings.misc.auto_accept || g_csgo.m_engine( )->IsInGame( ) ) { - was_played = false; - return; - } - - if( strstr( file, xors( "competitive_accept_beep.wav" ) ) && !was_played ) { - was_played = true; - played_tick = GetTickCount( ) * 0.001f + g_settings.misc.auto_accept_delay; - } - - if( was_played && GetTickCount( ) * 0.001f > played_tick ) { - reinterpret_cast< void( __cdecl* )( ) >( is_ready )( ); - was_played = false; - } -} \ No newline at end of file diff --git a/gmod/player_manager.cpp b/gmod/player_manager.cpp deleted file mode 100644 index a531965..0000000 --- a/gmod/player_manager.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "player_manager.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -namespace features -{ - void c_player_record::update( int ent_index ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - if( !ent ) { clear( ); return; } - - if( ent != m_ent || ent->m_flSimulationTime( ) > g_csgo.m_globals->m_curtime + 1.f ) - clear( ); - - m_ent = ent; - if( !ent->is_valid( ) ) - return; - - update_simtime( ); - update_antiaim( ); - - update_cheater( ); - } - - bool c_player_manager::is_cheater( int ent_index ) { - return m_players[ ent_index ].is_cheater( ); - } - - void c_player_manager::frame_stage_notify( ) { - if( !g_ctx.m_local ) return; - - for( int i{ 1 }; i < 65; ++i ) { - if( i == g_csgo.m_engine( )->GetLocalPlayer( ) ) - continue; - - m_players[ i ].update( i ); - } - } -} \ No newline at end of file diff --git a/gmod/player_manager.hpp b/gmod/player_manager.hpp deleted file mode 100644 index 6a89b36..0000000 --- a/gmod/player_manager.hpp +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once -#include "sdk.hpp" - -namespace features -{ - constexpr int CHEATER_SIMTIME_THRESHOLD = 10; - constexpr int CHEATER_AA_THRESHOLD = 50; - constexpr int CHEATER_MAX_DETECTIONS = 200; - - class c_player_record { - float m_last_simtime; - int m_simtime_detections; - int m_aa_detections; - bool m_is_cheater; - - c_base_player* m_ent; - - void clear( ) { - m_last_simtime = { }; - m_simtime_detections = { }; - m_aa_detections = { }; - m_is_cheater = { }; - m_ent = { }; - } - - void update_simtime( ) { - if( !m_ent ) return; - - if( m_ent->m_flSimulationTime( ) == m_last_simtime ) { - m_simtime_detections += 2; - } - else if( m_simtime_detections > 0 ) { - m_simtime_detections--; - } - m_last_simtime = m_ent->m_flSimulationTime( ); - } - - void update_antiaim( ) { - if( !m_ent ) return; - - auto pitch = m_ent->m_angEyeAngles( ).x; - if( pitch > 75.f && m_aa_detections < CHEATER_MAX_DETECTIONS ) { - m_aa_detections++; - } - else if( m_aa_detections > 0 ) { - m_aa_detections--; - } - } - - void update_cheater( ) { - m_is_cheater = m_simtime_detections > CHEATER_SIMTIME_THRESHOLD - || m_aa_detections > CHEATER_AA_THRESHOLD; - } - - public: - c_player_record( ) { clear( ); } - bool is_cheater( ) const { return m_is_cheater; } - void update( int ent_index ); - }; - - class c_player_manager { - std::array< c_player_record, 65 > m_players; - public: - void frame_stage_notify( ); - bool is_cheater( int ent_index ); - }; -} \ No newline at end of file diff --git a/gmod/playerlist.cpp b/gmod/playerlist.cpp deleted file mode 100644 index 10f7d82..0000000 --- a/gmod/playerlist.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "playerlist.hpp" - -/* something in here caused the file size to increase alot lol */ - -namespace features -{ - - bool c_player_list::is_friend( const std::string& guid ) { - return m_friends[ guid ]; // if a guid is not there, then it is automatically set to false - } - - // handles players and drawing. - void c_player_list::operator()( ) { - if( g_gmod.m_engine( )->IsInGame( ) ) { - g_gmod.m_engine( )->GetScreenSize( m_scrw, m_scrh ); - - m_x = 50; - m_y = 50; - m_w = m_scrw - 100; - m_h = m_scrh - 100; - - m_tabwidth = m_w / 3; - - m_tab = 0; - m_items.clear( ); - - player_info_t info; - - for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { - if( i == g_gmod.m_engine( )->GetLocalPlayer( ) ) - continue; - - auto player = g_gmod.m_entlist( )->GetClientEntity< >( i ); - if( !player ) - continue; - - if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) - continue; - - m_items.push_back( playeritem_t( info.name, &m_friends[ info.m_steamid ] ) ); - } - - // sort first character alphabetically. - std::sort( m_items.begin( ), m_items.end( ), []( const auto& lhs, const auto& rhs ) { - return lhs.m_name[ 0 ] < rhs.m_name[ 0 ]; - } ); - - - if( m_open ) { - int i = 0; - int j = 0; - - // get d3d font info. - TEXTMETRICA metric{ }; - d3d::fonts.f_esp_small->GetTextMetricsA( &metric ); - - // construct size of list and how much to draw. - const int font_size = metric.tmHeight; - const int list_height = m_items.size( ) * font_size; - const int tabs_to_draw = std::min< int >( ( int )std::ceil( ( float )list_height / ( float )m_h ), 3 ); // template arg to stop the min define taking action - - // pixel padding. - const int m_pad_y = 2; - const int m_pad_x = 5; - - // draw blue background. - g_d3d.draw_filled_rect( ui::ui_get_bg_col( ), m_x, m_y, m_tabwidth * tabs_to_draw, m_h ); - - // for each player add to list. - for( const auto& item : m_items ) { - int str_pos_x{ }; - int str_pos_y = m_y + font_size * i + m_pad_y; - - if( str_pos_y > m_y + m_h ) { - i = 0; - m_tab++; - - str_pos_y = m_y + font_size * i + m_pad_y; - } - - str_pos_x = m_x + m_tabwidth * m_tab + m_pad_x; - - m_tab = std::min< int >( m_tab, tabs_to_draw ); - - // draw rectangle per element. - g_d3d.draw_rect( clr_t( 0, 0, 0 ), m_x + m_tabwidth * m_tab + 1, m_y + font_size * i, m_tabwidth - 2, font_size ); - - // if selected index is this current index, do special stuff. - if( m_index == j ) { - g_d3d.draw_filled_rect( clr_t( 200, 200, 200 ), m_x + m_tabwidth * m_tab + 1, m_y + font_size * i + 1, m_tabwidth - 1, font_size - 1 ); - - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), str_pos_x + 10, str_pos_y - 2 , D3DFONTFLAG_DROPSHADOW, item.m_name ); - g_d3d.draw_text< ALIGN_RIGHT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), m_x + m_tabwidth * ( m_tab + 1 ) - 5, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, *item.m_friend ? "true" : "false" ); - - } - else { - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), str_pos_x, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, item.m_name ); - g_d3d.draw_text< ALIGN_RIGHT >( d3d::fonts.f_esp_small, clr_t( 255, 255, 255 ), m_x + m_tabwidth * ( m_tab + 1 ) - 5, str_pos_y - 2, D3DFONTFLAG_DROPSHADOW, *item.m_friend ? "true" : "false" ); - } - - i++; - j++; - } - - - // draw pink outlines per tab. - for( uint8_t k = 0; k < ( uint8_t )tabs_to_draw; k++ ) { - g_d3d.draw_rect( ui::ui_get_accent_col( ), m_x + m_tabwidth * k, m_y, m_tabwidth, m_h ); - } - - } - } - } -} \ No newline at end of file diff --git a/gmod/playerlist.hpp b/gmod/playerlist.hpp deleted file mode 100644 index 56eac50..0000000 --- a/gmod/playerlist.hpp +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include "context.hpp" -#include "d3d.hpp" -#include "interface.hpp" -#include "ui_draw.h" - -#include -#include - -NAMESPACE_REGION( features ) - -class c_player_list -{ - struct playeritem_t - { - playeritem_t( ) = default; - playeritem_t( char* name, bool* friends ) { - strcpy( m_name, name ); - m_friend = friends; - } - - char m_name[ 32 ]{ }; - bool* m_friend{ }; - }; - - bool m_open; - int m_x, m_y, m_w, m_h; - int m_tabwidth; - int m_tab; - int m_scrw, m_scrh; - int m_index; - - std::vector< playeritem_t > m_items; - std::map< std::string, bool > m_friends; -public: - inline bool& is_open( ) { - return m_open; - } - - inline int& get_index( ) { - return m_index; - } - - inline auto get_list( ) { - return m_items; - } - - bool is_friend( const std::string& guid ); - - void operator()( ); -}; - -END_REGION \ No newline at end of file diff --git a/gmod/prediction.cpp b/gmod/prediction.cpp deleted file mode 100644 index ebfea5b..0000000 --- a/gmod/prediction.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "prediction.hpp" -#include "hooks.hpp" -#include "context.hpp" - -NAMESPACE_REGION( features ) - -void c_prediction::predict_player( c_base_player* player ) { - static uintptr_t run_command_address = g_gmod.m_prediction->get_old_function< uintptr_t >( 17 ); - static uintptr_t set_prediction_random_seed_address = ( run_command_address + 0x21 + 4 + *( uintptr_t* )( run_command_address + 0x21 ) ); - - - CMoveData move_data{ }; - auto ce = player->ce( ); - - float old_curtime = g_gmod.m_globals->m_curtime; - float old_frametime = g_gmod.m_globals->m_frametime; - - int backup_tickbase = player->m_nTickBase( ); - int backup_simtime = player->m_flSimulationTime( ); - - - //random seed is already being calculated and set in createmove - **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = g_ctx.get_last_cmd( )->m_random_seed; //prediction seed - **( uintptr_t** )( run_command_address + 0x2F ) = uintptr_t( g_ctx.m_local ); //prediction player - - //start prediction - g_gmod.m_game_movement( )->StartTrackPredictionErrors( ce ); - - //run prediction - g_gmod.m_prediction( )->SetupMove( ce, *player->get< user_cmd_t** >( 0x24B0 ), g_gmod.m_move_helper( ), &move_data ); - g_gmod.m_game_movement( )->ProcessMovement( ce, &move_data ); - g_gmod.m_prediction( )->FinishMove( ce, *player->get< user_cmd_t** >( 0x24B0 ), &move_data ); - - //finish prediction - g_gmod.m_game_movement( )->FinishTrackPredictionErrors( ce ); - - **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = 0xffffffff; - **( uintptr_t*** )( run_command_address + 0x2F ) = nullptr; - - player->m_nTickBase( ) = backup_tickbase; - player->m_flSimulationTime( ) = backup_simtime; - - g_gmod.m_globals->m_curtime = old_curtime; - g_gmod.m_globals->m_frametime = old_frametime; -} - -void c_prediction::run( user_cmd_t* ucmd ) { - if ( !ucmd || !g_ctx.m_local || !g_ctx.m_local->is_alive( ) ) - return; - - static uintptr_t run_command_address = g_gmod.m_prediction->get_old_function< uintptr_t >( 17 ); - static uintptr_t relative_call_addr = run_command_address + 0x21; - static uintptr_t set_prediction_random_seed_address = ( relative_call_addr + 4 + *( uintptr_t* )( relative_call_addr ) ); - - static auto sv_footsteps = g_gmod.m_cvar( )->FindVar( "sv_footsteps" ); - - CMoveData move_data{ }; - IClientEntity* local_ent = g_ctx.m_local->ce( ); - - //backup data - int old_buttons = ucmd->m_buttons; - float old_curtime = g_gmod.m_globals->m_curtime; - float old_frame_time = g_gmod.m_globals->m_frametime; - int old_tickbase = g_ctx.m_local->m_nTickBase( ); - int old_flags = g_ctx.m_local->m_fFlags( ); - MoveType_t old_move_type = g_ctx.m_local->m_nMoveType( ); - vec3_t old_velocity = g_ctx.m_local->m_vecVelocity( ); - int old_sv_flags = sv_footsteps->m_flags; - - sv_footsteps->m_flags = 0; - sv_footsteps->m_nvalue = 0; - - //set globals - g_gmod.m_globals->m_curtime = g_gmod.m_globals->m_interval_per_tick * old_tickbase; - g_gmod.m_globals->m_frametime = g_gmod.m_globals->m_interval_per_tick; - - //random seed is already being calculated and set in createmove - **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = ucmd->m_random_seed; //prediction seed - **( uintptr_t** )( run_command_address + 0x2F ) = uintptr_t( g_ctx.m_local ); //prediction player - - //start prediction - g_gmod.m_game_movement( )->StartTrackPredictionErrors( local_ent ); - - //run prediction - g_gmod.m_prediction( )->SetupMove( local_ent, ucmd, nullptr, &move_data ); - g_gmod.m_game_movement( )->ProcessMovement( local_ent, &move_data ); - g_gmod.m_prediction( )->FinishMove( local_ent, ucmd, &move_data ); - - //finish prediction - g_gmod.m_game_movement( )->FinishTrackPredictionErrors( local_ent ); - - **( uintptr_t** )( set_prediction_random_seed_address + 0xC ) = 0xffffffff; - **( uintptr_t*** )( run_command_address + 0x2F ) = nullptr; - - //good to have, can be used for edge jump and such - m_predicted_flags = g_ctx.m_local->m_fFlags( ); - - //restore - ucmd->m_buttons = old_buttons; - g_gmod.m_globals->m_curtime = old_curtime; - g_gmod.m_globals->m_frametime = old_frame_time; - g_ctx.m_local->m_nTickBase( ) = old_tickbase; - g_ctx.m_local->m_fFlags( ) = old_flags; - g_ctx.m_local->m_nMoveType( ) = old_move_type; - g_ctx.m_local->m_vecVelocity( ) = old_velocity; - - sv_footsteps->m_nvalue = 1; - sv_footsteps->m_flags = old_sv_flags; -} - -END_REGION \ No newline at end of file diff --git a/gmod/prediction.hpp b/gmod/prediction.hpp deleted file mode 100644 index ca0fb93..0000000 --- a/gmod/prediction.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include "util.hpp" - -class user_cmd_t; -class c_base_player; - -NAMESPACE_REGION( features ) - -class c_prediction { - user_cmd_t* m_ucmd{ }; - int m_predicted_flags{ }; - - void run( user_cmd_t* ucmd ); -public: - void operator()( user_cmd_t* ucmd ) { - m_ucmd = ucmd; - run( m_ucmd ); - } - - int get_predicted_flags( ) const { - return m_predicted_flags; - } - - void predict_player( c_base_player* player ); -}; - -END_REGION \ No newline at end of file diff --git a/gmod/proxies.cpp b/gmod/proxies.cpp deleted file mode 100644 index 200a370..0000000 --- a/gmod/proxies.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" -#include "base_cheat.hpp" - -void __cdecl hooks::lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { - lby_proxy.get_old_function( )( proxy_data_const, entity, output ); - - if( !g_csgo.m_panic ) { - auto player = ( c_base_player* )( entity ); - if( player && player == g_ctx.m_local ) { - g_cheat.m_ragebot.m_antiaim->on_lby_proxy( ); - } - } -} - -void __cdecl hooks::last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { - last_shot_proxy.get_old_function( )( proxy_data_const, entity, output ); - - if( !g_csgo.m_panic && proxy_data_const ) { - auto wep = ( c_base_weapon* )( entity ); - if( wep ) { - auto owner = g_csgo.m_entlist( )->GetClientEntityFromHandle( wep->m_hOwner( ) ); - if( owner && owner->is_valid( ) ) { - - auto records = g_cheat.m_ragebot.m_lagcomp->get_records( owner->ce( )->GetIndex( ), RECORD_NORMAL ); - if( records && records->size( ) ) { - for( auto& it : *records ) { - float sim = it.m_flSimulationTime; - if( sim == wep->get< float >( 0x3314 ) ) { - it.m_tickcount -= it.m_choked; - auto ang = math::vector_angles( owner->get_hitbox_pos( 0 ), g_ctx.m_local->get_eye_pos( ) ); - //g_con->log( "found shot record for %d: %f angles: %f %f", owner->ce( )->GetIndex( ), sim, it.m_vecAngles.x, it.m_vecAngles.y ); - - it.m_vecAngles = it.m_vecRenderAngles = ang; - it.m_vecAbsAngles.y = ang.y; - break; - } - } - } - } - } - } -} \ No newline at end of file diff --git a/gmod/ragebot_antiaim.cpp b/gmod/ragebot_antiaim.cpp deleted file mode 100644 index 1cb9af9..0000000 --- a/gmod/ragebot_antiaim.cpp +++ /dev/null @@ -1,750 +0,0 @@ -#include "ragebot.hpp" -#include "base_cheat.hpp" -#include "context.hpp" -#include "math.hpp" -#include "input_system.hpp" - -namespace features -{ - void c_ragebot::c_lby_breaker::update_animstate( ) { - static bool valid = false; - static float last_spawn = 0.f; - static float last_update = 0.f; - if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { - if( m_animstate ) { - g_csgo.m_alloc->Free( m_animstate ); - m_animstate = nullptr; - } - valid = false; - return; - } - - if( m_animstate && ( m_animstate->pBaseEntity != g_ctx.m_local || g_ctx.m_local->m_flSpawnTime( ) != last_spawn ) ) { - last_spawn = g_ctx.m_local->m_flSpawnTime( ); - g_csgo.m_alloc->Free( m_animstate ); - m_animstate = nullptr; - valid = false; - } - - if( !m_animstate ) { - m_animstate = ( CCSGOPlayerAnimState* )g_csgo.m_alloc->Alloc( sizeof( CCSGOPlayerAnimState ) ); - } - - if( !valid && m_animstate ) { - g_ctx.m_local->create_animstate( m_animstate ); - valid = true; - } - else if( valid && m_animstate && !g_cheat.m_lagmgr.get_choked( ) ) { - static float time_delta = g_csgo.m_globals->m_curtime - last_update; - if( std::abs( time_delta ) > g_csgo.m_globals->m_interval_per_tick ) { - vec3_t angles = g_ctx.m_last_realangle; - - C_AnimationLayer anim_backup[ 13 ]; - float param_backup[ 24 ]; - - memcpy( anim_backup, g_ctx.m_local->m_AnimOverlay( ).GetElements( ), sizeof( anim_backup ) ); - memcpy( param_backup, g_ctx.m_local->m_flPoseParameter( ), sizeof( param_backup ) ); - - m_animstate->update( angles.y, angles.x ); - m_animstate->m_flFeetSpeedForwardsOrSideWays = std::clamp( m_animstate->m_flFeetSpeedForwardsOrSideWays, 0.f, 2.f ); - m_animstate->m_flFeetSpeedUnknownForwardOrSideways = std::clamp( m_animstate->m_flFeetSpeedUnknownForwardOrSideways, 0.f, 3.f ); - - memcpy( g_ctx.m_local->m_AnimOverlay( ).GetElements( ), anim_backup, sizeof( anim_backup ) ); - memcpy( g_ctx.m_local->m_flPoseParameter( ), param_backup, sizeof( param_backup ) ); - - last_update = g_csgo.m_globals->m_curtime; - } - } - - bool moving = m_animstate->m_velocity > 0.1f && g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - if( g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) moving = false; - - static bool was_moving = moving; - float time = g_ctx.pred_time( ); - - float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); - float real = g_ctx.m_last_realangle.y; - - if( moving ) { - m_next_update = time + 0.22f; - m_state = BS_MOVING; - } - else if( time >= m_next_update ) { - //idk - float latency = g_csgo.m_globals->m_interval_per_tick; - - m_next_update = time + ( was_moving ? 0.22f : 1.1f ) + latency; - - m_state = was_moving ? BS_WAS_MOVING : BS_BREAKING; - } - - was_moving = moving; - - if( g_ctx.m_tickbase > 0 ) { - auto& cur_update = m_lby_updates[ g_ctx.m_tickbase % 64 ]; - cur_update.m_tickbase = g_ctx.m_tickbase; - cur_update.m_state = m_state; - } - } - - void c_ragebot::c_lby_breaker::on_lby_proxy( ) { - float oldsimtime_1tickfuture = g_ctx.m_local->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - int oldsimtime_ticks = TIME_TO_TICKS( oldsimtime_1tickfuture ); - - float latency = g_csgo.m_engine( )->GetNetChannelInfo( )->GetLatency( 0 ) + g_csgo.m_globals->m_interval_per_tick; - for( auto& it : m_lby_updates ) { - if( it.m_tickbase == oldsimtime_ticks ) - if( it.m_state == BS_WAS_MOVING ) { - //m_next_update = oldsimtime_1tickfuture + 0.22f - latency; - - if( it.m_state == BS_BREAKING ) - m_next_update = oldsimtime_1tickfuture + 1.1f - latency; - - break; - } - } - } - - int c_ragebot::c_lby_breaker::get_next_update( ) const { - auto current_tick = TIME_TO_TICKS( g_ctx.pred_time( ) ); - auto update_tick = TIME_TO_TICKS( m_next_update ); - - return update_tick - current_tick; - } - - void c_ragebot::c_lby_breaker::override_angles( float* angles, float original, float offset ) { - const float angle = original; - int update_ticks = get_next_update( ); - - if( g_cheat.m_lagmgr.get_state( ) ) - return; - - //yep - if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) - return; - - float break_angle = angle - offset; - - float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); - float real = angle; - float delta = std::remainderf( lby - real, 360.f ); - - if( std::abs( delta ) < 37.f && get_state( ) == BS_BREAKING ) { - if( update_ticks < -TIME_TO_TICKS( 1.f ) ) { - *angles = break_angle; - return; - } - } - - if( update_ticks < -1 ) - return; - - if( ( get_state( ) == BS_WAS_MOVING || g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) - && update_ticks >= 1 && offset < 140.f ) { - *angles = angle + 140.f - offset; - } - - if( /*get_state( ) > BS_MOVING &&*/ update_ticks < 1 || - get_state( ) == BS_WAS_MOVING && update_ticks < 3 ) { - *angles = break_angle; - } - - g_ctx.m_thirdperson_angle.y = *angles; - } - - void c_ragebot::c_antiaim::fix_movement( ) { - auto last_cmd = g_ctx.get_last_cmd( ); - auto old_yaw = last_cmd->m_viewangles.y; - auto cur_yaw = m_cmd->m_viewangles.y; - - float yaw_delta = cur_yaw - old_yaw; - - float f1 = old_yaw < 0.f ? old_yaw + 360.f : old_yaw; - float f2 = cur_yaw < 0.f ? cur_yaw + 360.f : cur_yaw; - - if( f2 < f1 ) - yaw_delta = abs( f2 - f1 ); - else - yaw_delta = 360.f - abs( f1 - f2 ); - yaw_delta = 360.f - yaw_delta; - - m_cmd->m_forwardmove = cos( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + cos( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; - m_cmd->m_sidemove = sin( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + sin( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; - - if( g_ctx.m_local->m_nMoveType( ) != MOVETYPE_LADDER ) { - if( m_cmd->m_forwardmove ) { - m_cmd->m_buttons &= ~( m_cmd->m_forwardmove < 0 ? IN_FORWARD : IN_BACK ); - m_cmd->m_buttons |= ( m_cmd->m_forwardmove > 0 ? IN_FORWARD : IN_BACK ); - } - if( m_cmd->m_sidemove ) { - m_cmd->m_buttons &= ~( m_cmd->m_sidemove < 0 ? IN_MOVERIGHT : IN_MOVELEFT ); - m_cmd->m_buttons |= ( m_cmd->m_sidemove > 0 ? IN_MOVERIGHT : IN_MOVELEFT ); - } - } - } - - float get_damage( const vec3_t& start, const vec3_t& end, c_base_player* a, c_base_player* b ) { - static weapon_info_t wpn_data{ }; - wpn_data.damage = 200; - wpn_data.range_modifier = 1.0f; - wpn_data.penetration = 3.0f; - wpn_data.armor_ratio = 0.5f; - wpn_data.range = 8192.f; - - fire_bullet_data_t data{ }; - data.src = start; - data.filter.pSkip = a; - data.length_to_end = ( end - start ).length( ); - - vec3_t angle = math::vector_angles( start, end ); - data.direction = math::angle_vectors( angle ); - - data.direction.normalize_vector( ); - - if( g_cheat.m_autowall.fire_bullet( a, b, &wpn_data, data, false, false ) ) { - return data.current_damage; - } - - return -1.f; - } - - bool is_visible( const vec3_t& start, const vec3_t& end, void* skip ) { - CTraceFilter filter; - CGameTrace tr; - Ray_t ray; - - filter.pSkip = skip; - ray.Init( start, end ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); - - return tr.fraction >= 0.98f; - } - - bool c_ragebot::c_antiaim::run_edge_dtc( ) { - if( !g_settings.rage.edge_dtc_normal ) - return false; - - if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) - return false; - - if( g_settings.rage.edge_dtc_normal == 1 ) { - float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); - if( speed < 30.f ) return false; - } - - bool peeking = g_ctx.m_local->m_vecVelocity( ).length( ) > 30.f; - if( is_fakewalking( ) ) peeking = false; - CTraceFilterWorldAndPropsOnly filter; - - float max_dist = peeking ? g_settings.rage.edge_dtc_moving : g_settings.rage.edge_dtc_standing; - float min_dist = 64.f; - float edge_yaw = 0.f; - float final_yaw = 0.f; - bool detected = false; - - const float step = 45.f; - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - - for( float rot = -180.f; rot < 180.f; rot += step ) { - float rot_left = rot - 90.f; - float rot_right = rot + 90.f; - - vec3_t pos_left = math::get_rotated_pos( eye_pos, rot_left, 30.f ); - vec3_t pos_right = math::get_rotated_pos( eye_pos, rot_right, 30.f ); - - vec3_t forward = math::angle_vectors( vec3_t( 0.f, rot, 0.f ) ); - forward *= 4000.f; - - CGameTrace trace_left, trace_right; - Ray_t ray_left, ray_right; - - ray_left.Init( pos_left, pos_left + forward ); - ray_right.Init( pos_right, pos_right + forward ); - - g_csgo.m_trace( )->TraceRay( ray_left, MASK_SHOT_HULL, &filter, &trace_left ); - g_csgo.m_trace( )->TraceRay( ray_right, MASK_SHOT_HULL, &filter, &trace_right ); - - float dist_left = ( pos_left - trace_left.endpos ).length( ); - float dist_right = ( pos_right - trace_right.endpos ).length( ); - - if( dist_right > dist_left ) { - if( dist_right > max_dist && dist_left < min_dist ) { - max_dist = dist_right; - edge_yaw = rot_left; - detected = true; - } - } - else { - if( dist_left > max_dist && dist_right < min_dist ) { - max_dist = dist_left; - edge_yaw = rot_right; - detected = true; - } - } - } - - if( !detected ) - return false; - - final_yaw = edge_yaw; - if( g_cheat.m_lagmgr.get_state( ) ) { - final_yaw = edge_yaw + 180.f; - } - - int state = m_breaker.get_state( ); - int ticks = m_breaker.get_next_update( ); - switch( g_settings.rage.edge_dtc_type( ) ) { - case 0: { - break; - } - case 1: { - m_breaker.override_angles( &final_yaw, edge_yaw, 110.f ); - m_cmd->m_viewangles.y = final_yaw; - return true; - } - case 2: { - m_breaker.override_angles( &final_yaw, edge_yaw, 180.f ); - m_cmd->m_viewangles.y = final_yaw; - return true; - } - default: - break; - } - - m_cmd->m_viewangles.y = final_yaw; - return true; - } - - bool c_ragebot::c_antiaim::run_freestanding( ) { - if( !g_settings.rage.edge_detection ) - return false; - - bool is_fake = g_cheat.m_lagmgr.get_state( ); - vec3_t enemy_pos; - vec3_t local_pos; - - vec3_t aim_angle; - vec3_t final_angle; - vec3_t final_enemy_pos; - vec3_t final_local_pos; - - float cur_damage{ 30.f }; - bool direction{ false }; - int enemy_index; - - enemy_index = util::get_closest_player( ); - - if( enemy_index == -1 ) - return false; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( enemy_index ); - - enemy_pos = ent->m_vecOrigin( ); - enemy_pos.z = ent->get_hitbox_pos( 0 ).z; - - local_pos = g_ctx.m_local->get_eye_pos( ); - - aim_angle = math::vector_angles( enemy_pos, local_pos ); - - for( int step_local = 1; step_local <= 4; ++step_local ) { - float offset = step_local * 20.f; - - vec3_t local_left = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, -offset ); - vec3_t local_right = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, offset ); - - bool visible_left = is_visible( local_pos, local_left, g_ctx.m_local ); - bool visible_right = is_visible( local_pos, local_right, g_ctx.m_local ); - - if( !visible_left && !visible_right ) break; - - const float enemy_offset = 60.f; - - vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_offset ); - vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, -enemy_offset ); - - CTraceFilter filter; - CGameTrace tr_right; - CGameTrace tr_left; - Ray_t ray; - - filter.pSkip = ent; - ray.Init( enemy_pos, enemy_left ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_left ); - ray.Init( enemy_pos, enemy_right ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_right ); - - enemy_left = tr_left.endpos; - enemy_right = tr_right.endpos; - - auto update_damage = [ & ]( const vec3_t& position, bool dir, bool center ) { - if( is_visible( enemy_pos, position, ent ) || center ) { - float dmg_left{ }; - float dmg_right{ }; - - if( visible_left ) { - dmg_left = get_damage( position, local_left, ent, g_ctx.m_local ); - } - - if( visible_right ) { - dmg_right = get_damage( position, local_right, ent, g_ctx.m_local ); - } - - if( step_local == 1 ) { - float delta = std::abs( dmg_left - dmg_right ); - if( delta < 35.f && dmg_left > 30.f && dmg_right > 30.f ) { - return false; - } - } - - float max_dmg = std::max< float >( dmg_left, dmg_right ); - vec3_t end_pos = dmg_left > dmg_right ? local_left : local_right; - bool new_dir = dmg_left > dmg_right; - - - //add a bit of tolerance - if( max_dmg > cur_damage + 10.f ) { - final_enemy_pos = position; - final_local_pos = end_pos; - cur_damage = max_dmg; - direction = new_dir; - } - } - - return true; - }; - - if( !update_damage( enemy_pos, true, true ) ) - return false; - - update_damage( enemy_left, true, false ); - update_damage( enemy_right, false, false ); - } - - - if( cur_damage > 50.f ) { - auto angle = math::vector_angles( final_local_pos, final_enemy_pos ); - - m_direction = direction; - angle.y += direction ? -90.f : 90.f; - angle.y = math::find_closest_step( angle.y, 30.f ); - - if( g_settings.rage.pitch == 3 && g_settings.rage.edge_detection > 1 && m_breaker.get_next_update( ) < 2 ) { - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - vec3_t rotated_pos = math::get_rotated_pos( eye_pos, angle.y - 180.f, 25.f ); - - vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); - - vec3_t middle_pos = eye_pos + velocity * TICK_INTERVAL( ) * 2.f; - middle_pos.z += 10.f; - - int dmg_rot = get_damage( final_enemy_pos, rotated_pos, ent, g_ctx.m_local ); - int dmg_mid = get_damage( final_enemy_pos, middle_pos, ent, g_ctx.m_local ); - - if( dmg_mid < dmg_rot && ( dmg_mid < 100 || velocity.length2d( ) < 0.1f ) ) { - m_cmd->m_viewangles.x = 0.f; - } - } - - if( is_fake ) { - int jitter = g_settings.rage.edge_dtc_jitter; - if( jitter ) { - angle.y += math::random_number< float >( -jitter, jitter ); - } - angle.y -= 180.f; - } - else { - switch( g_settings.rage.edge_detection( ) ) { - case 2: - m_breaker.override_angles( &angle.y, angle.y, 110.f ); - break; - case 3: - m_breaker.override_angles( &angle.y, angle.y, 180.f ); - break; - } - } - - m_cmd->m_viewangles.y = angle.clamp( ).y; - return true; - } - - return false; - } - - void c_ragebot::c_antiaim::run_fakewalk( ) { - m_is_fakewalking = false; - bool in_move = !( m_cmd->m_buttons & IN_FORWARD ) && !( m_cmd->m_buttons & IN_BACK ) && !( m_cmd->m_buttons & IN_LEFT ) && !( m_cmd->m_buttons & IN_RIGHT ); - - if( !m_cmd->m_sidemove && !m_cmd->m_forwardmove && !g_ctx.m_local->m_vecVelocity( ) && !in_move ) - return; - - if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) - return; - - if( m_cmd->m_buttons & IN_WALK ) { - m_cmd->m_buttons &= ~IN_WALK; - } - - m_is_fakewalking = true; - - auto velocity = g_ctx.m_local->m_vecVelocity( ); - - static auto predict_velocity = [ ]( vec3_t* velocity ) { - static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); - static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); - - float speed = velocity->length( ); - if( speed >= 0.1f ) { - float friction = sv_friction->get_float( ); - float stop_speed = std::max< float >( speed, sv_stopspeed->get_float( ) ); - float time = std::max< float >( g_csgo.m_globals->m_interval_per_tick, g_csgo.m_globals->m_frametime ); - *velocity *= std::max< float >( 0.f, speed - friction * stop_speed * time / speed ); - } - }; - - static auto quick_stop = [ & ]( ) { - vec3_t vel = g_ctx.m_local->m_vecVelocity( ); - float speed = vel.length2d( ); - if( speed > 13.f ) { - vec3_t direction = math::vector_angles( { 0.f, 0.f, 0.f }, vel ); - direction.y = g_ctx.get_last_cmd( )->m_viewangles.y - direction.y; - - vec3_t new_move = math::angle_vectors( direction ); - new_move *= -450.f; - - g_ctx.get_last_cmd( )->m_forwardmove = new_move.x; - g_ctx.get_last_cmd( )->m_sidemove = new_move.y; - } - else { - g_ctx.get_last_cmd( )->m_forwardmove = 0.f; - g_ctx.get_last_cmd( )->m_sidemove = 0.f; - } - }; - - //check how many ticks before LBY update comes in - int ticks_to_update = m_breaker.get_next_update( ) - 1; - - int ticks_to_stop; - for( ticks_to_stop = 0; ticks_to_stop < 15; ++ticks_to_stop ) { - if( velocity.length2d( ) < 0.1f ) - break; - - predict_velocity( &velocity ); - } - - const int max_ticks = std::min< int >( g_settings.rage.fakewalk_ticks, ticks_to_update ); - const int choked = g_cheat.m_lagmgr.get_choked( ); - int ticks_left = max_ticks - choked; - - if( choked < max_ticks || ticks_to_stop ) { - g_cheat.m_lagmgr.set_state( false ); - } - - if( !ticks_to_stop && !g_ctx.m_local->m_vecVelocity( ).length2d( ) && !g_cheat.m_lagmgr.get_sent( ) - && choked > max_ticks ) { - g_cheat.m_lagmgr.set_state( true ); - } - - if( ticks_to_stop > ticks_left || !choked || g_cheat.m_lagmgr.get_state( ) ) { - quick_stop( ); - } - } - - float c_ragebot::c_antiaim::get_pitch( ) { - switch( g_settings.rage.pitch( ) ) { - case 1: //custom - return float( g_settings.rage.pitch_offset( ) ); - case 2: //flip - return g_cheat.m_lagmgr.get_state( ) ? 75.f : 89.f; - case 3: - return 89.f; - case 4: //random - return math::random_number( -89.f, 89.f ); - } - - return 0.f; - } - - float c_ragebot::c_antiaim::get_yaw( bool fake, float original, bool no_jitter ) { - constexpr static double rate = 360.0 / 1.618033988749895; - constexpr static int switch_rate = 10; - static float last_onground = 0.f; - static int ticks = 0; - static bool side_switch = false; - bool on_ground = false; - - int setting = fake ? g_settings.rage.fake_yaw : g_settings.rage.real_yaw; - int jitter = fake ? g_settings.rage.fake_yaw_jitter : g_settings.rage.real_yaw_jitter; - int add = fake ? g_settings.rage.fake_yaw_add : g_settings.rage.real_yaw_add; - if( g_ctx.m_local->m_vecVelocity( ).length( ) > 0.1f && !is_fakewalking( ) ) { - if( fake && g_settings.rage.fake_yaw_moving( ) ) { - setting = g_settings.rage.fake_yaw_moving( ); - jitter = g_settings.rage.fake_moving_jitter( ); - add = g_settings.rage.fake_yaw_moving_add( ); - } - else if( g_settings.rage.real_yaw_moving( ) ) { - setting = g_settings.rage.real_yaw_moving( ); - jitter = g_settings.rage.real_moving_jitter( ); - add = g_settings.rage.real_yaw_moving_add( ); - } - } - - if( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { - last_onground = g_ctx.pred_time( ); - on_ground = true; - } - - ticks++; - if( ticks > switch_rate ) { - side_switch ^= 1; - ticks = 0; - } - - float rand = 0.f; - if( setting && jitter && !no_jitter ) { - rand = math::random_number( -float( jitter ), float( jitter ) ); - } - - if( setting && add ) { - original += add; - } - - switch( setting ) { - case 1: //back - return original - 180.f + rand; - case 2: {//back spin - float time = on_ground ? g_csgo.m_globals->m_curtime * 0.5f : ( g_csgo.m_globals->m_curtime - last_onground ); - float range = on_ground ? jitter : jitter * 2.f; - return original - 180.f - range * 0.5f + ( no_jitter ? range : std::fmod( time * rate, range + 1.f ) ); - } - case 3: //sideways - //to be updated with the last saved yaw from freestanding/breaker - return rand + fake ? ( side_switch ? original - 90.f : original + 90.f ) : - ( side_switch ? original + 90.f : original - 90.f ); - case 4: //slowpin lol - return rand + std::fmod( g_csgo.m_globals->m_curtime * rate, 360.f ); - case 5: //random - return math::random_number( -180.f, 180.f ); - case 6: - return rand + fake ? ( m_direction ? original - 90.f : original + 90.f ) : - ( m_direction ? original + 90.f : original - 90.f ); - } - - return original; - } - - float c_ragebot::c_antiaim::get_yaw( bool no_jitter ) { - const auto is_fake = g_cheat.m_lagmgr.get_state( ); - auto original = g_ctx.get_last_cmd( )->m_viewangles.y; - - if( g_settings.rage.at_players ) { - auto closest_ent = util::get_closest_player( ); - if( closest_ent != -1 ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( closest_ent ); - vec3_t ang = math::vector_angles( g_ctx.m_local->m_vecOrigin( ), - ent->m_vecOrigin( ) ); - - original = ang.y; - } - } - - if( is_fake && !g_settings.rage.fake_yaw( ) ) - return original; - if( !is_fake && !g_settings.rage.real_yaw( ) ) - return original; - - if( g_settings.rage.angle_step( ) && g_settings.rage.angle_step_degrees( ) ) { - float step = float( g_settings.rage.angle_step_degrees( ) ); - original = math::find_closest_step( original, step ); - } - return get_yaw( is_fake, original, no_jitter ); - } - - void c_ragebot::c_antiaim::run( ) { - m_is_edging = false; - if( !g_settings.rage.anti_aim( ) || !g_settings.rage.enabled( ) ) - return; - - auto is_everyone_dormant = [ ]( ) { - for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - if( ent && ent->is_valid( ) && - ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) - || g_settings.rage.friendlies ) ) { - return false; - } - } - - return true; - }; - - if( ( m_cmd->m_forwardmove || m_cmd->m_sidemove ) && - ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || - g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) ) - return; - - if( g_ctx.m_local->m_fFlags( ) & FL_FROZEN ) - return; - - if( is_everyone_dormant( ) && g_settings.rage.dormant_check ) - return; - - if( g_settings.rage.fakewalk( ) && g_input.is_key_pressed( g_settings.rage.fakewalk_key( ) ) ) { - run_fakewalk( ); - } - else { - m_is_fakewalking = false; - } - - if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( weapon && weapon->is_grenade( ) ) { - if( weapon->m_fThrowTime( ) > g_csgo.m_globals->m_interval_per_tick ) { - return; - } - } - - if( m_cmd->m_buttons & IN_USE ) - return; - - if( g_settings.rage.real_yaw( ) || - g_settings.rage.fake_yaw( ) ) { - m_cmd->m_viewangles.y = get_yaw( ); - if( g_settings.rage.break_lby( ) ) { - m_breaker.override_angles( &m_cmd->m_viewangles.y, - get_yaw( true ), - float( g_settings.rage.lby_delta ) ); - } - } - - bool edge_detected = false; - bool freestanding = false; - - if( g_settings.rage.pitch( ) ) { - m_cmd->m_viewangles.x = get_pitch( ); - } - - if( !g_settings.rage.edge_dtc_priority ) { - freestanding = run_freestanding( ); - if( !freestanding ) - edge_detected = run_edge_dtc( ); - } - else { - edge_detected = run_edge_dtc( ); - if( !edge_detected ) - freestanding = run_freestanding( ); - } - - m_is_edging = freestanding || edge_detected; - - if( edge_detected && g_cheat.m_lagmgr.get_choked( ) && m_breaker.get_next_update( ) > 1 ) { - vec3_t vang{ }; - g_csgo.m_engine( )->GetViewAngles( vang ); - - float delta = std::remainderf( vang.y - m_cmd->m_viewangles.y, 360.f ); - m_direction = delta < 0; - } - } -} \ No newline at end of file diff --git a/gmod/ragebot_lagcomp.cpp b/gmod/ragebot_lagcomp.cpp deleted file mode 100644 index 0fe3a0b..0000000 --- a/gmod/ragebot_lagcomp.cpp +++ /dev/null @@ -1,595 +0,0 @@ -#include "ragebot.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "mem.hpp" - -namespace features -{ - c_ragebot::lag_record_t::lag_record_t( c_base_player* ent ) : m_ent( ent ) { - if( !m_ent || !m_ent->is_valid( ) ) return; - m_valid = true; - - m_flSimulationTime = m_ent->m_flSimulationTime( ); - m_tickcount = TIME_TO_TICKS( m_flSimulationTime + util::get_lerptime( ) ); - m_choked = m_ent->get_choked_ticks( ); - - m_flLowerBodyYaw = m_ent->m_flLowerBodyYawTarget( ); - m_vecVelocity = m_ent->m_vecVelocity( ); - m_fFlags = m_ent->m_fFlags( ); - m_flCycle = m_ent->m_flCycle( ); - m_nSequence = m_ent->m_nSequence( ); - - m_vecAngles = m_ent->m_angEyeAngles( ); - m_vecOrigin = m_ent->m_vecOrigin( ); - - m_vecRenderAngles = m_ent->ce( )->GetRenderAngles( ); - m_vecAbsAngles = *( vec3_t* )( uintptr_t( m_ent ) + 0xc4 ); - - m_vecAbsOrigin = *( vec3_t* )( uintptr_t( m_ent ) + 0xa0 ); - m_vecRenderOrigin = m_ent->ce( )->GetRenderOrigin( ); - - m_vecHeadPos = ent->get_hitbox_pos( 0 ); - m_vecPelvisPos = ent->get_hitbox_pos( HITBOX_PELVIS ); - m_can_render = ent->ce( )->SetupBones( m_matrix, 128, 0x100, 0.f ); - - m_vecMins = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ); - m_vecMaxs = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ); - - float* pose_params = m_ent->m_flPoseParameter( ); - memcpy( m_PoseParameters, - pose_params, - sizeof( float ) * 24 ); - - size_t count = std::min< size_t >( m_ent->m_AnimOverlay( ).GetSize( ), 13 ); - memcpy( m_AnimLayers, - m_ent->m_AnimOverlay( ).GetElements( ), - sizeof( C_AnimationLayer ) * count ); - - memcpy( &m_state, - m_ent->get_animstate( ), - sizeof( CCSGOPlayerAnimState ) ); - } - - //this shit doesnt work and im going to lose my fucking mind - bool c_ragebot::lag_record_t::restore( bool recalculate ) { - if( !m_ent || !m_ent->is_valid( ) ) return false; - - m_ent->m_flLowerBodyYawTarget( ) = m_flLowerBodyYaw; - - m_ent->m_vecVelocity( ) = m_vecVelocity; - m_ent->m_flCycle( ) = m_flCycle; - m_ent->m_nSequence( ) = m_nSequence; - - m_ent->m_angEyeAngles( ) = m_vecAngles; - m_ent->m_vecOrigin( ) = m_vecOrigin; - m_ent->m_fFlags( ) = m_fFlags; - - m_ent->ce( )->GetRenderAngles( ) = m_vecRenderAngles; - m_ent->ce( )->GetRenderOrigin( ) = m_vecRenderOrigin; - - m_ent->set_abs_angles( m_vecAbsAngles ); - m_ent->set_abs_origin( m_vecAbsOrigin ); - - *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ) = m_vecMins; - *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ) = m_vecMaxs; - - memcpy( m_ent->m_flPoseParameter( ), - m_PoseParameters, - sizeof( float ) * 24 ); - - size_t count = std::min< int >( m_ent->m_AnimOverlay( ).GetSize( ), 13 ); - memcpy( m_ent->m_AnimOverlay( ).GetElements( ), - m_AnimLayers, - sizeof( C_AnimationLayer ) * count ); - - if( recalculate ) { - m_ent->fix_animations( nullptr ); - //m_ent->invalidate_bone_cache( ); - return m_ent->ce( )->SetupBones( nullptr, -1, 0x100, 0.f ); - } - else { - m_ent->invalidate_bone_cache( ); - return true; - } - - return false; - } - - bool c_ragebot::lag_record_t::is_valid( ) { - if( !m_valid ) return false; - if( m_balanceadjust && m_shot ) return false; - - return util::is_tick_valid( m_tickcount ); - } - - void c_ragebot::c_lagcomp::restore_animations( ) { - if( g_csgo.m_engine( )->IsInGame( ) ) { - if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( ent && ent->is_player( ) && ent != g_ctx.m_local ) { - ent->m_flLastBoneSetupTime( ) = g_csgo.m_globals->m_curtime; - ent->m_iMostRecentModelBoneCounter( ) = g_csgo.m_globals->m_framecount; - ent->m_bClientSideAnimation( ) = true; - } - } - } - } - } - - void c_ragebot::c_lagcomp::store_visuals( ) { - if( g_csgo.m_engine( )->IsInGame( ) && g_settings.rage.resolver( ) ) { - static float last_simtime[ 65 ]{ }; - - if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - for( int i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - auto& data = m_data_render[ i ]; - - if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) && - !!std::abs( last_simtime[ i ] - ent->m_flSimulationTime( ) ) ) { - render_record_t new_record; - new_record.m_simtime = ent->m_flSimulationTime( ) + util::get_lerptime( ); - new_record.m_origin = ent->m_vecOrigin( ); - if( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { - data.push_front( new_record ); - } - - last_simtime[ i ] = ent->m_flSimulationTime( ); - } - - while( !data.empty( ) && - data.size( ) > TIME_TO_TICKS( 1.f ) ) { - data.pop_back( ); - } - } - } - } - } - - c_ragebot::render_record_t* c_ragebot::c_lagcomp::get_render_record( int ent_index ) { - auto& data = m_data_render[ ent_index ]; - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - - for( auto& it : util::reverse_iterator( data ) ) { - if( util::is_tick_valid( TIME_TO_TICKS( it.m_simtime ) ) ) { - return it.m_origin.dist_to( ent->m_vecOrigin( ) ) > 5.f ? &it : nullptr; - } - } - - return nullptr; - } - - void c_ragebot::c_lagcomp::fsn_net_update_start( ) { - static bool restored{ }; - - if( !g_settings.rage.enabled( ) ) { - if( !restored ) { - restore_animations( ); - restored = true; - } - - return; - } - - restored = false; - if( g_csgo.m_engine( )->IsInGame( ) ) { - if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - static float last_simtime[ 65 ]{ }; - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { - ent->disable_interpolaton( ); - if( ent != g_ctx.m_local ) { - ent->m_bClientSideAnimation( ) = false; - } - - float simtime = ent->m_flSimulationTime( ); - - last_simtime[ i ] = simtime; - } - } - } - } - } - - void c_ragebot::c_lagcomp::fsn_render_start( ) { - if( !g_settings.rage.enabled( ) ) - return; - - if( !g_ctx.m_local ) - return; - - static float stored_lby[ 65 ]; - - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_player( ) ) { - //invalidate_animstate( i ); - continue; - } - - if( ent == g_ctx.m_local && ent->is_alive( ) ) { - ent->m_bClientSideAnimation( ) = true; - //fuck ya - - auto breaker_animstate = g_cheat.m_ragebot.m_antiaim->get_animstate( ); - if( breaker_animstate && g_settings.rage.anti_aim( ) ) { - if( breaker_animstate->pBaseEntity == ent ) { - memcpy( g_ctx.m_local->get_animstate( ), - breaker_animstate, - sizeof( CCSGOPlayerAnimState ) ); - ent->get_animstate( )->m_flLastClientSideAnimationUpdateTime = FLT_MAX; - ent->get_animstate( )->m_iLastClientSideAnimationUpdateFramecount = INT_MAX; - } - } - - continue; - } - - //return; - - if( !ent->is_alive( ) ) { - ent->m_bClientSideAnimation( ) = true; - //invalidate_animstate( i ); - continue; - } - - if( ent->ce( )->IsDormant( ) ) { - ent->invalidate_bone_cache( ); - continue; - } - - if( ent->m_bGunGameImmunity( ) ) { - ent->fix_animations( ); - ent->enforce_animations( ); - continue; - } - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) - && !g_settings.rage.friendlies ) { - ent->fix_animations( ); - ent->enforce_animations( ); - continue; - } - - if( m_data_lby[ i ].size( ) && - m_data_lby[ i ].front( ).m_ent != ent ) { - m_data_lby[ i ].clear( ); - } - - if( m_data_normal[ i ].size( ) && - m_data_normal[ i ].front( ).m_ent != ent ) { - m_data_normal[ i ].clear( ); - } - - auto update_anims = [ this, &ent ]( int e ) { - ent->fix_animations( ); - }; - - bool is_moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) - && ( ent->m_fFlags( ) & FL_ONGROUND ); - - float lby = ent->m_flLowerBodyYawTarget( ); - - float last_simtime = m_last_simtime[ i ]; - float simtime = ent->m_flSimulationTime( ); - - if( !!std::abs( simtime - last_simtime ) ) { - if( is_moving && g_settings.rage.resolver ) { - ent->m_angEyeAngles( ).y = lby; - //ent->ce( )->GetRenderAngles( ).y = lby; - - //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); - //abs_ang.y = lby; - //ent->set_abs_angles( abs_ang ); - - update_anims( i ); - lag_record_t new_record( ent ); - //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y - // = new_record.m_vecRenderAngles.y = lby; - - m_data_lby[ i ].push_front( new_record ); - } - - else if( ( lby != stored_lby[ i ] ) && g_settings.rage.resolver ) { - stored_lby[ i ] = lby; - ent->m_angEyeAngles( ).y = lby; - //ent->ce( )->GetRenderAngles( ).y = lby; - - //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); - //abs_ang.y = lby; - //ent->set_abs_angles( abs_ang ); - - update_anims( i ); - lag_record_t new_record( ent ); - //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y - // = new_record.m_vecRenderAngles.y = lby; - - m_data_lby[ i ].push_front( new_record ); - } - - else if( g_settings.rage.resolver ) { - static C_AnimationLayer last_layer[ 65 ]{ }; - auto layer = m_anim_backup[ i ][ 3 ]; - auto ent_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; - if( g_cheat.m_ragebot.m_resolver->get_breaking_state( i ) == BREAKING_ADJUST && - layer.m_flCycle == 0.f && layer.m_flWeight == 0.f && ent_layer && - last_layer[ i ].m_flCycle > layer.m_flCycle ) { - ent->m_angEyeAngles( ).y = lby; - //ent->ce( )->GetRenderAngles( ).y = lby; - - //vec3_t abs_ang = ent->get< vec3_t >( 0xc4 ); - //abs_ang.y = lby; - //ent->set_abs_angles( abs_ang ); - - update_anims( i ); - - auto anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - - int flick_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); - lag_record_t new_record( ent ); - //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y - // = new_record.m_vecRenderAngles.y = lby; - new_record.m_flSimulationTime = anim_time; - new_record.m_tickcount = flick_tick; - - new_record.m_balanceadjust = true; - m_data_lby[ i ].push_front( new_record ); - } - else { - update_anims( i ); - m_data_normal[ i ].push_front( lag_record_t( ent ) ); - } - - last_layer[ i ] = layer; - } - else { - update_anims( i ); - m_data_normal[ i ].push_front( lag_record_t( ent ) ); - } - } - - m_last_simtime[ i ] = simtime; - ent->enforce_animations( ); - - while( !m_data_lby[ i ].empty( ) && - m_data_lby[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { - m_data_lby[ i ].pop_back( ); - } - - while( !m_data_normal[ i ].empty( ) && - m_data_normal[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { - m_data_normal[ i ].pop_back( ); - } - } - } - - void c_ragebot::c_lagcomp::fsn_postdataupdate_start( ) { - if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) - return; - - static float stored_lby[ 65 ]; - - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_player( ) ) { - //invalidate_animstate( i ); - continue; - } - - if( ent == g_ctx.m_local ) { - continue; - } - - if( !ent->is_alive( ) ) { - continue; - } - - if( ent->ce( )->IsDormant( ) ) { - continue; - } - - memcpy( m_anim_backup.at( i ), - ent->m_AnimOverlay( ).GetElements( ), - sizeof( C_AnimationLayer ) * 13 ); - - if( ent->m_bGunGameImmunity( ) ) { - continue; - } - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) - && !g_settings.rage.friendlies ) - continue; - - bool is_moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) - && ( ent->m_fFlags( ) & FL_ONGROUND ); - - float lby = ent->m_flLowerBodyYawTarget( ); - - float last_simtime = m_last_simtime[ i ]; - float simtime = ent->m_flSimulationTime( ); - - if( !!std::abs( simtime - last_simtime ) ) { - memcpy( m_anim_backup.at( i ), - ent->m_AnimOverlay( ).GetElements( ), - sizeof( C_AnimationLayer ) * 13 ); - - if( is_moving && g_settings.rage.resolver ) { - ent->m_angEyeAngles( ).y = lby; - //ent->ce( )->GetRenderAngles( ).y = lby; - - m_last_simtime[ i ] = simtime; - ent->fix_animations( ); - - lag_record_t new_record( ent ); - //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y - // = new_record.m_vecRenderAngles.y = lby; - - m_data_lby[ i ].push_front( new_record ); - } - - else if( ( lby != stored_lby[ i ] ) && g_settings.rage.resolver ) { - stored_lby[ i ] = lby; - ent->m_angEyeAngles( ).y = lby; - //ent->ce( )->GetRenderAngles( ).y = lby; - - m_last_simtime[ i ] = simtime; - ent->fix_animations( ); - - auto anim_time = ent->m_flSimulationTime( ) + TICK_INTERVAL( ); - auto anim_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); - - lag_record_t new_record( ent ); - new_record.m_tickcount = anim_tick; - //new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y - // = new_record.m_vecRenderAngles.y = lby; - - m_data_lby[ i ].push_front( new_record ); - } - - else if( g_settings.rage.resolver ) { - static C_AnimationLayer last_layer[ 65 ]{ }; - auto layer = m_anim_backup[ i ][ 3 ]; - auto ent_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; - if( g_cheat.m_ragebot.m_resolver->get_breaking_state( i ) == BREAKING_ADJUST && - layer.m_flCycle == 0.f && layer.m_flWeight == 0.f && ent_layer && - last_layer[ i ].m_flCycle > layer.m_flCycle ) { - ent->m_angEyeAngles( ).y = lby; - //ent->ce( )->GetRenderAngles( ).y = lby; - - ent->fix_animations( ); - m_last_simtime[ i ] = simtime; - float anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - - int flick_tick = TIME_TO_TICKS( anim_time + util::get_lerptime( ) ); - lag_record_t new_record( ent ); - new_record.m_vecAngles.y = new_record.m_vecAbsAngles.y - = new_record.m_vecRenderAngles.y = lby; - new_record.m_flSimulationTime = anim_time; - new_record.m_tickcount = flick_tick; - - new_record.m_balanceadjust = true; - m_data_lby[ i ].push_front( new_record ); - } - - last_layer[ i ] = layer; - } - } - - ent->enforce_animations( ); - } - } - - RecordType_t c_ragebot::c_lagcomp::can_backtrack_entity( int ent_index ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - if( ent->is_breaking_lc( ) ) { - return RECORD_NONE; - } - - auto data_lby = &m_data_lby[ ent_index ]; - auto data_normal = &m_data_normal[ ent_index ]; - - if( !data_lby->empty( ) ) { - for( auto& it : *data_lby ) { - if( it.is_valid( ) ) return RECORD_LBY; - } - } - - if( !data_normal->empty( ) ) { - for( auto& it : *data_normal ) { - if( it.is_valid( ) ) return RECORD_NORMAL; - } - } - - return RECORD_NONE; - } - - int c_ragebot::c_lagcomp::backtrack_entity( int ent_index, RecordType_t type, lag_record_t** out_record ) { - if( type == RECORD_NONE ) return -1; - - auto& data = *get_records( ent_index, type ); - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - - auto check_record = [ &ent, &out_record ]( lag_record_t* record, bool check_pelvis ) { - if( record->m_balanceadjust && record->m_shot ) return -1; - - vec3_t head_pos = record->m_vecHeadPos; - vec3_t pelvis_pos = record->m_vecPelvisPos; - - float damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, head_pos, false ) * 4.f; - float min_damage = std::min< float >( ent->m_iHealth( ), - g_settings.rage.active->m_damage ); - - //g_con->log( xors( "record: %d damage: %f" ), counter++, damage ); - - if( damage > min_damage ) { - if( !record->restore( ) ) - return -1; - - if( out_record ) { - *out_record = record; - } - return record->m_tickcount; - } - - if( check_pelvis ) { - float pelvis_damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, pelvis_pos, false ); - if( pelvis_damage > min_damage ) { - if( !record->restore( ) ) - return -1; - - if( out_record ) { - *out_record = record; - } - return record->m_tickcount; - } - } - - return -1; - }; - - if( data.empty( ) ) - return -1; - - auto* back = &data.back( ); - auto* front = &data.front( ); - - for( auto& it : data ) { - if( !it.is_valid( ) ) continue; - front = ⁢ - break; - } - - for( auto& it : util::reverse_iterator( data ) ) { - if( !it.is_valid( ) ) continue; - back = ⁢ - break; - } - - int front_result = check_record( front, false ); - if( front_result != -1 ) return front_result; - - int back_result = check_record( back, true ); - if( back_result != -1 ) return back_result; - - if( g_settings.rage.bt_scan_all && !( g_settings.rage.preserve_fps && util::is_low_fps( ) ) ) { - for( auto& it : data ) { - if( &it == front ) continue; - if( &it == back ) break; - if( !it.is_valid( ) ) continue; - - auto result = check_record( &it, false ); - if( result != -1 ) return result; - } - } - - return -1; - } -} \ No newline at end of file diff --git a/gmod/ragebot_resolver.cpp b/gmod/ragebot_resolver.cpp deleted file mode 100644 index 0de8f13..0000000 --- a/gmod/ragebot_resolver.cpp +++ /dev/null @@ -1,471 +0,0 @@ -#include "ragebot.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "math.hpp" -#include "input_system.hpp" - -namespace features -{ - constexpr float FLT_ANG_LBY = 360.f; - constexpr float FLT_ANG_MOVING_LBY = -360.f; - constexpr float FLT_ANG_180 = 720.f; - constexpr float FLT_ANG_90 = -720.f; - constexpr float FLT_ANG_MINUS_90 = -480.f; - - static const std::vector< float > possible_angles_none = { - FLT_ANG_LBY, - FLT_ANG_MOVING_LBY, - FLT_ANG_180, - FLT_ANG_90, - FLT_ANG_MINUS_90, - 180.f - }; - - static const std::vector< float > possible_angles_adjust = { - FLT_ANG_MOVING_LBY, - 180.f, - FLT_ANG_180, - FLT_ANG_90, - FLT_ANG_MINUS_90, - -130.f, - 130.f, - }; - - static const std::vector< float > possible_angles_noadjust = { - FLT_ANG_MOVING_LBY, - 110.f, - FLT_ANG_180, - FLT_ANG_90, - FLT_ANG_MINUS_90, - 90.f, - -90.f - }; - - bool dbg_resolver( ) { - static con_var< bool > var{ &data::holder_, fnv( "dbg_resolver" ), false }; - return var( ); - } - - c_ragebot::c_resolver::resolve_log_t::resolve_log_t( ) { - auto register_vec = [ ]( c_ragebot::c_resolver::angle_vec_t* vec, const std::vector< float >& vec1 ) { - vec->clear( ); - - for( auto& it : vec1 ) { - vec->push_back( it ); - } - }; - - register_vec( &m_logged_angles[ 0 ], possible_angles_none ); - register_vec( &m_logged_angles[ 1 ], possible_angles_adjust ); - register_vec( &m_logged_angles[ 2 ], possible_angles_noadjust ); - } - - void c_ragebot::c_resolver::resolve_log_t::update( int ent_index ) { - static C_AnimationLayer last_layer[ 65 ]{ }; - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - - if( !ent || ent == g_ctx.m_local || !ent->is_player( ) || !ent->is_alive( ) || ent->ce( )->IsDormant( ) ) { - m_was_invalid = true; - return; - } - - if( !( ent->m_fFlags( ) & FL_ONGROUND ) ) { - m_breaking = BREAKING_NONE; - return; - } - - //they moved since the last time they were dormant - reset the data - if( m_was_invalid && m_last_pos.dist_to( ent->m_vecOrigin( ) ) > 4.f ) { - m_last_pos = ent->m_vecOrigin( ); - reset( ); - } - - m_was_invalid = false; - m_shots %= 100; - float lby = ent->m_flLowerBodyYawTarget( ); - if( lby != m_last_lby ) { - m_last_lby = lby; - m_last_update = ent->m_flSimulationTime( ); - m_breaking = BREAKING_NONE; - } - - //filter out the first lby update - if( ent->m_flSimulationTime( ) - m_last_update > 0.1f ) { - C_AnimationLayer* adjust_layer = &ent->m_AnimOverlay( ).GetElements( )[ 3 ]; - C_AnimationLayer* prev_layer = &last_layer[ ent_index ]; - - auto cur_seq = ent->get_seq_activity( adjust_layer->m_nSequence ); - auto old_seq = ent->get_seq_activity( prev_layer->m_nSequence ); - - if( old_seq == 979 && cur_seq == 979 && ( adjust_layer->m_flCycle != prev_layer->m_flCycle - || adjust_layer->m_flWeight == 1.f ) ) { - m_breaking = BREAKING_ADJUST; - m_last_adjust = ent->m_flSimulationTime( ); - } - else if( ent->m_flSimulationTime( ) - m_last_adjust > TICKS_TO_TIME( 14 ) ) { - m_breaking = BREAKING_NOADJUST; - } - - *prev_layer = *adjust_layer; - } - else { - m_breaking = BREAKING_NONE; - } - } - - void c_ragebot::c_resolver::resolve_log_t::reset( ) { - //assuming theyre STILL not moving this shouldnt change - //however if they are, it will be reset to none anyway - m_breaking = BREAKING_NONE; - m_last_adjust = 0.f; - m_last_update = 0.f; - m_last_lby = 0.f; - m_missed_shots = 0; - } - - void c_ragebot::c_resolver::resolve_log_t::reset_angles( ) { - std::vector< float > ang_vec; - auto& cur_vec = m_logged_angles[ m_breaking ]; - - switch( m_breaking ) { - case BREAKING_NONE: - ang_vec = possible_angles_none; - break; - case BREAKING_NOADJUST: - ang_vec = possible_angles_noadjust; - break; - case BREAKING_ADJUST: - ang_vec = possible_angles_adjust; - break; - } - - cur_vec.clear( ); - for( auto& it : ang_vec ) cur_vec.emplace_back( it ); - } - - void c_ragebot::c_resolver::resolve_log_t::blacklist_shot( int shots ) { - auto& angles = m_logged_angles[ m_breaking ]; - - if( angles.empty( ) ) { - reset_angles( ); - } - - shots %= angles.size( ); - - if( dbg_resolver( ) ) - g_con->log( "blacklisting angle: %f", angles.at( shots ).ang ); - - angles.at( shots ).missed = true; - } - - float c_ragebot::c_resolver::get_shot_yaw( int shots, int ent_index ) { - auto& data = m_data[ ent_index ]; - auto ang_vec = &data.m_logged_angles[ data.m_breaking ]; - - std::vector< float > angles; - - for( size_t i{ }; i < ang_vec->size( ); ++i ) { - if( !ang_vec->at( i ).missed ) { - angles.push_back( ang_vec->at( i ).ang ); - } - } - - if( angles.empty( ) ) { - data.reset_angles( ); - return ang_vec->at( 0 ).ang; - } - - if( angles.size( ) <= 1 ) { - return angles.at( 0 ); - } - - return angles[ shots % angles.size( ) ]; - } - - void c_ragebot::c_resolver::aimbot( int ent_index, int hitbox, vec3_t angle, vec3_t position ) { - if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) - return; - - auto& data = m_data[ ent_index ]; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - bool moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && ( ent->m_fFlags( ) & FL_ONGROUND ); - - if( moving && !ent->is_fakewalking( ) ) { - return; - } - - auto model = ent->ce( )->GetModel( ); - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); - - if( hitbox == HITBOX_HEAD ) { - auto box = set->pHitbox( 0 ); - if( box ) { - auto dist = box->bbmin.dist_to( box->bbmax ); - - context::shot_data_t new_shot{ }; - new_shot.m_angle = angle; - new_shot.m_enemy_pos = position; - new_shot.m_enemy_index = ent_index; - new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); - new_shot.m_resolver_shots = data.m_shots; - new_shot.m_resolver_state = true; - new_shot.m_hitbox_radius = dist; - new_shot.m_missed = true; - new_shot.m_hitgroup = HITGROUP_HEAD; - - g_ctx.m_last_shot++; - g_ctx.m_last_shot %= 128; - g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; - - g_ctx.m_has_incremented_shots = true; - data.m_snapshot[ g_ctx.m_last_shot ] = data; - - increment_shots( ent_index ); - data.blacklist_shot( data.m_shots ); - } - } - else { - matrix3x4 bone_matrix[ 128 ]; - if( model && hdr && set && ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) { - auto box = set->pHitbox( hitbox ); - if( !box ) return; - - auto origin = ent->m_vecOrigin( ); - - vec3_t shot_pos = position; - vec3_t rotated_center; - - vec3_t offset = position - origin; - float radius = offset.length2d( ); - float cos_ = offset.x / radius; - - float deg = RAD2DEG( acos( cos_ ) ); - if( offset.y < 0 ) deg = -deg; - - float rot = ( deg - 180.f ) * ( M_PI / 180.f ); - rotated_center.x = origin.x + cos( rot ) * radius; - rotated_center.y = origin.y + sin( rot ) * radius; - rotated_center.z = position.z; - - Ray_t ray; - CTraceFilterOneEntity filter; - CGameTrace tr_center; - CGameTrace tr_rot; - - filter.ent = ent; - - ray.Init( g_ctx.m_local->get_eye_pos( ), position ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_center ); - - ray.Init( g_ctx.m_local->get_eye_pos( ), rotated_center ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_rot ); - - bool is_within = tr_center.hitbox == tr_rot.hitbox; - - if( !is_within ) { - auto dist = box->bbmin.dist_to( box->bbmax ); - - context::shot_data_t new_shot{ }; - new_shot.m_angle = angle; - new_shot.m_enemy_pos = position; - new_shot.m_enemy_index = ent_index; - new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); - new_shot.m_resolver_shots = data.m_shots; - new_shot.m_resolver_state = true; - new_shot.m_hitbox_radius = dist; - new_shot.m_missed = true; - new_shot.m_hitgroup = util::hitbox_to_hitgroup( hitbox ); - - g_ctx.m_last_shot++; - g_ctx.m_last_shot %= 128; - g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; - - g_ctx.m_has_incremented_shots = true; - data.m_snapshot[ g_ctx.m_last_shot ] = data; - - increment_shots( ent_index ); - data.blacklist_shot( data.m_shots ); - } - } - } - //printf( "resolver: logging aimbot shot %d missed: %d state: %d time: %f\n", - // data.m_shots, data.m_missed_shots[ data.m_breaking ], data.m_breaking, g_Interfaces.Globals->curtime ); - } - - void c_ragebot::c_resolver::on_missed_spread( int ent_index, int shots ) { - if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) - return; - - auto& data = m_data[ ent_index ]; - auto& snapshot = data.m_snapshot[ shots ]; - - auto& shot_vec = data.m_logged_angles[ snapshot.m_breaking ]; - - if( shot_vec.empty( ) ) { - data.reset_angles( ); - } - - if( shot_vec.size( ) <= 1 ) { - shot_vec.at( 0 ).missed = false; - } - else - shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).missed = false; - - - if( dbg_resolver( ) ) - g_con->log( "shot missed due to spread: %f", shot_vec.size( ) <= 1 ? shot_vec.at( 0 ).ang : shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).ang ); - - } - - void c_ragebot::c_resolver::listener( int ent_index, int shots ) { - if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) - return; - - auto& data = m_data[ ent_index ]; - auto& snapshot = data.m_snapshot[ shots ]; - - auto& shot_vec = data.m_logged_angles[ snapshot.m_breaking ]; - - if( shot_vec.empty( ) ) { - data.reset_angles( ); - } - - if( shot_vec.size( ) <= 1 ) { - shot_vec.at( 0 ).missed = false; - } - else - shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).missed = false; - - data.m_shots = snapshot.m_shots; - - if( dbg_resolver( ) ) - g_con->log( "hit angle: %f", shot_vec.size( ) <= 1 ? shot_vec.at( 0 ).ang : shot_vec.at( snapshot.m_shots % shot_vec.size( ) ).ang ); - - } - - void c_ragebot::c_resolver::frame_stage_notify( ) { - if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) - return; - - for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || ent == g_ctx.m_local || ent->ce( )->IsDormant( ) - || !ent->is_alive( ) || !g_cheat.m_player_mgr.is_cheater( i ) ) { - m_data[ i ].m_was_invalid = true; - continue; - } - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) - continue; - - m_data[ i ].update( i ); - if( g_settings.rage.resolver_override( ) ) { - if( g_input.is_key_pressed( g_settings.rage.resolver_override_key( ) ) ) { - int dir = manual_override( ent ); - if( dir ) { - //to be finished - m_data[ i ].m_overriding = dir; - continue; - } - } - } - - m_data[ i ].m_overriding = 0; - brute_force( ent ); - } - } - - void c_ragebot::c_resolver::force_yaw( c_base_player* ent, float yaw ) { - //could be used to just store resolved yaw on entities - //so then this data can be used in CM - ent->m_angEyeAngles( ).y = yaw;// + 180.f; - - //ent->ce( )->GetRenderAngles( ).y = yaw; - //auto new_ang = ent->get< vec3_t >( 0xc4 ); - //new_ang.y = yaw; - - //ent->set_abs_angles( new_ang ); - } - - int c_ragebot::c_resolver::manual_override( c_base_player* ent ) { - if( ent->m_vecVelocity( ).length2d( ) > 35.f ) { //no point in overriding moving targets, it will also fuck up backtrack records otherwise - return OVERRIDE_NONE; - } - - vec3_t pos; - vec3_t angle; - vec3_t local_angle; - vec3_t local_pos; - float delta; - float dist; - - - local_pos = g_ctx.m_local->m_vecOrigin( ); - g_csgo.m_engine( )->GetViewAngles( local_angle ); - pos = ent->get_hitbox_pos( 0 ); - - angle = math::vector_angles( local_pos, pos ); - dist = pos.dist_to( local_pos ); - delta = ( angle - local_angle ).clamp( ).y; - float yaw_delta = sin( DEG2RAD( ( angle - local_angle ).clamp( ).y ) ) * dist; - - if( std::abs( yaw_delta ) < 25.f ) { - force_yaw( ent, angle.y ); - return OVERRIDE_CENTER; - } - else { - force_yaw( ent, angle.y + ( ( delta < 0.f ) ? 90.f : -90.f ) ); - return delta > 0.f ? OVERRIDE_LEFT : OVERRIDE_RIGHT; - } - } - - void c_ragebot::c_resolver::force_lby( c_base_player* ent ) { - force_yaw( ent, ent->m_flLowerBodyYawTarget( ) ); - } - - void c_ragebot::c_resolver::brute_force( c_base_player* ent ) { - if( ent->m_vecVelocity( ).length( ) > 0.1f && !ent->is_fakewalking( ) ) { - m_data[ ent->ce( )->GetIndex( ) ].m_last_moving_lby = ent->m_flLowerBodyYawTarget( ); - force_lby( ent ); - return; - } - - int i = ent->ce( )->GetIndex( ); - auto& data = m_data[ i ]; - float start = ent->m_flLowerBodyYawTarget( ); - float new_yaw{ }; - float new_ang{ }; - int shots{ }; - - shots = data.m_shots; - new_ang = get_shot_yaw( shots, i ); - float ang; - if( g_ctx.run_frame( ) ) { - auto local_pos = g_ctx.m_local->m_vecOrigin( ); - auto enemy_pos = ent->m_vecOrigin( ); - - ang = math::vector_angles( enemy_pos, local_pos ); - } - else { - ang = start; - } - - if( new_ang == FLT_ANG_LBY ) - new_yaw = ent->m_flLowerBodyYawTarget( ); - else if( new_ang == FLT_ANG_MOVING_LBY ) - new_yaw = data.m_last_moving_lby; - else if( new_ang == FLT_ANG_180 ) - new_yaw = ang - 180.f; - else if( new_ang == FLT_ANG_90 ) - new_yaw = ang + 90.f; - else if( new_ang == FLT_ANG_MINUS_90 ) - new_yaw = ang - 90.f; - else - new_yaw = std::remainderf( start + new_ang, 360.f ); - - force_yaw( ent, new_yaw ); - } -} \ No newline at end of file diff --git a/gmod/render_view.cpp b/gmod/render_view.cpp deleted file mode 100644 index c68a244..0000000 --- a/gmod/render_view.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" - -void __fastcall hooks::render_view( void* ecx, void* edx, CViewSetup& view, int clear_flags, int what_to_draw ) { - static auto render_view_o = g_gmod.m_view_render->get_old_function< decltype( &hooks::render_view ) >( 6 ); - if( g_gmod.m_panic ) return render_view_o( ecx, edx, view, clear_flags, what_to_draw ); - - render_view_o( ecx, edx, view, clear_flags, what_to_draw ); - g_cheat.m_visuals.store_data( ); -} \ No newline at end of file diff --git a/gmod/renderer.cpp b/gmod/renderer.cpp deleted file mode 100644 index 82b6432..0000000 --- a/gmod/renderer.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "renderer.hpp" -#include "interface.hpp" - -#undef CreateFont - -/* -drawings::c_fonts g_fonts; -drawings::c_drawings g_renderer; - -NAMESPACE_REGION( drawings ) - -c_fonts::font_t::font_t( std::string name, int size, - int weight, ulong_t flags ) : - m_name( name ), m_size( size ), - m_weight( weight ), m_flags( flags ) { - g_fonts.m_container.push_back( this ); -}; - -void c_fonts::font_t::initialize( ) { - m_font = g_gmod.m_surface( )->CreateFont( ); - g_gmod.m_surface( )->SetFontGlyphSet( - m_font, m_name.c_str( ), m_size, - m_weight, 0, 0, - m_flags - ); -} - -void c_fonts::initialize( ) { - for( auto& it : m_container ) { - it->initialize( ); - } -} - -void c_drawings::draw_string( const wchar_t* text, HFont font, int x, int y, const clr_t& color ) { - g_gmod.m_surface( )->DrawSetTextPos( x, y ); - g_gmod.m_surface( )->DrawSetTextFont( font ); - g_gmod.m_surface( )->DrawSetTextColor( color ); - g_gmod.m_surface( )->DrawPrintText( text, wcslen( text ) ); -} - -void c_drawings::draw_rect( int x, int y, int w, int h, const clr_t& color ) { - g_gmod.m_surface( )->DrawSetColor( color ); - g_gmod.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); -} - -void c_drawings::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { - g_gmod.m_surface( )->DrawSetColor( clr ); - g_gmod.m_surface( )->DrawLine( x, y, x1, y1 ); -} - -void c_drawings::draw_box( int x, int y, int w, int h, const clr_t& clr ) { - draw_line( x, y, x + w, y, clr ); - draw_line( x + w, y, x + w, y + h, clr ); - draw_line( x, y + h, x + w + 1, y + h, clr ); - draw_line( x, y, x, y + h, clr ); -} - -void c_drawings::draw_circle( int x, int y, int r, const clr_t& col, int res ) { - g_gmod.m_surface( )->DrawSetColor( col ); - g_gmod.m_surface( )->DrawOutlinedCircle( x, y, r, res ); -} - -void c_drawings::draw_filled_circle( int x, int y, int r, const clr_t& col, int res ) { - vertex_t* v = ( vertex_t* )( _alloca( res * sizeof( vertex_t ) ) ); - const float step = M_PI * 2.0f / res; - - for( size_t i{ }; i < res; ++i ) { - float theta = i * step; - float x_off = r * cos( theta ); - float y_off = r * sin( theta ); - v[ i ].init( x + x_off, y + y_off ); - } - - draw_polygon( res, v, col ); -} - -void c_drawings::draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& clr ) { - draw_line( ( int )begin.x, ( int )begin.y, ( int )end.x, ( int )end.y, clr ); -} - -void c_drawings::draw_polygon( int count, vertex_t* vertices, const clr_t& col ) { - static int texture = g_gmod.m_surface( )->CreateNewTextureID( true ); - - clr_t buf( 255, 255, 255 ); - - g_gmod.m_surface( )->DrawSetTextureRGBA( texture, ( byte* )( &buf ), 1, 1 ); - g_gmod.m_surface( )->DrawSetColor( col ); - g_gmod.m_surface( )->DrawSetTexture( texture ); - - g_gmod.m_surface( )->DrawTexturedPolygon( count, vertices ); -} - -END_REGION -*/ \ No newline at end of file diff --git a/gmod/renderer.hpp b/gmod/renderer.hpp deleted file mode 100644 index 1ae0c00..0000000 --- a/gmod/renderer.hpp +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once -#include -#include -#include - -#include "util.hpp" -#include "sdk.hpp" - -enum e_font_style : size_t { - -}; - -enum FontAlign_t : size_t { - ALIGN_CENTER, - ALIGN_LEFT, - ALIGN_RIGHT -}; - -NAMESPACE_REGION( drawings ) - - -class c_fonts { -protected: - struct font_t { - friend class c_fonts; - font_t( std::string name, int size, - int weight, ulong_t flags ); - - operator HFont( ) { - return m_font; - } - - private: - void initialize( ); - - HFont m_font; - std::string m_name; - int m_size; - int m_weight; - ulong_t m_flags; - }; - - std::vector< font_t* > m_container; - friend struct c_fonts::font_t; -public: - void initialize( ); - - font_t f_esp_small{ xors( "Tahoma" ), 11, 500, FONTFLAG_OUTLINE }; - font_t f_bold{ xors( "Verdana" ), 18, 900, FONTFLAG_DROPSHADOW | FONTFLAG_ANTIALIAS }; - font_t f_12{ xors( "Verdana" ), 12, 700, 128 }; - font_t f_14{ xors( "Verdana" ), 14, 700, 128 }; - font_t f_16{ xors( "Verdana" ), 16, 700, 128 }; - font_t f_18{ xors( "Verdana" ), 18, 700, 128 }; -}; - - - -//im going to fill ur triangles -class c_drawings { -private: - //dumb hacky fix for template functions - void draw_string( const wchar_t* msg, HFont font, int x, int y, const clr_t& color ); - -public: - void draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& color ); - void draw_line( int x, int y, int x1, int y2, const clr_t& color ); - void draw_rect( int x, int y, int w, int h, const clr_t& color ); - void draw_box( int x, int y, int w, int h, const clr_t& color ); //thicc - void draw_polygon( int count, vertex_t* vertices, const clr_t& col ); - void draw_circle( int x, int y, int r, const clr_t& col, int res = 48 ); - void draw_filled_circle( int x, int y, int r, const clr_t& col, int res = 48 ); - - template < FontAlign_t align = ALIGN_LEFT > //fuck ur sprintf nigga varargs nigga - void draw_string( HFont font, int x, int y, const clr_t& color, const wchar_t* msg, ... ) { - wchar_t* buffer = ( wchar_t* )_alloca( 2048 ); - va_list list{ }; - int wide, tall; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vswprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - g_gmod.m_surface( )->GetTextSize( - font, buffer, wide, tall ); - - switch( align ) { - case ALIGN_CENTER: - x -= wide / 2; - break; - case ALIGN_RIGHT: - x -= wide; - break; - default: break; - } - - draw_string( buffer, font, x, y, color ); - } - - template < FontAlign_t align = ALIGN_LEFT > //debatable whether it should be center or not - void draw_string( HFont font, int x, int y, const clr_t& color, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - auto wide_str = util::ascii_to_unicode( buffer ); - draw_string< align >( font, x, y, color, wide_str.c_str( ) ); - } -}; - -END_REGION - -extern drawings::c_fonts g_fonts; -extern drawings::c_drawings g_renderer; \ No newline at end of file diff --git a/gmod/run_command.cpp b/gmod/run_command.cpp deleted file mode 100644 index fad382d..0000000 --- a/gmod/run_command.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::run_command( void* ecx_, void* edx_, IClientEntity* entity, user_cmd_t* ucmd, IMoveHelper* move_helper) { - static auto run_command_o = g_gmod.m_prediction->get_old_function< decltype( &hooks::run_command ) >( 17 ); - if( g_gmod.m_panic ) return run_command_o( ecx_, edx_, entity, ucmd, move_helper ); - - if( g_settings.misc.no_recoil ) { - vec3_t angle; - g_gmod.m_engine( )->GetViewAngles( angle ); - run_command_o( ecx_, edx_, entity, ucmd, move_helper ); // weapon events are done during prediction, any viewangle change( could be recoil could be not ) during these weapon events will be changed back to its original state. - g_gmod.m_engine( )->SetViewAngles( angle ); - } - else { - run_command_o( ecx_, 0, entity, ucmd, move_helper ); - } -} diff --git a/gmod/scene_end.cpp b/gmod/scene_end.cpp deleted file mode 100644 index 1e42543..0000000 --- a/gmod/scene_end.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "hooks.hpp" -#include "settings.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::scene_end( void* ecx_, void* edx_ ) { - static auto scene_end_o = g_csgo.m_render_view->get_old_function< decltype( &hooks::scene_end ) >( 9 ); - scene_end_o( edx_, 0 ); - - if( !g_csgo.m_panic && g_ctx.m_local && g_settings.visuals.chams.enabled( ) && g_settings.visuals.chams.ignore_z( ) ) { - g_ctx.m_drawing_screneend = true; - for( int i = 1; i < g_csgo.m_globals->m_maxclients; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) ) { - if( ent == g_ctx.m_local && ent->m_bIsScoped( ) ) { - continue; - } - - int team = ent->m_iTeamNum( ); - bool enemy = team != g_ctx.m_local->m_iTeamNum( ); - - if( enemy || g_settings.visuals.chams.friendlies( ) ) { - IMaterial* mat = g_settings.visuals.chams.flat ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; - fclr_t clr_vis = enemy ? g_settings.visuals.chams.color_visible_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_visible_friendly( ).to_fclr( ); - fclr_t clr_hid = enemy ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); - g_cheat.m_chams.m_materials.force_material( mat, clr_hid ); - ent->ce( )->DrawModel( 0x1, 255 ); - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - g_cheat.m_chams.m_materials.force_material( mat, clr_vis ); - ent->ce( )->DrawModel( 0x1, 255 ); - - g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); - } - } - } - - g_ctx.m_drawing_screneend = false; - } -} \ No newline at end of file diff --git a/gmod/sdk.hpp b/gmod/sdk.hpp deleted file mode 100644 index fbed28a..0000000 --- a/gmod/sdk.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -#include "vector.hpp" - -#include "IClientMode.hpp" -#include "CHLClient.hpp" -#include "ISurface.hpp" -#include "IPanel.hpp" -#include "IVEngineClient.hpp" -#include "IClientEntityList.hpp" -#include "GlobalVars_t.hpp" -#include "IPrediction.hpp" -#include "ICvar.hpp" -#include "IVModelInfoClient.hpp" -#include "IMaterialSystem.hpp" -#include "IEngineTrace.hpp" -#include "IVRenderView.hpp" -#include "IPhysicsSurfaceProps.hpp" -#include "CUtlVector.hpp" -#include "IMemAlloc.hpp" -#include "IGameEventManager.hpp" -#include "KeyValues.hpp" -#include "CInput.hpp" -#include "bf_write.hpp" -#include "CLuaShared.hpp" - -#include "c_base_player.hpp" \ No newline at end of file diff --git a/gmod/send_datagram.cpp b/gmod/send_datagram.cpp deleted file mode 100644 index dc55887..0000000 --- a/gmod/send_datagram.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "base_cheat.hpp" -#include "hooks.hpp" - -int __fastcall hooks::send_datagram( INetChannel* channel, void* edx_, void* datagram ) { - auto send_datagram_o = g_csgo.m_net_channel->get_old_function< decltype( &hooks::send_datagram ) >( 48 ); - if( g_csgo.m_panic || !g_settings.misc.net_fakelag || datagram ) { - return send_datagram_o( channel, 0, datagram ); - } - - int backup_state = channel->m_nInReliableState; - int backup_sequence = channel->m_nInSequenceNr; - //int backup_o_state = channel->m_nOutReliableState; - - if( g_settings.misc.net_fakelag != 4 && g_settings.misc.net_fakeping_amount ) - g_cheat.m_extra.add_latency( channel ); - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci && g_settings.misc.net_fakelag == 4 && g_cheat.m_ragebot.can_fakeping( ) ) { - channel->m_nInReliableState = backup_state; - channel->m_nInSequenceNr = backup_sequence + 10; - } - - int ret = send_datagram_o( channel, 0, datagram ); - - channel->m_nInReliableState = backup_state; - channel->m_nInSequenceNr = backup_sequence; - - return ret; -} \ No newline at end of file diff --git a/gmod/settings.hpp b/gmod/settings.hpp deleted file mode 100644 index 0033391..0000000 --- a/gmod/settings.hpp +++ /dev/null @@ -1,276 +0,0 @@ -#pragma once -#include "simple_settings.hpp" -#include "strings.hpp" -#include "color.hpp" - -//later i will implement a way to load all config files - -namespace data -{ - extern SettingHolder holder_; - - class c_settings { - public: - void load( ) { - switch( menu.cur_setting ) { - case 0: - holder_.load( "", xors( "./garrysmod/cfg/money_legit.cfg" ) ); - break; - case 1: - holder_.load( "", xors( "./garrysmod/cfg/money_closet.cfg" ) ); - break; - case 2: - holder_.load( "", xors( "./garrysmod/cfg/money_rage1.cfg" ) ); - break; - case 3: - holder_.load( "", xors( "./garrysmod/cfg/money_rage2.cfg" ) ); - break; - } - } - - void save( ) { - switch( menu.cur_setting ) { - case 0: - holder_.save( "", xors( "./garrysmod/cfg/money_legit.cfg" ) ); - break; - case 1: - holder_.save( "", xors( "./garrysmod/cfg/money_closet.cfg" ) ); - break; - case 2: - holder_.save( "", xors( "./garrysmod/cfg/money_rage1.cfg" ) ); - break; - case 3: - holder_.save( "", xors( "./garrysmod/cfg/money_rage2.cfg" ) ); - break; - } - } - - struct { - con_var< bool > enabled{ &holder_, fnv( "rage_enabled" ), false }; - con_var< int > activation_type{ &holder_, fnv( "rage_activation_type" ), 0 }; - con_var< float > fov{ &holder_, fnv( "rage_fov" ), 0.f }; - con_var< int > hitbox{ &holder_, fnv( "rage_hitbox" ), false }; - con_var< bool > auto_fire{ &holder_, fnv( "rage_auto_fire" ), false }; - - struct { - con_var< bool > head{ &holder_, fnv( "rage_hitscan_head" ), true }; - con_var< bool > body{ &holder_, fnv( "rage_hitscan_body" ), true }; - con_var< bool > arms{ &holder_, fnv( "rage_hitscan_arms" ), false }; - con_var< bool > legs{ &holder_, fnv( "rage_hitscan_legs" ), false }; - } hitscan; - - con_var< bool > nospread{ &holder_, fnv( "rage_no_spread" ), false }; - con_var< bool > norecoil{ &holder_, fnv( "rage_no_recoil" ), false }; - con_var< bool > ignore_limbs_moving{ &holder_, fnv( "rage_ignore_limbs_moving" ), false }; - con_var< int > silent{ &holder_, fnv( "rage_silent" ), false }; - con_var< int > aimkey{ &holder_, fnv( "rage_key" ), 0 }; - con_var< bool > auto_scope{ &holder_, fnv( "rage_auto_scope" ), false }; - con_var< bool > auto_stop{ &holder_, fnv( "rage_auto_stop" ), false }; - con_var< bool > spread_limit{ &holder_, fnv( "rage_spread_limit" ), false }; - con_var< float > min_spread{ &holder_, fnv( "rage_min_spread" ), 100.f }; - con_var< bool > resolver{ &holder_, fnv( "rage_resolver" ), false }; - con_var< bool > resolver_override{ &holder_, fnv( "rage_resolver_override" ), false }; - con_var< int > resolver_override_key{ &holder_, fnv( "override_key" ), 0 }; - con_var< bool > bt_scan_all{ &holder_, fnv( "rage_scan_all_records" ), false }; - con_var< bool > bt_visualize{ &holder_, fnv( "rage_visualize_records" ), false }; - con_var< clr_t > bt_col{ &holder_, fnv( "rage_bt_color" ), clr_t( 150, 150, 150, 20 ) }; - con_var< bool > preserve_fps{ &holder_, fnv( "rage_preserve_fps" ), false }; - con_var< int > multipoint{ &holder_, fnv( "rage_multipoint" ), false }; - con_var< float > point_scale{ &holder_, fnv( "rage_point_scale" ), 1.0f }; - - con_var< int > selection_type{ &holder_, fnv( "rage_selection_type" ) }; - con_var< bool > prefer_moving{ &holder_, fnv( "rage_prefer_moving" ) }; - con_var< bool > prefer_low_hp{ &holder_, fnv( "rage_low_hp" ) }; - - con_var< bool > ignore_team{ &holder_, fnv( "rage_ignoreteam" ), false }; - con_var< bool > ignore_teamcolor{ &holder_, fnv( "rage_ignoreteamcolor" ), false }; - con_var< bool > ignore_spawnprot{ &holder_, fnv( "rage_ignorespawnprot" ), false }; - con_var< bool > ignore_noclip{ &holder_, fnv( "rage_ignorenoclip" ), false }; - - - - struct { - con_var< int > mode{ &holder_, fnv( "fakelag_mode" ), 0 }; - con_var< int > ticks{ &holder_, fnv( "fakelag_ticks" ), 0 }; - con_var< int > fluctuate{ &holder_, fnv( "fakelag_fluctuate" ), 0 }; - con_var< bool > in_air{ &holder_, fnv( "fakelag_in_air" ), false }; - con_var< bool > on_peek{ &holder_, fnv( "fakelag_on_peek" ), false }; - con_var< bool > in_move{ &holder_, fnv( "fakelag_in_move" ), false }; - con_var< bool > in_attack{ &holder_, fnv( "fakelag_in_attack" ), false }; - con_var< bool > avoid_ground{ &holder_, fnv( "fakelag_avoid_ground" ), false }; - } fakelag; - - con_var< bool > anti_aim{ &holder_, fnv( "rage_anti_aim" ), false }; - con_var< bool > dormant_check{ &holder_, fnv( "rage_dormant_check" ), false }; - con_var< bool > at_players{ &holder_, fnv( "rage_at_players" ), false }; - con_var< int > pitch{ &holder_, fnv( "rage_pitch" ), 0 }; - con_var< int > pitch_offset{ &holder_, fnv( "rage_pitch_offset" ), 0 }; - - con_var< int > real_yaw{ &holder_, fnv( "rage_real_yaw" ), 0 }; - con_var< int > real_yaw_add{ &holder_, fnv( "rage_real_yaw_add" ), 0 }; - con_var< int > real_yaw_jitter{ &holder_, fnv( "rage_real_jitter" ), 0 }; - - con_var< int > fake_yaw{ &holder_, fnv( "rage_fake_yaw" ), 0 }; - con_var< int > fake_yaw_add{ &holder_, fnv( "rage_fake_yaw_add" ), 0 }; - con_var< int > fake_yaw_jitter{ &holder_, fnv( "rage_fake_jitter" ), 0 }; - - con_var< int > real_yaw_moving{ &holder_, fnv( "rage_real_yaw_moving" ), 0 }; - con_var< int > real_yaw_moving_add{ &holder_, fnv( "rage_real_yaw_moving_add" ), 0 }; - con_var< int > real_moving_jitter{ &holder_, fnv( "rage_real_moving_jitter" ), 0 }; - - con_var< int > fake_yaw_moving{ &holder_, fnv( "rage_fake_yaw_moving" ), 0 }; - con_var< int > fake_yaw_moving_add{ &holder_, fnv( "rage_fake_yaw_moving_add" ), 0 }; - con_var< int > fake_moving_jitter{ &holder_, fnv( "rage_fake_moving_jitter" ), 0 }; - - con_var< int > edge_detection{ &holder_, fnv( "rage_edge_dtc" ), 0 }; - con_var< int > edge_dtc_jitter{ &holder_, fnv( "rage_edge_dtc_jitter" ), 0 }; - - con_var< int > edge_dtc_normal{ &holder_, fnv( "rage_edge_dtc_normal" ), 0 }; - con_var< int > edge_dtc_type{ &holder_, fnv( "rage_edge_dtc_type" ), 0 }; - con_var< int > edge_dtc_standing{ &holder_, fnv( "rage_edge_dtc_standing" ), 100 }; - con_var< int > edge_dtc_moving{ &holder_, fnv( "rage_edge_dtc_moving" ), 100 }; - con_var< int > edge_dtc_priority{ &holder_, fnv( "rage_edge_dtc_priority" ), 0 }; - - con_var< bool > break_lby{ &holder_, fnv( "rage_break_lby" ), 0 }; - con_var< int > lby_delta{ &holder_, fnv( "rage_lby_delta" ), 0 }; - - con_var< bool > fakewalk{ &holder_, fnv( "rage_fakewalk" ), 0 }; - con_var< int > fakewalk_key{ &holder_, fnv( "rage_fakewalk_key" ), 0 }; - con_var< int > fakewalk_ticks{ &holder_, fnv( "rage_fakewalk_ticks" ), 7 }; - - con_var< bool > draw_angles{ &holder_, fnv( "rage_draw_angles" ), false }; - con_var< clr_t > real_color{ &holder_, fnv( "rage_real_color" ), clr_t( 255, 255, 255, 150 ) }; - con_var< clr_t > lby_color{ &holder_, fnv( "rage_lby_color" ), clr_t( 231, 105, 105, 150 ) }; - - con_var< bool > angle_step{ &holder_, fnv( "rage_angle_step" ), false }; - con_var< int > angle_step_degrees{ &holder_, fnv( "range_angle_step_degrees" ), false }; - } rage; - - struct { - struct { - con_var< bool > enabled{ &holder_, fnv( "visuals_chams_enabled" ), 0 }; - con_var< bool > flat{ &holder_, fnv( "visuals_chams_flat" ), 0 }; - con_var< bool > ignore_z{ &holder_, fnv( "visuals_chams_ignore_z" ), 0 }; - con_var< float > reflectivity{ &holder_, fnv( "visuals_chams_reflectivity" ), 1.0f }; - con_var< float > shine{ &holder_, fnv( "visuals_chams_shine" ), 1.0f }; - con_var< bool > friendlies{ &holder_, fnv( "visuals_chams_friendlies" ), 0 }; - con_var< clr_t > color_visible_friendly{ &holder_, fnv( "visuals_chams_color_friendly" ), clr_t( 0, 255, 255 ) }; - con_var< clr_t > color_visible_enemy{ &holder_, fnv( "visuals_chams_color_enemy" ), clr_t( 255, 255, 0 ) }; - con_var< clr_t > color_hidden_friendly{ &holder_, fnv( "visuals_chams_color_h_friendly" ), clr_t( 0, 0, 255 ) }; - con_var< clr_t > color_hidden_enemy{ &holder_, fnv( "visuals_chams_color_h_enemy" ), clr_t( 255, 0, 0 ) }; - } chams; - - con_var< int > activation_type{ &holder_, fnv( "visuals_activation" ), false }; - con_var< bool > box{ &holder_, fnv( "visuals_box" ), false }; - con_var< bool > dormant{ &holder_, fnv( "visuals_dormant" ), false }; - con_var< bool > health{ &holder_, fnv( "visuals_health" ), false }; - con_var< bool > weapon{ &holder_, fnv( "visuals_weapon" ), false }; - con_var< bool > name{ &holder_, fnv( "visuals_name" ), false }; - con_var< bool > rank{ &holder_, fnv( "visuals_rank" ), false }; - con_var< bool > out_of_pov{ &holder_, fnv( "visuals_out_of_pov" ), false }; - con_var< bool > ignore_team{ &holder_, fnv( "visuals_ignoreteam" ), false }; - con_var< bool > ignore_teamcolor{ &holder_, fnv( "visuals_ignoreteamcolor" ), false }; - - con_var< bool > skeleton{ &holder_, fnv( "visuals_skeleton" ) }; - con_var< bool > glow{ &holder_, fnv( "visuals_glow" ), false }; - con_var< bool > flags{ &holder_, fnv( "visuals_flags" ), false }; - con_var< bool > resolver_indicator{ &holder_, fnv( "visuals_resolver_indicator" ), false }; - con_var< bool > ammo{ &holder_, fnv( "visuals_ammo" ), false }; - con_var< bool > money{ &holder_, fnv( "visuals_money" ) }; - con_var< bool > ping{ &holder_, fnv( "visuals_ping" ) }; - con_var< bool > floating_ragdolls{ &holder_, fnv( "visuals_floating_ragdolls" ) }; - con_var< clr_t > box_enemy{ &holder_, fnv( "visuals_clr_enemy" ), clr_t( 0, 255, 255 ) }; - con_var< clr_t > box_friendly{ &holder_, fnv( "visuals_clr_friendly" ), clr_t( 255, 0, 255 ) }; - - con_var< clr_t > glow_enemy{ &holder_, fnv( "visuals_glow_enemy" ), clr_t( 255, 0, 255, 150 ) }; - con_var< clr_t > glow_friendly{ &holder_, fnv( "visuals_glow_friendly" ), clr_t( 255, 120, 0, 150 ) }; - con_var< clr_t > skeleton_enemy{ &holder_, fnv( "visuals_skeleton_enemy" ), clr_t( 255, 255, 255 ) }; - con_var< clr_t > skeleton_friendly{ &holder_, fnv( "visuals_skeleton_friendly" ), clr_t( 255, 255, 255 ) }; - - con_var< bool > bullet_tracers{ &holder_, fnv( "visuals_bullet_tracers" ), false }; - - con_var< int > key{ &holder_, fnv( "visuals_key" ), 0 }; - con_var< bool > hitmarkers{ &holder_, fnv( "visuals_hitmarkers" ), false }; - bool active = true; - - con_var< bool > world_modulate{ &holder_, fnv( "visuals_world_modulate" ), false }; - con_var< bool > night_mode{ &holder_, fnv( "visuals_night_mode" ), false }; - con_var< bool > transparent_props{ &holder_, fnv( "visuals_transparent_props" ), false }; - - con_var< bool > recoil_crosshair{ &holder_, fnv( "misc_recoil_crosshair" ), false }; - con_var< bool > autowall_crosshair{ &holder_, fnv( "visual_recoil_crosshair" ), false }; - con_var< bool > draw_spread{ &holder_, fnv( "visual_draw_spread" ), false }; - con_var< bool > snipers_crosshair{ &holder_, fnv( "visuals_sniper_crosshair" ), false }; - con_var< bool > grenade_prediction{ &holder_, fnv( "visuals_grenade_prediction" ), false }; - - con_var< int > weapon_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; - con_var< int > grenade_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; - - con_var< clr_t > weapon_esp_clr{ &holder_, fnv( "visuals_weapon_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; - con_var< clr_t > grenade_esp_clr{ &holder_, fnv( "visuals_grenade_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; - - con_var< bool > spec_list{ &holder_, fnv( "visuals_spec_list" ), false }; - con_var< bool > radar{ &holder_, fnv( "visuals_radar" ), false }; - } visuals; - - struct { - con_var< bool > watermark{ &holder_, fnv( "misc_watermark" ), false }; - con_var< bool > bunny_hop{ &holder_, fnv( "misc_bhop" ), false }; - con_var< bool > auto_strafe{ &holder_, fnv( "misc_autostrafe" ), false }; - con_var< bool > circle_strafe{ &holder_, fnv( "misc_circlestrafe" ), false }; - con_var< int > circle_strafe_key{ &holder_, fnv( "misc_circle_key" ), 0 }; - con_var< bool > edge_jump{ &holder_, fnv( "misc_edgejump" ), false }; - con_var< int > edge_jump_key{ &holder_, fnv( "misc_edge_jump_key" ), false }; - con_var< bool > auto_jumpbug{ &holder_, fnv( "misc_auto_jumpbug" ), false }; - con_var< int > auto_jumpbug_key{ &holder_, fnv( "misc_auto_jumpbug_key" ), 0 }; - con_var< bool > show_jump_stats{ &holder_, fnv( "misc_show_jump_stats" ), 0 }; - con_var< int > viewmodel_fov{ &holder_, fnv( "misc_viewmodel_fov" ), 0 }; - con_var< int > fov_changer{ &holder_, fnv( "fov_changer" ), 90 }; - con_var< bool > clantag_changer{ &holder_, fnv( "misc_clantag" ), false }; - con_var< bool > log_hits{ &holder_, fnv( "misc_log_hits" ) }; - con_var< int > name_changer{ &holder_, fnv( "misc_namechanger" ), 0 }; - con_var< bool > thirdperson{ &holder_, fnv( "misc_thirdperson" ), false }; - con_var< int > thirdperson_key{ &holder_, fnv( "misc_tp_key" ), 0 }; - con_var< bool > auto_accept{ &holder_, fnv( "misc_autoaccept" ), false }; - con_var< int > auto_accept_delay{ &holder_, fnv( "misc_autoaccept_delay" ), 0 }; - con_var< int > net_fakelag{ &holder_, fnv( "misc_net_fakelag" ), false }; - con_var< int > net_fakeping_amount{ &holder_, fnv( "net_fakeping_amount" ), 0 }; - con_var< int > net_fakeping_key{ &holder_, fnv( "net_fakeping_key" ), 0 }; - bool net_fakeping_active = false; - - con_var< bool > rank_reveal{ &holder_, fnv( "misc_rank_reveal" ), 0 }; - con_var< bool > unlock_inventory{ &holder_, fnv( "misc_unlock_inventory" ), 0 }; - con_var< bool > auto_revolver{ &holder_, fnv( "misc_auto_revolver" ), 0 }; - con_var< bool > no_scope{ &holder_, fnv( "misc_no_scope" ), false }; - con_var< bool > no_recoil{ &holder_, fnv( "misc_no_recoil" ), false }; - con_var< bool > no_smoke{ &holder_, fnv( "misc_no_smoke" ), false }; - con_var< bool > no_flash{ &holder_, fnv( "misc_no_flash" ), false }; - con_var< bool > transparent_vm{ &holder_, fnv( "misc_transparent_vm" ), false }; - con_var< bool > disable_post_process{ &holder_, fnv( "misc_disable_post_process" ), false }; - con_var< int > recording_start_key{ &holder_, fnv( "recording_start_key" ), 0 }; - con_var< int > recording_stop_key{ &holder_, fnv( "recording_stop_key" ), 0 }; - con_var< int > recording_show_angles{ &holder_, fnv( "recording_show_angles" ), 0 }; - - con_var< bool > use_spam{ &holder_, fnv( "misc_use_spam" ), false }; - con_var< int > use_spam_key{ &holder_, fnv( "misc_use_spam_key" ), 0 }; - - bool recorder_enable = false; - } misc; - - struct { - con_var< uint8_t > menu_color_1r{ &holder_, fnv( "menu_color_1r" ), 231 }; - con_var< uint8_t > menu_color_1g{ &holder_, fnv( "menu_color_1g" ), 105 }; - con_var< uint8_t > menu_color_1b{ &holder_, fnv( "menu_color_1b" ), 105 }; - - con_var< uint8_t > menu_color_2r{ &holder_, fnv( "menu_color_2r" ), 0xf4 }; - con_var< uint8_t > menu_color_2g{ &holder_, fnv( "menu_color_2g" ), 0x7c }; - con_var< uint8_t > menu_color_2b{ &holder_, fnv( "menu_color_2b" ), 0xa8 }; - - bool open = false; - bool logs_enable = false; - int cur_setting = 0; - } menu; - }; -} - -extern data::c_settings g_settings; \ No newline at end of file diff --git a/gmod/simple_settings.cpp b/gmod/simple_settings.cpp deleted file mode 100644 index 156151a..0000000 --- a/gmod/simple_settings.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "settings.hpp" - -SettingHolder data::holder_{ "iloveyou" }; -data::c_settings g_settings; - -#pragma warning(disable: 4996) - -void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ) { - auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); - auto data = reinterpret_cast< const uint8_t* >( src ); - - for ( size_t i = 0; i < size; i++ ) - sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); - - WritePrivateProfileStringA( path, name, buffer, filename ); -} - -void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ) { - auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); - auto data = reinterpret_cast< uint8_t* >( dest ); - - GetPrivateProfileStringA( path, name, "", buffer, size * 2 + 1, filename ); - - if ( *buffer == 0 ) - return; - - for ( size_t i = 0; i < size; i++ ) { - unsigned temp; - sscanf( &buffer[ 2 * i ], "%02X", &temp ); - data[ i ] = temp; - } -} \ No newline at end of file diff --git a/gmod/simple_settings.hpp b/gmod/simple_settings.hpp deleted file mode 100644 index e3a8655..0000000 --- a/gmod/simple_settings.hpp +++ /dev/null @@ -1,171 +0,0 @@ -#pragma once -#include -#include -#include -#include - -#include "util.hpp" -#include "fnv.hpp" - -//nama stuff -extern void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ); -extern void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ); - -class ISettingNode { -public: - virtual ~ISettingNode( ) = default; - - virtual void load( const char* path, const char* file ) = 0; - virtual void save( const char* path, const char* file ) const = 0; - virtual void register_( ISettingNode* node_ptr ) = 0; - virtual hash_t get_hash( ) { return 0; } -}; - -class SettingHolder : public ISettingNode { -public: - __forceinline SettingHolder( const char* name ) : name_( name ) {} - __forceinline SettingHolder( SettingHolder* holder_ptr, const char* name ) : name_( name ) { holder_ptr->register_( this ); } - - void register_( ISettingNode* node_ptr ) override { - setting_nodes_.push_back( node_ptr ); - } - - void load( const char* path, const char* file ) override { - char full_path[ 64 ]; - strcpy_s( full_path, path ); - strcat_s( full_path, "_" ); - strcat_s( full_path, name_ ); - for ( auto x : setting_nodes_ ) - x->load( full_path, file ); - } - - void save( const char* path, const char* file ) const override { - char full_path[ 64 ]; - strcpy_s( full_path, path ); - strcat_s( full_path, "_" ); - strcat_s( full_path, name_ ); - for ( auto x : setting_nodes_ ) - x->save( full_path, file ); - } - - auto& get_nodes( ) { - return setting_nodes_; - } - -private: - const char* name_; - std::vector setting_nodes_; -}; - -class ISetting : public ISettingNode { - void register_( ISettingNode* node_ptr ) override {} -public: - virtual void set( float value ) = 0; - virtual void set( int value ) = 0; - virtual void set( ulong_t value ) = 0; - virtual std::string get_string( ) = 0; - virtual hash_t get_hash( ) = 0; -}; - -template < size_t L > -class SettingString : ISetting { -public: - __forceinline SettingString( SettingHolder* holder_ptr, hash_t hash ) : - m_name( name ), m_value( "" ) { - holder_ptr->register_( this ); - }; - - void load( const char* path, const char* file ) override { - GetPrivateProfileStringA( path, std::to_string( m_name ).c_str( ), "", m_value, L, file ); - } - - void save( const char* path, const char* file ) const override { - WritePrivateProfileStringA( path, std::to_string( m_name ).c_str( ), m_value, file ); - } - - char* get( ) { - return m_value; - } - -private: - char m_value[ L ]; - hash_t m_name; -}; - -template < typename T > -class con_var : public ISetting { -public: - __forceinline con_var( SettingHolder* holder_ptr, hash_t name ) : - name_( name ), - is_float_( std::is_floating_point_v< T > ), - is_integral_( std::is_integral_v< T > ) { - holder_ptr->register_( this ); - } - __forceinline con_var( SettingHolder* holder_ptr, hash_t name , const T& rhs ) : - value_( rhs ), - name_( name ), - is_float_( std::is_floating_point_v< T > ), - is_integral_( std::is_integral_v< T > ) { - holder_ptr->register_( this ); - } - - void load( const char* path, const char* file ) override { simple_load( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } - - void save( const char* path, const char* file ) const override { simple_save( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } - - __forceinline operator T&( ) { return value_; } - __forceinline T* operator &( ) { return &value_; } - - __forceinline T& operator ()( ) { return value_; } - - virtual std::string get_string( ) { - if constexpr( std::is_arithmetic_v< T > ) { - return std::to_string( value_ ); - } - else { - return util::to_hex_str( *( ulong_t* )( &value_ ) ); - } - } - - virtual void set( float value ) { - if constexpr( std::is_arithmetic_v< T > ) { - value_ = ( T )( value ); - } - } - - virtual void set( int value ) { - if constexpr( std::is_arithmetic_v< T > ) { - value_ = ( T )( value ); - } - else { - value_ = *( T* )( &value ); - } - } - - virtual void set( ulong_t value ) { - if constexpr( sizeof( T ) == sizeof( ulong_t ) ) { - *( ulong_t* )( &value_ ) = value; - return; - } - - memcpy( &value_, &value, sizeof( value_ ) ); - } - - virtual hash_t get_hash( ) { - return name_; - } - - __forceinline bool is_floating_point( ) { - return is_float_; - } - - __forceinline bool is_integral( ) { - return is_integral_; - } - -private: - hash_t name_; - bool is_float_; - bool is_integral_; - T value_; -}; \ No newline at end of file diff --git a/gmod/skins.cpp b/gmod/skins.cpp deleted file mode 100644 index 9564abf..0000000 --- a/gmod/skins.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "skins.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "interface.hpp" - -namespace features -{ - int c_skins::get_knife_index( ) { - switch( g_settings.misc.skins.knife( ) ) { - case 0: - return 0; - case 1: - return 500; - case 2: - return 505; - case 3: - return 506; - case 4: - return 507; - case 5: - return 508; - case 6: - return 509; - } - - return 0; - } - - const char* c_skins::get_model_str( ) { - switch( g_settings.misc.skins.knife( ) ) { - case 0: - return 0; - case 1: - return xors( "models/weapons/v_knife_bayonet.mdl" ); - case 2: - return xors( "models/weapons/v_knife_flip.mdl" ); - case 3: - return xors( "models/weapons/v_knife_gut.mdl" ); - case 4: - return xors( "models/weapons/v_knife_karam.mdl" ); - case 5: - return xors( "models/weapons/v_knife_m9_bay.mdl" ); - case 6: - return xors( "models/weapons/v_knife_tactical.mdl" ); - } - - return nullptr; - } - - void c_skins::override_knife( ) { - auto weapons = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2DE8 ); - for( int i{ }; weapons[ i ]; ++i ) { - auto wep = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weapons[ i ] ); - auto vm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hViewModel( ) ); - if( wep && wep->is_knife( ) ) { - int index = get_knife_index( ); - if( index ) { - int model = g_csgo.m_model_info( )->GetModelIndex( get_model_str( ) ); - - wep->m_iItemDefinitionIndex( ) = index; - wep->m_nModelIndex( ) = model; - if( weapons[ i ] == g_ctx.m_local->m_hActiveWeapon( ) ) { - vm->m_nModelIndex( ) = model; - } - } - } - } - } - - void c_skins::operator()( ) { - if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - override_knife( ); - } - } -} \ No newline at end of file diff --git a/gmod/skins.hpp b/gmod/skins.hpp deleted file mode 100644 index 4ce5971..0000000 --- a/gmod/skins.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -namespace features -{ - class c_skins { - private: - int get_knife_index( ); - const char* get_model_str( ); - - void override_knife( ); - public: - void operator()( ); - }; -} \ No newline at end of file diff --git a/gmod/strings.hpp b/gmod/strings.hpp deleted file mode 100644 index dfdeb8b..0000000 --- a/gmod/strings.hpp +++ /dev/null @@ -1,162 +0,0 @@ -//-------------------------------------------------------------------------------- -//-- XorCompileTime.hpp -// -// Author: frk -// Date: 12.12.2015 -// -//-------------------------------------------------------------------------------- - -#pragma once -#include -#include -#include - -#define BEGIN_NAMESPACE( x ) namespace x { -#define END_NAMESPACE } - -BEGIN_NAMESPACE( strenc ) - -constexpr auto time = __TIME__; -constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; - -// 1988, Stephen Park and Keith Miller -// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" -// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: -// with 32-bit math and without division - -template < int N > -struct RandomGenerator { -private: - static constexpr unsigned a = 16807; // 7^5 - static constexpr unsigned m = 2147483647; // 2^31 - 1 - - static constexpr unsigned s = RandomGenerator< N - 1 >::value; - static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 - static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 - static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits - static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi - static constexpr unsigned lo3 = lo2 + hi; - -public: - static constexpr unsigned max = m; - static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; -}; - -template <> -struct RandomGenerator< 0 > { - static constexpr unsigned value = seed; -}; - -template < int N, int M > -struct RandomInt { - static constexpr auto value = RandomGenerator< N + 1 >::value % M; -}; - -template < int N > -struct RandomChar { - static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); -}; - -template < size_t N, int K > -struct XorString { -private: - const char _key; - std::array< char, N + 1 > _encrypted; - bool decrypted = false; - - constexpr char enc( char c ) const { - return c ^ _key; - } - - char dec( char c ) const { - return c ^ _key; - } - -public: - template < size_t... Is > - constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { - } - - __forceinline const char* decrypt( void ) { - if( !decrypted ) { - for( size_t i = 0; i < N; ++i ) { - _encrypted[ i ] = dec( _encrypted[ i ] ); - } - _encrypted[ N ] = '\0'; - decrypted = true; - } - printf( "N: %u K: %d str: %s address: %08x\n", N, K, _encrypted.data( ), _encrypted.data( ) ); - - return _encrypted.data( ); - } -}; - -//-------------------------------------------------------------------------------- -//-- Note: XorStr will __NOT__ work directly with functions like printf. -// To work with them you need a wrapper function that takes a const char* -// as parameter and passes it to printf and alike. -// -// The Microsoft Compiler/Linker is not working correctly with variadic -// templates! -// -// Use the functions below or use std::cout (and similar)! -//-------------------------------------------------------------------------------- - -static auto w_printf = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_printf_s = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf( buf, fmt, args ); - va_end( args ); -}; - -static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf_s( buf, buf_size, fmt, args ); - va_end( args ); -}; - -//for compatibility with debug mode -struct debug_ret { -private: - const char* ret; - -public: - debug_ret( const char* str ) : ret( str ) { }; - - auto decrypt( ) { - return ret; - } -}; - -constexpr size_t strlen_ct( const char* const str ) { - size_t out = 1; - - for( ; str[ out ] != '\0'; ++out ); - - return out; -} - -#if 0 -#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) -#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) -#else -#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) -#define xors( s ) ( s ) -#endif - -END_NAMESPACE \ No newline at end of file diff --git a/gmod/ui.h b/gmod/ui.h deleted file mode 100644 index b25a98d..0000000 --- a/gmod/ui.h +++ /dev/null @@ -1,457 +0,0 @@ -#pragma once -#include "ui_base_item.h" -#include "ui_menu.h" -#include "ui_form.h" -#include "ui_render.h" -#include "ui_checkbox.h" -#include "ui_tab_manager.h" -#include "ui_slider.h" -#include "ui_dropdown.h" -#include "ui_key_picker.h" -#include "ui_button.h" -#include "ui_color_picker.h" -#include "ui_label.h" - -#include "settings.hpp" -#include "base_cheat.hpp" - -namespace ui -{ - static std::string date_str = __DATE__; - auto menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "quebot" ), - __DATE__ ); - - static void render( ) { - static bool was_setup = false; - if ( !was_setup ) { - std::transform( date_str.begin( ), date_str.end( ), date_str.begin( ), - [ ]( char c ) { return ::tolower( c ); } - ); - - menu.reset( ); - menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "moneybot" ), - date_str.c_str( ) ); - auto tab_sheet = std::make_shared< ui::c_tab_manager >( ); - - //todo: replace with icons? - - auto tab_rage = std::make_shared< ui::c_tab_sheet >( xors( "rage" ), &icons::sprite_rage ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_aimbot = std::make_shared< ui::c_tab_sheet >( xors( "aimbot" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ), 0 ); { - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.enabled ) ); - main_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 180.f, xors( "max fov" ), &g_settings.rage.fov ) ); - - - main_form->add_item( std::make_shared< ui::c_dropdown< int > >( - 0, 0, 120, xors( "activation type" ), - &g_settings.rage.activation_type, - &dropdowns::activation_types_aimbot ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.aimkey ) )->set_cond( - [ ]( ) { return g_settings.rage.activation_type == 1; } ); - - main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "silent" ), - &g_settings.rage.silent, &dropdowns::silent_aimbot_types ) ); - - - main_form->add_item( std::make_shared< ui::c_dropdown< int > >( 0, 0, 120, xors( "hitbox" ), - &g_settings.rage.hitbox, &dropdowns::hitboxes ) ); - - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "autofire" ), &g_settings.rage.auto_fire ) ); - } - - auto accuracy_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "accuracy" ) ); { - accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no spread" ), &g_settings.rage.nospread ) ); - accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.rage.norecoil ) ); - } - - auto selection_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "selection" ) ); { - selection_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "type" ), &g_settings.rage.selection_type, &dropdowns::selection_type ) ); - } - - auto filter_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "filters" ) ); { - filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team" ), &g_settings.rage.ignore_team ) ); - filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team color" ), &g_settings.rage.ignore_teamcolor ) ); - filter_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore spawn protection" ), &g_settings.rage.ignore_spawnprot ) ); - } - - left_column->add_item( main_form ); - right_column->add_item( accuracy_form ); - right_column->add_item( selection_form ); - right_column->add_item( filter_form ); - - subtab_aimbot->add_item( left_column ); - subtab_aimbot->add_item( right_column ); - } - - //auto subtab_antiaim = std::make_shared< ui::c_tab_sheet >( xors( "antiaim" ) ); { - // auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - // auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - // - // auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.anti_aim ) ); - // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "at players" ), &g_settings.rage.at_players ) ); - // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant check" ), &g_settings.rage.dormant_check ) ); - // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "angle step" ), &g_settings.rage.angle_step ) ); - // main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, &g_settings.rage.angle_step_degrees ) )->set_cond( - // [ ]( ) { return g_settings.rage.angle_step( ); } ); - // } - // - // auto pitch_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "pitch" ) ); { - // pitch_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "pitch" ), &g_settings.rage.pitch, &dropdowns::antiaim_pitch ) ); - // pitch_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -89, 89, &g_settings.rage.pitch_offset ) )->set_cond( - // [ ]( ) { return g_settings.rage.pitch == 1; } ); - // } - // - // auto yaw_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "yaw" ), 200 ); { - // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw" ), &g_settings.rage.real_yaw, &dropdowns::antiaim_yaw ) ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.real_yaw_add( ) ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw jitter" ), &g_settings.rage.real_yaw_jitter ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw moving" ), &g_settings.rage.real_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.real_yaw_moving_add( ) ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw moving jitter" ), &g_settings.rage.real_moving_jitter ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); - // - // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw" ), &g_settings.rage.fake_yaw, &dropdowns::antiaim_yaw ) ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.fake_yaw_add( ) ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw jitter" ), &g_settings.rage.fake_yaw_jitter ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw moving" ), &g_settings.rage.fake_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -100, 100, &g_settings.rage.fake_yaw_moving_add( ) ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.fake_yaw_moving( ) && !!g_settings.rage.fake_yaw( ); } ); - // yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw moving jitter" ), &g_settings.rage.fake_moving_jitter ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.fake_yaw_moving( ) && !!g_settings.rage.fake_yaw( ); } ); - // } - // - // auto edge_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "edge detection" ), 110 ); { - // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge" ), &g_settings.rage.edge_dtc_normal, - // &dropdowns::antiaim_edge ) ); - // - // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_standing ) )->set_cond( - // [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); - // - // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_moving ) )->set_cond( - // [ ]( ) { return !!g_settings.rage.edge_dtc_normal( ); } ); - // - // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge type" ), &g_settings.rage.edge_dtc_type, - // &dropdowns::antiaim_edge_type ) )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); - // - // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "freestanding" ), - // &g_settings.rage.edge_detection, &dropdowns::antiaim_freestanding ) ); - // - // edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "priority" ), - // &g_settings.rage.edge_dtc_priority, &dropdowns::edge_priority ) - // )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) && g_settings.rage.edge_detection( ); } ); - // - // edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, xors( "fake jitter" ), &g_settings.rage.edge_dtc_jitter ) ); - // } - // - // auto lby_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "lby breaker" ) ); { - // lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "break lby" ), &g_settings.rage.break_lby ) ); - // lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 105, 195, &g_settings.rage.lby_delta ) )->set_cond( - // [ ]( ) { return g_settings.rage.break_lby( ); } ); - // - // auto angles_box = lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "draw angles" ), &g_settings.rage.draw_angles ) ); - // angles_box->set_cond( [ ]( ) { return g_settings.rage.break_lby( ); } ); - // angles_box->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.rage.lby_color ) ); - // angles_box->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.rage.real_color ) ); - // - // lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fakewalk" ), &g_settings.rage.fakewalk ) )->add_item( - // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.fakewalk_key ) - // ); - // lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 7, 13, &g_settings.rage.fakewalk_ticks ) )->set_cond( - // [ ]( ) { return g_settings.rage.fakewalk; } ); - // } - // - // auto fakelag_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "fakelag" ), 165 ); { - // fakelag_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "mode" ), &g_settings.rage.fakelag.mode, &dropdowns::fakelag_types ) ); - // fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 15, xors( "max ticks" ), &g_settings.rage.fakelag.ticks ) ); - // fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 50, xors( "fluctuate" ), &g_settings.rage.fakelag.fluctuate ) )->set_cond( - // [ ]( ) { return g_settings.rage.fakelag.mode == 2; } - // ); - // - // auto flags_form = fakelag_form->add_item( std::make_shared< ui::c_form >( 0, 5, 139, 0, xors( "flags" ), 0, true ) ); - // - // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "in air" ), &g_settings.rage.fakelag.in_air ) ); - // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on move" ), &g_settings.rage.fakelag.in_move ) ); - // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on peek" ), &g_settings.rage.fakelag.on_peek ) ); - // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "while shooting" ), &g_settings.rage.fakelag.in_attack ) ); - // flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid ground" ), &g_settings.rage.fakelag.avoid_ground ) ); - // } - // - // left_column->add_item( main_form ); - // left_column->add_item( pitch_form ); - // left_column->add_item( yaw_form ); - // - // right_column->add_item( edge_form ); - // right_column->add_item( lby_form ); - // right_column->add_item( fakelag_form ); - // - // subtab_antiaim->add_item( left_column ); - // subtab_antiaim->add_item( right_column ); - //} - - //subtab_sheet->add_item( subtab_antiaim ); - subtab_sheet->add_item( subtab_aimbot ); - - tab_rage->add_item( subtab_sheet ); - } - - - auto tab_visuals = std::make_shared< ui::c_tab_sheet >( xors( "visuals" ), &icons::sprite_visuals ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_players = std::make_shared< ui::c_tab_sheet >( xors( "players" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "activation type" ), &g_settings.visuals.activation_type, &dropdowns::activation_type_visuals ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.visuals.key ) )->set_cond( [ ]( ) { return g_settings.visuals.activation_type > 1; } ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team" ), &g_settings.visuals.ignore_team ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore team color" ), &g_settings.visuals.ignore_teamcolor ) ); - - } - - auto player_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "players" ) ); { - auto box_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "box" ), &g_settings.visuals.box ) ); - box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.box_enemy( ) ) ); - - auto skeleton_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "skeleton" ), &g_settings.visuals.skeleton ) ); - skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.skeleton_enemy ) ); - - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "health" ), &g_settings.visuals.health ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "name" ), &g_settings.visuals.name ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "weapon" ), &g_settings.visuals.weapon ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "rank" ), &g_settings.visuals.rank ) ); - } - - auto hud_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "hud" ) ); { - // hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hitmarkers" ), &g_settings.visuals.hitmarkers ) ); will probably add soon. - hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spectator list" ), &g_settings.visuals.spec_list ) ); - } - - //auto chams_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "chams" ) ); { soon - // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.visuals.chams.enabled( ) ) ); - // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "through walls" ), &g_settings.visuals.chams.ignore_z( ) ) ); - // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.chams.friendlies( ) ) ); - // chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flat" ), &g_settings.visuals.chams.flat( ) ) ); - // chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "reflectivity" ), &g_settings.visuals.chams.reflectivity ) - // )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); - // - // chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "shine" ), &g_settings.visuals.chams.shine ) - // )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); - // - // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies visible" ), &g_settings.visuals.chams.color_visible_friendly( ) ) )->set_cond( - // [ ]( ) { return g_settings.visuals.chams.friendlies( ); } ); - // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies hidden" ), &g_settings.visuals.chams.color_hidden_friendly( ) ) )->set_cond( - // [ ]( ) { return g_settings.visuals.chams.friendlies( ) && g_settings.visuals.chams.ignore_z( ); } ); - // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies visible" ), &g_settings.visuals.chams.color_visible_enemy( ) ) ); - // chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies hidden" ), &g_settings.visuals.chams.color_hidden_enemy( ) ) )->set_cond( - // [ ]( ) { return g_settings.visuals.chams.ignore_z( ); } ); - //} - - left_column->add_item( main_form ); - left_column->add_item( player_form ); - - right_column->add_item( hud_form ); - //right_column->add_item( chams_form ); - - subtab_players->add_item( left_column ); - subtab_players->add_item( right_column ); - } - - auto subtab_other = std::make_shared< ui::c_tab_sheet >( xors( "other" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - //auto world_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "world" ) ); { - // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "world modulate" ), &g_settings.visuals.world_modulate ) ); - // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "night mode" ), &g_settings.visuals.night_mode ) - // )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate; } ); - // world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent props" ), &g_settings.visuals.transparent_props ) - // )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate; } ); - // - // world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "dropped weapons" ), &g_settings.visuals.weapon_esp, &dropdowns::world_esp_type ) - // )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.weapon_esp_clr( ) ) ); - // - // world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "grenades" ), &g_settings.visuals.grenade_esp, &dropdowns::world_esp_type ) - // )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.grenade_esp_clr( ) ) ); - //} - - - auto view_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "view" ) ); { - view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "watermark" ), &g_settings.misc.watermark ) ); - // will add soon - //view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thirdperson" ), &g_settings.misc.thirdperson( ) ) )->add_item( - // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.thirdperson_key ) - //); - //view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 40, xors( "viewmodel fov" ), &g_settings.misc.viewmodel_fov( ) ) ); - //view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 90, 130, xors( "view fov" ), &g_settings.misc.fov_changer( ) ) ); - } - - auto removals_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "removals" ) ); { - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.misc.no_recoil ) ); - } - - left_column->add_item( view_form ); - left_column->add_item( removals_form ); - - //right_column->add_item( view_form ); - //right_column->add_item( removals_form ); - - subtab_other->add_item( left_column ); - //subtab_other->add_item( right_column ); - } - - subtab_sheet->add_item( subtab_other ); - subtab_sheet->add_item( subtab_players ); - - tab_visuals->add_item( subtab_sheet ); - } - - - auto tab_misc = std::make_shared< ui::c_tab_sheet >( xors( "miscellaneous" ), &icons::sprite_misc ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_general = std::make_shared< ui::c_tab_sheet >( xors( "general" ) ); { - auto column_left = subtab_general->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 0 ) ); - auto column_right = subtab_general->add_item( std::make_shared< ui::base_item >( 220, -5, 0, 0 ) ); - - auto movement_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "movement" ) ); { - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto strafe" ), &g_settings.misc.auto_strafe ) ); - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bhop" ), &g_settings.misc.bunny_hop( ) ) ); - //auto circle_box = movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "circle strafe" ), &g_settings.misc.circle_strafe ) ); - //circle_box->add_item( std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.circle_strafe_key ) ); - //circle_box->set_cond( [ ]( ) { return g_settings.misc.bunny_hop && g_settings.misc.auto_strafe; } ); - - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "edge jump" ), &g_settings.misc.edge_jump( ) ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.edge_jump_key( ) ) - ); - //movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto jumpbug" ), &g_settings.misc.auto_jumpbug( ) ) )->add_item( - // std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.auto_jumpbug_key( ) ) - //); - //movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "show jump stats" ), &g_settings.misc.show_jump_stats ) ); - } - - //auto identity_form = std::make_shared< ui::c_form >( 0, 1, 215, 0, xors( "identity" ) ); { - // // need to add - // identity_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "name changer" ), &g_settings.misc.name_changer, - // &dropdowns::name_changers ) ); - //} - - - auto helpers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "helpers" ) ); { - // e spammer - helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "use spammer" ), &g_settings.misc.use_spam ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.use_spam_key ) ); - - } - - - - column_left->add_item( movement_form ); - //column_left->add_item( identity_form ); - - column_right->add_item( helpers_form ); - } - - - //auto subtab_movement_recorder = std::make_shared< ui::c_tab_sheet >( xors( "movement recorder" ) ); { - // auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "idle" ) ) ); - // main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.misc.recorder_enable ) ); - // main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "show angles" ), &g_settings.misc.recording_show_angles, &dropdowns::recorder_angles ) ); - // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording start key" ) ) )->add_item( - // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_start_key ) - // ); - // main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording stop key" ) ) )->add_item( - // std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_stop_key ) - // ); - // - // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "play" ), [ ]( ) { g_cheat.m_move_rec.play_back( ); } ) ); - // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "stop playing" ), [ ]( ) { g_cheat.m_move_rec.stop_playback( ); } ) ); - // main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "clear recording" ), [ ]( ) { g_cheat.m_move_rec.clear_recording( ); } ) ); - // } - // - // subtab_movement_recorder->add_item( main_form ); - //} - // - //subtab_sheet->add_item( subtab_movement_recorder ); - subtab_sheet->add_item( subtab_general ); - - tab_misc->add_item( subtab_sheet ); - } - - - auto tab_config = std::make_shared< ui::c_tab_sheet >( xors( "config" ), &icons::sprite_config ); { - auto cfg_form = std::make_shared< ui::c_form >( 0, 10, 200, 75, xors( "config" ) ); - cfg_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 180, xors( "setting" ), &g_settings.menu.cur_setting, &dropdowns::configs ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 0, 0, 85, 20, xors( "save" ), []( ) { g_settings.save( ); } ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 95, -25, 85, 20, xors( "load" ), []( ) { g_settings.load( ); } ) ); - - tab_config->add_item( cfg_form ); - } - - tab_sheet->add_item( tab_config ); - tab_sheet->add_item( tab_misc ); - tab_sheet->add_item( tab_visuals ); - tab_sheet->add_item( tab_rage ); - //tab_sheet->add_item( tab_legit ); - - menu->add_item( tab_sheet ); - - was_setup = true; - } - else { - //static auto movement_state = menu->find_item( - // xors( "movement recorder" ) )->find_item( - // xors( "main" ) )->find_item( - // xors( "idle" ) - // ); - // - //if( !g_settings.misc.recorder_enable ) - // movement_state->set_text( xors( "idle" ) ); - //else if( g_cheat.m_move_rec.is_playing( ) ) { - // movement_state->set_text( xors( "playing" ) ); - //} - //else if( g_cheat.m_move_rec.is_recording( ) ) { - // movement_state->set_text( xors( "recording" ) ); - //} - //else { - // movement_state->set_text( xors( "idle" ) ); - //} - - //static auto jitter_real = menu->find_item( xors( "real yaw jitter" ) ); - //jitter_real->set_text( g_settings.rage.real_yaw == 2 ? xors( "spin range" ) : xors( "real yaw jitter" ) ); - // - //static auto jitter_real_moving = menu->find_item( xors( "real yaw moving jitter" ) ); - //jitter_real_moving->set_text( g_settings.rage.real_yaw_moving == 2 ? xors( "spin range" ) : xors( "real yaw moving jitter" ) ); - // - //static auto jitter_fake = menu->find_item( xors( "fake yaw jitter" ) ); - //jitter_fake->set_text( g_settings.rage.fake_yaw == 2 ? xors( "spin range" ) : xors( "fake yaw jitter" ) ); - // - //static auto jitter_fake_moving = menu->find_item( xors( "fake yaw moving jitter" ) ); - //jitter_fake_moving->set_text( g_settings.rage.fake_yaw_moving == 2 ? xors( "spin range" ) : xors( "fake yaw moving jitter" ) ); - - render_item( menu.get( ) ); - - //reset the menu if home is pressed for debugging purposes - if ( g_input.is_key_pressed( KEYS_HOME ) ) { - menu.reset( ); - menu = std::make_shared< c_menu >( 10, 10, 580, 470, xors( "golden cheat" ) ); - was_setup = false; - } - } - } -} \ No newline at end of file diff --git a/gmod/ui_base_item.h b/gmod/ui_base_item.h deleted file mode 100644 index 68c2198..0000000 --- a/gmod/ui_base_item.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include -#include -#include - -#include "ui_draw.h" - -namespace ui -{ - //the offset between each item - constexpr int ITEM_OFFSET = 5; - - class base_item : public std::enable_shared_from_this< base_item > { - public: - base_item( ) { } - base_item( int x, int y, int w, int h, const char* name = nullptr ) : - m_x( x ), m_y( y ), m_width( w ), m_height( h ) { - if( name ) { - strcpy( m_text, name ); - } - } - - virtual void render( ) { }; - virtual bool is_hovered( ) { return false; } - virtual bool is_form( ) const { return false; } - - virtual void reset( ) { - m_y_offset = 0; - } - - virtual int get_total_height( ) const { - return m_height; - } - - void set_y_offset( int offset ) { - m_y_offset = offset; - } - - int get_y_offset( ) const { - return m_y_offset; - } - - auto add_item( std::shared_ptr< base_item > item ) { - item.get( )->m_parent = shared_from_this( ); - m_items.emplace( m_items.begin( ), item ); - - return item; - } - - auto& get_items( ) { return m_items; } - auto get_parent( ) { return m_parent; } - - virtual int x( ) const { return m_x; } - virtual int y( ) const { return m_y; } - virtual int w( ) const { return m_width; } - virtual int h( ) const { return m_height; } - - void set_x( int x ) { m_x = x; } - void set_y( int y ) { m_y = y; } - - void set_width( int w ) { m_width = w; } - void set_height( int h ) { m_height = h; } - - bool get_visible( ) const { - if( m_cond && !m_cond( ) ) { - return false; - } - - return m_visible; - } - - void set_cond( std::function< bool( ) > func ) { - m_cond = func; - } - - void set_visible( bool vis ) { m_visible = vis; } - void set_text( const char* text ) { - strcpy( m_text, text ); - } - auto get_text( ) const { - return m_text; - } - - std::shared_ptr< base_item > find_item( const char* name ) { - if( !m_items.empty( ) ) { - for( auto& it : m_items ) { - if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { - return it; - } - - auto it_find = it->find_item( name ); - if( it_find != it ) return it_find; - } - } - - return shared_from_this( ); - } - - auto get_top_parent( ) { - for( auto parent = m_parent; ; - parent = parent->get_parent( ) ) { - if( !parent->get_parent( ) ) { - return parent; - } - } - - return shared_from_this( ); - } - - int get_relative_x( ) { - int x = m_x; - for( auto parent = get_parent( ); !!parent; - parent = parent->get_parent( ) ) { - x += parent->x( ); - } - - return x; - } - - int get_relative_y( ) { - int y = m_y + get_y_offset( ); - for( auto parent = get_parent( ); !!parent; - parent = parent->get_parent( ) ) { - y += parent->y( ) + parent->get_y_offset( ); - } - - return y; - } - - void set_disabled( bool disabled ) { - m_disabled = disabled; - - for( auto& it : m_items ) { - it->set_disabled( disabled ); - } - } - - void set_disabled_callbacks( bool disabled ) { - auto top = get_top_parent( ); - - top->set_disabled( disabled ); - - m_disabled = false; - } - - protected: - int m_x{ }; - int m_y{ }; - - int m_width{ }; - int m_height{ }; - - //current y position for rendering - int m_y_offset{ }; - - bool m_visible = true; - bool m_disabled = false; - char m_text[ 256 ]{ }; - - std::shared_ptr< base_item > m_parent; - std::vector< std::shared_ptr< base_item > > m_items; - std::function< bool( ) > m_cond; - }; -} \ No newline at end of file diff --git a/gmod/ui_button.h b/gmod/ui_button.h deleted file mode 100644 index 022fc67..0000000 --- a/gmod/ui_button.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include - -#include "ui_base_item.h" - -namespace ui -{ - class c_button : public base_item { - public: - c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : - base_item( x, y, w, h, name ), m_fn( fn ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ); - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); - if ( !m_mouse_held ) { - m_fn( ); - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - - ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); - } - - protected: - std::function< void( ) > m_fn; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/gmod/ui_checkbox.h b/gmod/ui_checkbox.h deleted file mode 100644 index 50cad1c..0000000 --- a/gmod/ui_checkbox.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_checkbox : public base_item { - public: - c_checkbox( int x, int y, const char* txt, bool* setting ) : - base_item( x, y, 16, 16, txt ), m_setting( setting ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int rel_x = get_relative_x( ); - int rel_y = get_relative_y( ); - - return mouse_x >= rel_x && mouse_x <= rel_x + m_width - && mouse_y >= rel_y && mouse_y <= rel_y + m_height; - } - - inline void render_checkbox( const int& x, const int& y ) { - clr_t col = ui_get_bg_col( ); - if ( is_hovered( ) ) { - col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; - } - else if ( *m_setting ) { - col = ui_get_accent_col( ); - } - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); - - //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); - } - - inline void input( ) { - bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); - - if ( is_hovered( ) && mouse_presesed ) { - if ( !m_mouse_held ) { - *m_setting = !*m_setting; - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - render_checkbox( x, y ); - input( ); - - - ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); - } - - protected: - bool* m_setting; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/gmod/ui_color_picker.h b/gmod/ui_color_picker.h deleted file mode 100644 index 2711d29..0000000 --- a/gmod/ui_color_picker.h +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once - -#include "ui_base_item.h" -#include "d3d.hpp" - -namespace ui -{ - class c_color_picker : public base_item { - static constexpr int BOX_WIDTH = 106; - static constexpr int BOX_HEIGHT = 125; - public: - c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : - base_item( x, y, w, 4, name ), m_setting( setting ), - m_has_text( true ) { } - - c_color_picker( int x, int y, int w, clr_t* setting ) : - base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), - m_has_text( false ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ); - - int cursor_x, cursor_y; - ui_get_cursor_pos( cursor_x, cursor_y ); - - if ( m_has_text ) y += 12; - - if ( !m_active ) { - return cursor_x >= x && cursor_x <= x + m_width - && cursor_y >= y && cursor_y <= y + m_height; - } - - return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 - && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; - } - - virtual int get_total_height( ) const override { - return m_has_text ? ( m_height + 12 ) : m_height; - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_active ) { - m_mouse_held = true; - } - - m_active = true; - } - else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_active = false; - } - else { - m_mouse_held = false; - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - - m_hue = m_setting->hue( ); - if ( m_hue > 1.0f ) { - m_hue -= 359.f; - } - - m_saturation = m_setting->saturation( ); - m_brightness = m_setting->brightness( ) / 255.f; - m_alpha = m_setting->a( ); - } - - void output( ) { - *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); - m_setting->a( ) = m_alpha; - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - if ( m_has_text ) { - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - y += 12; - } - - input( ); - - if ( m_active ) { - RECT old_rect; - g_d3d.get_device( )->GetScissorRect( &old_rect ); - - RECT new_rect{ - x - 1, y - 1, - x + BOX_WIDTH + 22, - y + BOX_HEIGHT + 2 - }; - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - clr_t bg_col( 0, 0, 0, 90 ); - ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); - ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); - - for ( int i{ }; i < 100; i += 3 ) { - for ( int i2{ }; i2 < 100; i2 += 3 ) { - ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, - clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); - } - } - - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held - && mouse_x > x && mouse_x <= x + 100 - && mouse_y > y && mouse_y <= y + 100 ) { - - int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); - int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); - - int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); - int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); - - m_saturation = float( delta_y ) * 0.01f; - m_brightness = float( delta_x ) * 0.01f; - } - - auto is_hue_slider_hovered = [&]( ) -> bool { - return mouse_x > x + 110 && mouse_x < x + 122 - && mouse_y > y && mouse_y < y + 100; - }; - - auto draw_slider_hue = [&]( ) { - for ( int i{ }; i < 100; ++i ) { - auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); - - ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); - } - - ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, - is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); - }; - - auto is_alpha_slider_hovered = [&]( ) -> bool { - return mouse_x > x + 1 && mouse_x < x + 122 - && mouse_y > y + 110 && mouse_y < y + 124; - }; - - auto draw_slider_alpha = [&]( ) { - for ( int i{ 121 }; i >= 0; --i ) { - auto col = *m_setting; - col.a( ) = ( int )( float( i ) * 255.f / 121.f ); - - ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); - } - - int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); - ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, - is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); - }; - - draw_slider_hue( ); - if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - int delta = std::clamp( mouse_y - y, 0, 100 ); - m_hue = float( delta ) * 0.01f; - } - - draw_slider_alpha( ); - if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - int delta = std::clamp( mouse_x - x, 0, 121 ); - m_alpha = ( int )( float( delta ) * 255.f / 121.f ); - } - - output( ); - - g_d3d.get_device( )->SetScissorRect( &old_rect ); - } - else { - if ( is_hovered( ) ) { - ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); - } - ui_draw_rect( x, y, m_width, m_height, *m_setting ); - } - } - - protected: - clr_t* m_setting = nullptr; - bool m_active = false; - bool m_mouse_held = false; - float m_saturation = 1.0f; - float m_brightness = 1.0f; - float m_hue = 0.f; - uint8_t m_alpha = 255; - bool m_has_text = false; - }; -} \ No newline at end of file diff --git a/gmod/ui_draw.h b/gmod/ui_draw.h deleted file mode 100644 index 336c4fa..0000000 --- a/gmod/ui_draw.h +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once -#include "color.hpp" -#include "d3d.hpp" -#include "icons.hpp" -#include "d3d_sprite.hpp" -#include "input_system.hpp" - -namespace ui -{ - /*__forceinline auto ui_get_background_texture( ) { - static auto buffer = std::make_shared< byte[ 512 ] >( ); - static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); - static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); - static IDirect3DTexture9* texture; - - if ( !texture ) { - for ( int i = 0; i < 512; i += 4 ) { - *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; - } - - D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); - } - - return texture; - }*/ - - static float anim_time{ }; - - __forceinline void set_animtime( float animtime ) { - anim_time = animtime; - } - - __forceinline void setup_sprites( IDirect3DDevice9* device ) { - //fuck msvc - icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); - icons::sprite_visuals_.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); - icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); - icons::sprite_visuals.init( device, icons::raw::visuals, icons::visuals_size, 66, 66 ); - icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); - icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); - } - - __forceinline clr_t ui_get_accent_col( ) { - clr_t col_start = { - g_settings.menu.menu_color_1r, - g_settings.menu.menu_color_1g, - g_settings.menu.menu_color_1b - }; - - clr_t col_end = { - g_settings.menu.menu_color_2r, - g_settings.menu.menu_color_2g, - g_settings.menu.menu_color_2b - }; - - clr_t col = clr_t::blend( col_start, col_end, anim_time ); - - return col; - } - - __forceinline clr_t& ui_get_disabled_col( ) { - static clr_t col = clr_t( 61, 61, 61, 255 ); - return col; - } - - __forceinline clr_t& ui_get_bg_col( ) { - static clr_t col = clr_t( 24, 25, 27, 255 ); - return col; - } - - __forceinline clr_t& ui_get_text_col( ) { - static clr_t col = clr_t( 221, 221, 221, 255 ); - return col; - } - - __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, - clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { - - g_d3d.draw_gradient( start, end, x, y, w, h, type ); - } - - __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { - g_d3d.draw_line( color, x, y, x1, y1 ); - } - - __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { - g_d3d.draw_filled_rect( color, x, y, w, h ); - } - - __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { - g_d3d.draw_rect( color, x, y, w, h ); - } - - __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { - g_d3d.draw_circle( color, x, y, r, res ); - } - - __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { - g_d3d.draw_filled_circle( color, x, y, r, res ); - } - - __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { - char buf[ 2048 ]{ }; - va_list list{ }; - - __crt_va_start( list, str ); - vsprintf_s( buf, 2048, str, list ); - __crt_va_end( list ); - - g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, - center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); - } - - __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { - char* buf = ( char* )_alloca( 2048 ); - va_list list{ }; - - __crt_va_start( list, text ); - vsprintf_s( buf, 2048, text, list ); - __crt_va_end( list ); - - w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); - h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); - } - - __forceinline void ui_get_cursor_pos( int& x, int& y ) { - g_input.get_cursor_pos( x, y ); - } - - __forceinline float ui_get_frametime( ) { - return g_gmod.m_frametime; - } - - __forceinline void ui_draw_cursor( ) { - const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); - int x, y; - ui_get_cursor_pos( x, y ); - - - for ( int i{ }; i <= 9; ++i ) { - ui_draw_line( x, y, x + i, y + 11, accent ); - } - - for ( int i{ }; i <= 7; ++i ) { - ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); - } - - for ( int i{ }; i <= 3; ++i ) { - ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); - } - - ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); - ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); - - ui_draw_line( x, y, x, y + 17, black ); - ui_draw_line( x, y + 17, x + 3, y + 14, black ); - ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); - ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); - ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); - ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); - ui_draw_line( x + 11, y + 12, x, y, black ); - } -} \ No newline at end of file diff --git a/gmod/ui_dropdown.h b/gmod/ui_dropdown.h deleted file mode 100644 index 0c4e990..0000000 --- a/gmod/ui_dropdown.h +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once -#include "ui_dropdown_item.h" - -namespace ui -{ - template < typename t = int > - class c_dropdown : public base_item { - public: - c_dropdown( int x, int y, int w, const char* name, t* setting, - std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : - base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), - m_max_items( max_items ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - inline bool is_any_item_hovered( ) { - if ( m_disabled || !m_active ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + m_height + 12; - int h = m_height * ( std::min< size_t >( - m_dropdown_items->size( ), m_max_items ) ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - virtual int get_total_height( ) const override { - return m_height + 13; - } - - void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { - ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); - ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); - - ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); - } - - void update_value( ) { - for ( auto& it : *m_dropdown_items ) { - if ( it.m_value == *m_setting ) { - m_selected_item = ⁢ - } - } - } - - void draw_items( const int& x, const int& y ) { - auto& items = *m_dropdown_items; - auto it = &items.front( ); - int offset = m_height + 1; - int hovered = 0; - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - auto is_hovered = [ & ] ( int y_offset ) { - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; - }; - - - for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; - i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); - ++i, offset += m_height + 1 - ) { - it = &items.at( i ); - - draw_box( x, y + offset, it->m_name ); - - if ( is_hovered( offset ) ) { - hovered = offset; - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_selected_item = it; - *m_setting = it->m_value; - m_active = false; - m_enable_time = GetTickCount( ) * 0.001f + 0.220f; - m_enable_next_frame = true; - } - } - } - - if ( hovered ) { - ui_draw_outlined_rect( x - 1, y - 1 + hovered, - m_width + 1, m_height + 1, ui_get_text_col( ) ); - } - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = !m_active; - } - m_mouse_held = true; - } - else if ( !is_any_item_hovered( ) ) { - m_mouse_held = false; - } - - if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { - m_active = false; - } - - if ( GetTickCount( ) * 0.001f > m_enable_time && m_enable_next_frame ) { - set_disabled_callbacks( false ); - m_enable_next_frame = false; - } - - - active_changed = m_active != active_backup; - //disable input on all items - if ( active_changed ) { - if ( !m_active ) { - m_enable_time = GetTickCount( ) * 0.001f + 0.220f; - m_enable_next_frame = true; - } - else { - set_disabled_callbacks( true ); - } - } - - if ( m_selected_item ) { - *m_setting = m_selected_item->m_value; - } - - if ( m_active && m_dropdown_items->size( ) > m_max_items ) { - int scroll_input = g_input.get_scroll_state( ); - - if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max - m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it - - if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) - m_curr_scroll = m_dropdown_items->size( ) - m_max_items; - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - bool restore = false; - RECT prev_rect{ }; - - if ( m_active ) { - restore = true; - g_d3d.get_device( )->GetScissorRect( &prev_rect ); - - RECT new_rect{ - prev_rect.left, - prev_rect.top, - g_d3d.m_width, - g_d3d.m_height, - }; - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - draw_items( x, y + 11 ); - - - //draw scrollbar - size_t total_items = m_dropdown_items->size( ); - if ( total_items > m_max_items ) { - const size_t height = ( m_height + 1 ) * m_max_items; - const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); - - size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); - ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); - } - } - - update_value( ); - input( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, - is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - if ( m_selected_item ) { - ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); - } - - if( restore ) { - g_d3d.get_device( )->SetScissorRect( &prev_rect ); - } - } - - protected: - std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; - dropdowns::dropdown_item_t< t >* m_selected_item{ }; - bool m_active = false; - bool m_mouse_held = false; - t* m_setting{ }; - size_t m_max_items{ }; - size_t m_curr_scroll{ }; - float m_enable_time{ }; - int m_enable_next_frame{ }; - }; -} \ No newline at end of file diff --git a/gmod/ui_dropdown_item.h b/gmod/ui_dropdown_item.h deleted file mode 100644 index 4723af8..0000000 --- a/gmod/ui_dropdown_item.h +++ /dev/null @@ -1,183 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - namespace dropdowns - { - template < typename t = int > - struct dropdown_item_t { - const char* m_name; - t m_value; - }; - - std::vector< dropdown_item_t< > > activation_types_aimbot = { - { xors( "always" ), 0 }, - { xors( "on key" ), 1 }, - }; - - std::vector< dropdown_item_t< > > silent_aimbot_types = { - { xors( "none" ), 0 }, - { xors( "client-side" ), 1 }, - { xors( "server-side" ), 2 }, - }; - - std::vector< dropdown_item_t< > > hitboxes = { - { xors( "hitscan" ), -1 }, - { xors( "head" ), 0 }, - { xors( "neck" ), 1 }, - { xors( "pelvis" ), 2 }, - { xors( "chest" ), 3 }, - }; - - std::vector< dropdown_item_t< > > antiaim_yaw = { - { xors( "normal" ), 0 }, - { xors( "backwards" ), 1 }, - { xors( "backwards spin" ), 2 }, - { xors( "direction" ), 6 }, - { xors( "sideways" ), 3 }, - { xors( "golden spin" ), 4 }, - { xors( "random" ), 5 }, - }; - - std::vector< dropdown_item_t< > > delay_type = { - { xors( "none" ), 0 }, - { xors( "fake lag" ), 1 }, - { xors( "time" ), 2 }, - { xors( "velocity" ), 3 }, - }; - - std::vector< dropdown_item_t< > > antiaim_pitch = { - { xors( "normal" ), 0 }, - { xors( "custom" ), 1 }, - { xors( "flip" ), 2 }, - { xors( "minimal" ), 3 }, - { xors( "random" ), 4 } - }; - - std::vector< dropdown_item_t< > > antiaim_freestanding = { - { xors( "disabled" ), 0 }, - { xors( "static" ), 1 }, - { xors( "narrow angle" ), 2 }, - { xors( "wide angle" ), 3 }, - }; - - std::vector< dropdown_item_t< > > antiaim_edge = { - { xors( "off" ), 0 }, - { xors( "peek" ), 1 }, - { xors( "full" ), 2 }, - }; - - std::vector< dropdown_item_t< > > antiaim_edge_type = { - { xors( "static" ), 0 }, - { xors( "narrow angle" ), 1 }, - { xors( "wide angle" ), 2 }, - }; - - std::vector< dropdown_item_t< > > fakelag_types = { - { xors( "disabled" ), 0 }, - { xors( "adaptive" ), 1 }, - { xors( "fluctuate" ), 2 }, - { xors( "static" ), 3 }, - }; - - std::vector< dropdown_item_t< > > activation_type_visuals = { - { xors( "never" ), 0 }, - { xors( "always" ), 1 }, - { xors( "on hold" ), 2 }, - { xors( "toggle" ), 3 }, - }; - - std::vector< dropdown_item_t< > > configs = { - { xors( "legit" ), 0 }, - { xors( "closet" ), 1 }, - { xors( "rage 1" ), 2 }, - { xors( "rage 2" ), 3 }, - }; - - std::vector< dropdown_item_t< > > recorder_angles = { - { xors( "none" ), 0 }, - { xors( "shot" ), 1 }, - { xors( "all" ), 2 } - }; - - std::vector< dropdown_item_t< > > baim_types = { - { xors( "off" ), 0 }, - { xors( "basic" ), 1 }, - { xors( "smart" ), 2 }, - { xors( "aggressive" ), 3 }, - { xors( "force" ), 4 }, - }; - - std::vector< dropdown_item_t< > > name_changers = { - { xors( "off" ), 0 }, - { xors( "dollar" ), 1 }, - { xors( "moneybot.cc" ), 2 }, - }; - - std::vector< dropdown_item_t< > > weapon_esp_types = { - { xors( "none" ), 0 }, - { xors( "icon" ), 1 }, - { xors( "name" ), 2 }, - }; - - std::vector< dropdown_item_t< > > fake_ping_activation = { - { xors( "off" ), 0 }, - { xors( "on hold" ), 1 }, - { xors( "toggle" ), 2 }, - { xors( "always" ), 3 }, - { xors( "auto" ), 4 } - }; - - std::vector< dropdown_item_t< > > world_esp_type = { - { xors( "off" ), 0 }, - { xors( "name" ), 1 }, - { xors( "glow" ), 2 }, - { xors( "both" ), 3 } - }; - - std::vector< dropdown_item_t< > > multipoint_types = { - { xors( "off" ), 0 }, - { xors( "minimal" ), 1 }, - { xors( "vitals" ), 2 }, - { xors( "full" ), 3 } - }; - - std::vector< dropdown_item_t< > > edge_priority = { - { xors( "freestanding" ), 0 }, - { xors( "edge" ), 1 } - }; - - std::vector< dropdown_item_t< > > selection_type = { - { xors( "fov" ), 0 }, - { xors( "distance" ), 1 } - }; - - std::vector< dropdown_item_t< > > autobuy_main_wep = { - { xors( "none" ), 0 }, - { xors( "autosniper" ), 1 }, - { xors( "scout" ), 2 }, - { xors( "sniper" ), 3 }, - { xors( "ak/m4" ), 4 }, - { xors( "aug/sg" ), 5 }, - { xors( "mac10/mp9" ), 6 }, - }; - - std::vector< dropdown_item_t< > > autobuy_second_wep = { - { xors( "none" ), 0 }, - { xors( "deagle/r8" ), 1 }, - { xors( "dualies" ), 2 }, - }; - - std::vector< dropdown_item_t< > > skin_knives = { - { xors( "none" ), 0 }, - { xors( "bayonet" ), 1 }, - { xors( "flip knife" ), 2 }, - { xors( "gut knife" ), 3 }, - { xors( "karambit" ), 4 }, - { xors( "m9 bayonet" ), 5 }, - { xors( "huntsman" ), 6 }, - }; - } -} \ No newline at end of file diff --git a/gmod/ui_form.h b/gmod/ui_form.h deleted file mode 100644 index 0791528..0000000 --- a/gmod/ui_form.h +++ /dev/null @@ -1,187 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_form : public base_item { - public: - c_form( int x, int y, int w, int h, const char* name, int max_h = 0, bool collapse = false ) : - base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ), m_collapse( collapse ) { }; - - virtual int x( ) const override { - return m_x + 10; - } - - virtual int y( ) const override { - return m_y + m_scroll_offset + 9; - } - - virtual bool is_form( ) const override { - return true; - } - - virtual bool is_hovered( ) override { - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int x = get_relative_x( ); - int y = get_relative_y( ); - - return mouse_x > x && mouse_x < x + w( ) - && mouse_y > y && mouse_y < y + h( ); - } - - bool is_collapse_hovered( ) { - if( !m_collapse ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int x = get_relative_x( ) + m_width - 8; - int y = get_relative_y( ) + 2; - - return mouse_x >= x && mouse_x <= x + 5 - && mouse_y >= y && mouse_y <= y + 7; - } - - bool is_collapsed( ) { - return ( m_collapse && !m_open ); - } - - inline void update_size( ) { - if ( !m_dynamic ) return; - - int total_height{ ITEM_OFFSET * 2 }; - for ( auto& it : m_items ) { - if ( it->get_visible( ) ) { - auto item_height = it->get_total_height( ) + ITEM_OFFSET; - if( m_max_height && total_height + item_height > m_max_height ) { - total_height = m_max_height; - break; - } - total_height += it->get_total_height( ) + ITEM_OFFSET; - } - } - - m_height = total_height; - } - - virtual int get_total_height( ) const override { - if( !m_open && m_collapse ) return 18; - return m_height + 5; - } - - int get_total_item_height( ) { - int total_height{ ITEM_OFFSET * 2 }; - for( auto& it : m_items ) { - if( it->get_visible( ) ) { - auto item_height = it->get_total_height( ) + ITEM_OFFSET; - total_height += it->get_total_height( ) + ITEM_OFFSET; - } - } - - return total_height; - } - - void input( ) { - if( m_collapse ) { - bool hovered = is_collapse_hovered( ); - bool clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - if( hovered && clicked ) { - if( !m_was_pressed ) { - m_open ^= 1; - } - m_was_pressed = true; - } - else { - m_was_pressed = false; - } - } - - if( m_max_height && get_total_item_height( ) > m_max_height ) { - if( !m_disabled && is_hovered( ) ) { - auto scroll_state = g_input.get_scroll_state( ); - if( !!scroll_state && m_was_hovered ) { - scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; - } - m_scroll_offset = std::clamp( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ), 0 ); - } - } - else { - m_scroll_offset = 0; - } - } - - virtual void render( ) override { - update_size( ); - input( ); - int x = get_relative_x( ); - int y = get_relative_y( ); - - int text_w, text_h; - ui_get_text_size( text_w, text_h, m_text ); - - if( m_collapse ) { - if( !m_open && m_collapse ) { - ui_draw_outlined_rect( x, y, m_width, 14, ui_get_accent_col( ) ); - ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); - ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); - - int button_x = x + m_width - 6; - int button_y = y + 2; - - ui_draw_string( button_x, button_y, true, - is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "+" ); - return; - } - } - - for( int i{ }; i < 8; ++i ) { - clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); - ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); - } - - ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); - - if( m_max_height && get_total_item_height( ) > m_height ) { - const size_t height = get_total_height( ) - 20; - const float delta = ( float )( get_total_item_height( ) - height + 1 ); - const float slider_step = ( ( float )( height ) / delta ); - const float slider_height = slider_step * 13.f; - - size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); - ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); - ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); - } - - if( is_hovered( ) != m_was_hovered ) { - bool backup = m_disabled; - if( !backup ) { - set_disabled( !is_hovered( ) ); - } - m_disabled = backup; - } - - ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); - ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); - if( m_collapse ) { - int button_x = x + m_width - 6; - int button_y = y + 2; - - ui_draw_string( button_x, button_y, true, - is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "-" ); - } - - m_was_hovered = is_hovered( ); - } - - protected: - bool m_dynamic{ }; - bool m_was_hovered{ }; - int m_max_height{ }; - int m_scroll_offset{ }; - bool m_was_pressed{ }; - bool m_collapse{ }; - bool m_open{ true }; - }; -} \ No newline at end of file diff --git a/gmod/ui_key_picker.h b/gmod/ui_key_picker.h deleted file mode 100644 index 03aed84..0000000 --- a/gmod/ui_key_picker.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_key_picker : public base_item { - public: - c_key_picker( int x, int y, int w, const char* name, int* setting ) : - base_item( x, y, w, 16, name ), m_setting( setting ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - virtual int get_total_height( ) const override { - return m_height + 12; - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = true; - } - m_mouse_held = true; - } - - if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { - m_active = false; - *m_setting = KEYS_NONE; - } - - if ( m_active && !m_mouse_held ) { - int key = g_input.is_any_key_pressed( ); - if ( key != KEYS_NONE ) { - *m_setting = key; - m_active = false; - } - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - input( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, - is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), - g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); - } - - protected: - int* m_setting{ }; - bool m_active{ }; - bool m_mouse_held{ }; - }; - - //skEeT PiCkErS - class c_key_picker_small : public base_item { - public: - c_key_picker_small( int x, int y, int* setting ) : - base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } - - virtual int get_total_height( ) const override { - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int w, h; - ui_get_text_size( w, h, name ); - - return h; - } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int x = get_relative_x( ); - int y = get_relative_y( ); - int mouse_x, mouse_y; - int w, h; - - ui_get_text_size( w, h, "[%s]", name ); - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= x - w && mouse_x <= x - && mouse_y >= y && mouse_y <= y + h; - } - - void input( ) { - - bool active_backup = m_active; - bool active_changed = false; - - if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { - m_active = false; - *m_setting = KEYS_NONE; - } - - if ( m_active && !m_mouse_held ) { - int key = g_input.is_any_key_pressed( ); - if ( key != KEYS_NONE ) { - *m_setting = key; - m_active = false; - } - } - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = true; - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - } - - virtual void render( ) override { - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int x = get_relative_x( ); - int y = get_relative_y( ); - - int w, h; - ui_get_text_size( w, h, "[%s]", name ); - - input( ); - - ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? - ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); - } - - protected: - int* m_setting; - bool m_active{ }; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/gmod/ui_label.h b/gmod/ui_label.h deleted file mode 100644 index 9df46b5..0000000 --- a/gmod/ui_label.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_label : public base_item { - public: - c_label( int x, int y, const char* text ) : - base_item( x, y, 0, 16, text ) { } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); - } - }; -} \ No newline at end of file diff --git a/gmod/ui_menu.h b/gmod/ui_menu.h deleted file mode 100644 index 53a17a0..0000000 --- a/gmod/ui_menu.h +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_menu : public base_item { - public: - c_menu( int start_x, int start_y, int width, - int height, const char* name, const char* right_text = nullptr ) : - base_item( start_x, start_y, width, height, name ), - m_right_text( right_text ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= m_x && mouse_x <= m_x + w( ) - && mouse_y >= m_y && mouse_y <= m_y + 19; - } - - virtual int y( ) const override { - return m_y + 19; - } - - inline void input( ) { - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - - if ( is_hovered( ) ) { - m_mouse_held = true; - } - - if ( !mouse_clicked ) { - m_mouse_held = is_hovered( ); - } - - if ( m_mouse_held && !mouse_clicked ) { - m_drag_offset_y = mouse_y - m_y; - m_drag_offset_x = mouse_x - m_x; - } - - if ( m_mouse_held && mouse_clicked ) { - m_x = mouse_x - m_drag_offset_x; - m_y = mouse_y - m_drag_offset_y; - } - } - - virtual void render( ) override { - constexpr auto top_height = 19; - - input( ); - - //draw a c00l shadow - ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); - - ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); - if( is_hovered( ) ) { - ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); - } - - for( int i{ }; i < 8; ++i ) { - clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); - ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); - } - ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); - - if( m_right_text ) { - ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); - - int width, height; - ui_get_text_size( width, height, m_right_text ); - - ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); - } - else { - ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); - } - } - - protected: - int m_drag_offset_x{ }; - int m_drag_offset_y{ }; - bool m_mouse_held{ }; - const char* m_right_text{ }; - }; -} \ No newline at end of file diff --git a/gmod/ui_render.h b/gmod/ui_render.h deleted file mode 100644 index f67f16b..0000000 --- a/gmod/ui_render.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - //recursively render all items - static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { - if( !item->get_visible( ) ) return; - - item->reset( ); - item->render( ); - bool reset = false; - RECT original; - - if( allow_rect && item->is_form( ) ) { - auto device = g_d3d.get_device( ); - device->GetScissorRect( &original ); - - auto x = item->get_relative_x( ); - auto y = item->get_relative_y( ); - - RECT new_rect{ - x, - y + 4, - x + item->w( ), - y + item->get_total_height( ) - 7 - }; - - device->SetScissorRect( &new_rect ); - reset = true; - } - - bool draw = true; - if( item->is_form( ) ) { - auto form_cast = static_cast< c_form* >( item ); - draw = !form_cast->is_collapsed( ); - } - - if( item->get_items( ).size( ) && draw ) { - //madr0fl - int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); - int cur_offset = 0; - for( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { - auto& cur_item = item->get_items( )[ i ]; - height_offset[ i ] = cur_offset; - cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; - } - - int i{ }; - for( auto& it : item->get_items( ) ) { - item->set_y_offset( height_offset[ i ] ); - render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); - ++i; - } - } - - if( reset ) { - auto device = g_d3d.get_device( ); - device->SetScissorRect( &original ); - } - } -} \ No newline at end of file diff --git a/gmod/ui_slider.h b/gmod/ui_slider.h deleted file mode 100644 index 0e55a73..0000000 --- a/gmod/ui_slider.h +++ /dev/null @@ -1,165 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - template < typename t > - class c_slider : public base_item { - public: - c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : - base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; - - c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : - base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; - - c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : - base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - if( !m_has_text ) { - x += 4; - return mouse_x >= x && mouse_x <= x + m_width - 8 - && mouse_y >= y && mouse_y <= y + m_height + 2; - } - - return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 - && mouse_y >= y && mouse_y <= y + m_height + 2; - } - - void input( ) { - bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - bool hovered = is_hovered( ); - float progress = 0.f; - int x = get_relative_x( ); - int y = get_relative_y( ) + 2; - int mouse_x, mouse_y; - - *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); - ui_get_cursor_pos( mouse_x, mouse_y ); - - if ( hovered && mouse_clicked ) { - - float progress{ }; - - if( m_has_text ) { - progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); - } - else { - progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); - } - - *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); - } - - if( !m_has_text ) { - bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; - - bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; - bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; - - if( mouse_clicked ) { - if( !m_mouse_held ) { - if( !std::is_floating_point< t >::value ) { - if( minus_hovered ) *m_setting -= ( t )1; - if( plus_hovered ) *m_setting += ( t )1; - } - else if( m_max - m_min <= 2.0f ) { - if( minus_hovered ) *m_setting -= ( t )0.1f; - if( plus_hovered ) *m_setting += ( t )0.1f; - } - } - - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - } - }; - - void draw_slider( int x, int y ) { - float val = float( *m_setting ); - float progress = ( val - m_min ) / ( m_max - m_min ); - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - - ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); - ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); - } - - void draw_slider_small( int x, int y ) { - float val = float( *m_setting ); - float progress = ( val - m_min ) / ( m_max - m_min ); - x -= 1; //i couldnt be fucked - - ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); - - ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); - ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); - - ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); - ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); - - char val_str[ 12 ]; - if( m_suffix ) - sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); - else - sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); - - ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ) + 3, y + 2, true, ui_get_text_col( ), val_str ); - } - - virtual int get_total_height( ) const override { - return m_height + ( m_has_text ? 12 : 6 ); - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - int text_w, text_h; - char val[ 12 ]; - - input( ); - - //weird hacky fix for floating point vars - if ( m_suffix ) - sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); - else - sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); - - if( m_has_text ) { - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_get_text_size( text_w, text_h, val ); - ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); - draw_slider( x, y + 12 ); - } - else { - draw_slider_small( x, y + 2 ); - } - } - - - protected: - t* m_setting; - t m_full; - float m_min; - float m_max; - bool m_has_text = true; - const char* m_suffix; - bool m_mouse_held = false; - }; -} \ No newline at end of file diff --git a/gmod/ui_tab_manager.h b/gmod/ui_tab_manager.h deleted file mode 100644 index b771470..0000000 --- a/gmod/ui_tab_manager.h +++ /dev/null @@ -1,228 +0,0 @@ -#pragma once -#include "ui_base_item.h" - - - -namespace ui -{ - namespace { - constexpr int BUTTON_WIDTH = 120; - constexpr int BUTTON_HEIGHT = 100; - - constexpr int SUBTAB_HEIGHT = 25; - } - - class c_tab_sheet : public base_item { - public: - c_tab_sheet( const char* tab_name ) : - base_item( 0, 0, 0, 0, tab_name ), - m_fade_progress( 0 ) { }; - - c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : - base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), - m_fade_progress( 0.f ) { - }; - - virtual void render( ) override { }; - virtual bool is_hovered( ) override { - return false; - }; - - public: - float m_fade_progress{ }; - d3d::c_sprite* m_sprite{ }; - }; - - - class c_tab_manager : public base_item { - public: - c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, - xors( "TAB_MANAGER" ) ) { }; - - virtual bool is_hovered( ) override { - return false; - } - - inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { - if ( hovered ) { - constexpr float frequency = 1.f / 0.3f; - const float step = ui_get_frametime( ) * frequency; - - item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); - } - else { - item->m_fade_progress = 0.f; - } - } - - auto get_selected_tab( ) { - return m_selected_tab; - } - - void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { - auto item = ( c_tab_sheet* )button.get( ); - auto text = item->get_text( ); - auto parent_x = m_parent->x( ) + 5; - auto parent_y = m_parent->y( ) + 5; - int item_height = BUTTON_HEIGHT; - - scale_button_fade( item, hovered ); - - ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, - item_height + 1, ui_get_bg_col( ) ); - - ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, - parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, - ui_get_disabled_col( ) ); - - if( hovered ) { - ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, - parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, - ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); - } - - if( item->m_sprite ) { - auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); - item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, - parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); - } - else { - g_con->log( "sprite is null" ); - } - } - - inline bool is_button_hovered( int start ) { - auto item_x = m_parent->x( ) + 5; - auto item_y = m_parent->y( ) + 5 + start; - int item_height = BUTTON_HEIGHT; - int mouse_x, mouse_y; - - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 - && mouse_y >= item_y && mouse_y <= item_y + item_height; - } - - virtual void render( ) override { - if ( !m_items.empty( ) ) { - int cur_y{ 10 }; - for ( auto& it : m_items ) { - it->set_visible( false ); - bool hovered = is_button_hovered( cur_y ); - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { - //fix items that disable input mess it up when changing tabs - set_disabled_callbacks( false ); - m_selected_tab = it; - } - - draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); - cur_y += BUTTON_HEIGHT + 4; - } - } - - if ( !m_selected_tab ) { - m_selected_tab = m_items.front( ); - } - - m_selected_tab->set_visible( true ); - } - - protected: - decltype( m_parent ) m_selected_tab{ }; - }; - - - class c_subtab_manager : public base_item { - public: - c_subtab_manager( ) : base_item( 0, 35, 0, 5, - xors( "SUBTAB_MANAGER" ) ) { } - - virtual bool is_hovered( ) override { return false; } - - int get_button_width( ) { - int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; - - if ( !m_items.empty( ) ) - return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); - - return width; - } - - inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { - if ( hovered ) { - constexpr float frequency = 1.f / 0.3f; - const float step = ui_get_frametime( ) * frequency; - - item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); - } - else { - item->m_fade_progress = 0.f; - } - } - - auto get_selected_tab( ) { - return m_selected_tab; - } - - void render_button( decltype( m_parent )& button, int start, bool hovered ) { - auto item = ( c_tab_sheet* )button.get( ); - auto item_x = get_relative_x( ) + start - 2; - auto item_y = get_relative_y( ) + 3 - m_y; - auto width = get_button_width( ); - - scale_button_fade( item, hovered ); - clr_t tab_clr = ui_get_disabled_col( ); - - //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); - ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); - if ( hovered ) { - clr_t col = ui_get_accent_col( ); - col.a( ) *= item->m_fade_progress; - ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); - } - - ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); - } - - bool is_button_hovered( decltype( m_parent )& button, int start ) { - int item_x = get_relative_x( ) + start - 2; - int item_y = get_relative_y( ) + 3 - m_y - 3; - int item_w = get_button_width( ); - int mouse_x, mouse_y; - - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= item_x && mouse_x <= item_x + item_w && - mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; - } - - virtual void render( ) override { - if ( !m_items.empty( ) ) { - int start = 2; - int width = get_button_width( ); - - for ( auto& it : m_items ) { - it->set_visible( false ); - bool hovered = is_button_hovered( it, start ); - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { - //fix items that disable input mess it up when changing tabs - set_disabled_callbacks( false ); - m_selected_tab = it; - } - - render_button( it, start, hovered || it == m_selected_tab ); - start += width; - } - - if ( !m_selected_tab ) { - m_selected_tab = m_items.front( ); - } - - m_selected_tab->set_visible( true ); - } - } - - protected: - decltype( m_parent ) m_selected_tab; - }; -} \ No newline at end of file diff --git a/gmod/ui_text_input.h b/gmod/ui_text_input.h deleted file mode 100644 index f486106..0000000 --- a/gmod/ui_text_input.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_text_input : public base_item { - c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str ) : - base_item( x, y, w, 16, name ), m_length( max_chars ), m_str( str ) { } - - virtual bool is_hovered( ) override { - - } - - void input( ) { - static float last_press[ KEYS_MAX ]{ }; - - int key = g_input.is_any_key_pressed( ); - if ( key == KEYS_BACK ) { - if ( strlen( m_str ) ) { - m_str[ strlen( m_str ) - 1 ] = 0; - } - } - if ( key != KEYS_NONE ) { - float cur_time = GetTickCount( ) * 0.001f; - if ( std::abs( cur_time - last_press[ key ] ) > 0.1f ) { - - auto scan_code = MapVirtualKeyA( key, MAPVK_VK_TO_VSC ); - uword_t ascii; - ToAscii( key, scan_code, 0, &ascii, 0 ); - char str[ 2 ] = { ( char )ascii, 0 }; - strcat_s( m_str, m_length, str ); - - last_press[ key ] = cur_time; - } - } - } - - virtual void render( ) override { - - } - - protected: - size_t m_length{ }; - char* m_str{ }; - - }; -} \ No newline at end of file diff --git a/gmod/util.cpp b/gmod/util.cpp deleted file mode 100644 index a038871..0000000 --- a/gmod/util.cpp +++ /dev/null @@ -1,265 +0,0 @@ -#include "util.hpp" - -#include "interface.hpp" -#include "c_base_player.hpp" -#include "pattern.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "math.hpp" -#include "base_cheat.hpp" - -float TICK_INTERVAL( ) { - return g_gmod.m_globals->m_interval_per_tick; -} - -int TIME_TO_TICKS( float dt ) { - return static_cast< int >( 0.5f + dt / TICK_INTERVAL( ) ); -} - -float TICKS_TO_TIME( int tick ) { - return tick * TICK_INTERVAL( ); -} - -bool util::is_low_fps( ) { - return g_gmod.m_globals->m_frametime > g_gmod.m_globals->m_interval_per_tick; -} - -/* -int util::get_closest_player( ) { - float cur_fov{ 360.f }; - int ret{ -1 }; - vec3_t viewangles{ }; - vec3_t local_pos{ }; - - bool friendlies = g_settings.rage.active ? - g_settings.rage.friendlies : g_settings.legit.friendlies; - - local_pos = g_ctx.m_local->get_eye_pos( ); - g_gmod.m_engine( )->GetViewAngles( viewangles ); - - for( int i{ 1 }; i < g_gmod.m_globals->m_maxclients; ++i ) { - auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); - - if( !ent ) continue; - if( ent == g_ctx.m_local ) continue; - if( !ent->is_valid( ) ) continue; - int team = ent->m_iTeamNum( ); - if( team == g_ctx.m_local->m_iTeamNum( ) && !friendlies ) { - continue; - } - - auto ang = math::vector_angles( local_pos, ent->get_hitbox_pos( 0 ) ); - ang.clamp( ); - - float fov = ( viewangles - ang ).clamp( ).length2d( ); - if( fov < cur_fov ) { - ret = i; - cur_fov = fov; - } - } - - return ret; -} -*/ - -void util::clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, - unsigned mask, CTraceFilter* filter, CGameTrace* tr ) { - CGameTrace player_trace; - Ray_t ray; - float smallest_fraction = tr->fraction; - - ray.Init( src, end ); - - if ( !filter->ShouldHitEntity( player, mask ) ) { - return; - } - - g_gmod.m_trace( )->ClipRayToEntity( ray, mask | CONTENTS_HITBOX, player, &player_trace ); - - if ( player_trace.fraction < smallest_fraction ) { - *tr = player_trace; - smallest_fraction = player_trace.fraction; - } -} - -std::string util::hitgroup_to_string( int hitgroup ) { - switch( hitgroup ) { - case HITGROUP_CHEST: - return xors( "chest" ); - case HITGROUP_HEAD: - return xors( "head" ); - case HITGROUP_LEFTARM: - return xors( "left arm" ); - case HITGROUP_LEFTLEG: - return xors( "left leg" ); - case HITGROUP_RIGHTARM: - return xors( "right arm" ); - case HITGROUP_RIGHTLEG: - return xors( "right leg" ); - case HITGROUP_STOMACH: - return xors( "stomach" ); - default: - return xors( "generic" ); - } -} - -bool util::trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ) { - CGameTrace tr; - Ray_t ray; - CTraceFilter filter; - - filter.pSkip = a; - - ray.Init( start, end ); - - g_gmod.m_trace( )->TraceRay( ray, 0x46004003 | CONTENTS_HITBOX, &filter, &tr ); - clip_trace_to_player( b, start, end, ( unsigned )0x46004003, &filter, &tr ); - - return tr.m_pEnt == b || tr.fraction > 0.98f; -} - -void util::set_random_seed( int seed ) { - using fn = int( __cdecl* )( int ); - static fn fn_ptr = ( fn )( GetProcAddress( - GetModuleHandleA( xors( "vstdlib.dll" ) ), - xors( "RandomSeed" ) ) ); - - fn_ptr( seed ); -} - -float util::get_random_float( float min, float max ) { - using fn = float( *)( float, float ); - static fn fn_ptr = ( fn )( GetProcAddress( - GetModuleHandleA( xors( "vstdlib.dll" ) ), - xors( "RandomFloat" ) ) ); - - return fn_ptr( min, max ); -} - -vec3_t util::get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ) { - set_random_seed( ( seed & 0xff ) + 1 ); - - float rand_a = get_random_float( 0.0f, 1.0f ); - float pi_rand_a = get_random_float( 0.f, 2.f * M_PI ); - float rand_b = get_random_float( 0.f, 1.0f ); - float pi_rand_b = get_random_float( 0.f, 2.f * M_PI ); - - float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); - float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); - - vec3_t forward, right, up; - math::angle_vectors( angles, &forward, &right, &up ); - - vec3_t spread_dir = forward + ( right * spread_x ) + ( up * spread_y ); - spread_dir.normalize_vector( ); - - return spread_dir; -} - -float util::get_total_latency( ) { - auto nci = g_gmod.m_engine( )->GetNetChannelInfo( ); - - if ( nci ) { - float latency = nci->GetLatency( 0 ) + nci->GetLatency( 1 ); - return latency; - } - - return 0.f; -} - -float util::get_lerptime( ) { - static cvar_t* cl_interpolate = g_gmod.m_cvar( )->FindVar( xors( "cl_interpolate" ) ); - static cvar_t* cl_interp = g_gmod.m_cvar( )->FindVar( xors( "cl_interp" ) ); - static cvar_t* cl_updaterate = g_gmod.m_cvar( )->FindVar( xors( "cl_updaterate" ) ); - static cvar_t* cl_interp_ratio = g_gmod.m_cvar( )->FindVar( xors( "cl_interp_ratio" ) ); - - if( cl_interp && cl_interpolate && cl_updaterate && cl_interp_ratio ) { - bool interpolate = cl_interpolate->get_int( ); - if( interpolate ) { - float interp = cl_interp->get_float( ); - float interp_ratio = cl_interp_ratio->get_float( ); - float updaterate = cl_updaterate->get_float( ); - - return std::max< float >( interp, interp_ratio / updaterate ); - } - } - - return 0.f; -} - -/* -bool util::is_tick_valid( int tickcount ) { - float latency = get_total_latency( ); - float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); - float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) + TICK_INTERVAL( ) * 2.f ); - - return std::abs( delta ) < 0.2f; -} - -bool util::is_tick_valid( int tickcount, float in_latency ) { - float latency = in_latency; - auto nci = g_gmod.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - latency += nci->GetLatency( 0 ); - } - - float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); - float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) + TICK_INTERVAL( ) ); - - return std::abs( delta ) < 0.2f; -} -*/ -void util::disable_pvs( ) { - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_valid( ) ) - continue; - - if( ent == g_ctx.m_local ) - continue; - - *( int* )( uintptr_t( ent ) + 0xa30 ) = g_gmod.m_globals->m_framecount; - *( int* )( uintptr_t( ent ) + 0xa28 ) = 0; - } -} - -vec2_t util::screen_transform( vec3_t world ) { - vec2_t screen; - auto w2s = [ &world, &screen ]( ) -> bool { - - //matrix3x4& matrix2 = *( matrix3x4* )( 0x18C * 2 + *( uintptr_t * )( ( uintptr_t )g_gmod.m_engine_render( ) + 0xDC ) - 0x44 ); - VMatrix& matrix = g_cheat.m_visuals.get_matrix( ); - - screen.x = matrix[ 0 ][ 0 ] * world[ 0 ] + matrix[ 0 ][ 1 ] * world[ 1 ] + matrix[ 0 ][ 2 ] * world[ 2 ] + matrix[ 0 ][ 3 ]; - screen.y = matrix[ 1 ][ 0 ] * world[ 0 ] + matrix[ 1 ][ 1 ] * world[ 1 ] + matrix[ 1 ][ 2 ] * world[ 2 ] + matrix[ 1 ][ 3 ]; - - float w = matrix[ 3 ][ 0 ] * world[ 0 ] + matrix[ 3 ][ 1 ] * world[ 1 ] + matrix[ 3 ][ 2 ] * world[ 2 ] + matrix[ 3 ][ 3 ]; - - if( w < 0.001f ) { - //screen.x *= 100000.f; - //screen.y *= 100000.f; - return true; - } - - float invw = 1.0f / w; - screen.x *= invw; - screen.y *= invw; - - return false; - }; - - w2s( ); - //if ( !w2s( ) ) { - int w, h; - g_gmod.m_engine( )->GetScreenSize( w, h ); - - screen.x = ( w * .5f ) + ( screen.x * w ) * .5f; - screen.y = ( h * .5f ) - ( screen.y * h ) * .5f; - - return screen; - //} - - return vec2_t{ }; -} - diff --git a/gmod/util.hpp b/gmod/util.hpp deleted file mode 100644 index 0013611..0000000 --- a/gmod/util.hpp +++ /dev/null @@ -1,102 +0,0 @@ -#pragma once -#include -#include - -#include "strings.hpp" - -#define NAMESPACE_REGION( x ) namespace x { -#define END_REGION } - -extern int TIME_TO_TICKS( float dt ); -extern float TICKS_TO_TIME( int tick ); -extern float TICK_INTERVAL( ); - -//WEE WOO WEE WOO ITS THE DWORD POLICE -using ulong_t = unsigned long; -using uword_t = unsigned short; - -class IClientEntity; -class CTraceFilter; -class CGameTrace; -class vec3_t; -class vec2_t; - -NAMESPACE_REGION( util ) - -template < typename t > -struct reverse_iterable { - reverse_iterable( t&& it ) : - iterable( it ) { } - - t& iterable; - inline auto begin( ) { - return std::rbegin( iterable ); - } - - inline auto end( ) { - return std::rend( iterable ); - } -}; - -template< typename t > -reverse_iterable< t > -reverse_iterator( t&& iter ) { - return reverse_iterable< t >{ iter }; -} - -template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { - if ( !classbase ) return fn{ }; - return ( fn )( *( uintptr_t** )classbase )[ index ]; -} - -template < size_t index, typename ret, class ... args_ > -__forceinline ret get_vfunc( void* thisptr, args_... args ) { - using fn = ret( __thiscall* )( void*, args_... ); - - auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; - return fn_ptr( thisptr, args... ); -} - -__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { - std::string ascii_str( unicode.begin( ), unicode.end( ) ); - return ascii_str; -} - -__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { - std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); - return unicode_str; -} - -template < typename integer > -__forceinline auto to_hex_str( const integer& w, - size_t hex_len = sizeof( integer ) << 1 ) { - constexpr const char* hex_digits = xors( "0123456789abcdef" ); - std::string rc( hex_len, 0 ); - - for( size_t i{ }, j{ ( hex_len - 1 ) * 4 } ; i < hex_len; ++i, j -= 4 ) - rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; - - return rc; -} - -extern void clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, - unsigned mask, CTraceFilter* filter, CGameTrace* trace ); - -extern bool trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ); -extern bool is_low_fps( ); -extern bool is_tick_valid( int tickcount ); -extern bool is_tick_valid( int tickcount, float in_latency ); -extern void set_random_seed( int seed ); -extern vec3_t get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ); -extern float get_random_float( float min, float max ); -extern bool hitchance( int target, const vec3_t& angles, int percentage ); -extern float get_total_latency( ); -extern float get_lerptime( ); -extern int get_closest_player( ); -extern vec2_t screen_transform( vec3_t world ); -extern const char* definition_index_to_name( int index ); -extern void disable_pvs( ); -extern int hitbox_to_hitgroup( int hitbox ); -extern std::string hitgroup_to_string( int hitgroup ); - -END_REGION \ No newline at end of file diff --git a/gmod/vector.hpp b/gmod/vector.hpp deleted file mode 100644 index a917bb8..0000000 --- a/gmod/vector.hpp +++ /dev/null @@ -1,329 +0,0 @@ -#pragma once -#include -#include - -class vec2_t { -public: - vec2_t( ) { - x = y = 0.0f; - } - - vec2_t( float X, float Y ) { - x = X; y = Y; - } - - vec2_t( float* v ) { - x = v[ 0 ]; y = v[ 1 ]; - } - - vec2_t( const float* v ) { - x = v[ 0 ]; y = v[ 1 ]; - } - - vec2_t( const vec2_t& v ) { - x = v.x; y = v.y; - } - - vec2_t& operator=( const vec2_t& v ) { - x = v.x; y = v.y; return *this; - } - - float& operator[]( int i ) { - return ( ( float* )this )[ i ]; - } - - float operator[]( int i ) const { - return ( ( float* )this )[ i ]; - } - - vec2_t& operator+=( const vec2_t& v ) { - x += v.x; y += v.y; return *this; - } - - vec2_t& operator-=( const vec2_t& v ) { - x -= v.x; y -= v.y; return *this; - } - - vec2_t& operator*=( const vec2_t& v ) { - x *= v.x; y *= v.y; return *this; - } - - vec2_t& operator/=( const vec2_t& v ) { - x /= v.x; y /= v.y; return *this; - } - - vec2_t& operator+=( float v ) { - x += v; y += v; return *this; - } - - vec2_t& operator-=( float v ) { - x -= v; y -= v; return *this; - } - - vec2_t& operator*=( float v ) { - x *= v; y *= v; return *this; - } - - vec2_t& operator/=( float v ) { - x /= v; y /= v; return *this; - } - - vec2_t operator+( const vec2_t& v ) const { - return vec2_t( x + v.x, y + v.y ); - } - - vec2_t operator-( const vec2_t& v ) const { - return vec2_t( x - v.x, y - v.y ); - } - - vec2_t operator*( const vec2_t& v ) const { - return vec2_t( x * v.x, y * v.y ); - } - - vec2_t operator/( const vec2_t& v ) const { - return vec2_t( x / v.x, y / v.y ); - } - - vec2_t operator+( float v ) const { - return vec2_t( x + v, y + v ); - } - - vec2_t operator-( float v ) const { - return vec2_t( x - v, y - v ); - } - - vec2_t operator*( float v ) const { - return vec2_t( x * v, y * v ); - } - - vec2_t operator/( float v ) const { - return vec2_t( x / v, y / v ); - } - - void set( float X = 0.0f, float Y = 0.0f ) { - x = X; y = Y; - } - - float length( void ) const { - return sqrtf( x * x + y * y ); - } - - float lengthsqr( void ) const { - return ( x * x + y * y ); - } - - float dist_to( const vec2_t& v ) const { - return ( *this - v ).length( ); - } - - float dist_to_sqr( const vec2_t& v ) const { - return ( *this - v ).lengthsqr( ); - } - - float dot( const vec2_t& v ) const { - return ( x * v.x + y * v.y ); - } - - bool is_zero( void ) const { - return ( x > -FLT_EPSILON && x < FLT_EPSILON && - y > -FLT_EPSILON && y < FLT_EPSILON ); - } - - operator bool( ) const noexcept { - return !is_zero( ); - } - -public: - float x, y; -}; - -class vec3_t { -public: - vec3_t( ) { - x = y = z = 0.0f; - } - - vec3_t( float X, float Y, float Z ) { - x = X; y = Y; z = Z; - } - - vec3_t( float* v ) { - x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; - } - - vec3_t( const float* v ) { - x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; - } - - vec3_t( const vec3_t& v ) { - x = v.x; y = v.y; z = v.z; - } - - vec3_t( const vec2_t& v ) { - x = v.x; y = v.y; z = 0.0f; - } - - __forceinline vec3_t& operator=( const vec3_t& v ) { - x = v.x; y = v.y; z = v.z; return *this; - } - - __forceinline vec3_t& operator=( const vec2_t& v ) { - x = v.x; y = v.y; z = 0.0f; return *this; - } - - float& operator[]( int i ) { - return ( ( float* )this )[ i ]; - } - - __forceinline float operator[]( int i ) const { - return ( ( float* )this )[ i ]; - } - - vec3_t& operator+=( const vec3_t& v ) { - x += v.x; y += v.y; z += v.z; return *this; - } - - vec3_t& operator-=( const vec3_t& v ) { - x -= v.x; y -= v.y; z -= v.z; return *this; - } - - vec3_t& operator*=( const vec3_t& v ) { - x *= v.x; y *= v.y; z *= v.z; return *this; - } - - vec3_t& operator/=( const vec3_t& v ) { - x /= v.x; y /= v.y; z /= v.z; return *this; - } - - vec3_t& operator+=( float v ) { - x += v; y += v; z += v; return *this; - } - - vec3_t& operator-=( float v ) { - x -= v; y -= v; z -= v; return *this; - } - - vec3_t& operator*=( float v ) { - x *= v; y *= v; z *= v; return *this; - } - - vec3_t& operator/=( float v ) { - x /= v; y /= v; z /= v; return *this; - } - - __forceinline vec3_t operator+( const vec3_t& v ) const { - return vec3_t( x + v.x, y + v.y, z + v.z ); - } - - __forceinline vec3_t operator-( const vec3_t& v ) const { - return vec3_t( x - v.x, y - v.y, z - v.z ); - } - - __forceinline vec3_t operator*( const vec3_t& v ) const { - return vec3_t( x * v.x, y * v.y, z * v.z ); - } - - __forceinline vec3_t operator/( const vec3_t& v ) const { - return vec3_t( x / v.x, y / v.y, z / v.z ); - } - - __forceinline vec3_t operator+( float v ) const { - return vec3_t( x + v, y + v, z + v ); - } - - __forceinline vec3_t operator-( float v ) const { - return vec3_t( x - v, y - v, z - v ); - } - - __forceinline vec3_t operator*( float v ) const { - return vec3_t( x * v, y * v, z * v ); - } - - __forceinline vec3_t operator/( float v ) const { - return vec3_t( x / v, y / v, z / v ); - } - - __forceinline float length( ) const { - return sqrtf( x * x + y * y + z * z ); - } - - __forceinline float lengthsqr( ) const { - return ( x * x + y * y + z * z ); - } - - __forceinline float length2d( ) const { - return sqrtf( x * x + y * y ); - } - - __forceinline float length2dsqr( ) const { - return ( x * x + y * y ); - } - - __forceinline float dist_to( const vec3_t& v ) const { - return ( *this - v ).length( ); - } - - __forceinline float dist_to_sqr( const vec3_t& v ) const { - return ( *this - v ).lengthsqr( ); - } - - __forceinline float dot( const vec3_t& v ) const { - return ( x * v.x + y * v.y + z * v.z ); - } - - __forceinline float fov_to( const vec3_t& to ) const { - const float from_length = length( ); - const float to_length = to.length( ); - - if( from_length && to_length ) { - return acos( dot( to ) / from_length * to_length ); - } - - return 0.f; - } - - vec3_t cross( const vec3_t& v ) const { - return vec3_t( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); - } - - bool is_zero( ) const { - return ( x > -FLT_EPSILON && x < FLT_EPSILON && - y > -FLT_EPSILON && y < FLT_EPSILON && - z > -FLT_EPSILON && z < FLT_EPSILON ); - } - - operator bool( ) const { - return !is_zero( ); - } - - inline void normalize_vector( ) { - vec3_t& v = *this; - - float iradius = 1.f / ( this->length( ) + FLT_EPSILON ); //FLT_EPSILON - - v.x *= iradius; - v.y *= iradius; - v.z *= iradius; - } - - vec3_t clamp( ) { - for ( size_t axis{ }; axis < 2; axis++ ) { - auto &cur_axis = operator[]( axis ); - if ( !std::isfinite( cur_axis ) ) { - cur_axis = 0.f; - } - } - - x = std::clamp( x, -89.f, 89.f ); - y = std::clamp( std::remainder( y, 360.f ), -180.f, 180.f ); - z = 0.f; - return *this; - } - -public: - float x, y, z; -}; - -__forceinline vec3_t operator*( float f, const vec3_t& v ) { - return v * f; -} diff --git a/gmod/visual.hpp b/gmod/visual.hpp deleted file mode 100644 index 748497f..0000000 --- a/gmod/visual.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#include -#include "interface.hpp" -#include "vector.hpp" -#include "color.hpp" -#include "d3d.hpp" -#include -#include "strings.hpp" -#include "IVRenderView.hpp" - -class c_base_player; - -namespace features -{ - class c_visuals - { - void draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ); - void draw_line( int x, int y, int x1, int y1, const clr_t& clr ); - void draw_rect( int x, int y, int w, int h, const clr_t& clr ); - void draw_filled_rect( int x, int y, int w, int h, const clr_t& clr ); - void draw_circle( int x, int y, int r, const clr_t& clr, int res = 48 ); - - void draw_really_big_string( int x, int y, const clr_t& clr, const char* msg, ... ); - void draw_string( int x, int y, int align, bool big, const clr_t& clr, const char* msg, ... ); - - struct stored_player_data_t - { - std::string m_rank{ }; - clr_t m_team_color{ }; - matrix3x4 m_matrix[ 128 ]{ }; - vec3_t m_pos{ }; - matrix3x4 m_coordinate_frame{ }; - }; - - struct stored_data_t - { - std::array< stored_player_data_t, 256 > m_player{ }; - VMatrix m_matrix{ }; - }; - - stored_data_t m_data{ }; - - void spectator_list( ); - void draw_players( ); - - public: - void operator( )( ); - void store_data( ); - VMatrix& get_matrix( ); - }; -} \ No newline at end of file diff --git a/gmod/visual_draw.cpp b/gmod/visual_draw.cpp deleted file mode 100644 index db282a7..0000000 --- a/gmod/visual_draw.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "d3d.hpp" -#include "interface.hpp" -#include "renderer.hpp" -#include "visual.hpp" -#include "settings.hpp" - -namespace features -{ - void c_visuals::draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ) { - g_d3d.draw_line( clr, a.x, a.y, b.x, b.y ); - } - - void c_visuals::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { - g_d3d.draw_line( clr, x, y, x1, y1 ); - } - - void c_visuals::draw_rect( int x, int y, int w, int h, const clr_t& clr ) { - g_d3d.draw_rect( clr, x, y, w, h ); - } - - void c_visuals::draw_filled_rect( int x, int y, int w, int h, const clr_t& col ) { - g_d3d.draw_filled_rect( col, x, y, w, h ); - } - - void c_visuals::draw_circle( int x, int y, int r, const clr_t& col, int res ) { - g_d3d.draw_circle( col, x, y, r, res ); - } - - void c_visuals::draw_string( int x, int y, int align, bool big, const clr_t& col, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - switch( align ) { - case ALIGN_CENTER: - g_d3d.draw_text< ALIGN_CENTER >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); - break; - case ALIGN_LEFT: - g_d3d.draw_text< ALIGN_LEFT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); - break; - case ALIGN_RIGHT: - g_d3d.draw_text< ALIGN_RIGHT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); - break; - } - } - - void c_visuals::draw_really_big_string( int x, int y, const clr_t& col, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - g_d3d.draw_text< ALIGN_LEFT >( ::d3d::fonts.f_18, col, x, y, D3DFONTFLAG_OUTLINE, buffer ); - } -} \ No newline at end of file diff --git a/gmod/visual_local.cpp b/gmod/visual_local.cpp deleted file mode 100644 index 94de96b..0000000 --- a/gmod/visual_local.cpp +++ /dev/null @@ -1,503 +0,0 @@ -#include - -#include "visual.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "renderer.hpp" -#include "input_system.hpp" -#include "math.hpp" - -namespace features -{ - void c_visuals::draw_local( ) { - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - - int cur_pos{ }; - - if( g_ctx.m_local->is_valid( ) ) { - static float incoming_latency; - if( g_settings.misc.net_fakelag ) { - float desired_latency = incoming_latency + g_settings.misc.net_fakeping_amount * 0.001f; - if( g_settings.misc.net_fakelag == 4 ) - desired_latency = 1.0f; - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - float cur_latency = nci->GetLatency( 1 ); - float percentage = cur_latency / desired_latency; - percentage = std::clamp( percentage + 0.1f, 0.f, 1.f ); - - clr_t col = clr_t::blend( esp_red( ), esp_green( ), percentage ); - - bool visible = g_settings.misc.net_fakeping_active; - if( g_settings.misc.net_fakelag == 4 ) - visible = true; - - if( percentage > 0.35f || visible ) { - g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, col, xors( "PING" ) ); - } - } - } - else { - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - incoming_latency = nci->GetLatency( 1 ); - } - } - - if( g_settings.rage.enabled( ) && - g_settings.rage.anti_aim( ) && - g_settings.rage.break_lby( ) ) { - static float last_lby = 0.f; - static float last_update = 0.f; - float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); - if( lby != last_lby ) { - last_update = g_csgo.m_globals->m_curtime; - last_lby = lby; - } - - float lby_delta = std::abs( std::remainderf( lby - g_ctx.m_last_realangle.y, 360.f ) ); - float time_delta = g_csgo.m_globals->m_curtime - last_update; - - bool breaking = lby_delta > 35.f && time_delta > 0.2f; - - if( g_cheat.m_ragebot.m_antiaim->is_edging( ) ) { - g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, esp_green( ), xors( "EDGE" ) ); - } - - g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, breaking ? esp_green( ) : esp_red( ), xors( "LBY" ) ); - - if( g_settings.rage.preserve_fps && g_settings.rage.enabled && util::is_low_fps( ) ) { - g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, esp_red( ), xors( "FPS" ) ); - } - - if( g_settings.rage.draw_angles ) { - auto get_rotated_point = [ ]( vec2_t point, float rotation, float distance ) { - float rad = DEG2RAD( rotation ); - - point.x += sin( rad ) * distance; - point.y += cos( rad ) * distance; - - return point; - }; - - auto draw_rotated_triangle = [ &get_rotated_point ]( vec2_t point, float rotation, clr_t col ) { - vec2_t rotated_pos_1 = get_rotated_point( point, rotation + 205.f, 30.f ); - vec2_t rotated_pos_2 = get_rotated_point( point, rotation + 155.f, 30.f ); - - vertex_t v[ ] = { - { point }, - { rotated_pos_1 }, - { rotated_pos_2 } - }; - - g_renderer.draw_polygon( 3, v, col ); - }; - - vec2_t rotated_lby{ screen_w * 0.5f, screen_h * 0.5f }; - vec2_t rotated_real{ screen_w * 0.5f, screen_h * 0.5f }; - - vec3_t angles{ }; - g_csgo.m_engine( )->GetViewAngles( angles ); - - float rotation_lby = std::remainderf( g_ctx.m_local->m_flLowerBodyYawTarget( ) - angles.y, 360.f ) - 180.f; - float rotation_real = std::remainderf( g_ctx.m_last_realangle.y - angles.y, 360.f ) - 180.f; - - rotated_lby = get_rotated_point( rotated_lby, rotation_lby, 120.f ); - rotated_real = get_rotated_point( rotated_real, rotation_real, 120.f ); - - draw_rotated_triangle( rotated_lby, rotation_lby, g_settings.rage.lby_color ); - draw_rotated_triangle( rotated_real, rotation_real, g_settings.rage.real_color ); - } - } - - if( g_settings.rage.fakelag.mode( ) && - g_settings.rage.fakelag.ticks( ) && - g_settings.rage.fakelag.in_air( ) ) { - int min_dist = 64; - int max_ticks = g_settings.rage.fakelag.ticks; - if( g_settings.rage.fakelag.mode == 2 ) { - max_ticks += g_settings.rage.fakelag.fluctuate * 0.01f; - max_ticks = math::min( max_ticks, 15 ); - } - - float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); - if( speed > 255 && speed * g_csgo.m_globals->m_interval_per_tick * max_ticks > 50 ) { - bool breaking = g_cheat.m_lagmgr.is_breaking_lc( ); - g_renderer.draw_string( g_fonts.f_bold, 10, cur_pos += 15, breaking ? esp_green( ) : esp_red( ), xors( "LC" ) ); - } - } - } - - if( g_settings.misc.no_scope( ) && - g_ctx.m_local->m_bIsScoped( ) ) { - int w, h; - g_csgo.m_engine( )->GetScreenSize( w, h ); - - g_renderer.draw_line( 0, h / 2, w, h / 2, clr_t( 0, 0, 0 ) ); - g_renderer.draw_line( w / 2, 0, w / 2, h, clr_t( 0, 0, 0 ) ); - } - - draw_spread( ); - draw_autowall( ); - spectator_list( ); - grenade_prediction( ); - } - - void c_visuals::spectator_list( ) { - if( !g_settings.visuals.spec_list ) - return; - - std::vector< std::string > spec_list; - - for( size_t i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - if( ent && ent->is_player( ) && !ent->ce( )->IsDormant( ) ) { - auto spec_handle = ent->m_hObserverTarget( ); - auto spec_ent = g_csgo.m_entlist( )->GetClientEntityFromHandle< >( spec_handle ); - - if( spec_ent == g_ctx.m_local ) { - char player_name[ 32 ]; - ent->get_name_safe( player_name ); - spec_list.push_back( player_name ); - } - } - } - - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - - int cur_pos{ }; - - if( g_settings.misc.watermark ) { - cur_pos = 20; - } - - for( auto& it : spec_list ) { - g_renderer.draw_string< ALIGN_RIGHT >( g_fonts.f_12, screen_w - 3, cur_pos, clr_t( 255, 255, 255 ), it.c_str( ) ); - cur_pos += 10; - } - } - - void c_visuals::grenade_prediction( ) { - static auto molotov_detonate_time = g_csgo.m_cvar( )->FindVar( xors( "molotov_throw_detonate_time" ) ); - static auto molotov_detonate_slope = g_csgo.m_cvar( )->FindVar( xors( "weapon_molotov_maxdetonateslope" ) ); - static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); - - if( !g_settings.visuals.grenade_prediction ) - return; - - auto is_grenade = [ ]( int defindex ) { - switch( defindex ) { - case WEAPON_FLASHBANG: - case WEAPON_HEGRENADE: - case WEAPON_SMOKEGRENADE: - case WEAPON_MOLOTOV: - case WEAPON_INCGRENADE: - case WEAPON_DECOY: - return true; - default: return false; - } - }; - - auto get_detonate_time = [ ]( int defindex ) { - switch( defindex ) { - case WEAPON_FLASHBANG: - case WEAPON_HEGRENADE: - return 1.5f; - case WEAPON_INCGRENADE: - case WEAPON_MOLOTOV: - return molotov_detonate_time->get_float( ); - case WEAPON_DECOY: - return 5.f; - default: return 3.f; - } - }; - - auto draw_3d_line = [ ]( const vec3_t& start, const vec3_t& end, clr_t col, bool circle = false ) { - vec2_t start_w2s = util::screen_transform( start ); - vec2_t end_w2s = util::screen_transform( end ); - - g_renderer.draw_line( start_w2s, end_w2s, col ); - if( circle ) - g_renderer.draw_filled_circle( end_w2s.x, end_w2s.y, 2, clr_t( 230, 230, 230 ), 24 ); - }; - - auto clip_velocity = [ ]( const vec3_t& in, const vec3_t& normal, vec3_t& out, float overbounce ) { - int blocked = 0; - float angle = normal[ 2 ]; - - if( angle > 0.f ) - blocked |= 1; - - if( !angle ) - blocked |= 2; - - float backoff = in.dot( normal ) * overbounce; - - for( int i{ }; i < 3; ++i ) { - out[ i ] = in[ i ] - ( normal[ i ] * backoff ); - - if( out[ i ] > -0.1f && out[ i ] < 0.1f ) { - out[ i ] = 0.f; - } - } - - return blocked; - }; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) return; - - int def_index = weapon->m_iItemDefinitionIndex( ); - if( !is_grenade( def_index ) || !weapon->m_bPinPulled( ) ) - return; - - auto wpn_info = weapon->get_wpn_info( ); - - vec3_t throw_ang, forward; - g_csgo.m_engine( )->GetViewAngles( throw_ang ); - throw_ang.x -= ( 90.f - abs( throw_ang.x ) ) * 0.11111111f; - throw_ang.x = std::remainderf( throw_ang.x, 360.f ); - - forward = math::angle_vectors( throw_ang ); - - float throw_strength = weapon->m_flThrowStrength( ); - float throw_velocity = std::min( std::max( wpn_info->throw_velocity * 0.9f, 15.f ), 750.f ); - - float throw_height = ( throw_strength * 12.f ) - 12.f; - float v68 = throw_velocity * ( ( 0.7f * throw_strength ) + 0.3f ); - - vec3_t start_pos = g_ctx.m_local->get_eye_pos( ) + vec3_t( 0, 0, throw_height ); - vec3_t end_pos = start_pos + ( forward * 22.f ); - - CTraceFilter filter; - filter.pSkip = g_ctx.m_local; - - CGameTrace trace; - Ray_t ray; - ray.Init( start_pos, end_pos, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); - end_pos = trace.endpos - forward * 6.f; - vec3_t throw_pos = g_ctx.m_local->m_vecVelocity( ) * 1.25f + forward * v68; - - //draw_3d_line( start_pos, end_pos, clr_t( 66, 143, 244 ) ); - float gravity = sv_gravity->get_float( ) * 0.4f; - - player_info_t info{ }; - - for( int ticks = TIME_TO_TICKS( get_detonate_time( def_index ) ); ticks >= 0; --ticks ) { - auto throw_dir = vec3_t( throw_pos.x, throw_pos.y, throw_pos.z + ( throw_pos.z - ( gravity * TICK_INTERVAL( ) ) ) * 0.5f ); - auto temp = throw_dir * TICK_INTERVAL( ); - throw_pos.z -= gravity * TICK_INTERVAL( ); - - vec3_t src = end_pos, end = end_pos + temp; - Ray_t ray; - ray.Init( src, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); - if( trace.allsolid ) - throw_pos = vec3_t( ); - - end_pos = trace.endpos; - draw_3d_line( src, end_pos, clr_t( 66, 143, 244 ) ); - - if( trace.fraction != 1.f ) { - float surf_elasticity = 1.f; - vec3_t throw_pos2{ }; - clip_velocity( throw_pos, trace.plane.normal, throw_pos2, 2.f ); - - if( trace.m_pEnt && g_csgo.m_engine( )->GetPlayerInfo( trace.m_pEnt->GetIndex( ), &info ) ) { - surf_elasticity = 0.3f; - } - - throw_pos2 *= std::clamp( surf_elasticity * 0.45f, 0.f, 0.9f ); - end = end_pos + throw_pos2 * ( ( 1.f - trace.fraction ) * TICK_INTERVAL( ) ); - - if( def_index == WEAPON_MOLOTOV || def_index == WEAPON_INCGRENADE ) { - if( trace.plane.normal.z >= cos( DEG2RAD( molotov_detonate_slope->get_float( ) ) ) ) { - return; - } - } - - ray.Init( end_pos, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID | CONTENTS_CURRENT_90, &filter, &trace ); - - draw_3d_line( end_pos, end, clr_t( 66, 143, 244 ), true ); - end_pos = trace.endpos; - throw_pos = throw_pos2; - } - } - } - - void c_visuals::draw_autowall( ) { - if( !g_settings.visuals.autowall_crosshair ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon || weapon->is_knife( ) || weapon->is_grenade( ) ) - return; - - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - - auto wpn_data = weapon->get_wpn_info( ); - - vec3_t angles{ }; - g_csgo.m_engine( )->GetViewAngles( angles ); - - fire_bullet_data_t data{ }; - data.src = g_ctx.m_local->get_eye_pos( ); - vec3_t end = data.src; - end += math::angle_vectors( angles ) * wpn_data->range; - - data.filter.pSkip = g_ctx.m_local; - data.current_damage = wpn_data->damage; - data.penetrate_count = 1; - data.trace_length = 0.f; - - //data.length_to_end = ( end - data.src ).length( ); - data.trace_length_remaining = wpn_data->range - data.trace_length; - data.direction = math::angle_vectors( angles ); - - data.direction.normalize_vector( ); - - CTraceFilter filter; - Ray_t ray; - - filter.pSkip = g_ctx.m_local; - ray.Init( data.src, end ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT | CONTENTS_GRATE, &filter, &data.enter_trace ); - - bool can_penetrate = g_cheat.m_autowall.handle_bullet_penetration( wpn_data, data ); - - g_renderer.draw_box( screen_w / 2 - 1, screen_h / 2, 1, 1, - can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ) ); - } - - void c_visuals::draw_spread( ) { - if( !g_settings.visuals.draw_spread ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( weapon ) { - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - int cross_x = screen_w / 2, cross_y = screen_h / 2; - - float recoil_step = screen_h / g_ctx.m_fov; - - cross_x -= ( int )( g_ctx.m_local->m_aimPunchAngle( ).y * recoil_step ); - cross_y += ( int )( g_ctx.m_local->m_aimPunchAngle( ).x * recoil_step ); - - weapon->update_accuracy_penalty( ); - float inaccuracy = weapon->get_inaccuracy( ); - float spread = weapon->get_spread( ); - - float cone = inaccuracy * spread; - cone *= screen_h * 0.7f; - cone *= 90.f / g_ctx.m_fov; - - for( int seed{ }; seed < 256; ++seed ) { - util::set_random_seed( math::random_number( 0, 255 ) + 1 ); - float rand_a = util::get_random_float( 0.f, 1.0f ); - float pi_rand_a = util::get_random_float( 0.f, 2.0f * M_PI ); - float rand_b = util::get_random_float( 0.0f, 1.0f ); - float pi_rand_b = util::get_random_float( 0.f, 2.f * M_PI ); - - float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); - float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); - - float max_x = cos( pi_rand_a ) * cone + cos( pi_rand_b ) * cone; - float max_y = sin( pi_rand_a ) * cone + sin( pi_rand_b ) * cone; - - float step = screen_h / g_ctx.m_fov * 90.f; - int screen_spread_x = ( int )( spread_x * step * 0.7f ); - int screen_spread_y = ( int )( spread_y * step * 0.7f ); - - float percentage = ( rand_a * inaccuracy + rand_b * spread ) / ( inaccuracy + spread ); - - g_renderer.draw_rect( cross_x + screen_spread_x, cross_y + screen_spread_y, 1, 1, - clr_t( 255, 255, 255, 255 * ( 0.4f + percentage * 0.6f ) ) * ( 0.1f + percentage * 0.9f ) ); - } - } - } - - void c_visuals::store_tracer( int index, vec3_t pos ) { - static float last_time[ 65 ]{ }; - tracer_t new_tracer; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); - if( ent && ent->is_valid( ) ) { - bool valid = ent == g_ctx.m_local; - float time = g_csgo.m_globals->m_curtime; - auto ent_pos = ent->get_hitbox_pos( 0 ); - - if( ent != g_ctx.m_local && g_ctx.m_local->is_valid( ) && - ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.visuals.friendlies( ) ) ) { - vec3_t ang = math::vector_angles( ent_pos, pos ); - vec3_t local_pos = g_ctx.m_local->get_hitbox_pos( 0 ); - float dist = local_pos.dist_to( ent_pos ); - - vec3_t local_ang = math::vector_angles( ent_pos, local_pos ); - - constexpr float max_delta_sqr = 30.f * 30.f; - - float pitch_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).x ) ) ) * dist; - float yaw_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).y ) ) ) * dist; - float delta_sqr = ( yaw_delta * yaw_delta + pitch_delta * pitch_delta ); - - - if( delta_sqr > max_delta_sqr ) return; - - vec3_t vec = math::angle_vectors( ang ); - vec *= dist; - vec += ent_pos; - - pos = vec; - - valid = true; - } - - if( valid ) { - float delta = std::abs( g_csgo.m_globals->m_curtime - last_time[ index ] ); - if( delta > g_csgo.m_globals->m_interval_per_tick ) { - new_tracer.m_time = time; - new_tracer.m_start = ent_pos; - new_tracer.m_end = pos; - new_tracer.m_local = ent == g_ctx.m_local; - m_tracers.emplace_back( new_tracer ); - - last_time[ index ] = g_csgo.m_globals->m_curtime; - } - } - } - } - - void c_visuals::draw_tracers( ) { - if( !g_settings.visuals.bullet_tracers ) return; - float time = g_csgo.m_globals->m_curtime; - - for( size_t i{ }; i < m_tracers.size( ) && !m_tracers.empty( ); ++i ) { - auto& tr = m_tracers[ i ]; - - float delta = time - tr.m_time; - if( delta > 1.0f ) m_tracers.erase( m_tracers.begin( ) + i ); - } - - if( !m_tracers.empty( ) ) { - for( auto& it : m_tracers ) { - float delta = time - it.m_time; - auto w2s_begin = util::screen_transform( it.m_start ); - auto w2s_end = util::screen_transform( it.m_end ); - - clr_t col = it.m_local ? clr_t::from_hsb( delta, 1.0f, 1.0f ) : clr_t( 255, 15, 46 ); - col.a( ) = 1.0f - delta * 255; - - g_renderer.draw_line( w2s_begin, w2s_end, col ); - } - } - } -} \ No newline at end of file diff --git a/gmod/visual_player.cpp b/gmod/visual_player.cpp deleted file mode 100644 index fb65458..0000000 --- a/gmod/visual_player.cpp +++ /dev/null @@ -1,308 +0,0 @@ -#include - -#include "visual.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "renderer.hpp" -#include "input_system.hpp" -#include "math.hpp" - -/* - Change hook where grabbing lua related from RenderView to CEngineVGui::Paint to see if that works. - I do all my drawing in Paint and should not crash( I never crash ). -*/ - -namespace features -{ - - struct box_t - { - int x, y, w, h; - }; - - box_t get_box( c_base_player* ent, matrix3x4& frame ) { - const matrix3x4& matrix = frame; - - vec3_t min = ent->m_vecMins( ); - vec3_t max = ent->m_vecMaxs( ); - - std::array< vec3_t, 8 > point_list = { - vec3_t{ min.x, min.y, min.z }, - vec3_t{ min.x, max.y, min.z }, - vec3_t{ max.x, max.y, min.z }, - vec3_t{ max.x, min.y, min.z }, - vec3_t{ max.x, max.y, max.z }, - vec3_t{ min.x, max.y, max.z }, - vec3_t{ min.x, min.y, max.z }, - vec3_t{ max.x, min.y, max.z } - }; - - std::array< float, 8 > x_points; - std::array< float, 8 > y_points; - - for( auto& it : point_list ) { - vec3_t backup = it; - for( int i{ }; i < 3; ++i ) { - it[ i ] = backup.dot( ( const vec3_t& )( matrix[ i ] ) ) + matrix[ i ][ 3 ]; - } - } - - for( size_t i{ }; i < 8; ++i ) { - vec2_t w2s = util::screen_transform( point_list[ i ] ); - x_points[ i ] = w2s.x; - y_points[ i ] = w2s.y; - } - - std::sort( x_points.begin( ), x_points.end( ) ); - std::sort( y_points.begin( ), y_points.end( ) ); - - int x = ( int )x_points.front( ); - int w = ( int )x_points.back( ) - x; - - int y = ( int )y_points.front( ); - int h = ( int )y_points.back( ) - y; - - return { x, y, w, h }; - } - - void c_visuals::store_data( ) { - g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); - if( !g_ctx.m_lua ) - return; - - m_data.m_matrix = *( VMatrix* )( 0x18C * 2 + *( uintptr_t* )( ( uintptr_t )g_gmod.m_engine_render( ) + 0xDC ) - 0x44 ); - - const auto local_id = g_gmod.m_engine( )->GetLocalPlayer( ); - - for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { - auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); - if( !ent || !ent->is_valid( ) ) - continue; - - auto& data = m_data.m_player.at( i ); - - if( g_settings.visuals.ignore_teamcolor ) { - data.m_team_color = ent->get_team_color( ); - } - - if( i == local_id ) - continue; - - data.m_coordinate_frame = ent->m_CoordinateFrame( ); - - if( g_settings.visuals.skeleton ) { - ent->ce( )->SetupBones( data.m_matrix, 128, 0x100, g_gmod.m_globals->m_curtime ); // yep, 256 is the max bone count in gmod, but i doubt it's used for anything. - } - - if( g_settings.visuals.rank || g_settings.visuals.spec_list ) { - data.m_rank = ent->get_rank( ); - } - } - } - - void c_visuals::spectator_list( ) { - if( !g_settings.visuals.spec_list ) - return; - - int cur_pos{ }; - player_info_t info{ }; - char buffer[ 128 ]{ }; - std::vector< const char* > list_of_names{ }; - - const int local_id = g_gmod.m_engine( )->GetLocalPlayer( ); - - for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { - if( i == local_id ) - continue; - - auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); - if( !ent ) - continue; - - if( !g_gmod.m_engine( )->GetPlayerInfo( i, &info ) ) - continue; - - auto target = ent->get_observer_target( ); - if( !target ) - continue; - - if( target->ce( )->GetIndex( ) != local_id ) - continue; - - sprintf_s( buffer, "%s - (%s)", info.name, m_data.m_player.at( i ).m_rank.c_str( ) ); - - list_of_names.push_back( buffer ); - } - - int screen_w, screen_h; - g_gmod.m_engine( )->GetScreenSize( screen_w, screen_h ); - - if( g_settings.misc.watermark ) { - cur_pos = 20; - } - - for( const auto& it : list_of_names ) { - draw_string( screen_w - 3, cur_pos, ALIGN_RIGHT, true, clr_t( 255, 255, 255 ), it ); - cur_pos += 10; - } - } - - - void c_visuals::draw_players( ) { - const auto local_id = g_gmod.m_engine( )->GetLocalPlayer( ); - const auto local_team_color = m_data.m_player.at( local_id ).m_team_color; - - for( int i{ 1 }; i <= g_gmod.m_globals->m_maxclients; ++i ) { - if( i == local_id ) - continue; - - auto ent = g_gmod.m_entlist( )->GetClientEntity< >( i ); - if( !ent || !ent->is_valid( ) ) - continue; - - auto& data = m_data.m_player.at( i ); - - if( g_settings.visuals.ignore_team && - g_ctx.m_local->m_iTeamNum( ) == ent->m_iTeamNum( ) ) - continue; - - if( g_settings.visuals.ignore_teamcolor && - local_team_color == data.m_team_color ) - continue; - - //clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? - // g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; - - clr_t col = g_settings.visuals.box_enemy; - - auto box = get_box( ent, data.m_coordinate_frame ); - int health = ent->m_iHealth( ); - int bottom_pos = 0; - - if( g_settings.visuals.skeleton( ) ) { - //clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.skeleton_friendly : g_settings.visuals.skeleton_enemy; - clr_t col = g_settings.visuals.skeleton_enemy; - - auto hdr = g_gmod.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); - if( hdr ) { - for( size_t bone{ }; bone < hdr->numbones; ++bone ) { - auto b = hdr->get_bone( bone ); - if( b && b->flags & 0x100 && b->parent != -1 ) { - vec3_t child = vec3_t{ data.m_matrix[ bone ][ 0 ][ 3 ], data.m_matrix[ bone ][ 1 ][ 3 ], data.m_matrix[ bone ][ 2 ][ 3 ] }; - vec3_t parent = vec3_t{ data.m_matrix[ b->parent ][ 0 ][ 3 ], data.m_matrix[ b->parent ][ 1 ][ 3 ], data.m_matrix[ b->parent ][ 2 ][ 3 ] }; - - auto child_screen = util::screen_transform( child ); - auto parent_screen = util::screen_transform( parent ); - - draw_line( child_screen, parent_screen, col ); - } - } - } - } - - if( g_settings.visuals.box( ) ) { - draw_rect( box.x + 1, box.y + 1, box.w - 2, box.h - 2, clr_t( 0, 0, 0, 180 ) ); - draw_rect( box.x, box.y, box.w, box.h, col ); - } - - if( g_settings.visuals.health( ) ) { - auto fill = box.h - 1; - fill *= std::clamp( health, 0, 100 ) * 0.01f; - - auto hp_col = clr_t( - std::min< int >( 510 * ( 100 - health ) / 100, 255 ), - std::min< int >( 510 * health / 100, 255 ), - 0, - 255 ); - - draw_filled_rect( box.x - 4, box.y, 3, box.h + 1, clr_t( 0, 0, 0, 170 ) ); - draw_filled_rect( box.x - 3, box.y + box.h - fill, 1, fill, hp_col ); - - if( health != 100 ) - draw_string( box.x - 2, box.y + 1 + box.h - fill - 3, ALIGN_CENTER, false, clr_t( 255, 255, 255, 255 ), "%d", health ); - } - - if( g_settings.visuals.name( ) ) { - draw_string( box.x + box.w / 2, box.y - 12, ALIGN_CENTER, true, - clr_t( 255, 255, 255, 255 ), ent->get_info( ).name ); - } - - if( g_settings.visuals.weapon( ) ) { - auto weapon = ent->get_weapon( ); - if( weapon ) { - std::string wep_str = weapon->get_print_name( ); - if( !wep_str.empty( ) ) { - std::transform( wep_str.begin( ), wep_str.end( ), wep_str.begin( ), ::tolower ); // lowercase gang - - draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, - clr_t( 255, 255, 255, 255 ), wep_str.c_str( ) ); // font is a little ugly - - bottom_pos += 11; - } - } - } - - if( g_settings.visuals.rank( ) ) { - auto rank = data.m_rank; - if( !rank.empty( ) ) { - draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, - clr_t( 255, 255, 255, 255 ), rank.c_str( ) ); - - bottom_pos += 11; - } - } - - //if( g_settings.visuals.ammo ) { m_iClip1 just returns the max clip??? doesn't work. - // if( auto weapon = ent->get_weapon( ) ) { // hacker codes 8) - // draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, true, - // clr_t( 255, 255, 255, 255 ), "%d / %d", weapon->m_iClip1( ), m_stored_data.at( i ).m_max_clip1 ); - // } - //} - } - } - - void c_visuals::operator()( ) { - g_ctx.m_lua = g_gmod.m_lua_shared( )->GetLuaInterface( LUA_CLIENT ); - if( !g_ctx.m_lua ) - return; - - switch( g_settings.visuals.activation_type( ) ) { - case 0: - g_settings.visuals.active = false; - break; - case 1: - g_settings.visuals.active = true; - break; - case 2: - g_settings.visuals.active = g_input.is_key_pressed( g_settings.visuals.key ); - break; - case 3: - { - static bool held = false; - bool pressed = g_input.is_key_pressed( g_settings.visuals.key ); - if( pressed ) { - if( !held ) - g_settings.visuals.active ^= 1; - held = true; - } - else held = false; - } - break; - default: - g_settings.visuals.active = false; - break; - } - - if( g_ctx.run_frame( ) ) { - spectator_list( ); - g_cheat.m_playerlist( ); - if( g_settings.visuals.active ) { - draw_players( ); - } - } - } - - VMatrix& c_visuals::get_matrix( ) { - return m_data.m_matrix; - } -} \ No newline at end of file diff --git a/gmod/visual_world.cpp b/gmod/visual_world.cpp deleted file mode 100644 index 1f504bd..0000000 --- a/gmod/visual_world.cpp +++ /dev/null @@ -1,207 +0,0 @@ -#include - -#include "context.hpp" -#include "visual.hpp" -#include "interface.hpp" -#include "renderer.hpp" - -namespace features -{ - void fix_static_props( ) { - static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) ); - static bool fixed{ }; - if( !fixed ) { - cvar->m_flags |= 0; - cvar->set_value( 1 ); - - fixed = true; - } - } - - void c_visuals::draw_world( ) { - if( !g_settings.visuals.active ) - return; - - static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) ); - - for( int i{ 64 }; i < g_csgo.m_entlist( )->GetHighestEntityIndex( ); ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< IClientEntity >( i ); - if( !ent ) continue; - - auto client_class = ent->GetClientClass( ); - if( !client_class ) continue; - - int class_id = client_class->m_class_id; - - if( class_id != CBaseWeaponWorldModel && ( strstr( client_class->m_name, xors( "Weapon" ) ) - || class_id == CDEagle || class_id == CAK47 ) ) { - auto owner = ( int )ent->as< c_base_weapon >( )->m_hOwner( ) & 0xfff; - if( owner <= 0 || owner > 64 ) { - auto origin = ent->GetRenderOrigin( ); - if( origin ) { - bool draw = g_settings.visuals.weapon_esp( ) == 1; - bool glow = g_settings.visuals.weapon_esp( ) == 2; - - if( draw || g_settings.visuals.weapon_esp == 3 ) { - if( !glow ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false; - } - - auto w2s = util::screen_transform( origin ); - auto def_index = ent->as< c_base_weapon >( )->m_iItemDefinitionIndex( ); - auto name = util::definition_index_to_name( def_index ); - - g_renderer.draw_string< ALIGN_CENTER >( g_fonts.f_esp_small, w2s.x, w2s.y, - g_settings.visuals.weapon_esp_clr( ), name ); - } - if( glow || g_settings.visuals.weapon_esp == 3 ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - } - } - } - else { - if( g_settings.visuals.grenade_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) { - auto model = ent->GetModel( ); - if( !model ) continue; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) - continue; - - std::string name = xors( "nade" ); - if( strstr( hdr->name, xors( "flash" ) ) ) { - name = xors( "flash" ); - } - else if( strstr( hdr->name, xors( "smoke" ) ) ) { - name = xors( "smoke" ); - } - else if( strstr( hdr->name, xors( "decoy" ) ) ) { - name = xors( "decoy" ); - } - else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) { - name = xors( "molotov" ); - } - - if( g_settings.visuals.grenade_esp == 2 || g_settings.visuals.grenade_esp == 3 ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - - if( g_settings.visuals.grenade_esp == 1 || g_settings.visuals.grenade_esp == 3 ) { - auto pos = ent->GetRenderOrigin( ); - auto w2s = util::screen_transform( pos ); - - g_renderer.draw_string< ALIGN_CENTER >( g_fonts.f_esp_small, w2s.x, w2s.y, - g_settings.visuals.grenade_esp_clr, name.c_str( ) ); - } - } - } - - } - } - - void c_visuals::world_modulate( ) { - static std::unordered_map< MaterialHandle_t, fclr_t > world_materials; - static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2; - static c_base_player* local_player = nullptr; - static auto night_mode = false; - static bool modulated = false; - static bool alpha = false; - - if( !g_settings.visuals.world_modulate || !g_csgo.m_engine( )->IsInGame( ) ) { - modulated = false; - if( !world_materials2.empty( ) ) { - for( auto& it : world_materials2 ) { - auto mat = g_csgo.m_mat_system( )->GetMaterial( it.first ); - if( !mat ) continue; - - auto original_col = it.second; - mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) ); - mat->AlphaModulate( original_col.a( ) ); - } - - world_materials.clear( ); - world_materials2.clear( ); - } - - return; - } - - if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) { - fix_static_props( ); - - if( local_player == g_ctx.m_local && - night_mode == g_settings.visuals.night_mode( ) && - alpha == g_settings.visuals.transparent_props( ) && - modulated == g_settings.visuals.world_modulate( ) ) - return; - - - for( auto i = g_csgo.m_mat_system( )->FirstMaterial( ); - i != g_csgo.m_mat_system( )->InvalidMaterial( ); - i = g_csgo.m_mat_system( )->NextMaterial( i ) ) { - - auto mat = g_csgo.m_mat_system( )->GetMaterial( i ); - if( !mat ) continue; - - const char* group = mat->GetTextureGroupName( ); - bool is_world = strstr( group, xors( "World" ) ); - bool is_sky = strstr( group, xors( "Sky" ) ); - bool is_prop = strstr( group, xors( "StaticProp" ) ); - - if( is_world || is_sky || is_prop ) { - const char* name = mat->GetName( ); - if( world_materials.find( i ) == world_materials.end( ) ) { - fclr_t clr; - - mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) ); - clr.a( ) = mat->GetAlphaModulation( ); - - world_materials.emplace( i, clr ); - world_materials2.emplace( i, clr ); - } - - fclr_t new_color; - - new_color = world_materials2.find( i )->second; - bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate; - - if( is_world ) { - if( apply ) { - new_color.r( ) *= 0.15f; - new_color.g( ) *= 0.15f; - new_color.b( ) *= 0.15f; - } - } - else if( is_prop ) { - if( apply ) { - new_color.r( ) *= 0.3f; - new_color.g( ) *= 0.3f; - new_color.b( ) *= 0.3f; - } - if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) { - new_color.a( ) *= 0.6f; - } - } - else if( is_sky ) { - if( apply ) { - new_color = fclr_t( 0.f, 0.f, 0.f ); - } - } - - if( !( world_materials.at( i ) == new_color ) ) { - mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) ); - mat->AlphaModulate( new_color.a( ) ); - - world_materials.at( i ) = new_color; - } - } - } - - modulated = g_settings.visuals.world_modulate; - night_mode = g_settings.visuals.night_mode; - alpha = g_settings.visuals.transparent_props; - local_player = g_ctx.m_local; - } - } -} \ No newline at end of file diff --git a/gmod/vmt.hpp b/gmod/vmt.hpp deleted file mode 100644 index 0665e17..0000000 --- a/gmod/vmt.hpp +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once -#include -#include "util.hpp" - -// todo - dex; rewrite this, VirtualQuery (except for custom codeptr / readptr) and VirtualProtect shouldnt be used -// and we need to copy rtti over too or stuff will break later on - -// correct me if im wrong, but the vtable isnt replaced, instead the original is edited during hooking, rtti should be intact and accessable by game -// class could definetly do with a rewrite tho! - -// ^ you're corrct, but changing page rights and replacing ptrs direclty in rdata (or usually the heap, since thats where vmts go) is not a safe solution -// copying table + aligning it to compensate for rtti is safer -// vac loves scanning memory regions but it doesnt really do much outside of game servers (only loads some shit for checking DEP and stuff) - -// trash - -//llama is a fucking nigger -//true - -namespace hooks -{ - class c_vmt { - uintptr_t* m_table; - uintptr_t* m_original; - std::vector< uintptr_t > m_new; - public: - int count( ) { - int vfunc_count{ }; - - while ( m_original[ vfunc_count ] ) { - vfunc_count++; - }; - - return vfunc_count; - } - - c_vmt( void* table ) { - if ( !table ) { - return; - } - - this->m_table = reinterpret_cast< uintptr_t* >( table ); - this->m_original = *reinterpret_cast< uintptr_t** >( this->m_table ); - - for ( int i = -1; i < this->count( ); ++i ) { - this->m_new.push_back( this->m_original[ i ] ); - } - - auto data = this->m_new.data( ); - *this->m_table = uintptr_t( &data[ 1 ] ); - } - - ~c_vmt( ) { } - - template< typename T = uintptr_t > T get_function( int index ) { - return( ( T )( this->m_new.at( index + 1 ) ) ); - } - - template< typename T = uintptr_t > T get_old_function( int index ) { - return( ( T )( this->m_original[ index ] ) ); - } - - void hook( int index, uintptr_t new_func ) { - this->m_new.at( index + 1 ) = new_func; - } - - void unhook( int index ) { - this->m_new.at( index + 1 ) = this->m_original[ index ]; - } - - void hook( int index, void* new_func ) { - hook( index, reinterpret_cast< uintptr_t >( new_func ) ); - } - - void restore( ) const { - *this->m_table = uintptr_t( m_original ); - } - - static void* hook_method( void* instance, int index, void* function ) { - // edits the vtable itself - // i cannot be bothered re-hooking stuff on every instance creation - // so this should fix this problem, (should be fine on gmod cuz no AC) - void** vfunc = *( void*** )instance + index; - void* oldvf = *vfunc; - - unsigned long prot; - ::VirtualProtect( vfunc, 4, 0x40, &prot ); - *vfunc = function; - ::VirtualProtect( vfunc, 4, prot, &prot ); - - return oldvf; - } - }; -} \ No newline at end of file diff --git a/gmod/window_procedure.cpp b/gmod/window_procedure.cpp deleted file mode 100644 index f47027b..0000000 --- a/gmod/window_procedure.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "base_cheat.hpp" -#include "hooks.hpp" -#include "input_system.hpp" -#include "settings.hpp" - -decltype( &hooks::window_procedure ) hooks::window_procedure_o; -long __stdcall hooks::window_procedure( HWND hwnd, uint32_t msg, uint32_t wparam, long lparam ) { - if ( g_gmod.m_panic ) { - return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); - } - - if ( msg == WM_ACTIVATE && wparam == WA_INACTIVE ) { - g_input.clear_keys( ); - } - - if ( msg == WM_MOUSEMOVE ) { - g_input.capture_mouse_move( lparam ); - g_con->get_input( )->capture_mouse_move( lparam ); - } - - auto enable_screen_clicker = []( bool enable ) -> void { - - }; - - //static auto cvar = g_gmod.m_cvar( )->FindVar( xors( "cl_mouseenable" ) ); - static auto con_pressed = false; - if( g_con->get_input( )->is_key_pressed( KEYS_HOME ) ) { - if( !con_pressed ) { - if( !g_con->m_open ) { - g_con->m_consuming_input = true; - } - - g_con->m_open ^= 1; - } - - //cvar->set_value( !g_con->m_open ); - con_pressed = true; - } - else con_pressed = false; - - static auto list_pressed = false; - if( g_con->get_input( )->is_key_pressed( KEYS_DELETE ) ) { - if( !list_pressed ) { - g_cheat.m_playerlist.is_open( ) ^= 1; - list_pressed = true; - } - } - else list_pressed = false; - - if( g_cheat.m_playerlist.is_open( ) ) { - if( g_con->get_input( )->is_key_pressed( KEYS_DOWN ) ) { - g_cheat.m_playerlist.get_index( )++; - } - else if( g_con->get_input( )->is_key_pressed( KEYS_UP ) ) { - g_cheat.m_playerlist.get_index( )--; - } - - if( g_cheat.m_playerlist.get_index( ) < 0 ) - g_cheat.m_playerlist.get_index( ) = g_cheat.m_playerlist.get_list( ).size( ) - 1; - else if( g_cheat.m_playerlist.get_index( ) >= ( signed )g_cheat.m_playerlist.get_list( ).size( ) ) - g_cheat.m_playerlist.get_index( ) = 0; - - static bool was_pressed = false; - if( g_con->get_input( )->is_key_pressed( KEYS_LEFT ) || g_con->get_input( )->is_key_pressed( KEYS_RIGHT ) ) { - if( !was_pressed ) { - *g_cheat.m_playerlist.get_list( )[ g_cheat.m_playerlist.get_index( ) ].m_friend ^= 1; - was_pressed = true; - } - } - else was_pressed = false; - } - - if( g_con->get_input( )->register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) ) { - if( g_con->m_open ) return false; - } - - if( !g_con->m_open ) { - static bool was_pressed = false; - if( g_input.is_key_pressed( KEYS_INSERT ) ) { - if( !was_pressed ) { - g_settings.menu.open ^= 1; - //cvar->set_value( !g_settings.menu.open ); - //g_gmod.m_surface( )->SetCursorVisible( g_settings.menu.open ); - was_pressed = true; - } - } - else { - was_pressed = false; - } - - if( g_input.register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) - && g_settings.menu.open ) { - return false; - } - } - - return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); -} \ No newline at end of file diff --git a/gmod/x86.hpp b/gmod/x86.hpp deleted file mode 100644 index e96c469..0000000 --- a/gmod/x86.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include - -namespace x86 -{ - enum class reg : size_t { - eax = 0, - ecx, - edx, - ebx, - esp, - ebp, - esi, - edi, - - /* - x64: - r8, - r9, - r10, - r11, - r12, - r13, - r14, - r15,*/ - }; - - enum instruction : uint8_t { - retn_imm16 = 0xc2, - retn = 0xc3, - fs = 0x64, - //its big nigga season - call = 0xff - }; - - __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { - return ( 0xb8 + ( size_t( dreg ) ) ); - } - - __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { - return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); - } - - __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { - return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); - } -}; \ No newline at end of file diff --git a/injector/injector.vcxproj b/injector/injector.vcxproj deleted file mode 100644 index c769a6c..0000000 --- a/injector/injector.vcxproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Debug - Win32 - - - pHit - Win32 - - - pHit - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64} - injector - 10.0.16299.0 - - - - Application - true - v141 - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - true - v141 - MultiByte - - - Application - false - v141 - true - MultiByte - - - Application - false - v141 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - Disabled - true - true - - - - - Level3 - Disabled - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - - - true - true - - - - - - - - - - - - - - \ No newline at end of file diff --git a/injector/injector.vcxproj.filters b/injector/injector.vcxproj.filters deleted file mode 100644 index d81baf0..0000000 --- a/injector/injector.vcxproj.filters +++ /dev/null @@ -1,33 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - - - Source Files - - - \ No newline at end of file diff --git a/injector/main.cpp b/injector/main.cpp deleted file mode 100644 index f3d3511..0000000 --- a/injector/main.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include -#include "winapi.h" - -const wchar_t* const kernel32_str = L"KERNEL32.DLL"; -const wchar_t* const ucrtbase_str = L"ucrtbase.dll"; -const char* const loadlib_str = "LoadLibraryA"; -const char* const printf_str = "printf"; - -const char* const printf_fmt = "print: %08x\n\0"; -const char* const fail_msg = "k32 null\n"; -const char* const pause_str = "pause"; -const char* const system_str = "system"; - -uintptr_t printf_addr = ( uintptr_t )&printf; -uintptr_t system_addr = 0; - -//i dont even -//unfinished btw - -__declspec( naked ) int print_var( uint32_t var ) { - __asm { - push ebp - mov ebp, esp - sub esp, __LOCAL_SIZE - - mov eax, var - push eax - push printf_fmt - call printf_addr - - add esp, 8 - mov esp, ebp - pop ebp - - mov eax, 0 - ret - } -} - -__declspec( naked ) void print_error( const char* err ) { - __asm { - push ebp - mov ebp, esp - sub esp, __LOCAL_SIZE - - mov eax, err - push eax - call printf_addr - - add esp, 8 - mov esp, ebp - pop ebp - } -} - -__declspec( naked ) int main( void ) { - void* k32; - void* ucrtbase; - uintptr_t loadlib; - - __asm { - push ebp - mov ebp, esp - sub esp, __LOCAL_SIZE - - mov eax, ds:ucrtbase_str - push eax - call winapi::k32::get_module_handle - add esp, 4 - mov ucrtbase, eax - - mov eax, ds:system_str - push eax - mov ecx, ucrtbase - push ecx - call winapi::k32::get_proc_address - add esp, 4 - mov system_addr, eax - - mov eax, ds:kernel32_str - push eax - call winapi::k32::get_module_handle - add esp, 4 - mov k32, eax - - mov eax, k32 - push eax - call print_var - - cmp k32, 0 - je K32_FAIL - - mov eax, ds:loadlib_str - push eax - mov ecx, k32 - push ecx - call winapi::k32::get_proc_address - - add esp, 8 - mov loadlib, eax - - mov eax, loadlib - push eax - call print_var - - jmp END - - K32_FAIL: - mov eax, fail_msg - push eax - call printf_addr - - END: - mov eax, pause_str - push eax - call system_addr - mov esp, ebp - pop ebp - ret - } -} \ No newline at end of file diff --git a/injector/pe.h b/injector/pe.h deleted file mode 100644 index f67e46d..0000000 --- a/injector/pe.h +++ /dev/null @@ -1,309 +0,0 @@ -#pragma once -#include - -namespace nt { - using WORD = short; - using BYTE = unsigned char; - using DWORD = unsigned long; - - typedef struct _IMAGE_DATA_DIRECTORY { - DWORD VirtualAddress; - DWORD Size; - } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; - - typedef struct _IMAGE_OPTIONAL_HEADER { - WORD Magic; - BYTE MajorLinkerVersion; - BYTE MinorLinkerVersion; - DWORD SizeOfCode; - DWORD SizeOfInitializedData; - DWORD SizeOfUninitializedData; - DWORD AddressOfEntryPoint; - DWORD BaseOfCode; - DWORD BaseOfData; - DWORD ImageBase; - DWORD SectionAlignment; - DWORD FileAlignment; - WORD MajorOperatingSystemVersion; - WORD MinorOperatingSystemVersion; - WORD MajorImageVersion; - WORD MinorImageVersion; - WORD MajorSubsystemVersion; - WORD MinorSubsystemVersion; - DWORD Win32VersionValue; - DWORD SizeOfImage; - DWORD SizeOfHeaders; - DWORD CheckSum; - WORD Subsystem; - WORD DllCharacteristics; - DWORD SizeOfStackReserve; - DWORD SizeOfStackCommit; - DWORD SizeOfHeapReserve; - DWORD SizeOfHeapCommit; - DWORD LoaderFlags; - DWORD NumberOfRvaAndSizes; - IMAGE_DATA_DIRECTORY DataDirectory[ 16 ]; - } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; - - typedef struct _IMAGE_FILE_HEADER { - WORD Machine; - WORD NumberOfSections; - DWORD TimeDateStamp; - DWORD PointerToSymbolTable; - DWORD NumberOfSymbols; - WORD SizeOfOptionalHeader; - WORD Characteristics; - } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; - - typedef struct _IMAGE_NT_HEADERS { - DWORD Signature; - IMAGE_FILE_HEADER FileHeader; - IMAGE_OPTIONAL_HEADER OptionalHeader; - } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; - - typedef struct _IMAGE_EXPORT_DIRECTORY { - uint32_t Characteristics; - uint32_t TimeDateStamp; - uint16_t MajorVersion; - uint16_t MinorVersion; - uint32_t Name; - uint32_t Base; - uint32_t NumberOfFunctions; - uint32_t NumberOfNames; - uint32_t AddressOfFunctions; // RVA from base of image - uint32_t AddressOfNames; // RVA from base of image - uint32_t AddressOfNameOrdinals; // RVA from base of image - } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; - - typedef struct _IMAGE_DOS_HEADER { - WORD e_magic; - WORD e_cblp; - WORD e_cp; - WORD e_crlc; - WORD e_cparhdr; - WORD e_minalloc; - WORD e_maxalloc; - WORD e_ss; - WORD e_sp; - WORD e_csum; - WORD e_ip; - WORD e_cs; - WORD e_lfarlc; - WORD e_ovno; - WORD e_res[ 4 ]; - WORD e_oemid; - WORD e_oeminfo; - WORD e_res2[ 10 ]; - long e_lfanew; - } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; - - typedef struct _LIST_ENTRY { - struct _LIST_ENTRY *Flink; - struct _LIST_ENTRY *Blink; - } LIST_ENTRY, *PLIST_ENTRY; - - struct PEB_LDR_DATA { - uint32_t Length; - uint8_t Initialized; - uintptr_t SsHandle; - LIST_ENTRY InLoadOrderModuleList; - LIST_ENTRY InMemoryOrderModuleList; - LIST_ENTRY InInitializationOrderModuleList; - uintptr_t EntryInProgress; - uint8_t ShutdownInProgress; - uintptr_t ShutdownThreadId; - }; - - struct UNICODE_STRING { - uint16_t Length; - uint16_t MaximumLength; - wchar_t *Buffer; - }; - - struct STRING { - uint16_t Length; - uint16_t MaximumLength; - char *Buffer; - }; - - struct CURDIR { - UNICODE_STRING DosPath; - uintptr_t Handle; - }; - - struct RTL_DRIVE_LETTER_CURDIR { - uint16_t Flags; - uint16_t Length; - uint32_t TimeStamp; - STRING DosPath; - }; - - struct RTL_USER_PROCESS_PARAMETERS { - uint32_t MaximumLength; - uint32_t Length; - uint32_t Flags; - uint32_t DebugFlags; - uintptr_t ConsoleHandle; - uint32_t ConsoleFlags; - uintptr_t StandardInput; - uintptr_t StandardOutput; - uintptr_t StandardError; - CURDIR CurrentDirectory; - UNICODE_STRING DllPath; - UNICODE_STRING ImagePathName; - UNICODE_STRING CommandLine; - uintptr_t Environment; - uint32_t StartingX; - uint32_t StartingY; - uint32_t CountX; - uint32_t CountY; - uint32_t CountCharsX; - uint32_t CountCharsY; - uint32_t FillAttribute; - uint32_t WindowFlags; - uint32_t ShowWindowFlags; - UNICODE_STRING WindowTitle; - UNICODE_STRING DesktopInfo; - UNICODE_STRING ShellInfo; - UNICODE_STRING RuntimeData; - RTL_DRIVE_LETTER_CURDIR CurrentDirectores[ 32 ]; - uintptr_t EnvironmentSize; - uintptr_t EnvironmentVersion; - uintptr_t PackageDependencyData; - uint32_t ProcessGroupId; - uint32_t LoaderThreads; - }; - - struct RTL_BALANCED_NODE { - RTL_BALANCED_NODE *Children[ 2 ]; - RTL_BALANCED_NODE *Left; - RTL_BALANCED_NODE *Right; - uintptr_t ParentValue; - }; - - struct _PEB { - uint8_t InheritedAddressSpace; - uint8_t ReadImageFileExecOptions; - uint8_t BeingDebugged; - uint8_t BitField; - //uchar Padding0[ 4 ]; - uintptr_t Mutant; - uintptr_t ImageBaseAddress; - PEB_LDR_DATA *Ldr; - RTL_USER_PROCESS_PARAMETERS *ProcessParameters; - uintptr_t SubSystemData; - uintptr_t ProcessHeap; - uintptr_t *FastPebLock; - uintptr_t AtlThunkSListPtr; - uintptr_t IFEOKey; - uint32_t CrossProcessFlags; - uint8_t Padding1[ 4 ]; - uintptr_t KernelCallbackTable; - uintptr_t UserSharedInfoPtr; - uint32_t SystemReserved[ 1 ]; - uint32_t AtlThunkSListPtr32; - uintptr_t ApiSetMap; - uint32_t TlsExpansionCounter; - uint8_t Padding2[ 4 ]; - uintptr_t TlsBitmap; - uint32_t TlsBitmapBits[ 2 ]; - uintptr_t ReadOnlySharedMemoryBase; - uintptr_t SparePvoid0; - uintptr_t ReadOnlyStaticServerData; - uintptr_t AnsiCodePageData; - uintptr_t OemCodePageData; - uintptr_t UnicodeCaseTableData; - uint32_t NumberOfProcessors; - uint32_t NtGlobalFlag; - uint64_t CriticalSectionTimeout; - uintptr_t HeapSegmentReserve; - uintptr_t HeapSegmentCommit; - uintptr_t HeapDeCommitTotalFreeThreshold; - uintptr_t HeapDeCommitFreeBlockThreshold; - uint32_t NumberOfHeaps; - uint32_t MaximumNumberOfHeaps; - uintptr_t ProcessHeaps; - uintptr_t GdiSharedHandleTable; - uintptr_t ProcessStarterHelper; - uint32_t GdiDCAttributeList; - uint8_t Padding3[ 4 ]; - uintptr_t *LoaderLock; - uint32_t OSMajorVersion; - uint32_t OSMinorVersion; - uint16_t OSBuildNumber; - uint16_t OSCSDVersion; - uint32_t OSPlatformId; - uint32_t ImageSubsystem; - uint32_t ImageSubsystemMajorVersion; - uint32_t ImageSubsystemMinorVersion; - uint8_t Padding4[ 4 ]; - uintptr_t ActiveProcessAffinityMask; -#ifdef _WIN32 - uint32_t GdiHandleBuffer[ 34 ]; -#else - uint32_t GdiHandleBuffer[ 60 ]; -#endif - uintptr_t PostProcessInitRoutine; - uintptr_t TlsExpansionBitmap; - uint32_t TlsExpansionBitmapBits[ 32 ]; - uint32_t SessionId; - uint8_t Padding5[ 4 ]; - uint64_t AppCompatFlags; - uint64_t AppCompatFlagsUser; - uintptr_t pShimData; - uintptr_t AppCompatInfo; - UNICODE_STRING CSDVersion; - uintptr_t ActivationContextData; - uintptr_t ProcessAssemblyStorageMap; - uintptr_t SystemDefaultActivationContextData; - uintptr_t SystemAssemblyStorageMap; - uintptr_t MinimumStackCommit; - uintptr_t FlsCallback; - LIST_ENTRY FlsListHead; - uintptr_t FlsBitmap; - uint32_t FlsBitmapBits[ 4 ]; - uint32_t FlsHighIndex; - uintptr_t WerRegistrationData; - uintptr_t WerShipAssertPtr; - uintptr_t pUnused; - uintptr_t pImageHeaderHash; - uint32_t TracingFlags; - uint8_t Padding6[ 4 ]; - uint64_t CsrServerReadOnlySharedMemoryBase; - uintptr_t TppWorkerpListLock; - LIST_ENTRY TppWorkerpList; - uintptr_t WaitOnAddressHashTable[ 128 ]; - }; - - struct LDR_DATA_TABLE_ENTRY { - LIST_ENTRY InLoadOrderLinks; - LIST_ENTRY InMemoryOrderLinks; - LIST_ENTRY InInitializationOrderLinks; - uintptr_t DllBase; - uintptr_t EntryPoint; - uint32_t SizeOfImage; - UNICODE_STRING FullDllName; - UNICODE_STRING BaseDllName; - uint8_t FlagGroup[ 4 ]; - uint32_t Flags; - uint16_t ObsoleteLoadCount; - uint16_t TlsIndex; - LIST_ENTRY HashLinks; - uint32_t TimeDateStamp; - uintptr_t EntryPointActivationContext; - uintptr_t Lock; - uintptr_t DdagNode; - LIST_ENTRY NodeModuleLink; - uintptr_t LoadContext; - uintptr_t ParentDllBase; - uintptr_t SwitchBackContext; - RTL_BALANCED_NODE BaseAddressIndexNode; - RTL_BALANCED_NODE MappingInfoIndexNode; - uintptr_t OriginalBase; - int64_t LoadTime; - uint32_t BaseNameHashValue; - uint32_t LoadReason; - uint32_t ImplicitPathOptions; - uint32_t ReferenceCount; - }; -}; \ No newline at end of file diff --git a/injector/util.h b/injector/util.h deleted file mode 100644 index 61b18dc..0000000 --- a/injector/util.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once -#include - -namespace util -{ - __forceinline void memcpy( void* dst, void* src, size_t size ) { - uint8_t* data = ( uint8_t* )src; - uint8_t* dest = ( uint8_t* )dst; - - for( size_t i{ }; i < size; ++i ) { - dest[ i ] = data[ i ]; - } - } - - __forceinline size_t strlen( const char* str ) { - size_t len; - for( len = 0; !!str[ len ]; ++len ); - - return len; - } - - __forceinline bool strcmp( const char* str, const char* comp ) { - for( size_t i{ }; i < strlen( comp ); ++i ) { - if( str[ i ] != comp[ i ] ) return false; - } - - return true; - } - - __forceinline size_t wstrlen( const wchar_t* str ) { - size_t len; - for( len = 0; !!str[ len ]; ++len ); - - return len; - } - - __forceinline bool wstrcmp( const wchar_t* str, const wchar_t* comp ) { - for( size_t i{ }; i < wstrlen( comp ); ++i ) { - if( str[ i ] != comp[ i ] ) return false; - } - - return true; - } -} \ No newline at end of file diff --git a/injector/winapi.h b/injector/winapi.h deleted file mode 100644 index 6fceeb7..0000000 --- a/injector/winapi.h +++ /dev/null @@ -1,81 +0,0 @@ -#pragma once -#include - -#include "pe.h" -#include "util.h" - -namespace winapi -{ - auto get_peb( ) { - return ( nt::_PEB* )( __readfsdword( 0x30 ) ); - } - - namespace k32 { - __declspec( noinline ) static void* get_module_handle( const wchar_t* module_ ) { - auto peb = get_peb( ); - auto ldr = peb->Ldr; - - auto root = &ldr->InMemoryOrderModuleList; - - for( auto mod = root->Flink; mod != root; mod = mod->Flink ) { - nt::LDR_DATA_TABLE_ENTRY* data_table; - void* module_base; - wchar_t* module_name; - - data_table = reinterpret_cast< decltype( data_table ) >( mod ); - module_base = reinterpret_cast< void* >( ( ( void** )( uintptr_t( data_table ) + 0x10 ) )[ 0 ] ); - - module_name = ( wchar_t* )_alloca( ( data_table->FullDllName.Length + 1 ) * 2 ); - util::memcpy( module_name, data_table->FullDllName.Buffer, data_table->FullDllName.Length * 2 ); - module_name[ data_table->FullDllName.Length ] = L'0'; - - if( util::wstrcmp( module_name, module_ ) ) { - return module_base; - } - } - - return false; - } - - __declspec( noinline ) uintptr_t get_proc_address( void* module_, const char* proc_name ) { - nt::IMAGE_DOS_HEADER* dos_header; - nt::IMAGE_NT_HEADERS* nt_headers; - uintptr_t export_address; - nt::IMAGE_EXPORT_DIRECTORY* export_dir; - const char* export_name; - uintptr_t* names; - uintptr_t* funcs; - uint16_t* ords; - uint32_t export_hash; - - dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); - nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); - - //find addresses of functions from nt headers - export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; - export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); - - if( !export_dir->NumberOfFunctions ) - return uintptr_t{ }; - - names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); - funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); - - ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); - - if( names && funcs && ords ) { - //iterate the exports - for( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { - export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); - if( util::strcmp( export_name, proc_name ) ) { - return uintptr_t( module_ ) + funcs[ ords[ i ] ]; - } - } - } - - while( 1 ) { } - - return uintptr_t{ }; - } - } -} \ No newline at end of file diff --git a/internal_rewrite/CHLClient.hpp b/internal_rewrite/CHLClient.hpp deleted file mode 100644 index 94d209f..0000000 --- a/internal_rewrite/CHLClient.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#pragma once -#include "util.hpp" -#include "IClientEntityList.hpp" -#include "ClientClass.hpp" -#include "color.hpp" - -enum ClientFrameStage_t { - FRAME_UNDEFINED = -1, - FRAME_START, - FRAME_NET_UPDATE_START, - FRAME_NET_UPDATE_POSTDATAUPDATE_START, - FRAME_NET_UPDATE_POSTDATAUPDATE_END, - FRAME_NET_UPDATE_END, - FRAME_RENDER_START, - FRAME_RENDER_END -}; - -struct GlowObject_t { - IClientEntity* m_pEntity; - fclr_t color; - char junk0[ 8 ]; - float m_flBloomAmount; - char junk1[ 4 ]; - bool m_bRenderWhenOccluded; - bool m_bRenderWhenUnoccluded; - bool m_bFullBloom; - char junk2[ 14 ]; -}; - -struct GlowObjectManager_t { - GlowObject_t* DataPtr; //0000 - unsigned int Max; //0004 - unsigned int unk02; //0008 - unsigned int Count; //000C - unsigned int DataPtrBack; //0010 - int m_nFirstFreeSlot; //0014 - unsigned int unk1; //0018 - unsigned int unk2; //001C - unsigned int unk3; //0020 - unsigned int unk4; //0024 - unsigned int unk5; //0028 -}; - -class IBaseClientDLL -{ -public: - ClientClass* GetAllClasses( ) { - using fn = ClientClass*( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 8 )( this ); - } - - /* - DONTCARE - void SetCrosshairAngle( Vector& angle ) - { - typedef void( __thiscall* SetCrosshairAngleFn )( void*, Vector& ); - CallVFunction( this, 29 )( this, angle ); - } - - void HudProcessInput( bool enable ) - { - using fn = void( __thiscall* )( void*, bool ); - CallVFunction( this, 10 )( this, enable ); - } - - void HudUpdate( bool enable ) - { - using fn = void( __thiscall* )( void*, bool ); - CallVFunction( this, 11 )( this, enable ); - } - - void IN_ActivateMouse( ) - { - using fn = void( __thiscall* )( void* ); - CallVFunction( this, 15 )( this ); - } - - void IN_DeactivateMouse( ) - { - using fn = void( __thiscall* )( void* ); - CallVFunction( this, 16 )( this ); - }*/ -}; \ No newline at end of file diff --git a/internal_rewrite/CInput.hpp b/internal_rewrite/CInput.hpp deleted file mode 100644 index 84802d3..0000000 --- a/internal_rewrite/CInput.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include "vector.hpp" -#include "IClientMode.hpp" - -#define MULTIPLAYER_BACKUP 150 - -struct verified_cmd_t { - user_cmd_t m_cmd; - CRC32_t m_crc; -}; - -class CInput { - void* pvftable; //0x00 -public: - bool m_fTrackIRAvailable; //0x04 - bool m_fMouseInitialized; //0x05 - bool m_fMouseActive; //0x06 - bool m_fJoystickAdvancedInit; //0x07 -private: - char pad_0x08[ 0x2C ]; //0x08 -public: - void* m_pKeys; //0x34 -private: - char pad_0x38[ 0x64 ]; //0x38 - int pad_0x41; - int pad_0x42; -public: - bool m_fCameraInterceptingMouse; //0x9C - bool m_fCameraInThirdPerson; //0x9D - bool m_fCameraMovingWithMouse; //0x9E - vec3_t m_vecCameraOffset; //0xA0 - bool m_fCameraDistanceMove; //0xAC - int m_nCameraOldX; //0xB0 - int m_nCameraOldY; //0xB4 - int m_nCameraX; //0xB8 - int m_nCameraY; //0xBC - bool m_CameraIsOrthographic; //0xC0 - vec3_t m_angPreviousViewAngles; //0xC4 - vec3_t m_angPreviousViewAnglesTilt; //0xD0 - float m_flLastForwardMove; //0xDC - int m_nClearInputState; //0xE0 -public: - user_cmd_t* m_pCommands; //0xEC - verified_cmd_t* m_pVerifiedCommands; //0xF0 - int m_hSelectedWeapon; - - user_cmd_t* GetUserCmd( int slot, int seq_num ) { - return util::get_vfunc< 8, user_cmd_t* >( this, slot, seq_num ); - } - - void CreateMove( int sequence_number, float input_sample_time, bool active ) { - return util::get_vfunc< 3, void >( this, sequence_number, input_sample_time, active ); - } -}; diff --git a/internal_rewrite/CUtlVector.hpp b/internal_rewrite/CUtlVector.hpp deleted file mode 100644 index 6e43505..0000000 --- a/internal_rewrite/CUtlVector.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -template -class CUtlMemory { -public: - T* GetBuffer( void ) { - return m_pMemory; - } - - int GetAllocationCount( void ) { - return m_nAllocationCount; - } - - int GetGrowSize( void ) { - return m_nGrowSize; - } - - T* OffsetBufferByIndex( size_t index ) { - return m_pMemory + index; - } - -private: - T* m_pMemory; - int m_nAllocationCount; - int m_nGrowSize; -}; - -template > -class CUtlVector { -public: - Allocator GetMemory( void ) { - return m_Memory; - } - - int GetSize( void ) { - return m_Size; - } - - T* GetElements( void ) { - return m_pElements; - } - -private: - Allocator m_Memory; - int m_Size; - T* m_pElements; -}; \ No newline at end of file diff --git a/internal_rewrite/ClientClass.hpp b/internal_rewrite/ClientClass.hpp deleted file mode 100644 index fc1f140..0000000 --- a/internal_rewrite/ClientClass.hpp +++ /dev/null @@ -1,272 +0,0 @@ -#pragma once -#include "Valve/dt_common.h" -#include "Valve/dt_recv.h" - -enum ClassId_t { - CAI_BaseNPC, - CAK47, - CBaseAnimating, - CBaseAnimatingOverlay, - CBaseAttributableItem, - CBaseButton, - CBaseCombatCharacter, - CBaseCombatWeapon, - CBaseCSGrenade, - CBaseCSGrenadeProjectile, - CBaseDoor, - CBaseEntity_, - CBaseFlex, - CBaseGrenade, - CBaseParticleEntity, - CBasePlayer, - CBasePropDoor, - CBaseTeamObjectiveResource, - CBaseTempEntity, - CBaseToggle, - CBaseTrigger, - CBaseViewModel, - CBaseVPhysicsTrigger, - CBaseWeaponWorldModel, - CBeam, - CBeamSpotlight, - CBoneFollower, - CBreakableProp, - CBreakableSurface, - CC4, - CCascadeLight, - CChicken, - CColorCorrection, - CColorCorrectionVolume, - CCSGameRulesProxy, - CCSPlayer, - CCSPlayerResource, - CCSRagdoll, - CCSTeam, - CDEagle, - CDecoyGrenade, - CDecoyProjectile, - CDynamicLight, - CDynamicProp, - CEconEntity, - CEconWearable, - CEmbers, - CEntityDissolve, - CEntityFlame, - CEntityFreezing, - CEntityParticleTrail, - CEnvAmbientLight, - CEnvDetailController, - CEnvDOFController, - CEnvParticleScript, - CEnvProjectedTexture, - CEnvQuadraticBeam, - CEnvScreenEffect, - CEnvScreenOverlay, - CEnvTonemapController, - CEnvWind, - CFEPlayerDecal, - CFireCrackerBlast, - CFireSmoke, - CFireTrail, - CFish, - CFlashbang, - CFogController, - CFootstepControl, - CFunc_Dust, - CFunc_LOD, - CFuncAreaPortalWindow, - CFuncBrush, - CFuncConveyor, - CFuncLadder, - CFuncMonitor, - CFuncMoveLinear, - CFuncOccluder, - CFuncReflectiveGlass, - CFuncRotating, - CFuncSmokeVolume, - CFuncTrackTrain, - CGameRulesProxy, - CHandleTest, - CHEGrenade, - CHostage, - CHostageCarriableProp, - CIncendiaryGrenade, - CInferno, - CInfoLadderDismount, - CInfoOverlayAccessor, - CItem_Healthshot, - CItemDogtags, - CKnife, - CKnifeGG, - CLightGlow, - CMaterialModifyControl, - CMolotovGrenade, - CMolotovProjectile, - CMovieDisplay, - CParticleFire, - CParticlePerformanceMonitor, - CParticleSystem, - CPhysBox, - CPhysBoxMultiplayer, - CPhysicsProp, - CPhysicsPropMultiplayer, - CPhysMagnet, - CPlantedC4, - CPlasma, - CPlayerResource, - CPointCamera, - CPointCommentaryNode, - CPointWorldText, - CPoseController, - CPostProcessController, - CPrecipitation, - CPrecipitationBlocker, - CPredictedViewModel, - CProp_Hallucination, - CPropDoorRotating, - CPropJeep, - CPropVehicleDriveable, - CRagdollManager, - CRagdollProp, - CRagdollPropAttached, - CRopeKeyframe, - CSCAR17, - CSceneEntity, - CSensorGrenade, - CSensorGrenadeProjectile, - CShadowControl, - CSlideshowDisplay, - CSmokeGrenade, - CSmokeGrenadeProjectile, - CSmokeStack, - CSpatialEntity, - CSpotlightEnd, - CSprite, - CSpriteOriented, - CSpriteTrail, - CStatueProp, - CSteamJet, - CSun, - CSunlightShadowControl, - CTeam, - CTeamplayRoundBasedRulesProxy, - CTEArmorRicochet, - CTEBaseBeam, - CTEBeamEntPoint, - CTEBeamEnts, - CTEBeamFollow, - CTEBeamLaser, - CTEBeamPoints, - CTEBeamRing, - CTEBeamRingPoint, - CTEBeamSpline, - CTEBloodSprite, - CTEBloodStream, - CTEBreakModel, - CTEBSPDecal, - CTEBubbles, - CTEBubbleTrail, - CTEClientProjectile, - CTEDecal, - CTEDust, - CTEDynamicLight, - CTEEffectDispatch, - CTEEnergySplash, - CTEExplosion, - CTEFireBullets, - CTEFizz, - CTEFootprintDecal, - CTEFoundryHelpers, - CTEGaussExplosion, - CTEGlowSprite, - CTEImpact, - CTEKillPlayerAttachments, - CTELargeFunnel, - CTEMetalSparks, - CTEMuzzleFlash, - CTEParticleSystem, - CTEPhysicsProp, - CTEPlantBomb, - CTEPlayerAnimEvent, - CTEPlayerDecal, - CTEProjectedDecal, - CTERadioIcon, - CTEShatterSurface, - CTEShowLine, - CTesla, - CTESmoke, - CTESparks, - CTESprite, - CTESpriteSpray, - CTest_ProxyToggle_Networkable, - CTestTraceline, - CTEWorldDecal, - CTriggerPlayerMovement, - CTriggerSoundOperator, - CVGuiScreen, - CVoteController, - CWaterBullet, - CWaterLODControl, - CWeaponAug, - CWeaponAWP, - CWeaponBaseItem, - CWeaponBizon, - CWeaponCSBase, - CWeaponCSBaseGun, - CWeaponCycler, - CWeaponElite, - CWeaponFamas, - CWeaponFiveSeven, - CWeaponG3SG1, - CWeaponGalil, - CWeaponGalilAR, - CWeaponGlock, - CWeaponHKP2000, - CWeaponM249, - CWeaponM3, - CWeaponM4A1, - CWeaponMAC10, - CWeaponMag7, - CWeaponMP5Navy, - CWeaponMP7, - CWeaponMP9, - CWeaponNegev, - CWeaponNOVA, - CWeaponP228, - CWeaponP250, - CWeaponP90, - CWeaponSawedoff, - CWeaponSCAR20, - CWeaponScout, - CWeaponSG550, - CWeaponSG552, - CWeaponSG556, - CWeaponSSG08, - CWeaponTaser, - CWeaponTec9, - CWeaponTMP, - CWeaponUMP45, - CWeaponUSP, - CWeaponXM1014, - CWorld, - DustTrail, - MovieExplosion, - ParticleSmokeGrenade, - RocketTrail, - SmokeTrail, - SporeExplosion, - SporeTrail, -}; - -class ClientClass { -public: - using create_fn = void*( *)( int, int ); - using event_fn = void*( *); - - create_fn m_create_fn; - event_fn m_createevent_fn; - char* m_name; - RecvTable* m_rt_table; - ClientClass* m_next; - int m_class_id; -}; \ No newline at end of file diff --git a/internal_rewrite/GlobalVars_t.hpp b/internal_rewrite/GlobalVars_t.hpp deleted file mode 100644 index 4cfcfb4..0000000 --- a/internal_rewrite/GlobalVars_t.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -class global_vars_t { -public: - float m_realtime; - int m_framecount; - float m_absframetime; -private: - float m_absoluteframestarttimestddev; -public: - float m_curtime; - float m_frametime; - int m_maxclients; - int m_tickcount; - float m_interval_per_tick; - float m_interpolation_amount; - int m_sim_ticks; - int m_network_protocol; -private: - char pad00[ 14 ]; -}; \ No newline at end of file diff --git a/internal_rewrite/IAppSystem.hpp b/internal_rewrite/IAppSystem.hpp deleted file mode 100644 index 61a6c8e..0000000 --- a/internal_rewrite/IAppSystem.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -class AppSystemInfo_t; - -enum InitReturnVal_t; - -enum AppSystemTier_t { - APP_SYSTEM_TIER0 = 0, - APP_SYSTEM_TIER1, - APP_SYSTEM_TIER2, - APP_SYSTEM_TIER3, - - APP_SYSTEM_TIER_OTHER, -}; - - -class IAppSystem { -public: - virtual bool Connect( void* factory ) = 0; - virtual void Disconnect( ) = 0; - virtual void* QueryInterface( const char* pInterfaceName ) = 0; - virtual InitReturnVal_t Init( ) = 0; - virtual void Shutdown( ) = 0; - virtual const AppSystemInfo_t* GetDependencies( ) = 0; - virtual AppSystemTier_t GetTier( ) = 0; - virtual void Reconnect( void* factory, const char* pInterfaceName ) = 0; - virtual bool IsSingleton( ) = 0; -}; \ No newline at end of file diff --git a/internal_rewrite/IClientEntityList.hpp b/internal_rewrite/IClientEntityList.hpp deleted file mode 100644 index d6a65e4..0000000 --- a/internal_rewrite/IClientEntityList.hpp +++ /dev/null @@ -1,143 +0,0 @@ -#pragma once -#include "util.hpp" -#include "vector.hpp" -#include "ClientClass.hpp" -#include "IVEngineClient.hpp" - -class ICollideable; -class IClientNetworkable; -class IClientRenderable; -class IClientThinkable; -class IClientEntity; -class IClientAlphaProperty; -class bf_read; -using model_t = uintptr_t; - - -class c_base_player; - -class IClientUnknown { -public: - virtual ICollideable* GetCollideable( ) = 0; - virtual IClientNetworkable* GetClientNetworkable( ) = 0; - virtual IClientRenderable* GetClientRenderable( ) = 0; - virtual IClientEntity* GetIClientEntity( ) = 0; - virtual IClientEntity* GetBaseEntity( ) = 0; - virtual IClientThinkable* GetClientThinkable( ) = 0; - //virtual IClientModelRenderable* GetClientModelRenderable() = 0; - virtual IClientAlphaProperty* GetClientAlphaProperty( ) = 0; -}; - -class IClientNetworkable { -public: - virtual IClientUnknown* GetIClientUnknown( ) = 0; - virtual void Release( ) = 0; - virtual ClientClass* GetClientClass( ) = 0; - virtual void NotifyShouldTransmit( int state ) = 0; - virtual void OnPreDataChanged( int updateType ) = 0; - virtual void OnDataChanged( int updateType ) = 0; - virtual void PreDataUpdate( int updateType ) = 0; - virtual void PostDataUpdate( int updateType ) = 0; - virtual void OnDataUnchangedInPVS( void ) = 0; - virtual bool IsDormant( void ) = 0; - virtual int EntIndex( void ) const = 0; - virtual void ReceiveMessage( int classID, bf_read& msg ) = 0; - virtual void* GetDataTableBasePtr( ) = 0; - virtual void SetDestroyedOnRecreateEntities( void ) = 0; -}; - -class IClientEntity { -public: - void* GetClientRenderable( ) { - return reinterpret_cast< void* >( this + 0x4 ); - } - - IClientNetworkable* GetClientNetworkable( ) { - return reinterpret_cast< IClientNetworkable* >( this + 0x8 ); - } - - ICollideable* GetCollideable( ) { - using fn = ICollideable* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 2 )( this ); - } - - vec3_t& GetRenderOrigin( ) { - using fn = vec3_t& ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 10 )( this ); - } - - vec3_t& GetRenderAngles( ) { - using fn = vec3_t& ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 11 )( this ); - } - - ClientClass* GetClientClass( ) { - if( !*( void** )( this ) ) - return nullptr; - - if( !*( void** )( GetClientNetworkable( ) ) ) - return nullptr; - - return GetClientNetworkable( )->GetClientClass( ); - } - - bool IsDormant( ) { - return GetClientNetworkable( )->IsDormant( ); - } - - int GetIndex( ) { - if( !this ) return 0; - - // no vfunc :> - return *reinterpret_cast< int* >( this + 0x64 ); - - return GetClientNetworkable( )->EntIndex( ); - } - - model_t* GetModel( ) { - using fn = model_t* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this->GetClientRenderable( ), 8 )( this->GetClientRenderable( ) ); - } - - int DrawModel( int flags, uint8_t alpha ) { - using fn = int( __thiscall* )( void*, int, uint8_t ); - return util::get_vfunc< fn >( this->GetClientRenderable( ), 9 )( this->GetClientRenderable( ), flags, alpha ); - } - - bool SetupBones( matrix3x4* bone_to_world, int max_bones, int mask, float time ) { - using fn = bool( __thiscall* )( void*, matrix3x4*, int, int, float ); - return util::get_vfunc< fn >( GetClientRenderable( ), 13 ) - ( GetClientRenderable( ), bone_to_world, max_bones, mask, time ); - } - - template < typename t > - t* as( ) { - return reinterpret_cast< t* >( this ); - } -}; - -class IClientEntityList -{ -public: - IClientNetworkable* GetClientNetworkable( int index ) { - using fn = IClientNetworkable* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 1 )( this, index ); - } - - template < typename t = c_base_player > - t* GetClientEntity( int index ) { - using fn = t* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 3 )( this, index ); - } - - template < typename t = c_base_player > - t* GetClientEntityFromHandle( uint32_t handle ) { - using fn = t* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 4 )( this, handle ); - } - - int GetHighestEntityIndex( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 6 )( this ); - } -}; \ No newline at end of file diff --git a/internal_rewrite/IClientMode.hpp b/internal_rewrite/IClientMode.hpp deleted file mode 100644 index dc7d15d..0000000 --- a/internal_rewrite/IClientMode.hpp +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once -#include "valve/checksum_crc.h" - -#include "util.hpp" -#include "vector.hpp" - -enum player_controls_t { - IN_ATTACK = 1 << 0, - IN_JUMP = 1 << 1, - IN_DUCK = 1 << 2, - IN_FORWARD = 1 << 3, - IN_BACK = 1 << 4, - IN_USE = 1 << 5, - IN_CANCEL = 1 << 6, - IN_LEFT = 1 << 7, - IN_RIGHT = 1 << 8, - IN_MOVELEFT = 1 << 9, - IN_MOVERIGHT = 1 << 10, - IN_ATTACK2 = 1 << 11, - IN_RUN = 1 << 12, - IN_RELOAD = 1 << 13, - IN_ALT1 = 1 << 14, - IN_ALT2 = 1 << 15, - IN_SCORE = 1 << 16, - IN_SPEED = 1 << 17, - IN_WALK = 1 << 18, - IN_ZOOM = 1 << 19, - IN_WEAPON1 = 1 << 20, - IN_WEAPON2 = 1 << 21, - IN_BULLRUSH = 1 << 22, - IN_GRENADE1 = 1 << 23, - IN_GRENADE2 = 1 << 24, - IN_ATTACK3 = 1 << 25, -}; - -class user_cmd_t { -public: - virtual ~user_cmd_t( ) { }; - - int m_cmd_nr; // 0x04 For matching server and client commands for debugging - int m_tick_count; // 0x08 the tick the client created this command - vec3_t m_viewangles; // 0x0C Player instantaneous view angles. - vec3_t m_aimdirection; // 0x18 - float m_forwardmove; // 0x24 - float m_sidemove; // 0x28 - float m_upmove; // 0x2C - int m_buttons; // 0x30 Attack button states - uint8_t m_impulse; // 0x34 - int m_weaponselect; // 0x38 Current weapon id - int m_weaponsubtype; // 0x3C - int m_random_seed; // 0x40 For shared random functions - short m_mousedx; // 0x44 mouse accum in x from create move - short m_mousedy; // 0x46 mouse accum in y from create move - bool m_predicted; // 0x48 Client only, tracks whether we've predicted this command at least once - vec3_t headangles; // 0x49 - vec3_t headoffset; // 0x55 - - __forceinline user_cmd_t clamp( bool angles = true ) { - if( angles ) - m_viewangles.clamp( ); - - m_forwardmove = std::clamp( m_forwardmove, -450.f, 450.f ); - m_sidemove = std::clamp( m_sidemove, -450.f, 450.f ); - m_upmove = std::clamp( m_upmove, -450.f, 450.f ); - - return *this; - } - - CRC32_t get_check_sum( ) { - CRC32_t crc; - CRC32_Init( &crc ); - - CRC32_ProcessBuffer( &crc, &m_cmd_nr, sizeof( m_cmd_nr ) ); - CRC32_ProcessBuffer( &crc, &m_tick_count, sizeof( m_tick_count ) ); - CRC32_ProcessBuffer( &crc, &m_viewangles, sizeof( m_viewangles ) ); - CRC32_ProcessBuffer( &crc, &m_aimdirection, sizeof( m_aimdirection ) ); - CRC32_ProcessBuffer( &crc, &m_forwardmove, sizeof( m_forwardmove ) ); - CRC32_ProcessBuffer( &crc, &m_sidemove, sizeof( m_sidemove ) ); - CRC32_ProcessBuffer( &crc, &m_upmove, sizeof( m_upmove ) ); - CRC32_ProcessBuffer( &crc, &m_buttons, sizeof( m_buttons ) ); - CRC32_ProcessBuffer( &crc, &m_impulse, sizeof( m_impulse ) ); - CRC32_ProcessBuffer( &crc, &m_weaponselect, sizeof( m_weaponselect ) ); - CRC32_ProcessBuffer( &crc, &m_weaponsubtype, sizeof( m_weaponsubtype ) ); - CRC32_ProcessBuffer( &crc, &m_random_seed, sizeof( m_random_seed ) ); - CRC32_ProcessBuffer( &crc, &m_mousedx, sizeof( m_mousedx ) ); - CRC32_ProcessBuffer( &crc, &m_mousedy, sizeof( m_mousedy ) ); - - CRC32_Final( &crc ); - return crc; - } - -private: - - //char pad_0x4C[ 0x18 ]; // 0x4C Current sizeof( usercmd ) = 100 = 0x64 -}; - -class CHudChat { -public: - void ChatPrintf( int iPlayerIndex, int iFilter, const char* fmt ) { - using fn = void( __cdecl* )( void*, int, int, const char* ); - util::get_vfunc< fn >( this, 27 )( this, iPlayerIndex, iFilter, fmt ); - } -}; - -class CViewSetup { -public: - int m_x; - int m_oldX; - int m_y; - int m_oldY; - int m_width; - int m_oldWidth; - int m_height; - int m_oldHeight; - - bool m_bOrtho; - float m_OrthoLeft; - float m_OrthoTop; - float m_OrthoRight; - float m_OrthoBottom; - -private: - char pad1[ 0x7C ]; - -public: - float m_flFov; - float m_flFovViewmodel; - vec3_t m_vecOrigin; - vec3_t m_vecAngles; - - float zNear; - float zFar; - float zNearViewmodel; - float zFarViewmodel; - - float m_flAspectRatio; - float m_flNearBlurDepth; - float m_flNearFocusDepth; - float m_flFarFocusDepth; - float m_flFarBlurDepth; - float m_flNearBlurRadius; - float m_flFarBlurRadius; - int m_nDoFQuality; - int m_nMotionBlurMode; - float m_flShutterTime; - vec3_t m_vShutterOpenPosition; - vec3_t m_shutterOpenAngles; - vec3_t m_vShutterClosePosition; - vec3_t m_shutterCloseAngles; - float m_flOffCenterTop; - float m_flOffCenterBottom; - float m_flOffCenterLeft; - float m_flOffCenterRight; - int m_iEdgeBlur; -private: -}; - -class IClientMode { -public: - char _pad[ 28 ]; - - CHudChat* m_pChatElement; //0x2A -}; \ No newline at end of file diff --git a/internal_rewrite/ICvar.hpp b/internal_rewrite/ICvar.hpp deleted file mode 100644 index 9e8040f..0000000 --- a/internal_rewrite/ICvar.hpp +++ /dev/null @@ -1,206 +0,0 @@ -#pragma once -#include "IAppSystem.hpp" -#include "util.hpp" -#include "color.hpp" - -using CVarDLLIdentifier_t = int; -class IConVar; -using FnChangeCallback_t = void( *)( IConVar *var, const char *pOldValue, float flOldValue ); -class ConCommandBase; -class ConCommand; -class ICvarQuery; - -class IConsoleDisplayFunc { -public: - virtual void ColorPrint( const uint8_t* clr, const char *pMessage ) = 0; - virtual void Print( const char *pMessage ) = 0; - virtual void DPrint( const char *pMessage ) = 0; -}; - -#define FCVAR_NONE 0 - -// Command to ConVars and ConCommands -// ConVar Systems -#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. -#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined. -#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL -#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL -#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out. - -// ConVar only -#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value -#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. -#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc -#define FCVAR_NOTIFY (1<<8) // notifies players when changed -#define FCVAR_USERINFO (1<<9) // changes the client's info string -#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats - -#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). -#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log -#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar - -// It's a ConVar that's shared between the client and the server. -// At signon, the values of all such ConVars are sent from the server to the client (skipped for local -// client, of course ) -// If a change is requested it must come from the console (i.e., no remote client changes) -// If a value is changed while a server is active, it's replicated to all connected clients -#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time -#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file -#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles -#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload -#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload - -#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server -#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread -#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox - -#define FCVAR_ACCESSIBLE_FROM_THREADS (1<<25) // used as a debugging tool necessary to check material system thread convars - -#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd. -#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue). -#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command. - - -class cvar_t { -public: - void set_value( const char* value ) { - using fn = void( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 14 )( this, value ); - } - - void set_value( float value ) { - using fn = void( __thiscall* )( void*, float ); - return util::get_vfunc< fn >( this, 15 )( this, value ); - } - - void set_value( int value ) { - using fn = void( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 16 )( this, value ); - } - - void set_value( clr_t value ) { - using fn = void( __thiscall* )( void*, clr_t ); - return util::get_vfunc< fn >( this, 17 )( this, value ); - } - - char* get_name( ) { - using fn = char*( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 5 )( this ); - } - - char* get_default( ) { - return m_default; - } - - const char* get_string( ) { - return m_string; - } - - float get_float( ) { - using fn = float( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 12 )( this ); - } - - int get_int( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 13 )( this ); - } - -private: - void* m_vft; -public: - cvar_t* m_next; //0x0004 - __int32 m_registered; //0x0008 - char* m_name; //0x000C - char* m_help_str; //0x0010 - __int32 m_flags; //0x0014 -private: - char pad_0x0018[ 0x4 ]; //0x0018 -public: - cvar_t* m_parent; //0x001C - char* m_default; //0x0020 - char* m_string; //0x0024 - __int32 m_str_len; //0x0028 - float m_flvalue; //0x002C - __int32 m_nvalue; //0x0030 - __int32 m_has_min; //0x0034 - float m_min; //0x0038 - __int32 m_hax_max; //0x003C - float m_max; //0x0040 - void* m_change_callback; //0x0044 -};//Size=0x0048 - -class ICVar : public IAppSystem -{ -public: - // Allocate a unique DLL identifier - virtual CVarDLLIdentifier_t AllocateDLLIdentifier( ) = 0; - - // Register, unregister commands - virtual void RegisterConCommand( ConCommandBase *pCommandBase ) = 0; - virtual void UnregisterConCommand( ConCommandBase *pCommandBase ) = 0; - virtual void UnregisterConCommands( CVarDLLIdentifier_t id ) = 0; - - // If there is a + on the command line, this returns the value. - // Otherwise, it returns NULL. - virtual const char* GetCommandLineValue( const char *pVariableName ) = 0; - - // Try to find the cvar pointer by name - virtual ConCommandBase* FindCommandBase( const char *name ) = 0; - virtual const ConCommandBase* FindCommandBase( const char *name ) const = 0; - virtual cvar_t *FindVar( const char *var_name ) = 0; - virtual const cvar_t *FindVar( const char *var_name ) const = 0; - virtual ConCommand *FindCommand( const char *name ) = 0; - virtual const ConCommand *FindCommand( const char *name ) const = 0; - - - - // Install a global change callback (to be called when any convar changes) - virtual void InstallGlobalChangeCallback( FnChangeCallback_t callback ) = 0; - virtual void RemoveGlobalChangeCallback( FnChangeCallback_t callback ) = 0; - virtual void CallGlobalChangeCallbacks( cvar_t *var, const char *pOldString, float flOldValue ) = 0; - - // Install a console printer - virtual void InstallConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; - virtual void RemoveConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; - virtual void ConsoleColorPrintf( const clr_t& clr, const char *pFormat, ... ) const = 0; - virtual void ConsolePrintf( const char *pFormat, ... ) const = 0; - virtual void ConsoleDPrintf( const char *pFormat, ... ) const = 0; - - // Reverts cvars which contain a specific flag - virtual void RevertFlaggedConVars( int nFlag ) = 0; - - // Method allowing the engine ICvarQuery interface to take over - // A little hacky, owing to the fact the engine is loaded - // well after ICVar, so we can't use the standard connect pattern - virtual void InstallCVarQuery( ICvarQuery *pQuery ) = 0; - - - virtual void SetMaxSplitScreenSlots( int nSlots ) = 0; - virtual int GetMaxSplitScreenSlots( ) const = 0; - - virtual void AddSplitScreenConVars( ) = 0; - virtual void RemoveSplitScreenConVars( CVarDLLIdentifier_t id ) = 0; - - virtual int GetConsoleDisplayFuncCount( ) const = 0; - virtual void GetConsoleText( int nDisplayFuncIndex, char *pchText, size_t bufSize ) const = 0; - - // Utilities for convars accessed by the material system thread - virtual bool IsMaterialThreadSetAllowed( ) const = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, const char *pValue ) = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, int nValue ) = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, float flValue ) = 0; - virtual bool HasQueuedMaterialThreadConVarSets( ) const = 0; - virtual int ProcessQueuedMaterialThreadConVarSets( ) = 0; - - class ICVarIteratorInternal - { - public: - virtual void SetFirst( ) = 0; - virtual void Next( ) = 0; - virtual bool IsValid( ) = 0; - virtual ConCommandBase *Get( ) = 0; - }; - - virtual ICVarIteratorInternal* FactoryInternalIterator( ) = 0; -}; \ No newline at end of file diff --git a/internal_rewrite/IEngineTrace.hpp b/internal_rewrite/IEngineTrace.hpp deleted file mode 100644 index 681d64b..0000000 --- a/internal_rewrite/IEngineTrace.hpp +++ /dev/null @@ -1,384 +0,0 @@ -#pragma once -#include "vector.hpp" -#include "IClientEntityList.hpp" - -enum TraceType_t { - TRACE_EVERYTHING = 0, - TRACE_WORLD_ONLY, // NOTE: This does *not* test static props!!! - TRACE_ENTITIES_ONLY, // NOTE: This version will *not* test static props - TRACE_EVERYTHING_FILTER_PROPS, // NOTE: This version will pass the IHandleEntity for props through the filter, unlike all other filters -}; - -enum SurfaceFlags_t { - DISPSURF_FLAG_SURFACE = 1 << 0, - DISPSURF_FLAG_WALKABLE = 1 << 1, - DISPSURF_FLAG_BUILDABLE = 1 << 2, - DISPSURF_FLAG_SURFPROP1 = 1 << 3, - DISPSURF_FLAG_SURFPROP2 = 1 << 4, -}; - -enum Hitgroup_t { - HITGROUP_GENERIC, - HITGROUP_HEAD, - HITGROUP_CHEST, - HITGROUP_STOMACH, - HITGROUP_LEFTARM, - HITGROUP_RIGHTARM, - HITGROUP_LEFTLEG, - HITGROUP_RIGHTLEG, - HITGROUP_GEAR -}; - -struct csurface_t { - const char* name; - short surfaceProps; - unsigned short flags; -}; - -struct cplane_t { - vec3_t normal; - float dist; - uint8_t type; - uint8_t signbits; - uint8_t pad[ 2 ]; -}; - -class ITraceFilter { -public: - virtual bool ShouldHitEntity( void* pEntity, int contentsMask ) = 0; - virtual int GetTraceType( ) const = 0; -}; - -class CTraceFilter : public ITraceFilter { -public: - CTraceFilter( ) {} - - CTraceFilter( void *ent ) - : pSkip( ent ) {} - - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return !( pEntityHandle == pSkip ); - } - - int GetTraceType( ) const override { - return TRACE_EVERYTHING; - } - - void* pSkip; -}; - -class CTraceFilterOneEntity : public ITraceFilter { -public: - bool ShouldHitEntity( void* entity_handle, int contents ) override { - return entity_handle == ent; - } - - int GetTraceType( ) const override { - return TRACE_ENTITIES_ONLY; - } - - void* ent; -}; - -class CTraceFilterWorldAndPropsOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return false; - } - - int GetTraceType( ) const override { - return TRACE_EVERYTHING; - } -}; - -class CTraceFilterEntitiesOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return !( pEntityHandle == pSkip ); - } - - int GetTraceType( ) const override { - return TRACE_ENTITIES_ONLY; - } - - void* pSkip; -}; - -class CTraceFilterPlayersOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - IClientEntity* hit_entity = ( IClientEntity* )pEntityHandle; - int index = hit_entity->GetIndex( ); - return !( pEntityHandle == pSkip || index < 1 || index > 64 ); - } - - int GetTraceType( ) const override { - return TRACE_ENTITIES_ONLY; - } - - void* pSkip; -}; - -class CTraceFilterWorldOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return false; - } - - int GetTraceType( ) const override { - return TRACE_WORLD_ONLY; - } - - void* pSkip; -}; - -class CTraceFilterSkipTwoEntities : public ITraceFilter { -public: - CTraceFilterSkipTwoEntities( ) { - - } - - CTraceFilterSkipTwoEntities( void* pPassEnt1, void* pPassEnt2 ) { - passentity1 = pPassEnt1; - passentity2 = pPassEnt2; - } - - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return !( pEntityHandle == passentity1 || pEntityHandle == passentity2 ); - } - - int GetTraceType( ) const override { - return TRACE_EVERYTHING; - } - - void* passentity1; - void* passentity2; -}; - -class __declspec( align( 16 ) )VectorAligned : public vec3_t { -public: - VectorAligned( float _x, float _y, float _z ) { - x = _x; - y = _y; - z = _z; - w = 0; - } - - VectorAligned( ) { } - - void operator=( const vec3_t& vOther ) { - x = vOther.x; - y = vOther.y; - z = vOther.z; - } - - float w; -}; - -struct Ray_t -{ - VectorAligned m_Start; - VectorAligned m_Delta; - VectorAligned m_StartOffset; - VectorAligned m_Extents; - - const matrix3x4* m_pWorldAxisTransform; - - bool m_IsRay; - bool m_IsSwept; - - Ray_t( ) : m_pWorldAxisTransform( nullptr ) { } - - void Init( const vec3_t& start, const vec3_t& end ) { - m_Delta = end - start; - - m_IsSwept = m_Delta.lengthsqr( ) != 0; - - m_Extents = vec3_t( 0.f, 0.f, 0.f ); - m_pWorldAxisTransform = nullptr; - m_IsRay = true; - - m_StartOffset = vec3_t( 0.f, 0.f, 0.f ); - m_Start = start; - } - - void Init( const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs ) { - m_Delta = end - start; - - m_pWorldAxisTransform = nullptr; - m_IsSwept = m_Delta.lengthsqr( ) != 0; - - m_Extents = maxs - mins; - m_Extents *= 0.5f; - m_IsRay = m_Extents.lengthsqr( ) < 1e-6; - - m_StartOffset = mins + maxs; - m_StartOffset *= 0.5f; - m_Start = start + m_StartOffset; - m_StartOffset *= -1.0f; - } -}; - -class CBaseTrace -{ -public: - bool IsDispSurface( ) const { return ( dispFlags & DISPSURF_FLAG_SURFACE ) != 0; } - bool IsDispSurfaceWalkable( ) const { return ( dispFlags & DISPSURF_FLAG_WALKABLE ) != 0; } - bool IsDispSurfaceBuildable( ) const { return ( dispFlags & DISPSURF_FLAG_BUILDABLE ) != 0; } - bool IsDispSurfaceProp1( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP1 ) != 0; } - bool IsDispSurfaceProp2( ) const { return ( dispFlags & DISPSURF_FLAG_SURFPROP2 ) != 0; } - -public: - vec3_t startpos; - vec3_t endpos; - cplane_t plane; - - float fraction; - - int contents; - unsigned short dispFlags; - - bool allsolid; - bool startsolid; - - CBaseTrace( ) {} - -private: - CBaseTrace( const CBaseTrace& vOther ); -}; - -class CGameTrace : public CBaseTrace -{ -public: - bool DidHitWorld( ) const; - - bool DidHitNonWorldEntity( ) const; - - int GetEntityIndex( ) const; - - bool DidHit( ) const - { - return fraction < 1 || allsolid || startsolid; - } - -public: - float fractionleftsolid; - csurface_t surface; - - int hitgroup; - - short physicsbone; - unsigned short worldSurfaceIndex; - - IClientEntity* m_pEnt; - int hitbox; - - CGameTrace( ) {} - CGameTrace( const CGameTrace& vOther ); -}; - -class IEngineTrace { -public: - int GetPointContents( const vec3_t& vecAbsPosition, int contentsMask = 0xffffffff ) { - using fn = int( __thiscall* )( void*, const vec3_t&, int, void* ); - return util::get_vfunc< fn >( this, 0 )( this, vecAbsPosition, contentsMask, nullptr ); - } - - void TraceRay( const Ray_t& ray, unsigned int fMask, ITraceFilter* pTraceFilter, CBaseTrace* pTrace ) { - return util::get_vfunc< 5, void >( this, ray, fMask, pTraceFilter, pTrace ); - } - - void ClipRayToEntity( const Ray_t& ray, unsigned int fMask, IClientEntity* pEnt, CBaseTrace* pTrace ) { - return util::get_vfunc< 3, void >( this, ray, fMask, pEnt, pTrace ); - } -}; - -#define CONTENTS_EMPTY 0 - -#define CONTENTS_SOLID 0x1 -#define CONTENTS_WINDOW 0x2 -#define CONTENTS_SOLID_SURF 0x3 -#define CONTENTS_AUX 0x4 -#define CONTENTS_LIGHT_SURF 0x7 -#define CONTENTS_GRATE 0x8 -#define CONTENTS_SLIME 0x10 -#define CONTENTS_WATER 0x20 -#define CONTENTS_BLOCKLOS 0x40 -#define CONTENTS_OPAQUE 0x80 -#define LAST_VISIBLE_CONTENTS CONTENTS_OPAQUE - -#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1)) - -#define CONTENTS_TESTFOGVOLUME 0x100 -#define CONTENTS_UNUSED 0x200 -#define CONTENTS_BLOCKLIGHT 0x400 -#define CONTENTS_TEAM1 0x800 -#define CONTENTS_TEAM2 0x1000 -#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 -#define CONTENTS_MOVEABLE 0x4000 -#define CONTENTS_AREAPORTAL 0x8000 -#define CONTENTS_PLAYERCLIP 0x10000 -#define CONTENTS_MONSTERCLIP 0x20000 -#define CONTENTS_CURRENT_0 0x40000 -#define CONTENTS_CURRENT_90 0x80000 -#define CONTENTS_CURRENT_180 0x100000 -#define CONTENTS_CURRENT_270 0x200000 -#define CONTENTS_CURRENT_UP 0x400000 -#define CONTENTS_CURRENT_DOWN 0x800000 - -#define CONTENTS_ORIGIN 0x1000000 - -#define CONTENTS_MONSTER 0x2000000 -#define CONTENTS_DEBRIS 0x4000000 -#define CONTENTS_DETAIL 0x8000000 -#define CONTENTS_TRANSLUCENT 0x10000000 -#define CONTENTS_LADDER 0x20000000 -#define CONTENTS_HITBOX 0x40000000 - -#define SURF_LIGHT 0x0001 -#define SURF_SKY2D 0x0002 -#define SURF_SKY 0x0004 -#define SURF_WARP 0x0008 -#define SURF_TRANS 0x0010 -#define SURF_NOPORTAL 0x0020 -#define SURF_TRIGGER 0x0040 -#define SURF_NODRAW 0x0080 - -#define SURF_HINT 0x0100 - -#define SURF_SKIP 0x0200 -#define SURF_NOLIGHT 0x0400 -#define SURF_BUMPLIGHT 0x0800 -#define SURF_NOSHADOWS 0x1000 -#define SURF_NODECALS 0x2000 -#define SURF_NOPAINT SURF_NODECALS -#define SURF_NOCHOP 0x4000 -#define SURF_HITBOX 0x8000 - -// ----------------------------------------------------- -// spatial content masks - used for spatial queries (traceline,etc.) -// ----------------------------------------------------- -#define MASK_ALL (0xFFFFFFFF) -#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) -#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) -#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) -#define MASK_NPCFLUID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER) -#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) -#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) -#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) -#define MASK_BLOCKLOS (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_BLOCKLOS) -#define MASK_BLOCKLOS_AND_NPCS (MASK_BLOCKLOS|CONTENTS_MONSTER) -#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) -#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) -#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) -#define MASK_SHOT_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_DEBRIS) -#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) -#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER) -#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) -#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) -#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) -#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) -#define MASK_NPCWORLDSTATIC_FLUID (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP) -#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) -#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN) -#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_GRATE) \ No newline at end of file diff --git a/internal_rewrite/IGameEventManager.hpp b/internal_rewrite/IGameEventManager.hpp deleted file mode 100644 index ec37320..0000000 --- a/internal_rewrite/IGameEventManager.hpp +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once -#include "util.hpp" - -class IGameEvent -{ -public: - const char* GetName( ) { - return util::get_vfunc< 1, const char* >( this ); - } - - int GetInt( const char* szKeyName, int nDefault = 0 ) { - return util::get_vfunc< 6, int >( this, szKeyName, nDefault ); - } - - float GetFloat( const char* name, float default_ = 0 ) { - return util::get_vfunc< 8, float >( this, name, default_ ); - } - - const char* GetString( const char* szKeyName ) { - return util::get_vfunc< 9, const char* >( this, szKeyName, 0 ); - } - - void SetString( const char* szKeyName, const char* szValue ) { - return util::get_vfunc< 16, void >( this, szKeyName, szValue ); - } -}; - -class IGameEventListener2 { -public: - virtual ~IGameEventListener2( void ) {}; - - // FireEvent is called by EventManager if event just occured - // KeyValue memory will be freed by manager if not needed anymore - virtual void FireGameEvent( IGameEvent* event ) = 0; - - virtual int GetEventDebugID( void ) = 0; -}; - -class IGameEventManager2 { -public: - virtual ~IGameEventManager2( void ) {}; - - // load game event descriptions from a file eg "resource\gameevents.res" - virtual int LoadEventsFromFile( const char* filename ) = 0; - - // removes all and anything - virtual void Reset( ) = 0; - - // adds a listener for a particular event - virtual bool AddListener( IGameEventListener2* listener, const char* name, bool bServerSide ) = 0; - - // returns true if this listener is listens to given event - virtual bool FindListener( IGameEventListener2* listener, const char* name ) = 0; - - // removes a listener - virtual void RemoveListener( IGameEventListener2* listener ) = 0; - - // create an event by name, but doesn't fire it. returns NULL is event is not - // known or no listener is registered for it. bForce forces the creation even if no listener is active - virtual IGameEvent* CreateEvent( const char* name, bool bForce = false, int* pCookie = nullptr ) = 0; - - // fires a server event created earlier, if bDontBroadcast is set, event is not send to clients - virtual bool FireEvent( IGameEvent* event, bool bDontBroadcast = false ) = 0; - - // fires an event for the local client only, should be used only by client code - virtual bool FireEventClientSide( IGameEvent* event ) = 0; - - // create a new copy of this event, must be free later - virtual IGameEvent* DuplicateEvent( IGameEvent* event ) = 0; - - // if an event was created but not fired for some reason, it has to bee freed, same UnserializeEvent - virtual void FreeEvent( IGameEvent* event ) = 0; - - // write/read event to/from bitbuffer - virtual bool SerializeEvent( IGameEvent* event, int* buf ) = 0; - virtual IGameEvent* UnserializeEvent( void* buf ) = 0; // create new KeyValues, must be deleted -}; \ No newline at end of file diff --git a/internal_rewrite/IMaterialSystem.hpp b/internal_rewrite/IMaterialSystem.hpp deleted file mode 100644 index 7fc1bc1..0000000 --- a/internal_rewrite/IMaterialSystem.hpp +++ /dev/null @@ -1,281 +0,0 @@ -#pragma once -#include "util.hpp" -#include "ISurface.hpp" - -using MaterialHandle_t = unsigned short; - -enum MaterialVarFlags_t { - MATERIAL_VAR_DEBUG = 1 << 0, - MATERIAL_VAR_NO_DEBUG_OVERRIDE = 1 << 1, - MATERIAL_VAR_NO_DRAW = 1 << 2, - MATERIAL_VAR_USE_IN_FILLRATE_MODE = 1 << 3, - MATERIAL_VAR_VERTEXCOLOR = 1 << 4, - MATERIAL_VAR_VERTEXALPHA = 1 << 5, - MATERIAL_VAR_SELFILLUM = 1 << 6, - MATERIAL_VAR_ADDITIVE = 1 << 7, - MATERIAL_VAR_ALPHATEST = 1 << 8, - MATERIAL_VAR_MULTIPASS = 1 << 9, - MATERIAL_VAR_ZNEARER = 1 << 10, - MATERIAL_VAR_MODEL = 1 << 11, - MATERIAL_VAR_FLAT = 1 << 12, - MATERIAL_VAR_NOCULL = 1 << 13, - MATERIAL_VAR_NOFOG = 1 << 14, - MATERIAL_VAR_IGNOREZ = 1 << 15, - MATERIAL_VAR_DECAL = 1 << 16, - MATERIAL_VAR_ENVMAPSPHERE = 1 << 17, - MATERIAL_VAR_NOALPHAMOD = 1 << 18, - MATERIAL_VAR_ENVMAPCAMERASPACE = 1 << 19, - MATERIAL_VAR_BASEALPHAENVMAPMASK = 1 << 20, - MATERIAL_VAR_TRANSLUCENT = 1 << 21, - MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK = 1 << 22, - MATERIAL_VAR_NEEDS_SOFTWARE_SKINNING = 1 << 23, - MATERIAL_VAR_OPAQUETEXTURE = 1 << 24, - MATERIAL_VAR_ENVMAPMODE = 1 << 25, - MATERIAL_VAR_SUPPRESS_DECALS = 1 << 26, - MATERIAL_VAR_HALFLAMBERT = 1 << 27, - MATERIAL_VAR_WIREFRAME = 1 << 28, -}; - -class ITexture { -public: - int GetActualWidth( ) { - return util::get_vfunc< 3, int >( this ); - } - - int GetActualHeight( ) { - return util::get_vfunc< 4, int >( this ); - } -}; - -struct MaterialVideoMode_t { - int m_width; - int m_height; - int m_format; - int m_hz; -}; - -struct IMaterialSystem_Config_t { - MaterialVideoMode_t m_vid_mode; - float m_monitor_gamma; - float m_monitor_max; - float m_monitor_min; - float m_monitor_exp; - bool m_gamma_enabled; - bool m_triple_buffer; - int m_aa_samples; - int m_force_anisotropic_level; - int m_skip_mip_levels; - int m_dx_level; - int m_flags; - bool m_edit_mode; - char m_proxy_test_mode; - bool m_compressed_textures; - bool m_filter_lightmaps; - bool m_filter_textures; - bool m_reverse_depth; - bool m_buffer_primitives; - bool m_draw_flat; - bool m_measure_fillrate; - bool m_visualize_fillrate; - bool m_no_transperacy; - bool m_software_lighting; - bool m_allow_cheats; - char m_show_mipmap; - bool m_low_res; - bool m_normal_mapping; - bool m_mipmap_textures; - char m_fullbright; - bool m_fast_nobumd; - bool m_supress_rendering; - bool m_drawgray; - bool m_show_specular; - bool m_show_diffuse; - int m_winsize_widthlimit; - int m_winsize_heightlimit; - int m_aa_quality; - bool m_shadow_depth_texture; - bool m_motion_blur; - bool m_flashlight; - bool m_paint_enabled; - char pad[ 0xC ]; -}; - -class IMaterialVar { -public: - virtual ITexture *GetTextureValue( void ) = 0; - - virtual char const * GetName( void ) const = 0; - virtual void* GetNameAsSymbol( ) const = 0; - - virtual void SetFloatValue( float val ) = 0; - - virtual void SetIntValue( int val ) = 0; - - virtual void SetStringValue( char const *val ) = 0; - virtual char const * GetStringValue( void ) const = 0; - - // Use FourCC values to pass app-defined data structures between - // the proxy and the shader. The shader should ignore the data if - // its FourCC type not correct. - virtual void SetFourCCValue( ) = 0; - virtual void GetFourCCValue( ) = 0; - - // Vec (dim 2-4) - virtual void SetVecValue( float const* val, int numcomps ) = 0; - virtual void SetVecValue( float x, float y ) = 0; - virtual void SetVecValue( float x, float y, float z ) = 0; - virtual void SetVecValue( float x, float y, float z, float w ) = 0; - virtual void GetLinearVecValue( float *val, int numcomps ) const = 0; - - // revisit: is this a good interface for textures? - virtual void SetTextureValue( ITexture * ) = 0; - - virtual IMaterial * GetMaterialValue( void ) = 0; - virtual void SetMaterialValue( IMaterial * ) = 0; - - virtual bool IsDefined( ) const = 0; - virtual void SetUndefined( ) = 0; - - // Matrix - virtual void SetMatrixValue( ) = 0; - virtual const void GetMatrixValue( ) = 0; - virtual bool MatrixIsIdentity( ) const = 0; - - // Copy.... - virtual void CopyFrom( IMaterialVar *pMaterialVar ) = 0; - - virtual void SetValueAutodetectType( char const *val ) = 0; - - virtual IMaterial * GetOwningMaterial( ) = 0; - - //set just 1 component - virtual void SetVecComponentValue( float fVal, int nComponent ) = 0; - -protected: - virtual int GetIntValueInternal( void ) const = 0; - virtual float GetFloatValueInternal( void ) const = 0; - virtual float const* GetVecValueInternal( ) const = 0; - virtual void GetVecValueInternal( float *val, int numcomps ) const = 0; - virtual int VectorSizeInternal( ) const = 0; -}; - -class IMaterial { - char pad[ 0x1C ]; -public: - int m_ref_count; - - auto GetName( ) { - return util::get_vfunc< 0, const char* >( this ); - } - - auto GetTextureGroupName( ) { - return util::get_vfunc< 1, const char* >( this ); - } - - void IncrementReferenceCount( ) { - return util::get_vfunc< 12, void >( this ); - } - - void DecrementReferenceCount( ) { - return util::get_vfunc< 13, void >( this ); - } - - void AlphaModulate( float alpha ) { - return util::get_vfunc< 27, void >( this, alpha ); - } - - void ColorModulate( float r, float g, float b ) { - return util::get_vfunc< 28, void >( this, r, g, b ); - } - - void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ) { - return util::get_vfunc< 29, void >( this, flag, on ); - } - - bool GetMaterialVarFlag( MaterialVarFlags_t flag ) { - return util::get_vfunc< 30, bool >( this, flag ); - } - - auto GetAlphaModulation( ) { - return util::get_vfunc< 44, float >( this ); - } - - void GetColorModulate( float* r, float* g, float* b ) { - return util::get_vfunc< 45, void >( this, r, g, b ); - } - - void Refresh( ) { - return util::get_vfunc< 37, void >( this ); - } -}; - -class IMaterialSystem -{ -public: - enum RenderTargetSizeMode_t { - RT_SIZE_NO_CHANGE = 0, // Only allowed for render targets that don't want a depth buffer - // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer). - RT_SIZE_DEFAULT = 1, // Don't play with the specified width and height other than making sure it fits in the framebuffer. - RT_SIZE_PICMIP = 2, // Apply picmip to the render target's width and height. - RT_SIZE_HDR = 3, // frame_buffer_width / 4 - RT_SIZE_FULL_FRAME_BUFFER = 4, // Same size as frame buffer, or next lower power of 2 if we can't do that. - RT_SIZE_OFFSCREEN = 5, // Target of specified size, don't mess with dimensions - RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP = 6 // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. - }; - - enum MaterialRenderTargetDepth_t { - MATERIAL_RT_DEPTH_SHARED = 0x0, - MATERIAL_RT_DEPTH_SEPARATE = 0x1, - MATERIAL_RT_DEPTH_NONE = 0x2, - MATERIAL_RT_DEPTH_ONLY = 0x3, - }; - - ImageFormat GetBackBufferFormat( ) { - return util::get_vfunc< 36, ImageFormat >( this ); - } - - IMaterial* CreateMaterial( const char* pMaterialName, void* pVMTKeyValues ) { - return util::get_vfunc< 83, IMaterial* >( this, pMaterialName, pVMTKeyValues ); - } - - IMaterial* FindMaterial( const char* pMaterialName, const char* pTextureGroupName = "Model textures", bool complain = true, const char* pComplainPrefix = nullptr ) { - return util::get_vfunc< 84, IMaterial* >( this, pMaterialName, pTextureGroupName, complain, pComplainPrefix ); - } - - MaterialHandle_t FirstMaterial( ) { - return util::get_vfunc< 86, MaterialHandle_t >( this ); - } - - MaterialHandle_t NextMaterial( MaterialHandle_t h ) { - return util::get_vfunc< 87, MaterialHandle_t >( this, h ); - } - - MaterialHandle_t InvalidMaterial( ) { - return util::get_vfunc< 88, MaterialHandle_t >( this ); - } - - IMaterial* GetMaterial( MaterialHandle_t h ) { - return util::get_vfunc< 89, IMaterial* >( this, h ); - } - - void BeginRenderTargetAllocation( ) { - return util::get_vfunc< 94, void >( this ); - } - - void EndRenderTargetAllocation( ) { - return util::get_vfunc< 95, void >( this ); - } - - ITexture* CreateNamedRenderTargetTextureEx( const char* name, int w, int h, RenderTargetSizeMode_t sizeMode, - ImageFormat format, MaterialRenderTargetDepth_t depth ) - { - const int textureFlags = 0x4 | 0x8; //TEXTUREFLAGS_CLAMPS, TEXTUREFLAGS_CLAMPT - const int renderTargetFlags = 0x1; //CREATERENDERTARGETFLAGS_HDR - return util::get_vfunc< 97, ITexture* >( this, name, w, h, sizeMode, format, depth, textureFlags, renderTargetFlags ); - } - - /*void* GetRenderContext( ) { - typedef IMatRenderContext*( __thiscall* GetRenderContextFn )( void* ); - return CallVFunction( this, 115 )( this ); - }*/ -}; \ No newline at end of file diff --git a/internal_rewrite/IMemAlloc.hpp b/internal_rewrite/IMemAlloc.hpp deleted file mode 100644 index 580104c..0000000 --- a/internal_rewrite/IMemAlloc.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -typedef size_t( *MemAllocFailHandler_t )( size_t ); - -class IMemAlloc { -public: - // Release versions - virtual void *Alloc( size_t nSize ) = 0; - virtual void *Realloc( void *pMem, size_t nSize ) = 0; - virtual void Free( void *pMem ) = 0; - virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize ) = 0; - - // Debug versions - virtual void *Alloc( size_t nSize, const char *pFileName, int nLine ) = 0; - virtual void *Realloc( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; - virtual void Free( void *pMem, const char *pFileName, int nLine ) = 0; - virtual void *Expand_NoLongerSupported( void *pMem, size_t nSize, const char *pFileName, int nLine ) = 0; - - // Returns size of a particular allocation - virtual size_t GetSize( void *pMem ) = 0; - - // Force file + line information for an allocation - virtual void PushAllocDbgInfo( const char *pFileName, int nLine ) = 0; - virtual void PopAllocDbgInfo( ) = 0; - - // FIXME: Remove when we have our own allocator - // these methods of the Crt debug code is used in our codebase currently - virtual long CrtSetBreakAlloc( long lNewBreakAlloc ) = 0; - virtual int CrtSetReportMode( int nReportType, int nReportMode ) = 0; - virtual int CrtIsValidHeapPointer( const void *pMem ) = 0; - virtual int CrtIsValidPointer( const void *pMem, unsigned int size, int access ) = 0; - virtual int CrtCheckMemory( void ) = 0; - virtual int CrtSetDbgFlag( int nNewFlag ) = 0; - virtual void CrtMemCheckpoint( void *pState ) = 0; - - // FIXME: Make a better stats interface - virtual void DumpStats( ) = 0; - virtual void DumpStatsFileBase( char const *pchFileBase ) = 0; - - // FIXME: Remove when we have our own allocator - virtual void* CrtSetReportFile( int nRptType, void* hFile ) = 0; - virtual void* CrtSetReportHook( void* pfnNewHook ) = 0; - virtual int CrtDbgReport( int nRptType, const char * szFile, - int nLine, const char * szModule, const char * pMsg ) = 0; - - virtual int heapchk( ) = 0; - - virtual bool IsDebugHeap( ) = 0; - - virtual void GetActualDbgInfo( const char *&pFileName, int &nLine ) = 0; - virtual void RegisterAllocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; - virtual void RegisterDeallocation( const char *pFileName, int nLine, int nLogicalSize, int nActualSize, unsigned nTime ) = 0; - - virtual int GetVersion( ) = 0; - - virtual void CompactHeap( ) = 0; - - // Function called when malloc fails or memory limits hit to attempt to free up memory (can come in any thread) - virtual MemAllocFailHandler_t SetAllocFailHandler( MemAllocFailHandler_t pfnMemAllocFailHandler ) = 0; - - virtual void DumpBlockStats( void * ) = 0; - -#if defined( _MEMTEST ) - virtual void SetStatsExtraInfo( const char *pMapName, const char *pComment ) = 0; -#endif - - // Returns 0 if no failure, otherwise the size_t of the last requested chunk - // "I'm sure this is completely thread safe!" Brian Deen 7/19/2012. - virtual size_t MemoryAllocFailed( ) = 0; - - // handles storing allocation info for coroutines - virtual unsigned GetDebugInfoSize( ) = 0; - virtual void SaveDebugInfo( void *pvDebugInfo ) = 0; - virtual void RestoreDebugInfo( const void *pvDebugInfo ) = 0; - virtual void InitDebugInfo( void *pvDebugInfo, const char *pchRootFileName, int nLine ) = 0; - - // Replacement for ::GlobalMemoryStatus which accounts for unused memory in our system - virtual void GlobalMemoryStatus( size_t *pUsedMemory, size_t *pFreeMemory ) = 0; -}; \ No newline at end of file diff --git a/internal_rewrite/IPanel.hpp b/internal_rewrite/IPanel.hpp deleted file mode 100644 index bbae705..0000000 --- a/internal_rewrite/IPanel.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -#include "util.hpp" - -class IPanel { -public: - const char* GetName( int panel ) { - using fn = const char* ( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 36 )( this, panel ); - } -}; \ No newline at end of file diff --git a/internal_rewrite/IPhysicsSurfaceProps.hpp b/internal_rewrite/IPhysicsSurfaceProps.hpp deleted file mode 100644 index 8e4f10f..0000000 --- a/internal_rewrite/IPhysicsSurfaceProps.hpp +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -struct surfacephysicsparams_t { - // vphysics physical properties - float friction; - float elasticity; // collision elasticity - used to compute coefficient of restitution - float density; // physical density (in kg / m^3) - float thickness; // material thickness if not solid (sheet materials) in inches - float dampening; -}; - -struct surfaceaudioparams_t { - float reflectivity; // like elasticity, but how much sound should be reflected by this surface - float hardnessFactor; // like elasticity, but only affects impact sound choices - float roughnessFactor; // like friction, but only affects scrape sound choices - float roughThreshold; // surface roughness > this causes "rough" scrapes, < this causes "smooth" scrapes - float hardThreshold; // surface hardness > this causes "hard" impacts, < this causes "soft" impacts - float hardVelocityThreshold; // collision velocity > this causes "hard" impacts, < this causes "soft" impacts - float highPitchOcclusion; //a value betweeen 0 and 100 where 0 is not occluded at all and 100 is silent (except for any additional reflected sound) - float midPitchOcclusion; - float lowPitchOcclusion; -}; - -struct surfacesoundnames_t { - unsigned short walkStepLeft; - unsigned short walkStepRight; - unsigned short runStepLeft; - unsigned short runStepRight; - unsigned short impactSoft; - unsigned short impactHard; - unsigned short scrapeSmooth; - unsigned short scrapeRough; - unsigned short bulletImpact; - unsigned short rolling; - unsigned short breakSound; - unsigned short strainSound; -}; - -struct surfacegameprops_t { - float maxspeedfactor; - float jumpfactor; - float penetrationmodifier; - float damagemodifier; - uint16_t material; - uint8_t climbable; -}; - -struct surfacedata_t { - surfacephysicsparams_t physics; // physics parameters - surfaceaudioparams_t audio; // audio parameters - surfacesoundnames_t sounds; // names of linked sounds - surfacegameprops_t game; // Game data / properties -}; - -class IPhysicsSurfaceProps -{ -public: - virtual ~IPhysicsSurfaceProps( void ) {} - - // parses a text file containing surface prop keys - virtual int ParseSurfaceData( const char* pFilename, const char* pTextfile ) = 0; - // current number of entries in the database - virtual int SurfacePropCount( void ) const = 0; - - virtual int GetSurfaceIndex( const char* pSurfacePropName ) const = 0; - virtual void GetPhysicsProperties( int surfaceDataIndex, float* density, float* thickness, float* friction, float* elasticity ) const = 0; - - virtual surfacedata_t* GetSurfaceData( int surfaceDataIndex ) = 0; - virtual const char* GetString( unsigned short stringTableIndex ) const = 0; - - virtual const char* GetPropName( int surfaceDataIndex ) const = 0; - - // sets the global index table for world materials - // UNDONE: Make this per-CPhysCollide - virtual void SetWorldMaterialIndexTable( int* pMapArray, int mapSize ) = 0; - - // NOTE: Same as GetPhysicsProperties, but maybe more convenient - //virtual void GetPhysicsParameters(int surfaceDataIndex, surfacephysicsparams_t* pParamsOut) const = 0; -}; \ No newline at end of file diff --git a/internal_rewrite/IPrediction.hpp b/internal_rewrite/IPrediction.hpp deleted file mode 100644 index 35fb6b2..0000000 --- a/internal_rewrite/IPrediction.hpp +++ /dev/null @@ -1,153 +0,0 @@ -#pragma once -#include "vector.hpp" - -//forward declarations -class user_cmd_t; -class IClientEntity; - -class IMoveHelper { -private: - virtual void unk00( ) = 0; -public: - virtual void SetHost( IClientEntity* host ) = 0; -private: - virtual void unk01( ) = 0; - virtual void unk02( ) = 0; -public: - virtual void ProcessImpacts( ) = 0; -}; - -class CMoveData { -public: - bool m_bFirstRunOfFunctions : 1; - bool m_bGameCodeMovedPlayer : 1; - bool m_bNoAirControl : 1; - - unsigned long m_nPlayerHandle; - int m_nImpulseCommand; - vec3_t m_vecViewAngles; - vec3_t m_vecAbsViewAngles; - int m_nButtons; - int m_nOldButtons; - float m_flForwardMove; - float m_flSideMove; - float m_flUpMove; - - float m_flMaxSpeed; - float m_flClientMaxSpeed; - - vec3_t m_vecVelocity; - vec3_t m_vecOldVelocity; - float somefloat; - vec3_t m_vecAngles; - vec3_t m_vecOldAngles; - - float m_outStepHeight; - vec3_t m_outWishVel; - vec3_t m_outJumpVel; - - vec3_t m_vecConstraintCenter; - float m_flConstraintRadius; - float m_flConstraintWidth; - float m_flConstraintSpeedFactor; - bool m_bConstraintPastRadius; - - void SetAbsOrigin( const vec3_t& vec ); - const vec3_t& GetAbsOrigin( ) const; - -private: - vec3_t m_vecAbsOrigin; // edict::origin - uint8_t pad_ending_001[0x160]; -}; - -class ICSGameMovement { -public: - void ProcessMovement( IClientEntity* ent, void* data ) { - using fn = void( __thiscall* )( void*, IClientEntity*, void* ); - return util::get_vfunc< fn >( this, 1 )( this, ent, data ); - } - - void Reset( ) { - using fn = void( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 2 )( this ); - } - - void StartTrackPredictionErrors( IClientEntity* ent ) { - using fn = void( __thiscall* )( void*, IClientEntity* ); - return util::get_vfunc< fn >( this, 3 )( this, ent ); - } - - void FinishTrackPredictionErrors( IClientEntity* ent ) { - using fn = void( __thiscall* )( void*, IClientEntity* ); - return util::get_vfunc< fn >( this, 4 )( this, ent ); - } -}; - -class IPrediction { -public: - - // You will need these members to avoid double footsteps and other - // prediction mistakes from happening. - - char pad00 [ 8 ]; // 0x0000 - bool m_bInPrediction; // 0x0008 - char pad01 [ 1 ]; // 0x0009 - bool m_bEnginePaused; // 0x000A - char pad02 [ 13 ]; // 0x000B - bool m_bIsFirstTimePredicted; // 0x0018 - - virtual ~IPrediction( ) { }; - - virtual void Init( ) = 0; - virtual void Shutdown( ) = 0; - - // Run prediction - virtual void Update - ( - int startframe, // World update ( un-modded ) most recently received - bool validframe, // Is frame data valid - int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) - int outgoing_command // Last command (most recent) sent to server (un-modded) - ) = 0; - - // We are about to get a network update from the server. We know the update #, so we can pull any - // data purely predicted on the client side and transfer it to the new from data state. - virtual void PreEntityPacketReceived( int commands_acknowledged, int current_world_update_packet ) = 0; - virtual void PostEntityPacketReceived( ) = 0; - virtual void PostNetworkDataReceived( int commands_acknowledged ) = 0; - - virtual void OnReceivedUncompressedPacket( ) = 0; - - // The engine needs to be able to access a few predicted values - virtual void GetViewOrigin( vec3_t& org ) = 0; - virtual void SetViewOrigin( vec3_t& org ) = 0; - virtual void GetViewAngles( vec3_t& ang ) = 0; - virtual void SetViewAngles( vec3_t& ang ) = 0; - virtual void GetLocalViewAngles( vec3_t& ang ) = 0; - virtual void SetLocalViewAngles( vec3_t& ang ) = 0; - - virtual bool InPrediction( ) const = 0; - virtual bool IsFirstTimePredicted( ) const = 0; - - virtual int GetLastAcknowledgedCommandNumber( ) const = 0; - - virtual int GetIncomingPacketNumber( ) const = 0; - - virtual void CheckMovingGround( IClientEntity* player, double frametime ) = 0; - virtual void RunCommand( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *moveHelper ) = 0; - - virtual void SetupMove( IClientEntity *player, user_cmd_t *ucmd, IMoveHelper *pHelper, CMoveData *move ) = 0; - virtual void FinishMove( IClientEntity *player, user_cmd_t *ucmd, CMoveData *move ) = 0; - virtual void SetIdealPitch( int nSlot, IClientEntity *player, const vec3_t& origin, const vec3_t& angles, const vec3_t& viewheight ) = 0; - - virtual void CheckError( int nSlot, IClientEntity *player, int commands_acknowledged ) = 0; - - virtual void _Update - ( - int nSlot, - bool received_new_world_update, - bool validframe, // Is frame data valid - int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) - int outgoing_command // Last command (most recent) sent to server (un-modded) - ) = 0; -}; diff --git a/internal_rewrite/ISteamClient.hpp b/internal_rewrite/ISteamClient.hpp deleted file mode 100644 index 190607f..0000000 --- a/internal_rewrite/ISteamClient.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "util.hpp" -using SteamPipeHandle = uint32_t; -using SteamUserHandle = uint32_t; - -enum game_coordinator_result_t { - result_ok, - result_no_message, - result_small_buffer, - result_not_logged_on, - result_invalid, - -}; - -class ISteamFriends { -public: - bool set_rich_presence( const char* key, const char* value ) { - return util::get_vfunc< 43, bool >( this, key, value ); - } - - void clear_rich_presence( ) { - util::get_vfunc< 44, void >( this ); - } -}; - -class ISteamClient { -public: - - void* GetISteamFriends( SteamUserHandle user, SteamPipeHandle pipe, const char* name ) { - return util::get_vfunc< 8, void* >( this, user, pipe, name ); - } - - void* GetISteamGenericInterface( SteamUserHandle user, SteamPipeHandle pipe, const char* name ) { - return util::get_vfunc< 12, void* >( this, user, pipe, name ); - } - -}; - -class ISteamGameCoordinator { -public: - virtual game_coordinator_result_t send_message( uint32_t msg_type, const void* pub_data, uint32_t data ) = 0; - virtual bool IsMessageAvailable( uint32_t* msg_size ) = 0; - virtual game_coordinator_result_t RetrieveMessage( uint32_t* msg_type, void* pub_dest, uint32_t dest, uint32_t* msg_size ) = 0; -}; diff --git a/internal_rewrite/ISurface.hpp b/internal_rewrite/ISurface.hpp deleted file mode 100644 index 2845eaa..0000000 --- a/internal_rewrite/ISurface.hpp +++ /dev/null @@ -1,421 +0,0 @@ -#pragma once -#include "IAppSystem.hpp" -#include "vector.hpp" -#include "color.hpp" - -enum FontDrawType_t { - FONT_DRAW_DEFAULT = 0, - FONT_DRAW_NONADDITIVE, - FONT_DRAW_ADDITIVE, - FONT_DRAW_TYPE_COUNT = 2, -}; - -enum FontFlags_t { - FONTFLAG_NONE, - FONTFLAG_ITALIC = 0x001, - FONTFLAG_UNDERLINE = 0x002, - FONTFLAG_STRIKEOUT = 0x004, - FONTFLAG_SYMBOL = 0x008, - FONTFLAG_ANTIALIAS = 0x010, - FONTFLAG_GAUSSIANBLUR = 0x020, - FONTFLAG_ROTARY = 0x040, - FONTFLAG_DROPSHADOW = 0x080, - FONTFLAG_ADDITIVE = 0x100, - FONTFLAG_OUTLINE = 0x200, - FONTFLAG_CUSTOM = 0x400, - FONTFLAG_BITMAP = 0x800, -}; - -enum ImageFormat { - IMAGE_FORMAT_UNKNOWN = -1, - IMAGE_FORMAT_RGBA8888 = 0, - IMAGE_FORMAT_ABGR8888, - IMAGE_FORMAT_RGB888, - IMAGE_FORMAT_BGR888, - IMAGE_FORMAT_RGB565, - IMAGE_FORMAT_I8, - IMAGE_FORMAT_IA88, - IMAGE_FORMAT_P8, - IMAGE_FORMAT_A8, - IMAGE_FORMAT_RGB888_BLUESCREEN, - IMAGE_FORMAT_BGR888_BLUESCREEN, - IMAGE_FORMAT_ARGB8888, - IMAGE_FORMAT_BGRA8888, - IMAGE_FORMAT_DXT1, - IMAGE_FORMAT_DXT3, - IMAGE_FORMAT_DXT5, - IMAGE_FORMAT_BGRX8888, - IMAGE_FORMAT_BGR565, - IMAGE_FORMAT_BGRX5551, - IMAGE_FORMAT_BGRA4444, - IMAGE_FORMAT_DXT1_ONEBITALPHA, - IMAGE_FORMAT_BGRA5551, - IMAGE_FORMAT_UV88, - IMAGE_FORMAT_UVWQ8888, - IMAGE_FORMAT_RGBA16161616F, - IMAGE_FORMAT_RGBA16161616, - IMAGE_FORMAT_UVLX8888, - IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point - IMAGE_FORMAT_RGB323232F, - IMAGE_FORMAT_RGBA32323232F, - - // Depth-stencil texture formats for shadow depth mapping - IMAGE_FORMAT_NV_DST16, // - IMAGE_FORMAT_NV_DST24, // - IMAGE_FORMAT_NV_INTZ, // Vendor-specific depth-stencil texture - IMAGE_FORMAT_NV_RAWZ, // formats for shadow depth mapping - IMAGE_FORMAT_ATI_DST16, // - IMAGE_FORMAT_ATI_DST24, // - IMAGE_FORMAT_NV_NULL, // Dummy format which takes no video memory - - // Compressed normal map formats - IMAGE_FORMAT_ATI2N, // One-surface ATI2N / DXN format - IMAGE_FORMAT_ATI1N, // Two-surface ATI1N format - - NUM_IMAGE_FORMATS -}; - -struct vertex_t { - vertex_t( ) {} - - vertex_t( const vec2_t& pos, const vec2_t& coord = vec2_t( 0, 0 ) ) { - m_position = pos; - m_tex_coord = coord; - } - - void init( float x, float y, const vec2_t& coord = vec2_t( 0, 0 ) ) { - m_position = vec2_t( x, y ); - m_tex_coord = coord; - } - - vec2_t m_position; - vec2_t m_tex_coord; -}; - -using HFont = unsigned long; -using VPANEL = unsigned long; -class IntRect; -class IHTMLEvents; -class IHTML; -using HCursor = unsigned long; -using HTexture = unsigned long; -class CharRenderInfo; -class IVguiMatInfo; -class IImage; -class DrawTexturedRectParms_t; -class IHTMLChromeController; - -class ISurface : public IAppSystem { -public: - // frame - virtual void RunFrame( ) = 0; - - // hierarchy root - virtual VPANEL GetEmbeddedPanel( ) = 0; - virtual void SetEmbeddedPanel( VPANEL pPanel ) = 0; - - // drawing context - virtual void PushMakeCurrent( VPANEL panel, bool useInsets ) = 0; - virtual void PopMakeCurrent( VPANEL panel ) = 0; //13 - - // rendering functions - virtual void DrawSetColor( ) = 0; //15 - virtual void DrawSetColor( clr_t col ) = 0; //14 - - virtual void DrawFilledRect( int x0, int y0, int x1, int y1 ) = 0; //16 - virtual void DrawFilledRectArray( IntRect *pRects, int numRects ) = 0; - virtual void DrawOutlinedRect( int x0, int y0, int x1, int y1 ) = 0; - - virtual void DrawLine( int x0, int y0, int x1, int y1 ) = 0; - virtual void DrawPolyLine( int *px, int *py, int numPoints ) = 0; - - virtual void DrawSetApparentDepth( float flDepth ) = 0; - virtual void DrawClearApparentDepth( ) = 0; - - virtual void DrawSetTextFont( HFont font ) = 0; - virtual void DrawSetTextColor( ) = 0; //25 - virtual void DrawSetTextColor( clr_t col ) = 0; //24 - virtual void DrawSetTextPos( int x, int y ) = 0; //26 - virtual void DrawGetTextPos( int& x, int& y ) = 0; - virtual void DrawPrintText( const wchar_t *text, int textLen, FontDrawType_t drawType = FONT_DRAW_DEFAULT ) = 0; - virtual void DrawUnicodeChar( wchar_t wch, FontDrawType_t drawType = FONT_DRAW_DEFAULT ) = 0; - - virtual void DrawFlushText( ) = 0; // flushes any buffered text (for rendering optimizations) - virtual IHTML *CreateHTMLWindow( IHTMLEvents *events, VPANEL context ) = 0; - virtual void PaintHTMLWindow( IHTML *htmlwin ) = 0; - virtual void DeleteHTMLWindow( IHTML *htmlwin ) = 0; - - enum ETextureFormat - { - eTextureFormat_RGBA, - eTextureFormat_BGRA, - eTextureFormat_BGRA_Opaque, // bgra format but alpha is always 255, CEF does this, we can use this fact for better perf on win32 gdi - }; - - virtual int DrawGetTextureId( char const *filename ) = 0; - virtual bool DrawGetTextureFile( int id, char *filename, int maxlen ) = 0; - virtual void DrawSetTextureFile( int id, const char *filename, int hardwareFilter, bool forceReload ) = 0; - virtual void DrawSetTextureRGBA( int id, const unsigned char *rgba, int wide, int tall ) = 0; - virtual void DrawSetTexture( int id ) = 0; //38 - virtual void DrawGetTextureSize( int id, int &wide, int &tall ) = 0; - virtual void DrawTexturedRect( int x0, int y0, int x1, int y1 ) = 0; - virtual bool IsTextureIDValid( int id ) = 0; - virtual bool DeleteTextureByID( int id ) = 0; - - virtual int CreateNewTextureID( bool procedural = false ) = 0; //43 - - virtual void GetScreenSize( int &wide, int &tall ) = 0; - virtual void SetAsTopMost( VPANEL panel, bool state ) = 0; - virtual void BringToFront( VPANEL panel ) = 0; - virtual void SetForegroundWindow( VPANEL panel ) = 0; - virtual void SetPanelVisible( VPANEL panel, bool state ) = 0; - virtual void SetMinimized( VPANEL panel, bool state ) = 0; - virtual bool IsMinimized( VPANEL panel ) = 0; - virtual void FlashWindow( VPANEL panel, bool state ) = 0; - virtual void SetTitle( VPANEL panel, const wchar_t *title ) = 0; - virtual void SetAsToolBar( VPANEL panel, bool state ) = 0; // removes the window's task bar entry (for context menu's, etc.) - - // windows stuff - virtual void CreatePopup( VPANEL panel, bool minimised, bool showTaskbarIcon = true, bool disabled = false, bool mouseInput = true, bool kbInput = true ) = 0; - virtual void SwapBuffers( VPANEL panel ) = 0; - virtual void Invalidate( VPANEL panel ) = 0; - virtual void SetCursor( HCursor cursor ) = 0; - virtual bool IsCursorVisible( ) = 0; - virtual void ApplyChanges( ) = 0; - virtual bool IsWithin( int x, int y ) = 0; - virtual bool HasFocus( ) = 0; - - // returns true if the surface supports minimize & maximize capabilities - enum SurfaceFeature_e - { - ANTIALIASED_FONTS = 1, - DROPSHADOW_FONTS = 2, - ESCAPE_KEY = 3, - OPENING_NEW_HTML_WINDOWS = 4, - FRAME_MINIMIZE_MAXIMIZE = 5, - OUTLINE_FONTS = 6, - DIRECT_HWND_RENDER = 7, - }; - virtual bool SupportsFeature( SurfaceFeature_e feature ) = 0; - - // restricts what gets drawn to one panel and it's children - // currently only works in the game - virtual void RestrictPaintToSinglePanel( VPANEL panel ) = 0; - - // these two functions obselete, use IInput::SetAppModalSurface() instead - virtual void SetModalPanel( VPANEL ) = 0; - virtual VPANEL GetModalPanel( ) = 0; - - virtual void UnlockCursor( ) = 0; - virtual void LockCursor( ) = 0; - virtual void SetTranslateExtendedKeys( bool state ) = 0; - virtual VPANEL GetTopmostPopup( ) = 0; - - // engine-only focus handling (replacing WM_FOCUS windows handling) - virtual void SetTopLevelFocus( VPANEL panel ) = 0; - - // fonts - // creates an empty handle to a vgui font. windows fonts can be add to this via SetFontGlyphSet(). - virtual HFont CreateFont( ) = 0; //71 - - // adds to the font - enum EFontFlags - { - FONTFLAG_NONE, - FONTFLAG_ITALIC = 0x001, - FONTFLAG_UNDERLINE = 0x002, - FONTFLAG_STRIKEOUT = 0x004, - FONTFLAG_SYMBOL = 0x008, - FONTFLAG_ANTIALIAS = 0x010, - FONTFLAG_GAUSSIANBLUR = 0x020, - FONTFLAG_ROTARY = 0x040, - FONTFLAG_DROPSHADOW = 0x080, - FONTFLAG_ADDITIVE = 0x100, - FONTFLAG_OUTLINE = 0x200, - FONTFLAG_CUSTOM = 0x400, // custom generated font - never fall back to asian compatibility mode - FONTFLAG_BITMAP = 0x800, // compiled bitmap font - no fallbacks - }; - - virtual bool SetFontGlyphSet( HFont font, const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags, int nRangeMin = 0, int nRangeMax = 0 ) = 0; - - // adds a custom font file (only supports true type font files (.ttf) for now) - virtual bool AddCustomFontFile( const char *fontName, const char *fontFileName ) = 0; - - // returns the details about the font - virtual int GetFontTall( HFont font ) = 0; - virtual int GetFontAscent( HFont font, wchar_t wch ) = 0; - virtual bool IsFontAdditive( HFont font ) = 0; - virtual void GetCharABCwide( HFont font, int ch, int &a, int &b, int &c ) = 0; - virtual int GetCharacterWidth( HFont font, int ch ) = 0; - virtual void GetTextSize( HFont font, const wchar_t *text, int &wide, int &tall ) = 0; - - // notify icons?!? - virtual VPANEL GetNotifyPanel( ) = 0; - virtual void SetNotifyIcon( VPANEL context, HTexture icon, VPANEL panelToReceiveMessages, const char *text ) = 0; - - // plays a sound - virtual void PlaySound( const char *fileName ) = 0; //82 - - //!! these functions should not be accessed directly, but only through other vgui items - //!! need to move these to seperate interface - virtual int GetPopupCount( ) = 0; - virtual VPANEL GetPopup( int index ) = 0; - virtual bool ShouldPaintChildPanel( VPANEL childPanel ) = 0; - virtual bool RecreateContext( VPANEL panel ) = 0; - virtual void AddPanel( VPANEL panel ) = 0; - virtual void ReleasePanel( VPANEL panel ) = 0; - virtual void MovePopupToFront( VPANEL panel ) = 0; - virtual void MovePopupToBack( VPANEL panel ) = 0; - - virtual void SolveTraverse( VPANEL panel, bool forceApplySchemeSettings = false ) = 0; - virtual void PaintTraverse( VPANEL panel ) = 0; - - virtual void EnableMouseCapture( VPANEL panel, bool state ) = 0; - - // returns the size of the workspace - virtual void GetWorkspaceBounds( int &x, int &y, int &wide, int &tall ) = 0; - - // gets the absolute coordinates of the screen (in windows space) - virtual void GetAbsoluteWindowBounds( int &x, int &y, int &wide, int &tall ) = 0; - - // gets the base resolution used in proportional mode - virtual void GetProportionalBase( int &width, int &height ) = 0; - - virtual void CalculateMouseVisible( ) = 0; - virtual bool NeedKBInput( ) = 0; - - virtual bool HasCursorPosFunctions( ) = 0; - virtual void SurfaceGetCursorPos( int &x, int &y ) = 0; - virtual void SurfaceSetCursorPos( int x, int y ) = 0; - - // SRC only functions!!! - virtual void DrawTexturedLine( const vertex_t &a, const vertex_t &b ) = 0; - virtual void DrawOutlinedCircle( int x, int y, int radius, int segments ) = 0; - virtual void DrawTexturedPolyLine( const vertex_t *p, int n ) = 0; // (Note: this connects the first and last points). - virtual void DrawTexturedSubRect( int x0, int y0, int x1, int y1, float texs0, float text0, float texs1, float text1 ) = 0; - virtual void DrawTexturedPolygon( int n, vertex_t *pVertice, bool bClipVertices = true ) = 0; //106 - virtual const wchar_t* GetTitle( VPANEL panel ) = 0; - virtual bool IsCursorLocked( ) const = 0; - virtual void SetWorkspaceInsets( int left, int top, int right, int bottom ) = 0; - - // squarish comic book word bubble with pointer, rect params specify the space inside the bubble - virtual void DrawWordBubble( int x0, int y0, int x1, int y1, int nBorderThickness, clr_t rgbaBackground, clr_t rgbaBorder, - bool bPointer = false, int nPointerX = 0, int nPointerY = 0, int nPointerBaseThickness = 16 ) = 0; - - - // Lower level char drawing code, call DrawGet then pass in info to DrawRender - virtual bool DrawGetUnicodeCharRenderInfo( wchar_t ch, CharRenderInfo& info ) = 0; - virtual void DrawRenderCharFromInfo( const CharRenderInfo& info ) = 0; - - // global alpha setting functions - // affect all subsequent draw calls - shouldn't normally be used directly, only in Panel::PaintTraverse() - virtual void DrawSetAlphaMultiplier( float alpha /* [0..1] */ ) = 0; - virtual float DrawGetAlphaMultiplier( ) = 0; - - // web browser - virtual void SetAllowHTMLJavaScript( bool state ) = 0; - - // video mode changing - virtual void OnScreenSizeChanged( int nOldWidth, int nOldHeight ) = 0; - - virtual HCursor CreateCursorFromFile( char const *curOrAniFile, char const *pPathID = nullptr ) = 0; - - // create IVguiMatInfo object ( IMaterial wrapper in VguiMatSurface, NULL in CWin32Surface ) - virtual IVguiMatInfo* DrawGetTextureMatInfoFactory( int id ) = 0; - - virtual void PaintTraverseEx( VPANEL panel, bool paintPopups = false ) = 0; - - virtual float GetZPos( ) const = 0; - - // From the Xbox - virtual void SetPanelForInput( VPANEL vpanel ) = 0; - virtual void DrawFilledRectFastFade( int x0, int y0, int x1, int y1, int fadeStartPt, int fadeEndPt, unsigned int alpha0, unsigned int alpha1, bool bHorizontal ) = 0; - virtual void DrawFilledRectFade( int x0, int y0, int x1, int y1, unsigned int alpha0, unsigned int alpha1, bool bHorizontal ) = 0; //123 - - virtual void DrawSetTextureRGBAEx( int id, const unsigned char *rgba, int wide, int tall, ImageFormat imageFormat ) = 0; - virtual void DrawSetTextScale( float sx, float sy ) = 0; - virtual bool SetBitmapFontGlyphSet( HFont font, const char *windowsFontName, float scalex, float scaley, int flags ) = 0; - // adds a bitmap font file - virtual bool AddBitmapFontFile( const char *fontFileName ) = 0; - // sets a symbol for the bitmap font - virtual void SetBitmapFontName( const char *pName, const char *pFontFilename ) = 0; - // gets the bitmap font filename - virtual const char* GetBitmapFontName( const char *pName ) = 0; - virtual void ClearTemporaryFontCache( ) = 0; - - virtual IImage* GetIconImageForFullPath( char const *pFullPath ) = 0; - virtual void DrawUnicodeString( const wchar_t *pwString, FontDrawType_t drawType = FONT_DRAW_DEFAULT ) = 0; - virtual void PrecacheFontCharacters( HFont font, const wchar_t *pCharacters ) = 0; - // Console-only. Get the string to use for the current video mode for layout files. - //virtual const char *GetResolutionKey( void ) const = 0; - - virtual const char *GetFontName( HFont font ) = 0; - //virtual const char *GetFontFamilyName( HFont font ) = 0; - - virtual bool ForceScreenSizeOverride( bool bState, int wide, int tall ) = 0; - // LocalToScreen, ParentLocalToScreen fixups for explicit PaintTraverse calls on Panels not at 0, 0 position - virtual bool ForceScreenPosOffset( bool bState, int x, int y ) = 0; - virtual void OffsetAbsPos( int &x, int &y ) = 0; - - virtual void SetAbsPosForContext( int, int, int ) = 0; - virtual void GetAbsPosForContext( int, int &, int & ) = 0; - - // Causes fonts to get reloaded, etc. - virtual void ResetFontCaches( ) = 0; - - virtual bool IsScreenSizeOverrideActive( ) = 0; - virtual bool IsScreenPosOverrideActive( ) = 0; - - virtual void DestroyTextureID( int id ) = 0; - - virtual int GetTextureNumFrames( int id ) = 0; - virtual void DrawSetTextureFrame( int id, int nFrame, unsigned int *pFrameCache ) = 0; - - virtual void GetClipRect( int &x0, int &y0, int &x1, int &y1 ) = 0; - virtual void SetClipRect( int x0, int y0, int x1, int y1 ) = 0; - - virtual void DrawTexturedRectEx( DrawTexturedRectParms_t *pDrawParms ) = 0; - - virtual void GetKernedCharWidth( HFont font, wchar_t ch, wchar_t chBefore, wchar_t chAfter, float &wide, float &abcA ) = 0; - - virtual void DrawUpdateRegionTextureRGBA( int nTextureID, int x, int y, const unsigned char *pchData, int wide, int tall, ImageFormat imageFormat ) = 0; - virtual bool BHTMLWindowNeedsPaint( IHTML *htmlwin ) = 0; - - virtual void DrawSetTextureRGBALinear( int, unsigned char const*, int, int ) = 0; - - virtual const char *GetWebkitHTMLUserAgentString( ) = 0; - - virtual IHTMLChromeController *Deprecated_AccessChromeHTMLController( ) = 0; - - /* - 154 CMatSystemSurface::SetAppDrivesInput(bool) - 155 CMatSystemSurface::EnableWindowsMessages(bool) - 156 CMatSystemSurface::Begin3DPaint(int,int,int,int,bool) - 157 CMatSystemSurface::End3DPaint(bool) - 158 CMatSystemSurface::DisableClipping(bool) - 159 CMatSystemSurface::SetMouseCallbacks(void (*)(int &,int &),void (*)(int,int)) - 160 CMatSystemSurface::InstallPlaySoundFunc(void (*)(char const*)) - 161 CMatSystemSurface::DrawColoredCircle(int,int,float,int,int,int,int) - 162 CMatSystemSurface::DrawColoredText(unsigned long,int,int,int,int,int,int,char const*,...) - 163 CMatSystemSurface::DrawColoredTextRect(unsigned long,int,int,int,int,int,int,int,int,char const*,...) - 164 CMatSystemSurface::DrawTextHeight(unsigned long,int,int &,char *,...) - 165 CMatSystemSurface::DrawTextLen(unsigned long,char const*,...) - 166 CMatSystemSurface::DrawPanelIn3DSpace(unsigned long long,VMatrix const&,int,int,float,float) - 167 CMatSystemSurface::DrawSetTextureMaterial(int,IMaterial *) - 168 CMatSystemSurface::HandleInputEvent(InputEvent_t const&) - 169 CMatSystemSurface::Set3DPaintTempRenderTarget(char const*) - 170 CMatSystemSurface::Reset3DPaintTempRenderTarget(void) - 171 CMatSystemSurface::DrawGetTextureMaterial(int) - 172 CMatSystemSurface::SetInputContext(InputContextHandle_t__ *) - 173 CMatSystemSurface::DrawSetSubTextureRGBA(int,int,int,unsigned char const*,int,int) - 174 CMatSystemSurface::DrawTexturedSubRectGradient(int,int,int,int,float,float,float,float,Color,Color,bool) - 175 CMatSystemSurface::~CMatSystemSurface() - 176 CMatSystemSurface::~CMatSystemSurface() - 177 CMatSystemSurface::SupportsFontFeature(FontFeature_t) - 178 CMatSystemSurface::InEngine(void) - 179 CMatSystemSurface::IsInThink(unsigned long long) - 180 CMatSystemSurface::SetLanguage(char const*) - 181 CMatSystemSurface::GetLanguage(void) - 182 CMatSystemSurface::ComputeTextWidth(wchar_t const*) - */ -}; \ No newline at end of file diff --git a/internal_rewrite/IVEngineClient.hpp b/internal_rewrite/IVEngineClient.hpp deleted file mode 100644 index fb39e08..0000000 --- a/internal_rewrite/IVEngineClient.hpp +++ /dev/null @@ -1,287 +0,0 @@ -#pragma once -#include -#include - -#include "util.hpp" -#include "vector.hpp" -#include "CUtlVector.hpp" - -using matrix3x4 = float[ 3 ][ 4 ]; - -typedef struct player_info_s { -private: - uint32_t __pad0[ 2 ]; -public: - unsigned int m_xuidlow; - unsigned int m_xuidhigh; - char name[ 128 ];//32 - int m_userid; - char m_steamid[ 33 ];//32 - unsigned m_steam3id; - char m_friendsname[ 128 ]; - bool m_isfakeplayer; - bool m_ishltv; - uint32_t m_customfiles[ 4 ]; - uint8_t m_filesdownloaded; -private: - int __pad1; -} player_info_t; - -class INetChannelInfo { -public: - enum - { - GENERIC = 0, // must be first and is default group - LOCALPLAYER, // bytes for local player entity update - OTHERPLAYERS, // bytes for other players update - ENTITIES, // all other entity bytes - SOUNDS, // game sounds - EVENTS, // event messages - TEMPENTS, // temp entities - USERMESSAGES, // user messages - ENTMESSAGES, // entity messages - VOICE, // voice data - STRINGTABLE, // a stringtable update - MOVE, // client move cmds - STRINGCMD, // string command - SIGNON, // various signondata - TOTAL, // must be last and is not a real group - }; - - virtual const char* GetName( ) const = 0; // get channel name - virtual const char* GetAddress( ) const = 0; // get channel IP address as string - virtual float GetTime( ) const = 0; // current net time - virtual float GetTimeConnected( ) const = 0; // get connection time in seconds - virtual int GetBufferSize( ) const = 0; // netchannel packet history size - virtual int GetDataRate( ) const = 0; // send data rate in byte/sec - - virtual bool IsLoopback( ) const = 0; // true if loopback channel - virtual bool IsTimingOut( ) const = 0; // true if timing out - virtual bool IsPlayback( ) const = 0; // true if demo playback - - virtual float GetLatency( int flow ) const = 0; // current latency (RTT), more accurate but jittering - virtual float GetAvgLatency( int flow ) const = 0; // average packet latency in seconds - virtual float GetAvgLoss( int flow ) const = 0; // avg packet loss[0..1] - virtual float GetAvgChoke( int flow ) const = 0; // avg packet choke[0..1] - virtual float GetAvgData( int flow ) const = 0; // data flow in bytes/sec - virtual float GetAvgPackets( int flow ) const = 0; // avg packets/sec - virtual int GetTotalData( int flow ) const = 0; // total flow in/out in bytes - virtual int GetTotalPackets( int flow ) const = 0; - virtual int GetSequenceNr( int flow ) const = 0; // last send seq number - virtual bool IsValidPacket( int flow, int frame_number ) const = 0; // true if packet was not lost/dropped/chocked/flushed - virtual float GetPacketTime( int flow, int frame_number ) const = 0; // time when packet was send - virtual int GetPacketBytes( int flow, int frame_number, int group ) const = 0; // group size of this packet - virtual bool GetStreamProgress( int flow, int* received, int* total ) const = 0; // TCP progress if transmitting - virtual float GetTimeSinceLastReceived( ) const = 0; // get time since last recieved packet in seconds - virtual float GetCommandInterpolationAmount( int flow, int frame_number ) const = 0; - virtual void GetPacketResponseLatency( int flow, int frame_number, int* pnLatencyMsecs, int* pnChoke ) const = 0; - virtual void GetRemoteFramerate( float* pflFrameTime, float* pflFrameTimeStdDeviation ) const = 0; - - virtual float GetTimeoutSeconds( ) const = 0; -}; - -class INetChannel { -public: - char pad_0000[ 20 ]; //0x0000 - bool m_bProcessingMessages; //0x0014 - bool m_bShouldDelete; //0x0015 - char pad_0016[ 2 ]; //0x0016 - int32_t m_nOutSequenceNr; //0x0018 last send outgoing sequence number - int32_t m_nInSequenceNr; //0x001C last received incoming sequnec number - int32_t m_nOutSequenceNrAck; //0x0020 last received acknowledge outgoing sequnce number - int32_t m_nOutReliableState; //0x0024 state of outgoing reliable data (0/1) flip flop used for loss detection - int32_t m_nInReliableState; //0x0028 state of incoming reliable data - int32_t m_nChokedPackets; //0x002C number of choked packets - float m_fClearTime; - float m_TimeOut; - char m_Name[ 32 ]; - - - char pad_0030[ 1044 ]; //0x0030 - - bool transmit( bool only_reliable ) { - return util::get_vfunc< 49, bool >( this, only_reliable ); - } -}; //Size: 0x0444 - -struct INetMessage { - virtual ~INetMessage( ); -}; - -template -class CNetMessagePB : public INetMessage, public T {}; - -class CCLCMsg_Move_ { -private: - char __PAD0[ 0x8 ]; -public: - int numBackupCommands; - int numNewCommands; -}; - -using CCLCMsg_Move_t = CNetMessagePB; - -class CClientState { -public: - char pad_0000[ 0x9c ]; //0x0000 - class INetChannel* m_netchannel; //0x0094 - char pad_0098[ 16 ]; //0x0098 - unsigned int m_retrynum; //0x00A8 - char pad_00AC[ 84 ]; //0x00AC - int m_signon_state; //0x0100 - char pad_0104[ 8 ]; //0x0104 - float m_next_cmd_time; //0x010C - int m_servercount; //0x0110 - int m_current_sequence; //0x0114 - char pad_0118[ 75 ]; //0x0118 - int m_server_tick; //0x0163 - int m_client_tick; //0x0167 - int m_delta_tick; //0x016B - char pad_016F[ 4 ]; //0x016F - int m_view_entity; //0x0173 - char pad_0177[ 8 ]; //0x0177 - char m_level_name[ 260 ]; //0x017F - char m_level_name_short[ 40 ]; //0x0283 - char pad_02AB[ 18932 ]; //0x02AB - char pad_0x2DA0; //0x4CA7 - int m_lastoutgoingcommand; //0x4CA8 - int m_chokedcommands; //0x4CAC - int m_last_acknowledged_cmd; //0x4CB0 - int m_command_ack; //0x4CB4 - int m_sound_seq; //0x4CB8 - char pad_4CBC[ 8 ]; //0x4CBC - bool m_ishltv; //0x4CC4 -}; - -class CGlobalState { -public: - uintptr_t* m_manager; - CClientState *m_def_clientstate; - - __forceinline CClientState* get_client_state( ) { - return m_def_clientstate; - } -}; - -struct CSndInfo { - int guid; - void *file_handle; - int sound_source; - int channel; - int speaker_entity; - float volume; - float last_spatilized_volume; - float radius; - int pitch; - vec3_t *origin; - vec3_t *direction; - bool update_positions; - bool is_sentence; - bool disable_dsp_processing; - bool from_speaker_entity; - bool server_sound; -}; - -class IVEngineSound { -public: - void GetActiveSounds( CUtlVector< CSndInfo >& list ) { - using fn = void( __thiscall* )( void*, CUtlVector< CSndInfo >& ); - - return util::get_vfunc< fn >( this, 18 )( this, list ); - } -}; - -class IVEngineClient -{ -public: - void GetScreenSize( int& width, int& height ) { - using fn = void( __thiscall* )( void*, int&, int& ); - return util::get_vfunc< fn >( this, 5 )( this, width, height ); - } - - void ClientCmd( const char* szCommandString ) { - std::string command( szCommandString ); - std::replace( command.begin( ), command.end( ), ';', ':' ); - std::replace( command.begin( ), command.end( ), '"', '*' ); - using fn = void( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 7 )( this, command.c_str( ) ); - } - - void ClientCmd_Unrestricted( const char* szCommandString ) { - std::string command( szCommandString ); - std::replace( command.begin( ), command.end( ), ';', ':' ); - std::replace( command.begin( ), command.end( ), '"', '*' ); - using fn = void( __thiscall* )( void*, const char*, const char* ); - return util::get_vfunc< fn >( this, 114 )( this, command.c_str( ), nullptr ); - } - - bool GetPlayerInfo( int index, player_info_t* pInfo ) { - using fn = bool( __thiscall* )( void*, int, player_info_t* ); - return util::get_vfunc< fn >( this, 8 )( this, index, pInfo ); - } - - int GetPlayerForUserID( int UserID ) { - using fn = int( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 9 )( this, UserID ); - } - - int GetLocalPlayer( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 12 )( this ); - } - - float Time( ) { - using fn = float( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 14 )( this ); - } - - void GetViewAngles( vec3_t& ang ) { - using fn = void( __thiscall* )( void*, vec3_t& ); - return util::get_vfunc< fn >( this, 18 )( this, ang ); - } - - vec3_t GetViewAngles( ) { - vec3_t ret; - GetViewAngles( ret ); - return ret; - } - - void SetViewAngles( vec3_t& ang ) { - using fn = void( __thiscall* )( void*, vec3_t& ); - return util::get_vfunc< fn >( this, 19 )( this, ang ); - } - - int GetMaxClients( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 20 )( this ); - } - - bool IsInGame( ) { - using fn = bool( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 26 )( this ); - } - - bool IsConnected( ) { - using fn = bool( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 27 )( this ); - } - - bool IsPaused( ) { - return util::get_vfunc< 91, bool >( this ); - } - - const matrix3x4& WorldToScreenMatrix( ) { - using fn = const matrix3x4& ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 37 )( this ); - } - - const char* GetLevelName( ) { - using fn = const char* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 52 )( this ); - } - - INetChannelInfo* GetNetChannelInfo( ) { - using fn = INetChannelInfo* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 78 )( this ); - } -}; \ No newline at end of file diff --git a/internal_rewrite/IVModelInfoClient.hpp b/internal_rewrite/IVModelInfoClient.hpp deleted file mode 100644 index 3cc418b..0000000 --- a/internal_rewrite/IVModelInfoClient.hpp +++ /dev/null @@ -1,268 +0,0 @@ -#pragma once -#include "IVEngineClient.hpp" -#include "IClientEntityList.hpp" - -enum BoneMask_t { - BONE_USED_MASK = 0x0007FF00, - BONE_USED_BY_ANYTHING = 0x0007FF00, - BONE_USED_BY_HITBOX = 0x00000100, // bone (or child) is used by a hit box - BONE_USED_BY_ATTACHMENT = 0x00000200, // bone (or child) is used by an attachment point - BONE_USED_BY_VERTEX_MASK = 0x0003FC00, - BONE_USED_BY_VERTEX_LOD0 = 0x00000400, // bone (or child) is used by the toplevel model via skinned vertex - BONE_USED_BY_VERTEX_LOD1 = 0x00000800, - BONE_USED_BY_VERTEX_LOD2 = 0x00001000, - BONE_USED_BY_VERTEX_LOD3 = 0x00002000, - BONE_USED_BY_VERTEX_LOD4 = 0x00004000, - BONE_USED_BY_VERTEX_LOD5 = 0x00008000, - BONE_USED_BY_VERTEX_LOD6 = 0x00010000, - BONE_USED_BY_VERTEX_LOD7 = 0x00020000, - BONE_USED_BY_BONE_MERGE = 0x00040000 // bone is available for bone merge to occur against it -}; - -struct DrawModelState_t; - -class INetworkStringTable; - -struct mstudiobbox_t { - int bone; - int group; - vec3_t bbmin; - vec3_t bbmax; - int szhitboxnameindex; - int m_iPad01[ 3 ]; - float m_flRadius; - int m_iPad02[ 4 ]; -}; - -struct mstudiohitboxset_t { - int sznameindex; - const char* pszName( ) const { return reinterpret_cast< const char* >( uintptr_t( this ) + sznameindex ); } - int numhitboxes; - int hitboxindex; - mstudiobbox_t* pHitbox( int i ) const { return reinterpret_cast< mstudiobbox_t* >( uintptr_t( this ) + hitboxindex ) + i; }; -}; - -struct mstudiobone_t { - int sznameindex; - char* GetName( ) const { return reinterpret_cast< char* >( reinterpret_cast< uintptr_t >( this ) ) + sznameindex; } - int parent; - int bonecontroller[ 6 ]; - vec3_t pos; - float quat[ 4 ]; - vec3_t rot; - vec3_t posscale; - vec3_t rotscale; - matrix3x4 poseToBone; - float qAlignment[ 4 ]; - int flags; - int proctype; - int procindex; - mutable int physicsbone; - void* GetProcedure( ) const { return procindex == 0 ? nullptr : reinterpret_cast( reinterpret_cast( this ) + procindex ); }; - int surfacepropidx; - char* GetSurfaceProps( ) const { return reinterpret_cast( reinterpret_cast( this ) ) + surfacepropidx; } - int contents; - unsigned char pad[ 32 ]; -}; - -struct mstudioseqdesc_t { - int baseptr; - int szlabelindex; - int szactivitynameindex; - int flags; // looping/non-looping flags - int activity; // initialized at loadtime to game DLL values - int actweight; - int numevents; - int eventindex; - vec3_t bbmin; // per sequence bounding box - vec3_t bbmax; - int numblends; - int animindexindex; - int movementindex; // [blend] float array for blended movement - int groupsize[ 2 ]; - int paramindex[ 2 ]; // X, Y, Z, XR, YR, ZR - float paramstart[ 2 ]; // local (0..1) starting value - float paramend[ 2 ]; // local (0..1) ending value - int paramparent; - float fadeintime; // ideal cross fate in time (0.2 default) - float fadeouttime; // ideal cross fade out time (0.2 default) - int localentrynode; // transition node at entry - int localexitnode; // transition node at exit - int nodeflags; // transition rules - float entryphase; // used to match entry gait - float exitphase; // used to match exit gait - float lastframe; // frame that should generation EndOfSequence - int nextseq; // auto advancing sequences - int pose; // index of delta animation between end and nextseq - int numikrules; - int numautolayers; // - int autolayerindex; - int weightlistindex; - int posekeyindex; - int numiklocks; - int iklockindex; - int keyvalueindex; - int keyvaluesize; - int cycleposeindex; // index of pose parameter to use as cycle index - int activitymodifierindex; - int numactivitymodifiers; - int unused[ 5 ]; // remove/add as appropriate (grow back to 8 ints on version change!) -}; - -struct studiohdr_t { - unsigned char pad00[ 12 ]; - char name[ 64 ]; - unsigned char pad01[ 80 ]; - int numbones; - int boneindex; - unsigned char pad02[ 12 ]; - int hitboxsetindex; - unsigned char pad03[ 8 ]; - int numlocalseq; - int localseqindex; - mutable int activitylistversion; - mutable int eventsindexed; - - int numtextures; - int textureindex; - - int numcdtextures; - int cdtextureindex; - unsigned char pad04[ 188 ]; - - mstudiobone_t *GetBone( int i ) const { - return reinterpret_cast( uintptr_t( this ) + boneindex ) + i; - }; - - mstudiohitboxset_t* pHitboxSet( int i ) const { - return reinterpret_cast( uintptr_t( this ) + hitboxsetindex ) + i; - }; - - mstudiobbox_t* pHitbox( int i, int set ) const { - const mstudiohitboxset_t* s = pHitboxSet( set ); - if ( !s ) - return nullptr; - - return s->pHitbox( i ); - }; - - int iHitboxCount( int set ) const { - const mstudiohitboxset_t* s = pHitboxSet( set ); - if ( !s ) - return 0; - - return s->numhitboxes; - }; -}; - -struct ModelRenderInfo_t { - vec3_t m_origin; - vec3_t m_angles; - char pad[ 0x4 ]; - void* m_renderable; - const model_t* m_model; - const matrix3x4* m_model2world; - const matrix3x4* m_light_offset; - const vec3_t* m_light_origin; - int m_flags; - int m_entity_index; - int m_skin; - int m_body; - int m_hitboxset; - uint16_t* m_instance; - - ModelRenderInfo_t( ) { - m_model2world = nullptr; - m_light_offset = nullptr; - m_light_origin = nullptr; - } -}; - -class IVModelInfoClient { -public: - model_t* GetModel( int index ) { - using fn = model_t*( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 1 )( this, index ); - } - - int GetModelIndex( const char* name ) { - using fn = int( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 2 )( this, name ); - } - - const char* GetModelName( const model_t* model ) { - using fn = const char* ( __thiscall* )( void*, const model_t* ); - return util::get_vfunc< fn >( this, 3 )( this, model ); - } - - studiohdr_t* GetStudiomodel( const model_t* mod ) { - using fn = studiohdr_t* ( __thiscall* )( void*, const model_t* ); - return util::get_vfunc< fn >( this, 32 )( this, mod ); - } - - model_t* FindOrLoadModel( const char* name ) { - using fn = model_t* ( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 43 )( this, name ); - } - - void GetModelMaterials( const model_t *model, int count, class IMaterial** ppMaterial ) { - using fn = const void( __thiscall* )( void*, const model_t*, int, IMaterial** ); - util::get_vfunc< fn >( this, 19 )( this, model, count, ppMaterial ); - } -}; - -enum OverrideType_t { - OVERRIDE_NORMAL = 0, - OVERRIDE_BUILD_SHADOWS, - OVERRIDE_DEPTH_WRITE, - OVERRIDE_SSAO_DEPTH_WRITE, -}; - -class IVModelRender { -public: - void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) { - using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int ); - return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk ); - } - - void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) { - using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); - util::get_vfunc< fn >( this, 21 )( this, matctx, state, pInfo, pCustomBoneToWorld ); - } -}; - -class CStringTable { -public: - INetworkStringTable* FindTable( const char* table ) { - using fn = INetworkStringTable * ( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 3 )( this, table ); - } -}; - -class INetworkStringTable { -public: - - virtual ~INetworkStringTable( void ) {}; - - // Table Info - virtual const char *GetTableName( void ) const = 0; - virtual int GetTableId( void ) const = 0; - virtual int GetNumStrings( void ) const = 0; - virtual int GetMaxStrings( void ) const = 0; - virtual int GetEntryBits( void ) const = 0; - - // Networking - virtual void SetTick( int tick ) = 0; - virtual bool ChangedSinceTick( int tick ) const = 0; - - // Accessors (length -1 means don't change user data if string already exits) - virtual int AddString( bool bIsServer, const char *value, int length = -1, const void *userdata = 0 ) = 0; - - virtual const char *GetString( int stringNumber ) = 0; - virtual void SetStringUserData( int stringNumber, int length, const void *userdata ) = 0; - virtual const void *GetStringUserData( int stringNumber, int *length ) = 0; - virtual int FindStringIndex( char const *string ) = 0; // returns INVALID_STRING_INDEX if not found - - // Callbacks - virtual void SetStringChangedCallback( void *object, void* changeFunc ) = 0; -}; \ No newline at end of file diff --git a/internal_rewrite/IVRenderView.hpp b/internal_rewrite/IVRenderView.hpp deleted file mode 100644 index a8396f5..0000000 --- a/internal_rewrite/IVRenderView.hpp +++ /dev/null @@ -1,185 +0,0 @@ -#pragma once -#include "util.hpp" - -class Beam_t; -class C_Beam; -class c_base_player; -class ITraceFilter; - - -class IVRenderView { -public: - void SetBlend( float blend ) { - return util::get_vfunc< 4, void >( this, blend ); - } - - float GetBlend( ) { - return util::get_vfunc< 5, float >( this ); - } - - void SetColorModulation( float const* blend ) { - return util::get_vfunc< 6, void >( this, blend ); - } - - void GetColorModulation( float* blend ) { - return util::get_vfunc< 7, void >( this, blend ); - } -}; - -enum beam_types { - beam_normal = 0, - beam_disk = 2, - beam_cylinder, - beam_follow, - beam_ring, - beam_spline, - beam_ring_point, - beam_laser, - beam_tesla, -}; - -enum beam_flags { - FBEAM_STARTENTITY = 0x00000001, - FBEAM_ENDENTITY = 0x00000002, - FBEAM_FADEIN = 0x00000004, - FBEAM_FADEOUT = 0x00000008, - FBEAM_SINENOISE = 0x00000010, - FBEAM_SOLID = 0x00000020, - FBEAM_SHADEIN = 0x00000040, - FBEAM_SHADEOUT = 0x00000080, - FBEAM_ONLYNOISEONCE = 0x00000100, // Only calculate our noise once - FBEAM_NOTILE = 0x00000200, - FBEAM_USE_HITBOXES = 0x00000400, // Attachment indices represent hitbox indices instead when this is set. - FBEAM_STARTVISIBLE = 0x00000800, // Has this client actually seen this beam's start entity yet? - FBEAM_ENDVISIBLE = 0x00001000, // Has this client actually seen this beam's end entity yet? - FBEAM_ISACTIVE = 0x00002000, - FBEAM_FOREVER = 0x00004000, - FBEAM_HALOBEAM = 0x00008000, // When drawing a beam with a halo, don't ignore the segments and endwidth - FBEAM_REVERSED = 0x00010000, - NUM_BEAM_FLAGS = 17 // KEEP THIS UPDATED! -}; - -struct BeamInfo_t { - beam_types m_nType; - - // Entities - c_base_player* m_pStartEnt; - int m_nStartAttachment; - c_base_player* m_pEndEnt; - int m_nEndAttachment; - - // Points - vec3_t m_vecStart; - vec3_t m_vecEnd; - - int m_nModelIndex; - const char *m_pszModelName; - - int m_nHaloIndex; - const char *m_pszHaloName; - float m_flHaloScale; - - float m_flLife; - float m_flWidth; - float m_flEndWidth; - float m_flFadeLength; - float m_flAmplitude; - - float m_flBrightness; - float m_flSpeed; - - int m_nStartFrame; - float m_flFrameRate; - - float m_flRed; - float m_flGreen; - float m_flBlue; - - bool m_bRenderable; - - int m_nSegments; - - int m_nFlags; - - // Rings - vec3_t m_vecCenter; - float m_flStartRadius; - float m_flEndRadius; - - BeamInfo_t( ) - { - m_nType = beam_normal; - m_nSegments = -1; - m_pszModelName = NULL; - m_pszHaloName = NULL; - m_nModelIndex = -1; - m_nHaloIndex = -1; - m_bRenderable = true; - m_nFlags = 0; - } -}; - -class IViewRenderBeams -{ -public: - // Construction -public: - IViewRenderBeams( void ); - virtual ~IViewRenderBeams( void ); - - // Implement IViewRenderBeams -public: - virtual void InitBeams( void ); - virtual void ShutdownBeams( void ); - virtual void ClearBeams( void ); - - // Updates the state of the temp ent beams - virtual void UpdateTempEntBeams( ); - - virtual void DrawBeam( Beam_t *pbeam ); - virtual void DrawBeam( C_Beam* pbeam, ITraceFilter*pEntityBeamTraceFilter = NULL ); - - virtual void KillDeadBeams( IClientEntity *pDeadEntity ); - - virtual void CreateBeamEnts( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b, int type = -1 ); - virtual Beam_t *CreateBeamEnts( BeamInfo_t &beamInfo ); - - virtual void CreateBeamEntPoint( int nStartEntity, const vec3_t *pStart, int nEndEntity, const vec3_t* pEnd, - int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b ); - virtual Beam_t *CreateBeamEntPoint( BeamInfo_t &beamInfo ); - - virtual void CreateBeamPoints( vec3_t& start, vec3_t& end, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b ); - virtual Beam_t *CreateBeamPoints( BeamInfo_t &beamInfo ); - - virtual void CreateBeamRing( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b, int flags ); - virtual Beam_t *CreateBeamRing( BeamInfo_t &beamInfo ); - - virtual void CreateBeamRingPoint( const vec3_t& center, float start_radius, float end_radius, int modelIndex, int haloIndex, float haloScale, - float life, float width, float m_nEndWidth, float m_nFadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b, int flags ); - virtual Beam_t *CreateBeamRingPoint( BeamInfo_t &beamInfo ); - - virtual void CreateBeamCirclePoints( int type, vec3_t& start, vec3_t& end, - int modelIndex, int haloIndex, float haloScale, float life, float width, - float endWidth, float fadeLength, float amplitude, float brightness, float speed, - int startFrame, float framerate, float r, float g, float b ); - virtual Beam_t *CreateBeamCirclePoints( BeamInfo_t &beamInfo ); - - virtual void CreateBeamFollow( int startEnt, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float r, float g, float b, - float brightness ); - virtual Beam_t *CreateBeamFollow( BeamInfo_t &beamInfo ); -}; \ No newline at end of file diff --git a/internal_rewrite/KeyValues.cpp b/internal_rewrite/KeyValues.cpp deleted file mode 100644 index 300b6f1..0000000 --- a/internal_rewrite/KeyValues.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "KeyValues.hpp" -#include "pattern.hpp" -#include "interface.hpp" - -void IKeyValuesSystem::FreeKeyValuesMemory( void* memory ) { - return util::get_vfunc< 2, void >( this, memory ); -} - -int IKeyValuesSystem::GetSymbolForString( const char* str, bool create ) { - static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 83 EC 0C 53 8B 5D 08 57" ) ); - using fn = int( __thiscall* )( void*, const char*, bool ); - - int symbol = ( ( fn )( offset ) )( this, str, create ); - return symbol; -} - -const char* IKeyValuesSystem::GetStringForSymbol( int symbol ) { - static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "vstdlib.dll" ) ), xors( "55 8B EC 8B 55 08 83 FA FF" ) ); - using fn = const char*( __thiscall* )( void*, int ); - - auto result = ( ( fn )( offset ) )( this, symbol ); - printf( "%d: %d\n", symbol, *( int* )( &result ) ); - - return result; -} - -KeyValues::KeyValues( const char* setName ) { - static void( __thiscall* keyvalues_constructor )( KeyValues*, const char* ) = 0; - - if( !keyvalues_constructor ) { - auto address = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "68 ? ? ? ? 8B C8 E8 ? ? ? ? 89 45 FC EB 07 C7 45 ? ? ? ? ? 8B 03 56" ), - 0x8 ); - - keyvalues_constructor = decltype( keyvalues_constructor )( address + *( uintptr_t* )( address ) + 4 ); - } - - keyvalues_constructor( this, setName ); -} - -KeyValues::~KeyValues( ) { - static bool( __thiscall* keyvalues_remove_everything )( KeyValues* ) = 0; - - if( !keyvalues_remove_everything ) { - auto address = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "E8 ? ? ? ? 81 23 ? ? ? ?" ), - 0x1 ); - - keyvalues_remove_everything = decltype( keyvalues_remove_everything )( address + *( uintptr_t* )( address ) + 4 ); - } - - keyvalues_remove_everything( this ); - g_csgo.m_keyvalues->FreeKeyValuesMemory( this ); - -} - - -bool KeyValues::LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem, const char *pPathID, bool( *unknown )( const char* ) ) { - static auto load_from_buffer = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 34 53 8B 5D 0C 89 4C 24 04" ) ); - return reinterpret_cast< bool( __thiscall* )( KeyValues*, const char*, const char*, void*, const char*, bool( *)( const char* ) ) >( load_from_buffer ) - ( this, resourceName, pBuffer, pFileSystem, pPathID, unknown ); -} - -const char* KeyValues::get_string( const char* name, const char* value ) { - static auto offset = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 C0 81 EC ?? ?? ?? ?? 53 8B 5D 08" ) ); - using fn = const char*( __thiscall* )( void*, const char*, const char* ); - - auto result = ( ( fn )( offset ) )( this, name, value ); - - return result; - -} - -KeyValues* KeyValues::FindKey( const char* name ) { - auto key = g_csgo.m_keyvalues->GetSymbolForString( name, false ); - for( auto dat = m_pSub; !!dat; dat = dat->m_pPeer ) { - if( dat->m_iKeyName == key ) { - return dat; - } - } - - return nullptr; -} \ No newline at end of file diff --git a/internal_rewrite/KeyValues.hpp b/internal_rewrite/KeyValues.hpp deleted file mode 100644 index 94eb6ca..0000000 --- a/internal_rewrite/KeyValues.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -#include "util.hpp" - -class IKeyValuesSystem { -public: - void FreeKeyValuesMemory( void* memory ); - int GetSymbolForString( const char* string, bool create ); - const char* GetStringForSymbol( int symbol ); -}; - -class KeyValues -{ -public: - KeyValues( const char *setName ); - ~KeyValues( ); - - bool LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem = nullptr, const char *pPathID = nullptr, bool( *unknown )( const char* ) = nullptr ); - - const char* get_string( const char* name, const char* value ); - - int m_iKeyName; - - char *m_sValue; - wchar_t *m_wsValue; - - // we don't delete these - union { - int m_iValue; - float m_flValue; - void *m_pValue; - unsigned char m_Color[ 4 ]; - }; - - char m_iDataType; - char m_bHasEscapeSequences; - char m_bEvaluateConditionals; - - KeyValues* FindKey( const char* key_name ); - - KeyValues *m_pPeer; // pointer to next key in list - KeyValues *m_pSub; // pointer to Start of a new sub key list - KeyValues *m_pChain;// Search here if it's not in our list -}; \ No newline at end of file diff --git a/internal_rewrite/Source.cpp b/internal_rewrite/Source.cpp deleted file mode 100644 index 0b63051..0000000 --- a/internal_rewrite/Source.cpp +++ /dev/null @@ -1,88 +0,0 @@ -//this cheat was a mistake - -#include -#include - -#include "hooks.hpp" -#include "console.hpp" -#include "input_system.hpp" -#include "mem.hpp" -#include "wipe.hpp" - -HMODULE g_dll; -header_t g_header; - -void main_thread( HINSTANCE uh ) { - -#ifdef HEADER_MODULE - memcpy( &g_header, uh, sizeof( g_header ) ); - for ( size_t i = 1; i < sizeof( header_t ); ++i ) - *(uint8_t*)( uintptr_t( &g_header ) + i ) ^= g_header.xor_key; - -#endif - - g_csgo.initialize( ); - -#ifdef HEADER_MODULE - util::memset( (uint8_t*)uh, 0x90, 0x1000 ); -#endif - - ExitThread( 0 ); -} - -long __stdcall exception_handler( EXCEPTION_POINTERS* e ) { - return EXCEPTION_CONTINUE_EXECUTION; -} - -int __stdcall DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { - HANDLE thread; - - uintptr_t wanted_reason; -#ifdef _DEBUG - wanted_reason = DLL_PROCESS_ATTACH; -#else - wanted_reason = DLL_PROCESS_ATTACH; -#endif - - if ( reason == wanted_reason -#ifdef IFACE_DLLMAIN - && !!reserved -#endif - ) { -#ifdef IFACE_DLLMAIN - g_factory.init( ( uintptr_t )( reserved ) ); -#endif - g_dll = inst; - //yayo - //SetUnhandledExceptionFilter( exception_handler ); - - DisableThreadLibraryCalls( inst ); -#ifdef HEADER_MODULE - antidebug::fuck_skids( ); -#endif - - thread = CreateThread( nullptr, 0, - ( LPTHREAD_START_ROUTINE )( main_thread ), - inst, 0, nullptr ); - - if( !thread ) - return 0; - - CloseHandle( thread ); - - return 1; - } -#ifdef IFACE_DLLMAIN - else if( !reserved ) { - MessageBoxA( nullptr, "interface data nullptr (loader error?)", "error", MB_OK ); - return 1; - } -#endif - - if( reason == DLL_PROCESS_DETACH ) { - g_csgo.m_panic = true; - //SetUnhandledExceptionFilter( nullptr ); - } - - return 0; -} \ No newline at end of file diff --git a/internal_rewrite/Valve/checksum_crc.cpp b/internal_rewrite/Valve/checksum_crc.cpp deleted file mode 100644 index bc7b433..0000000 --- a/internal_rewrite/Valve/checksum_crc.cpp +++ /dev/null @@ -1,169 +0,0 @@ -//========= Copyright Valve Corporation, All rights reserved. ============// -// -// Purpose: Generic CRC functions -// -//=============================================================================// - - -#include "checksum_crc.h" - -#define CRC32_INIT_VALUE 0xFFFFFFFFUL -#define CRC32_XOR_VALUE 0xFFFFFFFFUL - -#define NUM_BYTES 256 -static const CRC32_t pulCRCTable[ NUM_BYTES ] = -{ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, - 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, - 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, - 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, - 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, - 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, - 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, - 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, - 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, - 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, - 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, - 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, - 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, - 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, - 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, - 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, - 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, - 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -void CRC32_Init( CRC32_t *pulCRC ) { - *pulCRC = CRC32_INIT_VALUE; -} - -void CRC32_Final( CRC32_t *pulCRC ) { - *pulCRC ^= CRC32_XOR_VALUE; -} - -CRC32_t CRC32_GetTableEntry( unsigned int slot ) { - return pulCRCTable[ ( unsigned char )slot ]; -} - -void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *pBuffer, int nBuffer ) { - CRC32_t ulCrc = *pulCRC; - unsigned char *pb = ( unsigned char * )pBuffer; - unsigned int nFront; - int nMain; - -JustAfew: - - switch( nBuffer ) { - case 7: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 6: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 5: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 4: - ulCrc ^= *( CRC32_t * )pb; - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - *pulCRC = ulCrc; - return; - - case 3: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 2: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 1: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 0: - *pulCRC = ulCrc; - return; - } - - // We may need to do some alignment work up front, and at the end, so that - // the main loop is aligned and only has to worry about 8 byte at a time. - // - // The low-order two bits of pb and nBuffer in total control the - // upfront work. - // - nFront = ( ( unsigned int )pb ) & 3; - nBuffer -= nFront; - switch( nFront ) { - case 3: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - case 2: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - case 1: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - } - - nMain = nBuffer >> 3; - while( nMain-- ) { - ulCrc ^= *( CRC32_t * )pb ; - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc ^= *( CRC32_t * )( pb + 4 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - pb += 8; - } - - nBuffer &= 7; - goto JustAfew; -} diff --git a/internal_rewrite/Valve/checksum_crc.h b/internal_rewrite/Valve/checksum_crc.h deleted file mode 100644 index 356de67..0000000 --- a/internal_rewrite/Valve/checksum_crc.h +++ /dev/null @@ -1,30 +0,0 @@ -//========= Copyright Valve Corporation, All rights reserved. ============// -// -// Purpose: Generic CRC functions -// -// $NoKeywords: $ -//=============================================================================// -#ifndef CHECKSUM_CRC_H -#define CHECKSUM_CRC_H -#ifdef _WIN32 -#pragma once -#endif - -typedef unsigned int CRC32_t; - -void CRC32_Init( CRC32_t *pulCRC ); -void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *p, int len ); -void CRC32_Final( CRC32_t *pulCRC ); -CRC32_t CRC32_GetTableEntry( unsigned int slot ); - -inline CRC32_t CRC32_ProcessSingleBuffer( const void *p, int len ) { - CRC32_t crc; - - CRC32_Init( &crc ); - CRC32_ProcessBuffer( &crc, p, len ); - CRC32_Final( &crc ); - - return crc; -} - -#endif // CHECKSUM_CRC_H diff --git a/internal_rewrite/Valve/dt_common.h b/internal_rewrite/Valve/dt_common.h deleted file mode 100644 index ff0f7b7..0000000 --- a/internal_rewrite/Valve/dt_common.h +++ /dev/null @@ -1,161 +0,0 @@ -//========= Copyright Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $NoKeywords: $ -// -//=============================================================================// - -#pragma warning( push, 0 ) - -#ifndef DATATABLE_COMMON_H -#define DATATABLE_COMMON_H - -#ifdef _WIN32 -#pragma once -#endif - -#include - -#ifdef LINUX -#undef offsetof -#define offsetof(s,m) (size_t)&(((s *)0)->m) -#endif - -// Max number of properties in a datatable and its children. -#define MAX_DATATABLES 1024 // must be a power of 2. -#define MAX_DATATABLE_PROPS 4096 - -#define MAX_ARRAY_ELEMENTS 2048 // a network array should have more that 1024 elements - -#define HIGH_DEFAULT -121121.121121f - -#define BITS_FULLRES -1 // Use the full resolution of the type being encoded. -#define BITS_WORLDCOORD -2 // Encode as a world coordinate. - -#define DT_MAX_STRING_BITS 9 -#define DT_MAX_STRING_BUFFERSIZE (1<varName ) - -// Gets the size of a variable in a class. -#define PROPSIZEOF(className, varName) sizeof(((className*)0)->varName) - - -// SendProp::m_Flags. -#define SPROP_UNSIGNED (1<<0) // Unsigned integer data. - -#define SPROP_COORD (1<<1) // If this is set, the float/vector is treated like a world coordinate. -// Note that the bit count is ignored in this case. - -#define SPROP_NOSCALE (1<<2) // For floating point, don't scale into range, just take value as is. - -#define SPROP_ROUNDDOWN (1<<3) // For floating point, limit high value to range minus one bit unit - -#define SPROP_ROUNDUP (1<<4) // For floating point, limit low value to range minus one bit unit - -#define SPROP_NORMAL (1<<5) // If this is set, the vector is treated like a normal (only valid for vectors) - -#define SPROP_EXCLUDE (1<<6) // This is an exclude prop (not excludED, but it points at another prop to be excluded). - -#define SPROP_XYZE (1<<7) // Use XYZ/Exponent encoding for vectors. - -#define SPROP_INSIDEARRAY (1<<8) // This tells us that the property is inside an array, so it shouldn't be put into the -// flattened property list. Its array will point at it when it needs to. - -#define SPROP_PROXY_ALWAYS_YES (1<<9) // Set for datatable props using one of the default datatable proxies like -// SendProxy_DataTableToDataTable that always send the data to all clients. - -#define SPROP_CHANGES_OFTEN (1<<10) // this is an often changed field, moved to head of sendtable so it gets a small index - -#define SPROP_IS_A_VECTOR_ELEM (1<<11) // Set automatically if SPROP_VECTORELEM is used. - -#define SPROP_COLLAPSIBLE (1<<12) // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer -// (ie: for all automatically-chained base classes). -// In this case, it can get rid of this SendPropDataTable altogether and spare the -// trouble of walking the hierarchy more than necessary. - -#define SPROP_COORD_MP (1<<13) // Like SPROP_COORD, but special handling for multiplayer games -#define SPROP_COORD_MP_LOWPRECISION (1<<14) // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 -#define SPROP_COORD_MP_INTEGRAL (1<<15) // SPROP_COORD_MP, but coordinates are rounded to integral boundaries - -#define SPROP_VARINT SPROP_NORMAL // reuse existing flag so we don't break demo. note you want to include SPROP_UNSIGNED if needed, its more efficient - -#define SPROP_NUMFLAGBITS_NETWORKED 16 - -// This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are -// m_flAnimTime and m_flSimulationTime. MODs shouldn't need to mess with this probably -#define SPROP_ENCODED_AGAINST_TICKCOUNT (1<<16) - -// See SPROP_NUMFLAGBITS_NETWORKED for the ones which are networked -#define SPROP_NUMFLAGBITS 17 - -// Used by the SendProp and RecvProp functions to disable debug checks on type sizes. -#define SIZEOF_IGNORE -1 - - -// Use this to extern send and receive datatables, and reference them. -#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} -#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} - -#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable -#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable - - -class SendProp; - -// The day we do this, we break all mods until they recompile. -//#define SUPPORTS_INT64 - -typedef enum -{ - DPT_Int = 0, - DPT_Float, - DPT_Vector, - DPT_VectorXY, // Only encodes the XY of a vector, ignores Z - DPT_String, - DPT_Array, // An array of the base types (can't be of datatables). - DPT_DataTable, -#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! - DPT_Quaternion, -#endif - -#ifdef SUPPORTS_INT64 - DPT_Int64, -#endif - - DPT_NUMSendPropTypes - -} SendPropType; - - -struct DVariant { - union { - float m_Float; - long m_Int; - char* m_pString; - void* m_pData; - float m_Vector[ 3 ]; - __int64 m_Int64; - }; - - int m_Type; -}; - - -// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1. -inline int NumBitsForCount( int nMaxElements ) -{ - int nBits = 0; - while( nMaxElements > 0 ) - { - ++nBits; - nMaxElements >>= 1; - } - return nBits; -} - - -#endif // DATATABLE_COMMON_H - -#pragma warning( pop ) \ No newline at end of file diff --git a/internal_rewrite/Valve/dt_recv.h b/internal_rewrite/Valve/dt_recv.h deleted file mode 100644 index 6e73bdb..0000000 --- a/internal_rewrite/Valve/dt_recv.h +++ /dev/null @@ -1,590 +0,0 @@ -//========= Copyright Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $NoKeywords: $ -// -//=============================================================================// - -#pragma warning( push, 0 ) - -#ifndef DATATABLE_RECV_H -#define DATATABLE_RECV_H - -#ifdef _WIN32 -#pragma once -#endif - -#include "dt_common.h" - -#define ADDRESSPROXY_NONE -1 - - -class RecvTable; -class RecvProp; - - -// This is passed into RecvProxy functions. -class CRecvProxyData -{ -public: - const RecvProp *m_pRecvProp; // The property it's receiving. - - DVariant m_Value; // The value given to you to store. - - int m_iElement; // Which array element you're getting. - - int m_ObjectID; // The object being referred to. -}; - - -//----------------------------------------------------------------------------- -// pStruct = the base structure of the datatable this variable is in (like C_BaseEntity) -// pOut = the variable that this this proxy represents (like C_BaseEntity::m_SomeValue). -// -// Convert the network-standard-type value in m_Value into your own format in pStruct/pOut. -//----------------------------------------------------------------------------- -typedef void( *RecvVarProxyFn )( const CRecvProxyData *pData, void *pStruct, void *pOut ); - -// ------------------------------------------------------------------------ // -// ArrayLengthRecvProxies are optionally used to get the length of the -// incoming array when it changes. -// ------------------------------------------------------------------------ // -typedef void( *ArrayLengthRecvProxyFn )( void *pStruct, int objectID, int currentArrayLength ); - - -// NOTE: DataTable receive proxies work differently than the other proxies. -// pData points at the object + the recv table's offset. -// pOut should be set to the location of the object to unpack the data table into. -// If the parent object just contains the child object, the default proxy just does *pOut = pData. -// If the parent object points at the child object, you need to dereference the pointer here. -// NOTE: don't ever return null from a DataTable receive proxy function. Bad things will happen. -typedef void( *DataTableRecvVarProxyFn )( const RecvProp *pProp, void **pOut, void *pData, int objectID ); - - -// This is used to fork over the standard proxy functions to the engine so it can -// make some optimizations. -class CStandardRecvProxies -{ -public: - CStandardRecvProxies(); - - RecvVarProxyFn m_Int32ToInt8; - RecvVarProxyFn m_Int32ToInt16; - RecvVarProxyFn m_Int32ToInt32; - RecvVarProxyFn m_FloatToFloat; - RecvVarProxyFn m_VectorToVector; -#ifdef SUPPORTS_INT64 - RecvVarProxyFn m_Int64ToInt64; -#endif -}; -extern CStandardRecvProxies g_StandardRecvProxies; - - -class CRecvDecoder; - - -class RecvProp -{ - // This info comes from the receive data table. -public: - RecvProp(); - - void InitArray( int nElements, int elementStride ); - - int GetNumElements() const; - void SetNumElements( int nElements ); - - int GetElementStride() const; - void SetElementStride( int stride ); - - int GetFlags() const; - - const char* GetName() const; - SendPropType GetType() const; - - RecvTable* GetDataTable() const; - void SetDataTable( RecvTable *pTable ); - - RecvVarProxyFn GetProxyFn() const; - void SetProxyFn( RecvVarProxyFn fn ); - - DataTableRecvVarProxyFn GetDataTableProxyFn() const; - void SetDataTableProxyFn( DataTableRecvVarProxyFn fn ); - - int GetOffset() const; - void SetOffset( int o ); - - // Arrays only. - RecvProp* GetArrayProp() const; - void SetArrayProp( RecvProp *pProp ); - - // Arrays only. - void SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ); - ArrayLengthRecvProxyFn GetArrayLengthProxy() const; - - bool IsInsideArray() const; - void SetInsideArray(); - - // Some property types bind more data to the prop in here. - const void* GetExtraData() const; - void SetExtraData( const void *pData ); - - // If it's one of the numbered "000", "001", etc properties in an array, then - // these can be used to get its array property name for debugging. - const char* GetParentArrayPropName(); - void SetParentArrayPropName( const char *pArrayPropName ); - -public: - - const char *m_pVarName; - SendPropType m_RecvType; - int m_Flags; - int m_StringBufferSize; - - -public: - - bool m_bInsideArray; // Set to true by the engine if this property sits inside an array. - - // Extra data that certain special property types bind to the property here. - const void *m_pExtraData; - - // If this is an array (DPT_Array). - RecvProp *m_pArrayProp; - ArrayLengthRecvProxyFn m_ArrayLengthProxy; - - RecvVarProxyFn m_ProxyFn; - DataTableRecvVarProxyFn m_DataTableProxyFn; // For RDT_DataTable. - - RecvTable *m_pDataTable; // For RDT_DataTable. - int m_Offset; - - int m_ElementStride; - int m_nElements; - - // If it's one of the numbered "000", "001", etc properties in an array, then - // these can be used to get its array property name for debugging. - const char *m_pParentArrayPropName; -}; - - -class RecvTable -{ -public: - - typedef RecvProp PropType; - - RecvTable(); - RecvTable( RecvProp *pProps, int nProps, const char *pNetTableName ); - ~RecvTable(); - - void Construct( RecvProp *pProps, int nProps, const char *pNetTableName ); - - int GetNumProps(); - RecvProp* GetProp( int i ); - - const char* GetName(); - - // Used by the engine while initializing array props. - void SetInitialized( bool bInitialized ); - bool IsInitialized() const; - - // Used by the engine. - void SetInMainList( bool bInList ); - bool IsInMainList() const; - - -public: - - // Properties described in a table. - RecvProp *m_pProps; - int m_nProps; - - // The decoder. NOTE: this covers each RecvTable AND all its children (ie: its children - // will have their own decoders that include props for all their children). - CRecvDecoder *m_pDecoder; - - const char *m_pNetTableName; // The name matched between client and server. - - -private: - - bool m_bInitialized; - bool m_bInMainList; -}; - - -inline int RecvTable::GetNumProps() -{ - return m_nProps; -} - -inline RecvProp* RecvTable::GetProp( int i ) -{ - return &m_pProps[ i ]; -} - -inline const char* RecvTable::GetName() -{ - return m_pNetTableName; -} - -inline void RecvTable::SetInitialized( bool bInitialized ) -{ - m_bInitialized = bInitialized; -} - -inline bool RecvTable::IsInitialized() const -{ - return m_bInitialized; -} - -inline void RecvTable::SetInMainList( bool bInList ) -{ - m_bInMainList = bInList; -} - -inline bool RecvTable::IsInMainList() const -{ - return m_bInMainList; -} - - -// ------------------------------------------------------------------------------------------------------ // -// See notes on BEGIN_SEND_TABLE for a description. These macros work similarly. -// ------------------------------------------------------------------------------------------------------ // -#define BEGIN_RECV_TABLE(className, tableName) \ - BEGIN_RECV_TABLE_NOBASE(className, tableName) \ - RecvPropDataTable("baseclass", 0, 0, className::BaseClass::m_pClassRecvTable, DataTableRecvProxy_StaticDataTable), - -#define BEGIN_RECV_TABLE_NOBASE(className, tableName) \ - template int ClientClassInit(T *); \ - namespace tableName { \ - struct ignored; \ - } \ - template <> int ClientClassInit(tableName::ignored *); \ - namespace tableName { \ - RecvTable g_RecvTable; \ - int g_RecvTableInit = ClientClassInit((tableName::ignored *)NULL); \ - } \ - template <> int ClientClassInit(tableName::ignored *) \ - { \ - typedef className currentRecvDTClass; \ - const char *pRecvTableName = #tableName; \ - RecvTable &RecvTable = tableName::g_RecvTable; \ - static RecvProp RecvProps[] = { \ - RecvPropInt("should_never_see_this", 0, sizeof(int)), // It adds a dummy property at the start so you can define "empty" SendTables. - -#define END_RECV_TABLE() \ - }; \ - RecvTable.Construct(RecvProps+1, sizeof(RecvProps) / sizeof(RecvProp) - 1, pRecvTableName); \ - return 1; \ - } - - -#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) -#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) -#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName) -#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName)) -#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0]) - -// Just specify the name and offset. Used for strings and data tables. -#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName) -#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName) -#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName) - - -void RecvProxy_FloatToFloat( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_VectorToVector( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_VectorXYToVectorXY( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_QuaternionToQuaternion( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_Int32ToInt8( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_Int32ToInt16( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_StringToString( const CRecvProxyData *pData, void *pStruct, void *pOut ); -void RecvProxy_Int32ToInt32( const CRecvProxyData *pData, void *pStruct, void *pOut ); -#ifdef SUPPORTS_INT64 -void RecvProxy_Int64ToInt64( const CRecvProxyData *pData, void *pStruct, void *pOut ); -#endif - -// StaticDataTable does *pOut = pData. -void DataTableRecvProxy_StaticDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); - -// PointerDataTable does *pOut = *((void**)pData) (ie: pData is a pointer to the object to decode into). -void DataTableRecvProxy_PointerDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ); - - -RecvProp RecvPropFloat( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_FloatToFloat - ); - -RecvProp RecvPropVector( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_VectorToVector - ); - -RecvProp RecvPropVectorXY( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_VectorXYToVectorXY - ); - -// This is here so the RecvTable can look more like the SendTable. -#define RecvPropQAngles RecvPropVector - -#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! - -RecvProp RecvPropQuaternion( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_QuaternionToQuaternion - ); -#endif - -RecvProp RecvPropInt( - const char *pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = 0 - ); - -RecvProp RecvPropString( - const char *pVarName, - int offset, - int bufferSize, - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_StringToString - ); - -RecvProp RecvPropDataTable( - const char *pVarName, - int offset, - int flags, - RecvTable *pTable, - DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable - ); - -RecvProp RecvPropArray3( - const char *pVarName, - int offset, - int sizeofVar, - int elements, - RecvProp pArrayProp, - DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable - ); - -// Use the macro to let it automatically generate a table name. You shouldn't -// ever need to reference the table name. If you want to exclude this array, then -// reference the name of the variable in varTemplate. -RecvProp InternalRecvPropArray( - const int elementCount, - const int elementStride, - const char *pName, - ArrayLengthRecvProxyFn proxy - ); - - -// -// Use this if you want to completely manage the way the array data is stored. -// You'll need to provide a proxy inside varTemplate that looks for 'iElement' -// to figure out where to store the specified element. -// -#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \ - varTemplate, \ - InternalRecvPropArray( \ - maxArrayLength, \ - 0, \ - #propertyName, \ - arrayLengthProxy \ - ) - - -// Use this and pass the array name and it will figure out the count and stride automatically. -#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \ - varTemplate, \ - InternalRecvPropArray( \ - sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ - PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ - #arrayName, \ - arrayLengthProxy \ - ) - - -// Use this and pass the array name and it will figure out the count and stride automatically. -#define RecvPropArray( varTemplate, arrayName ) \ - RecvPropVariableLengthArray( 0, varTemplate, arrayName ) - - -// Use this one to specify the element count and stride manually. -#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \ - varTemplate, \ - InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy ) - - -// ---------------------------------------------------------------------------------------- // -// Inlines. -// ---------------------------------------------------------------------------------------- // - -inline void RecvProp::InitArray( int nElements, int elementStride ) -{ - m_RecvType = DPT_Array; - m_nElements = nElements; - m_ElementStride = elementStride; -} - -inline int RecvProp::GetNumElements() const -{ - return m_nElements; -} - -inline void RecvProp::SetNumElements( int nElements ) -{ - m_nElements = nElements; -} - -inline int RecvProp::GetElementStride() const -{ - return m_ElementStride; -} - -inline void RecvProp::SetElementStride( int stride ) -{ - m_ElementStride = stride; -} - -inline int RecvProp::GetFlags() const -{ - return m_Flags; -} - -inline const char* RecvProp::GetName() const -{ - return m_pVarName; -} - -inline SendPropType RecvProp::GetType() const -{ - return m_RecvType; -} - -inline RecvTable* RecvProp::GetDataTable() const -{ - return m_pDataTable; -} - -inline void RecvProp::SetDataTable( RecvTable *pTable ) -{ - m_pDataTable = pTable; -} - -inline RecvVarProxyFn RecvProp::GetProxyFn() const -{ - return m_ProxyFn; -} - -inline void RecvProp::SetProxyFn( RecvVarProxyFn fn ) -{ - m_ProxyFn = fn; -} - -inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn() const -{ - return m_DataTableProxyFn; -} - -inline void RecvProp::SetDataTableProxyFn( DataTableRecvVarProxyFn fn ) -{ - m_DataTableProxyFn = fn; -} - -inline int RecvProp::GetOffset() const -{ - return m_Offset; -} - -inline void RecvProp::SetOffset( int o ) -{ - m_Offset = o; -} - -inline RecvProp* RecvProp::GetArrayProp() const -{ - return m_pArrayProp; -} - -inline void RecvProp::SetArrayProp( RecvProp *pProp ) -{ - m_pArrayProp = pProp; -} - -inline void RecvProp::SetArrayLengthProxy( ArrayLengthRecvProxyFn proxy ) -{ - m_ArrayLengthProxy = proxy; -} - -inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy() const -{ - return m_ArrayLengthProxy; -} - -inline bool RecvProp::IsInsideArray() const -{ - return m_bInsideArray; -} - -inline void RecvProp::SetInsideArray() -{ - m_bInsideArray = true; -} - -inline const void* RecvProp::GetExtraData() const -{ - return m_pExtraData; -} - -inline void RecvProp::SetExtraData( const void *pData ) -{ - m_pExtraData = pData; -} - -inline const char* RecvProp::GetParentArrayPropName() -{ - return m_pParentArrayPropName; -} - -inline void RecvProp::SetParentArrayPropName( const char *pArrayPropName ) -{ - m_pParentArrayPropName = pArrayPropName; -} - -inline void**& GetVTable( void* instance ) -{ - return *reinterpret_cast( ( size_t )instance ); -} - -inline const void** GetVTable( const void* instance ) -{ - return *reinterpret_cast( ( size_t )instance ); -} - -template -inline T GetMethod( const void* instance, size_t index ) -{ - return reinterpret_cast( GetVTable( instance )[ index ] ); -} - -#endif // DATATABLE_RECV_H - -#pragma warning( pop ) \ No newline at end of file diff --git a/internal_rewrite/autowall.cpp b/internal_rewrite/autowall.cpp deleted file mode 100644 index 603f94e..0000000 --- a/internal_rewrite/autowall.cpp +++ /dev/null @@ -1,337 +0,0 @@ -#include - -#include "autowall.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "math.hpp" - - - -namespace features { - bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) { - if ( armor_value <= 0 ) return false; - - switch ( hitgroup ) { - case HITGROUP_GENERIC: - case HITGROUP_CHEST: - case HITGROUP_STOMACH: - case HITGROUP_LEFTARM: - case HITGROUP_RIGHTARM: - return true; - case HITGROUP_HEAD: - return ent->m_bHasHelmet( ); - } - - return false; - } - - void c_autowall::trace_line( const vec3_t& start, const vec3_t& end, unsigned mask, void* ignore, CGameTrace* tr ) { - CTraceFilter filter; - Ray_t ray; - - filter.pSkip = ignore; - ray.Init( start, end ); - - g_csgo.m_trace( )->TraceRay( ray, mask, &filter, tr ); - } - - void c_autowall::scale_damage( c_base_player* ent, int hitgroup, float weapon_armor_ratio, float& damage ) { - float multiplier; - float armor_ratio; - float new_damage; - int armor; - - auto get_hitgroup_mul = []( int hitgroup ) { - switch ( hitgroup ) { - case HITGROUP_HEAD: - return 4.f; - case HITGROUP_STOMACH: - return 1.25f; - case HITGROUP_LEFTLEG: - case HITGROUP_RIGHTLEG: - return 0.75f; - } - - return 1.0f; - }; - - multiplier = get_hitgroup_mul( hitgroup ); - damage *= multiplier; - armor = ent->m_ArmorValue( ); - - if ( is_armored( ent, armor, hitgroup ) ) { - armor_ratio = weapon_armor_ratio * 0.5f; - new_damage = damage * armor_ratio; - if ( hitgroup != HITGROUP_HEAD && damage - damage * armor_ratio * 0.5f > armor ) { - new_damage = damage - armor * 2.0f; - } - - damage = new_damage; - } - } - - bool c_autowall::is_breakable( IClientEntity* ent ) { - #ifdef is_breakable_ptr - static auto is_breakable_ptr = g_header.patterns.is_breakable; - #else - static auto is_breakable_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 85 F6 74 68 83 BE" ) ); - #endif - - if ( !ent || ent->GetIndex( ) == 0 ) - return false; - - auto is_breakable_fn = reinterpret_cast< bool( __thiscall* )( void* ) >( is_breakable_ptr ); - - bool breakable = is_breakable_fn( ent ); - - if ( !breakable ) { - auto ent_class = ent->GetClientClass( ); - - if ( !ent_class ) - return false; - - // s/o 2 poiak - auto nazwa = ent_class->m_name; - - // s/o 2 estrosterik - if ( *reinterpret_cast< uint32_t* >( nazwa ) == 0x65724243 && *reinterpret_cast< uint32_t* >( nazwa + 0x7 ) == 0x53656C62 ) - return true; - } - - return breakable; - } - - bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) { - float dist = 0.f; - int old_contents = 0; - - Ray_t ray; - - while ( dist <= 90.f ) { - dist += 4.0f; - - out_end = start + ( dir * dist ); - - if ( !old_contents ) - old_contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX ); - - int contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX ); - if ( contents & MASK_SHOT_HULL && ( !( contents & CONTENTS_HITBOX ) || old_contents == contents ) ) - continue; - - vec3_t end = out_end - ( dir * 4.0f ); - - ray.Init( out_end, end ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, nullptr, exit_trace ); - - if ( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) { - CTraceFilter filter; - filter.pSkip = exit_trace->m_pEnt; - - ray.Init( out_end, start ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace ); - - if ( exit_trace->DidHit( ) && !exit_trace->startsolid ) { - out_end = exit_trace->endpos; - return true; - } - - continue; - } - - // maps/cs_office/glass/urban_glass - const char* surface_name = tr.surface.name; - - if ( surface_name - && *( uint32_t* )( &surface_name[ 0 ] ) == 0x7370616d - && *( uint32_t* )( &surface_name[ 4 ] ) == 0x5f73632f - && *( uint32_t* )( &surface_name[ 8 ] ) == 0x6966666f - && *( uint32_t* )( &surface_name[ 12 ] ) == 0x672f6563 - && *( uint32_t* )( &surface_name[ 16 ] ) == 0x7373616c - && *( uint32_t* )( &surface_name[ 20 ] ) == 0x6272752f - && *( uint32_t* )( &surface_name[ 24 ] ) == 0x675f6e61 - && *( uint32_t* )( &surface_name[ 28 ] ) == 0x7373616c - ) { - *exit_trace = tr; - exit_trace->endpos = out_end + dir; - return true; - } - - if ( exit_trace->DidHit( ) && !exit_trace->startsolid ) { - if ( is_breakable( tr.m_pEnt ) && is_breakable( tr.m_pEnt ) ) - return true; - - if ( tr.surface.flags & SURF_NODRAW || !( exit_trace->surface.flags & SURF_NODRAW ) && ( exit_trace->plane.normal.dot( dir ) <= 1.f ) ) { - out_end -= dir * ( exit_trace->fraction * 4.f ); - return true; - } - - continue; - } - - if ( !exit_trace->DidHit( ) || exit_trace->startsolid ) { - if ( tr.m_pEnt && tr.m_pEnt != g_csgo.m_entlist( )->GetClientEntity< void >( 0 ) && is_breakable( exit_trace->m_pEnt ) ) { - *exit_trace = tr; - exit_trace->endpos = out_end + dir; - return true; - } - } - } - - return false; - } - - bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) { - - vec3_t pen_end; - CGameTrace exit_trace; - - - - if ( !trace_to_exit( data.enter_trace.endpos, data.direction, pen_end, data.enter_trace, &exit_trace ) ) { - // if( !( g_csgo.m_trace( )->GetPointContents( pen_end, MASK_SHOT_HULL ) & MASK_SHOT_HULL ) ) - return false; - } - - bool is_light_surf = ( data.enter_trace.contents >> 7 ) & 1; - bool is_solid_surf = ( data.enter_trace.contents >> 3 ) & 1; - - auto exit_surface = g_csgo.m_phys_props( )->GetSurfaceData( exit_trace.surface.surfaceProps ); - auto enter_surface = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps ); - - if ( !exit_surface || !enter_surface ) - return false; - - int exit_material = exit_surface->game.material, enter_material = enter_surface->game.material; - - auto damage_mod = 0.16f; - auto pen_mod = ( enter_surface->game.penetrationmodifier + exit_surface->game.penetrationmodifier ) * 0.5f; - - constexpr uint32_t grate = 71, wood = 85, plastic = 76, glass = 89, cardboard = 87; - - if ( enter_material == grate /* metal vents */ || enter_material == glass /* windows */ ) { - pen_mod = 3.0f; - damage_mod = 0.05f; - } else if ( is_light_surf || is_solid_surf ) { - pen_mod = 1.0f; - damage_mod = 0.16f; - } - - if ( enter_material == exit_material ) { - if ( exit_material == cardboard || exit_material == wood ) - pen_mod = 3.0f; - else if ( exit_material == plastic ) - pen_mod = 2.0f; - } - - float thickness = exit_trace.endpos.dist_to_sqr( data.enter_trace.endpos ); - - auto modifier = math::max( 0.f, 1.0f / pen_mod ); - - auto lost_dmg = std::fmaxf( - ( ( modifier * thickness ) / 24.f ) - + ( ( data.current_damage * damage_mod ) - + ( std::fmaxf( 3.75f / wpn_data->penetration, 0.f ) * 3.f * modifier ) ), 0.f ); - - - if ( lost_dmg > 0.f ) - data.current_damage -= lost_dmg; - - if ( data.current_damage < 1.f ) - return false; - - data.src = exit_trace.endpos; - data.penetrate_count--; - - return true; - } - - bool c_autowall::fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check, bool scale ) { - data.penetrate_count = 4; - - if ( !wep_data ) - return false; - - data.current_damage = ( float )( wep_data->damage ); - - while ( data.penetrate_count > 0 && data.current_damage >= 1.0f ) { - // this little nigga all along. - // never trust the feds. - // or even fluffy people. - data.to_travel = data.travel_range - data.traveled; - vec3_t end = data.src + data.direction * data.to_travel; - - trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace ); - util::clip_trace_to_player( target->ce( ), data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace ); - - data.traveled += data.to_travel * data.enter_trace.fraction; - data.current_damage *= std::pow( wep_data->range_modifier, data.traveled * 0.002f ); - - if ( data.enter_trace.fraction == 1.0f ) { - if ( !ent_check ) { - if ( scale ) - scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage ); - - return true; - } - break; - } - - - if ( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD - && data.enter_trace.m_pEnt == target->ce( ) ) { - auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt ); - - if ( scale ) - scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage ); - - return true; - } - - auto enter_surface = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps ); - if ( data.traveled > 3000.f || enter_surface->game.penetrationmodifier < 0.1f ) - break; - - if ( !handle_bullet_penetration( wep_data, data ) ) - break; - } - - return false; - } - - float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) { - if ( !shooter || !target ) { - return 0.f; - } - - auto wep = shooter->get_weapon( ); - if ( !wep ) { - return 0.f; - } - - fire_bullet_data_t data; - data.filter.pSkip = shooter; - - if ( shooter == g_ctx.m_local ) { - data.src = shooter->get_eye_pos( ); - } else { - data.src = shooter->m_vecOrigin( ); - data.src.z += 72.f; - } - - data.direction = end - data.src; - data.travel_range = data.direction.length( ); - data.direction.normalize_vector( ); - data.traveled = 0.f; - data.to_travel = data.travel_range; - - - if ( fire_bullet( shooter, target, wep->get_wpn_info( ), data, ent_check ) ) { - return std::max( data.current_damage, 0.f ); - } - - return 0.f; - } -} diff --git a/internal_rewrite/autowall.hpp b/internal_rewrite/autowall.hpp deleted file mode 100644 index 5e433e0..0000000 --- a/internal_rewrite/autowall.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once -#include "sdk.hpp" -#include "pattern.hpp" -#include "interface.hpp" - -struct fire_bullet_data_t { - vec3_t src; - CGameTrace enter_trace; - vec3_t direction; - CTraceFilter filter; - float current_damage; - int penetrate_count; - - float travel_range{ }; - float traveled{ }; - float to_travel{ }; -}; - -namespace features -{ - class c_autowall { - private: - bool is_armored( c_base_player* entity, int armor_value, int hitgroup ); - void scale_damage( c_base_player* entity, int hitgroup, float weapon_armor_ratio, float& damage ); - void trace_line( const vec3_t& abs_start, const vec3_t& abs_end, unsigned mask, void* ignore, CGameTrace* trace ); - bool is_breakable( IClientEntity* ent ); - - bool trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ); - - public: - bool handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ); - bool fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check = true, bool scale_damage = true ); - float run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check = true ); - }; -} \ No newline at end of file diff --git a/internal_rewrite/base_cheat.cpp b/internal_rewrite/base_cheat.cpp deleted file mode 100644 index d21888d..0000000 --- a/internal_rewrite/base_cheat.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "base_cheat.hpp" - -features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/internal_rewrite/base_cheat.hpp b/internal_rewrite/base_cheat.hpp deleted file mode 100644 index 07d3588..0000000 --- a/internal_rewrite/base_cheat.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -#include "util.hpp" -#include "movement.hpp" -#include "prediction.hpp" -#include "legitbot.hpp" -#include "chams.hpp" -#include "autowall.hpp" -#include "ragebot.hpp" -#include "identity.hpp" -#include "lag_mgr.hpp" -#include "visual.hpp" -#include "extra.hpp" -#include "movement_recorder.hpp" -#include "player_manager.hpp" -#include "skins.hpp" - -NAMESPACE_REGION( features ) - -class c_base_cheat { -public: - //have your cheat classes in here - c_movement m_movement; - c_prediction m_prediction; - c_legitbot m_legitbot; - c_autowall m_autowall; - c_ragebot m_ragebot; - c_identity m_identity; - c_chams m_chams; - c_lagmgr m_lagmgr; - c_extra m_extra; - c_skins m_skins; - c_visuals m_visuals; - c_move_recorder m_move_rec; - c_player_manager m_player_mgr; -}; - -END_REGION - -extern features::c_base_cheat g_cheat; \ No newline at end of file diff --git a/internal_rewrite/begin_lock.cpp b/internal_rewrite/begin_lock.cpp deleted file mode 100644 index 5312eec..0000000 --- a/internal_rewrite/begin_lock.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include - -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::begin_lock( void* ecx, void* edx ) { // THIS IS PROLLY NOT ENDLOCK, BUT WHATEVER - // signature: - // search "CL_CallPostDataUpdates: missing ent %d" in engine.dll. - // where framestagenotify gets called - - static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_engine.dll( ), "A1 ? ? ? ? B9 ? ? ? ? 6A 00 FF 50 18 8B 15 ? ? ? ?" ); - - if( _ReturnAddress( ) == (void*)ret_addr ) { - g_ctx.m_stage = FRAME_NET_UPDATE_POSTDATAUPDATE_START; - g_cheat.m_visuals.world_modulate( ); - - static float last_time = 0.f; - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) ) { - auto state = g_ctx.m_local->get_animstate( ); - - auto& anims = g_ctx.m_local->get_animdata( ).m_animlayers; - - if( state && state->m_flLastClientSideAnimationUpdateTime != last_time ) { - for( size_t i{ }; i < 13; ++i ) { - auto& layer = g_ctx.m_local->m_AnimOverlay( ).GetElements( )[ i ]; - - if( layer.m_flWeight != anims.at( i ).m_flWeight || layer.m_flCycle != anims.at( i ).m_flCycle ) { - memcpy( &g_ctx.m_local->get_animdata( ).m_animlayers, - g_ctx.m_local->m_AnimOverlay( ).GetElements( ), - sizeof( C_AnimationLayer ) * 13 ); - - g_ctx.m_absyaw = state->m_flGoalFeetYaw; - - last_time = state->m_flLastClientSideAnimationUpdateTime; - break; - } - } - } - } - - - - /*if( g_settings.rage.anti_aim && g_ctx.run_frame( ) ) { - static float last_time = 0.f; - - if( last_time != g_ctx.m_local->get_animstate( )->m_flLastClientSideAnimationUpdateTime ) { - - } - }*/ - - - //g_con->game_console_print( "net postdataupdate start\n" ); - - // FRAME_NET_UPDATE_POSTDATAUPDATE_START - g_cheat.m_extra.float_ragdolls( ); - - g_cheat.m_player_mgr.frame_stage_notify( ); - g_cheat.m_prediction.frame_stage_notify( ); - g_cheat.m_ragebot.m_resolver->frame_stage_notify( ); - g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); - g_cheat.m_skins( ); - } - - begin_lock_o( ecx, edx ); -} \ No newline at end of file diff --git a/internal_rewrite/bf_write.hpp b/internal_rewrite/bf_write.hpp deleted file mode 100644 index 7d759b2..0000000 --- a/internal_rewrite/bf_write.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -class bf_write { -public: - bf_write( void* data, int bytes, int max_bits = -1 ) { - m_data = ( unsigned char* )data; - m_bytes = bytes; - if( max_bits == -1 ) - m_bits = bytes * 8; - else - m_bits = max_bits; - } - - bf_write( const char* debug_name, void* data, int bytes, int max_bits = -1 ) { - m_debug_name = debug_name; - m_data = ( unsigned char* )data; - m_bytes = bytes; - if( max_bits == -1 ) - m_bits = bytes * 8; - else - m_bits = max_bits; - } - -public: - unsigned char* m_data{ }; - int m_bytes{ }; - int m_bits{ }; - int m_cur_bit{ }; - -private: - bool m_overflow{ }; - bool m_assert_on_overflow{ }; - const char* m_debug_name{ }; -}; \ No newline at end of file diff --git a/internal_rewrite/c_base_player.cpp b/internal_rewrite/c_base_player.cpp deleted file mode 100644 index 11882ea..0000000 --- a/internal_rewrite/c_base_player.cpp +++ /dev/null @@ -1,1144 +0,0 @@ -#include "c_base_player.hpp" -#include "interface.hpp" -#include "math.hpp" -#include "mem.hpp" -#include "context.hpp" -#include "base_cheat.hpp" - -#undef max - -ent_animdata_t c_base_player::sm_animdata[ 65 ]; - -void IKContext::Init( void* hdr, vec3_t& angles, vec3_t& origin, float curtime, int framecount, int bone_mask ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 EC 08 8B 45 08 56 57 8B F9 8D 8F" ) ); - - auto fn = ( void( __thiscall* )( void*, void*, vec3_t&, vec3_t&, float, int, int ) )( fn_ptr ); - fn( this, hdr, angles, origin, curtime, framecount, bone_mask ); -} - -void IKContext::UpdateTargets( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F0 81 EC 00 00 00 00 33 D2" ) ); - - auto fn = ( void( __thiscall* )( void*, vec3_t*, void*, matrix3x4*, char* ) )( fn_ptr ); - fn( this, pos, q, bone_array, computed ); -} - -void IKContext::SolveDependencies( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F0 81 EC 00 00 00 00 8B 81" ) ); - - auto fn = ( void( __thiscall* )( void*, vec3_t*, void*, matrix3x4*, char* ) )( fn_ptr ); - fn( this, pos, q, bone_array, computed ); -} - -bool& c_base_player::s_bInvalidateBoneCache( ) { -#ifdef HEADER_MODULE - static auto fn_ptr = g_header.patterns.animstate_update; -#else - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24" ) ); -#endif - static auto var = *( bool** )( fn_ptr + 0xda + 2 ); - - return *var; -} - -void CCSGOPlayerAnimState::update( float yaw, float pitch ) { -#ifdef HEADER_MODULE - static auto fn_ptr = g_header.patterns.animstate_update; -#else - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24" ) ); -#endif - - uintptr_t alloc = ( uintptr_t )this; - if( !alloc ) - return; - - if( !this->pBaseEntity ) - return; - - //bool* b = &c_base_player::s_bInvalidateBoneCache( ); - //char backup = *b; - - //vectorcall is GAY - if( fn_ptr ) { - __asm { - push 0 - mov ecx, alloc - - movss xmm1, dword ptr[ yaw ] - movss xmm2, dword ptr[ pitch ] - - call fn_ptr - } - } - - //c_base_player::s_bInvalidateBoneCache( ) = backup; -} - -void CCSGOPlayerAnimState::setup_velocity( float a2 ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 30 56 57 8B 3D" ) ); - if( fn_ptr ) { - auto ptr_ = ( uintptr_t )this; - - __asm { - mov ecx, ptr_ - - fld a2 - call fn_ptr - } - } -} - -bool CCSGOPlayerAnimState::cache_sequences( ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 34 53 56 8B F1 57 8B 46 60" ) ); - if( fn_ptr ) { - auto fn = ( bool( __thiscall* )( void* ) )( fn_ptr ); - return fn( this ); - } - - return false; -} - -void CCSGOPlayerAnimState::update_ex( float yaw, float pitch ) { -/* static auto unk_func_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "8B 0D ? ? ? ? 8B 01 8B 80 ? ? ? ? FF D0 84 C0 75 14 8B 0D ? ? ? ? 8B 01" ) ); - auto unk_fn = ( bool( *)( ) )( unk_func_ptr ); - - auto player = ( c_base_player* )this->pBaseEntity; - - if( player && cache_sequences( ) ) { - float v7 = *( float* )( uintptr_t( player ) + 0x2e0d ) + pitch; - v7 = std::remainderf( v7, 360.f ); - - float last_update = m_flLastClientSideAnimationUpdateTime; - float cur_time = g_csgo.m_globals->m_curtime; - - if( last_update != cur_time ) { - this->m_flLastUpdateDelta = math::max( cur_time - last_update, 0.f ); - this->m_flEyeYaw = yaw; - this->m_flPitch = pitch; - - this->m_vOrigin = player->m_vecOrigin( ); - this->pActiveWeapon = player->get_weapon( ); - if( pActiveWeapon != pLastActiveWeapon ) { - for( size_t i{ }; i < 13; ++i ) { - C_AnimationLayer* layer = &player->m_AnimOverlay( ).GetElements( )[ i ]; - - layer->m_unk1 = 0; - layer->m_unk2 = layer->m_unk3 = -1; - } - } - - bool using_duck_offset = !unk_fn( ); - - if( using_duck_offset ) { - float total_duck = *( float* )( uintptr_t( player ) + 0xbe7 ) + m_fLandingDuckAdditiveSomething; - - total_duck = std::clamp( total_duck, 0.f, 1.f ); - - float duck_amt = m_fDuckAmount; - - float v28 = this->m_flLastUpdateDelta * 6.0f; - float v29 = 0.f; - - if( total_duck - duck_amt > v28 ) { - if( v28 <= total_duck - duck_amt ) - v29 = total_duck; - else - v29 = duck_amt - v28; - } - else { - v29 = duck_amt + v28; - } - - m_fDuckAmount = std::clamp( v29, 0.f, 1.f ); - } - else { - float duck_amt = m_fDuckAmount; - - float v19 = player->m_fFlags( ) & FL_WATERJUMP ? 1.0 : m_fLandingDuckAdditiveSomething; - float v21 = 0.f; - if( v19 <= duck_amt ) - v21 = 6.0f; - else - v21 = 3.1f; - - float v22 = m_flLastUpdateDelta * v21; - float new_duck = 0.f; - if( v19 - duck_amt <= v22 ) { - if( v22 <= v19 - duck_amt ) - new_duck = v19; - else - new_duck = duck_amt - v22; - } - else { - new_duck = duck_amt = v22; - } - - m_fDuckAmount = std::clamp( new_duck, 0.f, 1.f ); - } - - *( uintptr_t* )( uintptr_t( player ) + 0x286 ) = 0; - player->invalidate_physics_recursive( 8 ); - setup_velocity( v7 ); - setup_aim_matrix( ); - setup_weapon_action( ); - setup_movement( ); - setup_alive_loop( ); - - } - }*/ -} - -void CCSGOPlayerAnimState::reset( ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "56 6A 01 68 ? ? ? ? 8B F1" ) ); - if( fn_ptr ) { - auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); - fn( this ); - } -} - -void CCSGOPlayerAnimState::setup_aim_matrix( ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 81 EC ? ? ? ? 53 56 57 8B 3D" ) ); - if( fn_ptr ) { - auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); - fn( this ); - } -} - -void c_base_player::invalidate_physics_recursive( int flags ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 0C 53 8B 5D 08 8B C3" ) ); - if( fn_ptr ) { - auto fn = ( void( __thiscall* )( void*, int ) )( fn_ptr ); - fn( this, flags ); - } -} - -uintptr_t c_base_player::get_player_resource( ) { - for( int i{ 1 }; i < g_csgo.m_entlist( )->GetHighestEntityIndex( ); ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< IClientEntity >( i ); - if( !ent ) continue; - auto class_ = ent->GetClientClass( ); - if( class_ ) { - if( class_->m_class_id == CCSPlayerResource ) { - return uintptr_t( ent ); - } - } - } - - return 0; -} - -uintptr_t c_base_player::get_game_rules( ) { - static uintptr_t** game_rules = pattern::first_code_match< uintptr_t** >( g_csgo.m_chl.dll( ), xors( "A1 ? ? ? ? 85 C0 0F 84 ? ? ? ? 80 B8 ? ? ? ? ? 0F 84 ? ? ? ? 0F 10 05" ), 0x1 ); - if( !game_rules ) { - game_rules = pattern::first_code_match< uintptr_t** >( g_csgo.m_chl.dll( ), xors( "A1 ? ? ? ? 85 C0 0F 84 ? ? ? ? 80 B8 ? ? ? ? ? 0F 84 ? ? ? ? 0F 10 05" ), 0x1 ); - } - - return **game_rules; -} - -int& c_base_player::g_iModelBoneCounter( ) { - static auto offset = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "A1 ? ? ? ? 48 C7 81" ), 0x1 ); - return **( int** )( offset ); -} - -//use is_zero( ) on the vector to figure out if it returns a valid value -vec3_t c_base_player::get_hitbox_pos( int hitbox ) { - auto ce = this->ce( ); - - const auto model = ce->GetModel( ); - if( !model ) return vec3_t{ }; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - if( !hdr ) return vec3_t{ }; - - matrix3x4 bone_matrix[ 128 ]; - memcpy( bone_matrix, - m_CachedBoneData( ).GetElements( ), - m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); - - auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); - if( !set ) return vec3_t{ }; - - auto box = set->pHitbox( hitbox ); - if( !box ) return vec3_t{ }; - - vec3_t center = ( box->bbmin + box->bbmax ) * 0.5f; - - return math::vector_transform( center, bone_matrix[ box->bone ] ); -} - -c_base_weapon* c_base_player::get_weapon( ) { - auto weap_handle = m_hActiveWeapon( ); - if( weap_handle ) - return g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weap_handle ); - - return nullptr; -} - -void c_base_player::set_needs_interpolate( bool interpolate ) { - auto varmap = get< VarMapping_t >( 0x24 ); - auto elements = varmap.m_Entries.GetElements( ); - - for( size_t i{ }; i < varmap.m_nInterpolatedEntries; ++i ) { - auto& e = elements[ i ]; - e.m_bNeedsToInterpolate = interpolate; - } -} - -bool c_base_player::is_visible( int hitbox ) { - vec3_t start = g_ctx.m_local->get_eye_pos( ); - vec3_t end = get_hitbox_pos( hitbox ); - - if( !end ) return false; - return util::trace_ray( start, end, g_ctx.m_local->ce( ), this->ce( ) ); -} - -float c_base_player::get_hitbox_radius( int hitbox ) { - auto model = ce( )->GetModel( ); - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); - - if( !model || !hdr || !set ) - return 0.f; - - auto box = set->pHitbox( hitbox ); - - if( box ) { - if( box->m_flRadius == -1 ) return box->bbmin.dist_to( box->bbmax ); - return box->m_flRadius; - } - - return 0.f; -} - -vec3_t c_base_player::get_hitbox_mins( int hitbox ) { - auto model = ce( )->GetModel( ); - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); - - if( !model || !hdr || !set ) - return vec3_t( ); - - matrix3x4 bone_matrix[ 128 ]; - memcpy( bone_matrix, - m_CachedBoneData( ).GetElements( ), - m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); - - auto box = set->pHitbox( hitbox ); - - return math::vector_transform( box->bbmin, bone_matrix[ box->bone ] ); -} - -vec3_t c_base_player::get_hitbox_maxs( int hitbox ) { - auto model = ce( )->GetModel( ); - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); - - if( !model || !hdr || !set ) - return vec3_t( ); - - matrix3x4 bone_matrix[ 128 ]; - memcpy( bone_matrix, - m_CachedBoneData( ).GetElements( ), - m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); - - auto box = set->pHitbox( hitbox ); - - vec3_t max = math::vector_transform( box->bbmax, bone_matrix[ box->bone ] ); - return max; -} - -bool c_base_player::is_fakewalking( ) { - auto walk_layer = m_AnimOverlay( ).GetElements( )[ 6 ]; - auto some_layer = m_AnimOverlay( ).GetElements( )[ 4 ]; - - auto velocity = m_vecVelocity( ).length2d( ); - bool on_ground = m_fFlags( ) & FL_ONGROUND; - if( walk_layer.m_flWeight < 0.1f - && some_layer.m_flWeight < 0.1f - && velocity > 0.1f && on_ground ) { - return true; - } - - if( velocity <= 0.1f ) - return true; - - return false; -} - -int c_base_player::get_choked_ticks( ) { - auto simtime = m_flSimulationTime( ); - - return TIME_TO_TICKS( g_csgo.m_globals->m_curtime - simtime ) + 1; -} - -int c_base_player::get_ping( ) { - auto resource = get_player_resource( ); - static auto offset = g_netvars.get_netvar( fnv( "DT_CSPlayerResource" ), fnv( "m_iPing" ) ); - int ping = *( int* )( resource + offset + ce( )->GetIndex( ) * 4 ); - - return ping; -} - -bool c_base_player::is_breaking_lc( ) { - return g_cheat.m_prediction.is_breaking_lc( this->ce( )->GetIndex( ) ); -} - -bool c_base_player::can_attack( bool ignore_rapid ) { - if( g_ctx.m_has_fired_this_frame ) return false; - if( !is_alive( ) ) return false; - - auto weapon = get_weapon( ); - if( !weapon ) return false; - - if( weapon->is_sniper( ) && g_cheat.m_lagmgr.has_fired( ) ) - return false; - - float time = g_ctx.pred_time( ); - - float next_attack = m_flNextAttack( ); - if( next_attack > time ) return false; - - float next_primary_attack = weapon->m_flNextPrimaryAttack( ); - if( next_primary_attack > time ) { - if( weapon->is_knife( ) ) { - if( weapon->m_flNextSecondaryAttack( ) > time ) - return false; - } - else { - return false; - } - } - - if( weapon->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER ) { - return g_ctx.m_revolver_shot; - } - - return true; -} - -int c_base_player::get_seq_activity( int sequence ) { - static uintptr_t fn_offset = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 7D 08 FF 56 8B F1 74 3D" ) ); - auto fn = ( int( __thiscall* )( void*, int ) )( fn_offset ); - - return fn ? fn( this, sequence ) : -2; -} - -void c_base_player::set_abs_angles( vec3_t angles ) { -#ifdef HEADER_MODULE - static uintptr_t fn_addr = g_header.patterns.set_abs_angles; -#else - static uintptr_t fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 64 53 56 57 8B F1 E8" ) ); -#endif - - auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); - - return fn( this, angles ); -} - -void c_base_player::set_abs_origin( vec3_t origin ) { -#ifdef HEADER_MODULE - static uintptr_t fn_addr = g_header.patterns.set_abs_origin; -#else - static uintptr_t fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 51 53 56 57 8B F1" ) ); -#endif - - auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); - - return fn( this, origin ); -} - -void c_base_player::create_animstate( CCSGOPlayerAnimState* state ) { - static auto fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 56 8B F1 B9 ? ? ? ? C7 46" ) ); - auto fn = ( void( __thiscall* )( CCSGOPlayerAnimState*, decltype( this ) ) )( fn_addr ); - - fn( state, this ); - state->pBaseEntity = this; -} - -void c_base_player::set_abs_velocity( vec3_t velocity ) { - static auto fn_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 0C 53 56 57 8B 7D 08 8B F1" ) ); - auto fn = ( void( __thiscall* )( void*, vec3_t& ) )( fn_addr ); - - fn( this, velocity ); -} - -void c_base_player::invalidate_bone_cache( ) { - m_flLastBoneSetupTime( ) = -FLT_MAX; - m_iMostRecentModelBoneCounter( ) = 0; -} - -void c_base_player::handle_taser_animation( ) { - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 EC 08 56 8B F1 80 BE ? ? ? ? ? 0F 84 ? ? ? ? 80 BE ? ? ? ? ? 0F 84 ? ? ? ? A1" ) ); - if( fn_ptr ) { - vec3_t eye_angles = m_angEyeAngles( ); - - __asm { - mov ecx, this - fld eye_angles.y - fld eye_angles.x - - call fn_ptr - } - } -} - -void c_base_player::calculate_duckamount( bool reset ) { - static float last_duckamt[ 65 ]{ }; - static float original_duckamt[ 65 ]{ }; - int idx = ce( )->GetIndex( ); - - if( reset ) { - original_duckamt[ idx ] = m_flDuckAmount( ); - last_duckamt[ idx ] = m_flDuckAmount( ); - return; - } - - float cur_duck = m_flDuckAmount( ); - float delta = m_flOldSimulationTime( ) - m_flSimulationTime( ) + TICK_INTERVAL( ); - - float old_duck = last_duckamt[ idx ]; - float rate = ( cur_duck - old_duck ) * delta; - - m_flDuckAmount( ) = old_duck + rate; - - if( cur_duck != original_duckamt[ idx ] ) - last_duckamt[ idx ] = cur_duck; - original_duckamt[ idx ] = cur_duck; -} - -void c_base_player::cache_anim_data( bool layers ) { - int idx = ce( )->GetIndex( ); - auto& animdata = sm_animdata[ idx ]; - - memcpy( &animdata.m_poseparams, - m_flPoseParameter( ), - sizeof( float ) * 24 ); - - if( layers ) { - memcpy( &animdata.m_animlayers, - m_AnimOverlay( ).GetElements( ), - sizeof( C_AnimationLayer ) * 13 ); - } - - memcpy( animdata.m_bones, - m_CachedBoneData( ).GetElements( ), - sizeof( matrix3x4 ) * m_CachedBoneData( ).GetSize( ) ); -} - -void c_base_player::restore_anim_data( bool layers ) { - int idx = ce( )->GetIndex( ); - auto& animdata = sm_animdata[ idx ]; - - memcpy( m_flPoseParameter( ), - &animdata.m_poseparams, - sizeof( float ) * 24 ); - - if( layers ) { - memcpy( m_AnimOverlay( ).GetElements( ), - &animdata.m_animlayers, - sizeof( C_AnimationLayer ) * 13 ); - } - - memcpy( animdata.m_bones, - m_CachedBoneData( ).GetElements( ), - sizeof( matrix3x4 ) * m_CachedBoneData( ).GetSize( ) ); -} - -void c_base_player::do_ent_interpolation( bool reset ) { - auto idx = ce( )->GetIndex( ); - auto* anim_data = &sm_animdata[ idx ]; - - vec3_t origin = m_vecOrigin( ); - - if( reset ) { - anim_data->m_last_interp_origin = anim_data->m_interp_origin = origin; - anim_data->m_simtime = anim_data->m_last_simtime = g_csgo.m_globals->m_curtime; - return; - } - - if( !anim_data->m_valid ) - return; - - if( origin.dist_to_sqr( anim_data->m_interp_origin ) > FLT_EPSILON ) { - anim_data->m_last_interp_origin = anim_data->m_interp_origin; - anim_data->m_interp_origin = origin; - anim_data->m_last_simtime = anim_data->m_simtime; - anim_data->m_simtime = g_csgo.m_globals->m_curtime; - } - - float lerp = util::get_lerptime( ); - if( !lerp ) - return; - - if( anim_data->m_last_interp_origin.dist_to( anim_data->m_interp_origin ) > 64.f ) - return; - - for( size_t i{ }; i < 3; ++i ) { - if( !std::isfinite( anim_data->m_last_interp_origin[ i ] ) || !std::isfinite( anim_data->m_interp_origin[ i ] ) ) { - char error_msg[ 128 ]; - sprintf_s< 128 >( error_msg, "player origin was NaN\nreport this bug\ndetails:\n %f %f", - g_csgo.m_globals->m_curtime, - anim_data->m_simtime ); - - MessageBoxA( nullptr, error_msg, "error", MB_OK ); - exit( 0 ); - } - } - - float update_delta = anim_data->m_simtime - anim_data->m_last_simtime; - float update_lerp = std::clamp( update_delta - lerp, 0.f, 1.f ); - - if( update_delta < TICK_INTERVAL( ) ) - return; - - lerp = std::clamp( lerp, 0.f, update_delta ); - - float lerp_progress = ( anim_data->m_simtime + lerp - g_csgo.m_globals->m_curtime ) / lerp; - - vec3_t vec_lerp = math::lerp( origin, anim_data->m_last_interp_origin, std::clamp( lerp_progress, 0.f, 1.f ) ); - - for( size_t i{ }; i < 3; ++i ) - if( !isfinite( vec_lerp[ i ] ) ) - return; - - byte backup = *( byte* )( uintptr_t( this ) + 0x270 ); - *( byte* )( uintptr_t( this ) + 0x270 ) = 0; - - restore_anim_data( true ); - - //aaaaAAAAAAAA - //calc_abs_velocity( ); - set_abs_origin( vec_lerp ); - invalidate_bone_cache( ); - - ce( )->SetupBones( anim_data->m_bones, 128, BONE_USED_BY_ANYTHING, g_csgo.m_globals->m_curtime ); - this->m_iMostRecentModelBoneCounter( )++; - - *( byte* )( uintptr_t( this ) + 0x270 ) = backup; -} - -void c_base_player::validate_animation_layers( ) { - for( size_t i{ }; i < m_AnimOverlay( ).GetSize( ); ++i ) { - auto& layer = m_AnimOverlay( ).GetElements( )[ i ]; - layer.m_flCycle = std::clamp( layer.m_flCycle, 0.f, 1.f ); - layer.m_flWeight = std::clamp( layer.m_flWeight, 0.f, 1.f ); - - layer.m_player = this; - } - - for( size_t i{ }; i < 24; ++i ) { - auto& param = m_flPoseParameter( )[ i ]; - if( !isfinite( param ) ) - param = 0.f; - } -} - -void c_base_player::compute_move_cycle( bool reset, bool moving ) { - if( !moving || reset ) - return; - - float eye_yaw = m_angEyeAngles( ).y; - - float blend_ang = math::approach_angle( eye_yaw, - get_animstate( )->m_flCurrentFeetYaw, - get_animstate( )->m_flFeetYawRate * 100.f ); - - //get_animstate( )->m_flCurrentFeetYaw = blend_ang + 360.f; - m_flPoseParameter( )[ LEAN_YAW ] = ( blend_ang + 180.f ) / 360.f; - m_flPoseParameter( )[ BODY_YAW ] = ( blend_ang + 180.f ) / 360.f; -} - -void c_base_player::calc_anim_velocity( bool reset ) { - int idx = ce( )->GetIndex( ); - - auto accelerate = [ & ]( vec3_t velocity, vec3_t direction, float speed, float accel ) { - float addspeed, accelspeed, currentspeed; - - velocity.z = 0.f; - currentspeed = velocity.dot( direction ); - - addspeed = speed - currentspeed; - - if( addspeed <= 0.f ) { - return velocity; - } - - //guess how many fucks i give, this works - accelspeed = std::min( accel * 10.f * TICK_INTERVAL( ) * std::max( speed, 250.f ), currentspeed ); - - for( size_t i{ }; i < 3; ++i ) { - velocity[ i ] += accelspeed * direction[ i ]; - } - - return velocity; - }; - - auto friction = [ & ]( vec3_t velocity ) { - static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); - static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); - - float speed = velocity.length2d( ); - if( speed < 0.1f ) - return vec3_t{ }; - - float friction = sv_friction->get_float( ); - float control = ( speed < sv_stopspeed->get_float( ) ) ? sv_stopspeed->get_float( ) : speed; - float drop = control * friction * TICK_INTERVAL( ); - - float newspeed = speed - drop; - if( newspeed < 0.f ) - newspeed = 0.f; - - if( newspeed != speed ) { - newspeed /= speed; - velocity *= newspeed; - } - - return velocity; - }; - - if( reset ) { - vec3_t velocity = m_vecVelocity( ); - sm_animdata[ idx ].m_last_origin = m_vecOrigin( ); - sm_animdata[ idx ].m_last_velocity = velocity; - sm_animdata[ idx ].m_anim_velocity = velocity; - } - else { - static auto sv_accelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_accelerate" ) ); - - float delta = m_flSimulationTime( ) - m_flOldSimulationTime( ); - delta = std::max( delta, TICK_INTERVAL( ) ); - - bool on_ground = m_fFlags( ) & FL_ONGROUND; - - vec3_t origin = m_vecOrigin( ); - vec3_t origin_delta = origin - sm_animdata[ idx ].m_last_origin; - - vec3_t velocity = origin_delta / delta; - vec3_t last_velocity = sm_animdata[ idx ].m_last_velocity; - - vec3_t anim_vel; - - if( on_ground ) { - vec3_t ang = math::vector_angles( vec3_t( ), velocity ); - - float move_yaw = math::vector_angles( velocity ).y; - float move_delta = math::vector_angles( last_velocity ).y; - move_delta -= move_yaw; - move_delta = std::remainderf( move_delta, 360.f ); - - vec3_t move_dir = math::angle_vectors( vec3_t( 0.f, move_delta, 0.f ) ) * 450.f; - - vec3_t forward, right, up; - math::angle_vectors( ang, &forward, &right, &up ); - - vec3_t wishdir; - for( size_t i{ }; i < 2; ++i ) - wishdir[ i ] = forward[ i ] * move_dir.x + right[ i ] * move_dir.y; - - anim_vel = friction( last_velocity ); - if( anim_vel.length2d( ) < 1.f ) - anim_vel = vec3_t( ); - - int ticks = TIME_TO_TICKS( delta * 0.5f ); - vec3_t est_tick_vel = math::lerp( last_velocity, velocity, .5f ); - for( int i{ }; i < ticks + 1; i++ ) { - if( est_tick_vel.length2d( ) < 5.f ) - break; - - est_tick_vel = friction( est_tick_vel ); - } - - if( velocity.length2d( ) > last_velocity.length2d( ) ) - anim_vel = accelerate( anim_vel, wishdir, 250.f, sv_accelerate->get_float( ) ); - - //assume fakewalk - if( anim_vel.length2d( ) >= sm_animdata[ idx ].m_anim_velocity.length2d( ) && est_tick_vel.length2d( ) < 5.f && delta > TICK_INTERVAL( ) ) - anim_vel = vec3_t( ); - } - else { - anim_vel = math::lerp( - last_velocity, - velocity, - TICK_INTERVAL( ) / delta - ); - } - - sm_animdata[ idx ].m_anim_velocity = anim_vel; - sm_animdata[ idx ].m_last_velocity = velocity; - sm_animdata[ idx ].m_last_origin = origin; - } -} - -void c_base_player::calc_abs_velocity( ) { -#ifdef HEADER_MODULE - static auto fn_ptr = g_header.patterns.calc_abs_velocity; -#else - static auto fn_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 1C 53 56 57 8B F9 F7 87" ), 0 ); -#endif - - if( fn_ptr ) { - auto fn = ( void( __thiscall* )( void* ) )( fn_ptr ); - fn( this ); - } -} - -void c_base_player::fix_jump_fall( bool reset ) { - if( reset ) - return; - - int prev_flags = get_animdata( ).m_prev_flags; - int flags = m_fFlags( ); - - if( ( prev_flags & FL_ONGROUND ) && ( flags & FL_ONGROUND ) ) { - flags |= FL_ONGROUND; - } - else { - auto layer_weight = m_AnimOverlay( ).GetElements( )[ 4 ].m_flWeight; - auto last_weight = get_animdata( ).m_last_layers.at( 4 ).m_flWeight; - - if( layer_weight != 1.f && last_weight == 1.f && - m_AnimOverlay( ).GetElements( )[ 5 ].m_flWeight != 0.f ) - flags |= FL_ONGROUND; - - if( ( flags & FL_ONGROUND ) && !( prev_flags & FL_ONGROUND ) ) - flags &= ~FL_ONGROUND; - } - - m_fFlags( ) = flags; -} - -void c_base_player::fix_animations( bool reset, bool resolver_change ) { - //todo: legs dont match up when fakelagging <- not anymore - int idx = ce( )->GetIndex( ); - sm_animdata[ idx ].m_valid = false; - - if( !get_animstate( ) ) - return; - - m_angEyeAngles( ).y = std::remainder( m_angEyeAngles( ).y, 360.f ); - - int flags = m_fFlags( ); - auto eye_angles = m_angEyeAngles( ); - auto original_duck = m_flDuckAmount( ); - - //enable animations - time to update - m_bClientSideAnimation( ) = true; - set_needs_interpolate( false ); - - //we need the player data at THIS EXACT moment, somehow - float anim_time = m_flOldSimulationTime( ) + TICK_INTERVAL( ); - - auto backup_curtime = g_csgo.m_globals->m_curtime; - auto backup_frametime = g_csgo.m_globals->m_frametime; - - g_csgo.m_globals->m_curtime = anim_time; - g_csgo.m_globals->m_frametime = TICK_INTERVAL( ); - - if( resolver_change && m_fFlags( ) & FL_ONGROUND && !reset ) { - float lby_delta = m_flLowerBodyYawTarget( ) - eye_angles.y; - lby_delta = std::remainderf( lby_delta, 360.f ); - lby_delta = std::clamp( lby_delta, -60.f, 60.f ); - - float feet_yaw = std::remainderf( eye_angles.y + lby_delta, 360.f ); - if( feet_yaw < 0.f ) - feet_yaw += 360.f; - - get_animstate( )->m_flGoalFeetYaw = get_animstate( )->m_flCurrentFeetYaw = feet_yaw; - } - - get_animstate( )->m_flFeetYawRate = 0.f; - - //why? - //because this calls pAttachmentHelper->CalcAbsVelocity - //aswell as removes EFL_DIRTY_ABSVELOCITY - //which fixes attachments etc - //normally this would be called by animstate->update - //but we prevent that - calc_abs_velocity( ); - - //calc_anim_velocity( reset ); - - set_abs_origin( m_vecOrigin( ) ); - //networked duck amount comes from the last simulation tick instead of the current one - calculate_duckamount( reset ); - fix_jump_fall( reset ); - validate_animation_layers( ); - - float old_cycle = m_AnimOverlay( ).GetElements( )[ 6 ].m_flCycle; - get_animstate( )->m_iLastClientSideAnimationUpdateFramecount -= 1; - - vec3_t velocity = m_vecVelocity( ); - int backup_eflags = get< int >( 0xe4 ); - int backup_byte = get< byte >( 0x35f8 ); - - if( !reset ) { - m_vecVelocity( ) = sm_animdata[ idx ].m_anim_velocity; - get< vec3_t >( 0x94 ) = sm_animdata[ idx ].m_anim_velocity; - get< byte >( 0x35f8 ) = 1; - get< int >( 0xe4 ) &= ~0x1000; - - get_animstate( )->m_flUnknownFraction = sm_animdata[ idx ].m_fraction; - } - - sm_animdata[ idx ].m_last_duck = m_flDuckAmount( ); - - float prev_cycle = m_AnimOverlay( ).GetElements( )[ 6 ].m_flPrevCycle; - float prev_rate = m_AnimOverlay( ).GetElements( )[ 6 ].m_flPlaybackRate; - - if( !reset ) { - auto fraction = get_animstate( )->m_flStopToFullRunningFraction; - bool stopping = sm_animdata[ idx ].m_is_stopping; - - if( fraction > 0.1f && fraction < 1.f ) { - float delta_2x = get_animstate( )->m_flLastUpdateDelta * 2.f; - - if( stopping ) - fraction -= delta_2x; - else - fraction += delta_2x; - - fraction = std::clamp( fraction, 0.f, 1.f ); - } - - auto speed = get_anim_velocity( ).length2d( ); - - if( speed > 135.2f && stopping ) { - sm_animdata[ idx ].m_is_stopping = false; - fraction = std::max( fraction, 0.0099999998f ); - } - if( speed < 135.2f && !stopping ) { - sm_animdata[ idx ].m_is_stopping = true; - fraction = std::min( fraction, 0.99000001f ); - } - - get_animstate( )->m_flStopToFullRunningFraction = fraction; - } - - sm_animdata[ idx ].m_last_animtime = get_animstate( )->m_flLastClientSideAnimationUpdateTime; - get_animstate( )->update( eye_angles.y, eye_angles.x ); - m_AnimOverlay( ).GetElements( )[ 6 ].m_flPrevCycle = m_AnimOverlay( ).GetElements( )[ 6 ].m_flCycle; - - float lerp_rate = math::lerp( - prev_rate, - m_AnimOverlay( ).GetElements( )[ 6 ].m_flPlaybackRate, - TICK_INTERVAL( ) / ( m_flSimulationTime( ) - m_flOldSimulationTime( ) ) ); - - if( !reset ) { - m_AnimOverlay( ).GetElements( )[ 6 ].m_flCycle = prev_cycle + lerp_rate; - } - - get_animdata( ).m_prev_flags = flags; - memcpy( - get_animdata( ).m_last_layers.data( ), - m_AnimOverlay( ).GetElements( ), - sizeof( C_AnimationLayer ) * 13 - ); - - sm_animdata[ idx ].m_fraction = get_animstate( )->m_flUnknownFraction; - - m_vecVelocity( ) = velocity; - get< vec3_t >( 0x94 ) = velocity; - get< int >( 0xe4 ) = backup_eflags; - get< byte >( 0x35f8 ) = backup_byte; - - m_AnimOverlay( ).GetElements( )[ 6 ].m_flPrevCycle = old_cycle; - - //check for any possible mistakes - validate_animation_layers( ); - - sm_animdata[ idx ].m_adjust_rate = m_AnimOverlay( ).GetElements( )[ 3 ].m_flPlaybackRate; - sm_animdata[ idx ].m_adjust_cycle = m_AnimOverlay( ).GetElements( )[ 3 ].m_flCycle; - - if( m_flSimulationTime( ) - m_flOldSimulationTime( ) > TICK_INTERVAL( ) ) { - auto activity = get_seq_activity( m_AnimOverlay( ).GetElements( )[ 3 ].m_nSequence ); - - if( activity == 979 ) { - m_AnimOverlay( ).GetElements( )[ 3 ].m_flWeight = 0.f; - m_AnimOverlay( ).GetElements( )[ 3 ].m_flCycle = 0.f; - } - } - - bool moving = sm_animdata[ idx ].m_anim_velocity.length( ) > 0.1f; - //compute_move_cycle( reset, moving ); - - get_animdata( ).m_anim_flags = m_fFlags( ); - - if( !moving ) - m_AnimOverlay( ).GetElements( )[ 6 ].m_flWeight = 0.f; - - ce( )->GetRenderAngles( ).y = std::remainderf( ce( )->GetRenderAngles( ).y, 360.f ); - - m_flDuckAmount( ) = original_duck; - m_fFlags( ) = flags; - m_angEyeAngles( ) = eye_angles; - m_flDuckAmount( ) = original_duck; - - get_animstate( )->m_flUnknownFraction = 0.f; - - //clear occlusion for setupbones (pvs fix) - *( int* )( uintptr_t( this ) + 0xa30 ) = 0; - - byte backup = get< byte >( 0x270 ); - get< byte >( 0x270 ) = 0; - - invalidate_bone_cache( ); - ce( )->SetupBones( nullptr, -1, BONE_USED_BY_ANYTHING, anim_time ); - cache_anim_data( ); - - g_csgo.m_globals->m_curtime = backup_curtime; - g_csgo.m_globals->m_frametime = backup_frametime; - - if( !reset ) { - sm_animdata[ idx ].m_valid = true; - } - - //disable animations again - m_bClientSideAnimation( ) = false; - get< byte >( 0x270 ) = backup; -} - -player_info_t c_base_player::get_info( ) { - player_info_t info; - g_csgo.m_engine( )->GetPlayerInfo( ce( )->GetIndex( ), &info ); - - return info; -} - -bool c_base_player::is_flashed( ) { - return m_flFlashTime( ) - g_csgo.m_globals->m_curtime > m_flFlashDuration( ) * 0.5f; -} - -bool c_base_player::is_reloading( ) { - auto gun_layer = m_AnimOverlay( ).GetElements( )[ 1 ]; - float playback_rate = gun_layer.m_flPlaybackRate; - if( playback_rate < 0.55f ) { - return gun_layer.m_flCycle < 0.99f; - } - - return false; -} - -void c_base_player::get_name_safe( char* buf ) { - player_info_t info; - if( g_csgo.m_engine( )->GetPlayerInfo( this->ce( )->GetIndex( ), &info ) ) { - for( size_t i{ }; i < 32; ++i ) { - switch( info.name[ i ] ) { - case '"': - case '\\': - case ';': - case '\n': - buf[ i ] = ' '; - break; - default: - buf[ i ] = info.name[ i ]; - break; - } - } - - buf[ 31 ] = 0; - } -} - -void c_base_player::set_local_view_angles( vec3_t *angle ) { - using fn = void( __thiscall * )( void *, vec3_t * ); - util::get_vfunc< fn >( this, 363 )( this, angle ); -} - -bool c_base_player::run_physics_think( int unk01 ) { - static auto impl = reinterpret_cast< bool( __thiscall * )( void *, int ) >( - pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 EC 10 53 56 57 8B F9 8B 87 ? ? ? ? C1 E8 16" ) ) - ); - - return impl( this, unk01 ); -} - -void c_base_player::pre_think( ) { - using fn = void( __thiscall * )( void * ); - util::get_vfunc< fn >( this, 309 )( this ); -} - -void c_base_player::think( ) { - using fn = void( __thiscall * )( void * ); - util::get_vfunc< fn >( this, 137 )( this ); -} - -void c_base_player::setup_bones_ex( matrix3x4* array_out, int bone_mask, float curtime ) { -/* auto hdr = *( studiohdr_t** )( uintptr_t( ce( )->GetClientRenderable( ) ) + 0x2938 ); - auto bone_array = ( matrix3x4* )( m_dwBoneMatrix( ) ); - - auto readable_bones = *( int* )( ( uintptr_t )ce( )->GetClientRenderable( ) + 0x2694 ); - bone_mask |= readable_bones; - - //backup necessary data - matrix3x4 backup_bone_array[ 128 ]; - float backup_pose_params[ 24 ]; - - memcpy( backup_bone_array, - ( void* )( m_dwBoneMatrix( ) ), - sizeof( backup_bone_array ) ); - - memcpy( backup_pose_params, - m_flPoseParameter( ), - sizeof( backup_pose_params ) ); - - vec3_t backup_origin = ce( )->GetRenderOrigin( ); - vec3_t backup_angles = ce( )->GetRenderAngles( ); - - //setup a transform matrix - matrix3x4 transform{ }; - math::angle_imatrix( backup_angles, transform ); - math::set_matrix_position( backup_origin, transform ); - - //set render flags - *( int* )( ( uintptr_t )ce( )->GetClientRenderable( ) + 0xE0 ) |= 8; - - update_ik_locks( m_flSimulationTime( ) ); - IKContext* ik = m_IKContext( ); - - if( ik ) { - ik->ClearTargets( ); - ik->Init( hdr, backup_angles, - backup_origin, - curtime, - g_csgo.m_globals->m_framecount, - bone_mask ); - } - - vec3_t pos[ 128 ]; - float q[ 4 ][ 128 ]; - - standard_blending_rules( hdr, pos, q, curtime, bone_mask ); - - //idk but this is in ida - char computed[ 0x100 ]{ }; - - if( ik ) { - ik->UpdateTargets( pos, q, bone_array, computed ); - calculate_ik_locks( curtime ); - ik->SolveDependencies( pos, q, bone_array, computed ); - } - - build_transformations( hdr, pos, q, transform, bone_mask, computed ); - - //clear render flags - *( int* )( ( uintptr_t )ce( )->GetClientRenderable( ) + 0xE0 ) &= ~8; - - //copy new bone array into the matrix - memcpy( array_out, bone_array, 128 * sizeof( matrix3x4 ) ); - - /* - //restore data - memcpy( bone_array, - backup_bone_array, - sizeof( matrix3x4 ) ); - - memcpy( m_flPoseParameter( ), - backup_pose_params, - sizeof( backup_pose_params ) ); - - set_abs_angles( backup_angles ); - set_abs_origin( backup_origin ); - */ -} \ No newline at end of file diff --git a/internal_rewrite/c_base_player.hpp b/internal_rewrite/c_base_player.hpp deleted file mode 100644 index 30bafde..0000000 --- a/internal_rewrite/c_base_player.hpp +++ /dev/null @@ -1,468 +0,0 @@ -#pragma once -#include - -#include "util.hpp" -#include "IClientEntityList.hpp" -#include "netvars.hpp" -#include "pattern.hpp" -#include "c_base_weapon.hpp" -#include "CUtlVector.hpp" -#include "IPhysicsSurfaceProps.hpp" -#include "settings.hpp" -#include "IPhysicsSurfaceProps.hpp" - -enum PlayerState_t { - FL_ONGROUND = 1 << 0, - FL_DUCKING = 1 << 1, - FL_WATERJUMP = 1 << 2, - FL_ONTRAIN = 1 << 3, - FL_INRAIN = 1 << 4, - FL_FROZEN = 1 << 5, - FL_ATCONTROLS = 1 << 6, - FL_CLIENT = 1 << 7, - FL_FAKECLIENT = 1 << 8, - FL_INWATER = 1 << 9, -}; - -enum PlayerHitboxes_t { - HITBOX_HEAD, - HITBOX_NECK, - HITBOX_PELVIS, - HITBOX_BODY, - HITBOX_THORAX, - HITBOX_CHEST, - HITBOX_UPPER_CHEST, - HITBOX_RIGHT_THIGH, - HITBOX_LEFT_THIGH, - HITBOX_RIGHT_CALF, - HITBOX_LEFT_CALF, - HITBOX_RIGHT_FOOT, - HITBOX_LEFT_FOOT, - HITBOX_RIGHT_HAND, - HITBOX_LEFT_HAND, - HITBOX_RIGHT_UPPER_ARM, - HITBOX_RIGHT_FOREARM, - HITBOX_LEFT_UPPER_ARM, - HITBOX_LEFT_FOREARM, - HITBOX_MAX, -}; - -enum MoveType_t { - MOVETYPE_NONE = 0, // never moves - MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc. - MOVETYPE_WALK, // Player only - moving on the ground - MOVETYPE_STEP, // gravity, special edge handling -- monsters use this - MOVETYPE_FLY, // No gravity, but still collides with stuff - MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity - MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation - MOVETYPE_PUSH, // no clip to world, push and crush - MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity - MOVETYPE_LADDER, // Used by players only when going onto a ladder - MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode - MOVETYPE_CUSTOM, // Allows the entity to describe its own physics - MOVETYPE_LAST = MOVETYPE_CUSTOM, // should always be defined as the last item in the list - MOVETYPE_MAX_BITS = 4, -}; - -enum LifeState_t { - LIFE_ALIVE = 0, // alive - LIFE_DYING, // playing death animation or still falling off of a ledge waiting to hit ground - LIFE_DEAD, // dead. lying still. - LIFE_RESPAWNABLE, - LIFE_DISCARDBODY, -}; - -enum PoseParam_t { - STRAFE_YAW, - STAND, - LEAN_YAW, - SPEED, - LADDER_YAW, - LADDER_SPEED, - JUMP_FALL, - MOVE_YAW, - MOVE_BLEND_CROUCH, - MOVE_BLEND_WALK, - MOVE_BLEND_RUN, - BODY_YAW, - BODY_PITCH, - AIM_BLEND_STAND_IDLE, - AIM_BLEND_STAND_WALK, - AIM_BLEND_STAND_RUN, - AIM_BLEND_COURCH_IDLE, - AIM_BLEND_CROUCH_WALK, - DEATH_YAW -}; - -class IKContext { -public: - void Init( void* hdr, vec3_t& angles, vec3_t& origin, float curtime, int framecount, int boneMask ); - void UpdateTargets( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ); - void SolveDependencies( vec3_t* pos, void* q, matrix3x4* bone_array, char* computed ); - - //THANK YOU IDA - void ClearTargets( ) { - int max = *( int* )( ( uintptr_t )this + 4080 ); - int count = 0; - - if( max > 0 ) { - uintptr_t v60 = ( uintptr_t )( ( uintptr_t )this + 208 ); - do { - *( int* )( v60 ) = -9999; - v60 += 340; - ++count; - } while( count < max ); - } - } -}; - -class C_AnimationLayer { -private: - char pad_0x8_[ 0x8 ]; -public: - uint32_t m_unk1; - uint32_t m_unk2; - uint32_t m_unk3; - uint32_t m_nOrder; //0x0014 - uint32_t m_nSequence; //0x0018 - float m_flPrevCycle; //0x001C - float m_flWeight; //0x0020 - float m_flWeightDeltaRate; //0x0024 - float m_flPlaybackRate; //0x0028 - float m_flCycle; //0x2C - c_base_player* m_player; //0x30 - char pad_0x8[ 0x4 ]; //0x34 -}; //Size: 0x0038 - -struct clientanimating_t { - void* m_pAnimating; - unsigned int m_fFlags; - clientanimating_t( void* _pAnim, unsigned int _flags ) : m_pAnimating( _pAnim ), m_fFlags( _flags ) {} -}; - -struct CCSGOPlayerAnimState -{ - void update( float yaw, float pitch ); - void update_ex( float yaw, float pitch ); - void setup_velocity( float ); - void setup_aim_matrix( ); - void setup_weapon_action( ); - void setup_movement( ); - void setup_alive_loop( ); - void setup_whole_body_action( ); - void setup_flashed_reaction( ); - void setup_flinch( ); - bool cache_sequences( ); - - void reset( ); - - char pad[ 4 ]; - char bUnknown; //0x4 - char pad2[ 91 ]; - void* pBaseEntity; //0x60 - void* pActiveWeapon; //0x64 - void* pLastActiveWeapon; //0x68 - float m_flLastClientSideAnimationUpdateTime; //0x6C - int m_iLastClientSideAnimationUpdateFramecount; //0x70 - float m_flLastUpdateDelta; //0x74 //b8 - float m_flEyeYaw; //0x78 //c0 - float m_flPitch; //0x7C //b8 - float m_flGoalFeetYaw; //0x80 //c0 - float m_flCurrentFeetYaw; //0x84 //c8 - float m_flCurrentTorsoYaw; //0x88 //d0 - float m_flUnknownVelocityLean; //0x8C //changes when moving/jumping/hitting ground //d8 - float m_flLeanAmount; //0x90 //e0 - char pad4[ 4 ]; //NaN //e8 - float m_flFeetCycle; //0x98 0 to 1 //100 //f0 - float m_flFeetYawRate; //0x9C 0 to 1 //108 //f8 - char pad11[ 4 ]; - float m_fDuckAmount; //0xA4 //118 //108 - float m_fLandingDuckAdditiveSomething; //0xA8 //110 - float m_fUnknown3; //0xAC //118 - vec3_t m_vOrigin; //0xB0, 0xB4, 0xB8 //120 - vec3_t m_vLastOrigin; //0xBC, 0xC0, 0xC4 - vec3_t m_vecVelocity; - float m_flUnknownFloat1; //0xD4 Affected by movement and direction - char pad6[ 8 ]; - float m_flUnknownFloat2; //0xE0 //from -1 to 1 when moving and affected by direction - float m_flUnknownFloat3; //0xE4 //from -1 to 1 when moving and affected by direction - float m_unknown; //0xE8 - float m_velocity; //0xEC - float flUpVelocity; //0xF0 - float m_flSpeedNormalized; //0xF4 //from 0 to 1 - float m_flFeetSpeedForwardsOrSideWays; //0xF8 //from 0 to 2. something is 1 when walking, 2.something when running, 0.653 when crouch walking - float m_flFeetSpeedUnknownForwardOrSideways; //0xFC //from 0 to 3. something - float m_flTimeSinceStartedMoving; //0x100 - float m_flTimeSinceStoppedMoving; //0x104 - unsigned char m_bOnGround; //0x108 - unsigned char m_bInHitGroundAnimation; //0x109 - char pad7[ 10 ]; - float m_flLastOriginZ; //0x114 - float m_flHeadHeightOrOffsetFromHittingGroundAnimation; //0x118 from 0 to 1, is 1 when standing - float m_flStopToFullRunningFraction; //0x11C from 0 to 1, doesnt change when walking or crouching, only running - char pad8[ 4 ]; //NaN - float m_flUnknownFraction; //0x124 affected while jumping and running, or when just jumping, 0 to 1 - char pad9[ 4 ]; //NaN - float m_flUnknown3; - char pad10[ 0x210 ]; -}; - -class VarMapEntry_t { -public: - unsigned short type; - unsigned short m_bNeedsToInterpolate; // Set to false when this var doesn't - // need Interpolate() called on it anymore. - void* data; - void* watcher; -}; - -struct VarMapping_t { - CUtlVector< VarMapEntry_t > m_Entries; - int m_nInterpolatedEntries; // +0x14 - float m_lastInterpolationTime; // +0x18 -}; - -struct ent_animdata_t { - std::array< C_AnimationLayer, 13 > m_animlayers; - std::array< C_AnimationLayer, 13 > m_last_layers; - std::array< float, 24 > m_poseparams; - matrix3x4 m_bones[ 128 ]; - int m_activity; - float m_simtime; - float m_last_simtime; - vec3_t m_last_interp_origin; - float m_fraction; - vec3_t m_interp_origin; - vec3_t m_last_origin; - vec3_t m_last_velocity; - vec3_t m_anim_velocity; - bool m_valid{ }; - float m_last_duck; - int m_prev_flags; - int m_anim_flags; - float m_adjust_rate; - float m_adjust_cycle; - bool m_is_stopping; - float m_last_animtime; -}; - -class c_base_player { -private: - static ent_animdata_t sm_animdata[ 65 ]; -public: - //NETVAR( m_YourFunctionName, "Name", "Table", extra, type ) - - NETVAR( m_nMoveType, "m_nRenderMode", "DT_BaseEntity", 1, MoveType_t ); - NETVAR( m_iAccount, "m_iAccount", "DT_CSPlayer", 0, int ); - NETVAR( m_iHealth, "m_iHealth", "DT_BasePlayer", 0, int ); - NETVAR( m_lifeState, "m_lifeState", "DT_BasePlayer", 0, uint8_t ); - NETVAR( m_nTickBase, "m_nTickBase", "DT_BasePlayer", 0, int ); - NETVAR( m_fFlags, "m_fFlags", "DT_BasePlayer", 0, int ); - NETVAR( m_vecVelocity, "m_vecVelocity[0]", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_nHitboxSet, "m_nHitboxSet", "DT_BaseAnimating", 0, int ); - NETVAR( m_vecOrigin, "m_vecOrigin", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_vecViewOffset, "m_vecViewOffset[0]", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_hActiveWeapon, "m_hActiveWeapon", "DT_BaseCombatCharacter", 0, ulong_t ); - NETVAR( m_iTeamNum, "m_iTeamNum", "DT_BaseEntity", 0, int ); - NETVAR( m_bHasHelmet, "m_bHasHelmet", "DT_CSPlayer", 0, bool ); - NETVAR( m_bHasDefuser, "m_bHasDefuser", "DT_CSPlayer", 0, bool ); - NETVAR( m_ArmorValue, "m_ArmorValue", "DT_CSPlayer", 0, int ); - NETVAR( m_flNextAttack, "m_flNextAttack", "DT_BaseCombatCharacter", 0, float ); - NETVAR( m_flLowerBodyYawTarget, "m_flLowerBodyYawTarget", "DT_CSPlayer", 0, float ); - NETVAR( m_angEyeAngles, "m_angEyeAngles[0]", "DT_CSPlayer", 0, vec3_t ); - NETVAR( m_AnimOverlay, "m_hLightingOrigin", "DT_BaseAnimating", 0x3c, CUtlVector< C_AnimationLayer > ); - NETVAR( m_flSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0, float ); - NETVAR( m_flCycle, "m_flCycle", "DT_BaseAnimating", 0, float ); - NETVAR( m_nSequence, "m_nSequence", "DT_BaseAnimating", 0, int ); - PNETVAR( m_flPoseParameter, "m_flPoseParameter", "DT_BaseAnimating", 0, float ); - NETVAR( m_bClientSideAnimation, "m_bClientSideAnimation", "DT_BaseAnimating", 0, bool ); - NETVAR( m_flLastBoneSetupTime, "m_hLightingOrigin", "DT_BaseAnimating", -0x20, float ); - NETVAR( m_iMostRecentModelBoneCounter, "m_nForceBone", "DT_BaseAnimating", 0x4, int ); - NETVAR( m_nWriteableBones, "m_nForceBone", "DT_BaseAnimating", 0x20, int ); - NETVAR( m_vecThirdpersonAngles, "deadflag", "DT_BasePlayer", 0x4, vec3_t ); - NETVAR( m_hObserverTarget, "m_hObserverTarget", "DT_BasePlayer", 0, uint32_t ); - NETVAR( m_iObserverMode, "m_iObserverMode", "DT_BasePlayer", 0, int ); - NETVAR( m_flOldSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0x4, float ); - NETVAR( m_CoordinateFrame, "m_CollisionGroup", "DT_BaseEntity", -0x30, matrix3x4 ); - NETVAR( m_vecMins, "m_vecMins", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_vecMaxs, "m_vecMaxs", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_bIsScoped, "m_bIsScoped", "DT_CSPlayer", 0, bool ); - NETVAR( m_viewPunchAngle, "m_viewPunchAngle", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_flMaxFlashAlpha, "m_flFlashMaxAlpha", "DT_CSPlayer", 0, float ); - NETVAR( m_flFlashDuration, "m_flFlashDuration", "DT_CSPlayer", 0, float ); - NETVAR( m_flFlashTime, "m_flFlashMaxAlpha", "DT_CSPlayer", -0x10, float ); - NETVAR( m_bGunGameImmunity, "m_bGunGameImmunity", "DT_CSPlayer", 0, bool ); - NETVAR( m_hViewModel, "m_hViewModel[0]", "DT_BasePlayer", 0, uint32_t ); - NETVAR( m_bSpotted, "m_bSpotted", "DT_CSPlayer", 0, bool ); - NETVAR( m_pSurfaceData, "m_flLaggedMovementValue", "DT_CSPlayer", 0x18, surfacedata_t* ); - NETVAR( m_vecBaseVelocity, "m_vecBaseVelocity", "DT_CSPlayer", 0, vec3_t ); - NETVAR( m_vecAbsVelocity, "m_vecVelocity", "DT_CSPlayer", 0x12, vec3_t ); - NETVAR( m_flGravity, "m_iTeamNum", "DT_CSPlayer", -0x14, float ); - NETVAR( m_surfaceFriction, "m_vecLadderNormal", "DT_CSPlayer", -0x4, float ); - NETVAR( m_flDuckAmount, "m_flDuckAmount", "DT_CSPlayer", 0, float ); - NETVAR( m_flDuckSpeed, "m_flDuckSpeed", "DT_CSPlayer", 0, float ); - PNETVAR( m_hMyWearables, "m_hMyWearables", "DT_BaseCombatCharacter", 0, uint32_t ); - PNETVAR( m_hMyWeapons, "m_hMyWeapons", "DT_BaseCombatCharacter", 0, uint32_t ); - NETVAR( m_hGroundEntity, "m_hGroundEntity", "DT_CSPlayer", 0, uint32_t ); - NETVAR( m_flConstraintRadius, "m_flConstraintRadius", "DT_CSPlayer", 0, float ); - - OFFSET( m_CachedBoneData, 0x28FC + sizeof( void* ), CUtlVector< matrix3x4 > ); - OFFSET( m_flSpawnTime, 0xA2C0, float ); - OFFSET( m_IKContext, 0x265c, IKContext* ); -public: - static uintptr_t get_player_resource( ); - static uintptr_t get_game_rules( ); - static bool& s_bInvalidateBoneCache( ); - static int& g_iModelBoneCounter( ); - - /*makes it much more organized: functions from IClientEntity - dont interfere with our defined functions*/ - - __forceinline IClientEntity* ce( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - __forceinline operator IClientEntity*( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - template < typename t > - __forceinline t& get( std::ptrdiff_t offset ) { - return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); - } - - __forceinline auto& get_animdata( ) { - return sm_animdata[ ce( )->GetIndex( ) ]; - } - - __forceinline bool is_alive( ) { - return m_iHealth( ) > 0 && m_lifeState( ) == LIFE_ALIVE; - } - - __forceinline void update_ik_locks( float curtime ) { - return util::get_vfunc< 186, void >( this, curtime ); - } - - __forceinline void calculate_ik_locks( float curtime ) { - return util::get_vfunc< 187, void >( this, curtime ); - } - - __forceinline void standard_blending_rules( void* hdr, vec3_t* pos, void* q, float curtime, int bone_mask ) { - return util::get_vfunc< 200, void >( this, hdr, pos, q, curtime, bone_mask ); - } - - __forceinline void build_transformations( void* hdr, vec3_t* pos, void* q, const matrix3x4& transform, int bone_mask, char* computed ) { - return util::get_vfunc< 184, void >( this, hdr, pos, q, transform, bone_mask, computed ); - } - - __forceinline bool has_valid_anim( ) { - if( m_bClientSideAnimation( ) ) - return true; - - return sm_animdata[ ce( )->GetIndex( ) ].m_valid; - } - - bool is_flashed( ); - bool is_reloading( ); - - int get_ping( ); - - __forceinline auto& m_aimPunchAngle( bool real = false ) { - static vec3_t backup_var{ }; - static auto offset = g_netvars.get_netvar( fnv( "DT_BasePlayer" ), fnv( "m_aimPunchAngle" ) ); - if( g_settings.misc.no_recoil( ) && !real ) { - backup_var = { 0.f, 0.f, 0.f }; - return backup_var; - } - - return get< vec3_t >( offset ); - } - - void set_local_view_angles( vec3_t *angle ); - bool run_physics_think( int n ); - void pre_think( ); - void think( ); - - __forceinline vec3_t get_anim_velocity( ) { - auto index = ce( )->GetIndex( ); - return sm_animdata[ index ].m_anim_velocity; - } - - __forceinline CCSGOPlayerAnimState* get_animstate( ) { - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( "DT_CSPlayer" ), - fnv( "m_bIsScoped" ) ); - - if( !offset ) { - return nullptr; - } - - return *reinterpret_cast< CCSGOPlayerAnimState** >( uintptr_t( this ) + offset - 0xa ); - } - - __forceinline void update_clientside_animation( ) { - bool backup = m_bClientSideAnimation( ); - m_bClientSideAnimation( ) = true; - util::get_vfunc< 218, void >( this ); - m_bClientSideAnimation( ) = backup; - } - - void invalidate_bone_cache( ); - - __forceinline vec3_t get_eye_pos( ) { - vec3_t yes; - //fuck references Lol - util::get_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 277 )( this, yes ); - - //thanks senator!! !11 - return yes; - } - - __forceinline bool is_player( ) { - if( !this ) - return false; - - ClientClass* client_class = ce( )->GetClientClass( ); - return client_class && client_class->m_class_id == CCSPlayer; - } - - __forceinline bool is_valid( ) { - return !!this && is_player( ) && !ce( )->IsDormant( ) && is_alive( ); - } - - bool is_fakewalking( ); - player_info_t get_info( ); - void get_name_safe( char* buf ); - c_base_weapon* get_weapon( ); - vec3_t get_hitbox_pos( int hitbox ); - vec3_t get_hitbox_mins( int hitbox ); - vec3_t get_hitbox_maxs( int hitbox ); - bool is_visible( int hitbox ); - bool can_attack( bool ignore_rapid = false ); - int get_choked_ticks( ); - float get_hitbox_radius( int hitbox ); - - void set_abs_origin( vec3_t origin ); - void set_abs_angles( vec3_t angles ); - void set_abs_velocity( vec3_t velocity ); - void calc_abs_velocity( ); - - void set_needs_interpolate( bool interp ); - void do_ent_interpolation( bool reset ); - - void invalidate_physics_recursive( int flags ); - void create_animstate( CCSGOPlayerAnimState* state ); - void setup_bones_ex( matrix3x4* matrix_out, int bone_mask, float curtime ); - int get_seq_activity( int sequence ); - - void fix_animations( bool reset = false, bool resolver_change = false ); - void validate_animation_layers( ); - void compute_move_cycle( bool reset, bool moving ); - void calculate_duckamount( bool reset ); - void cache_anim_data( bool layers = true ); - void restore_anim_data( bool layers = false ); - void handle_taser_animation( ); - void calc_anim_velocity( bool reset ); - void fix_jump_fall( bool reset ); - - bool is_breaking_lc( ); -}; \ No newline at end of file diff --git a/internal_rewrite/c_base_weapon.cpp b/internal_rewrite/c_base_weapon.cpp deleted file mode 100644 index ec6d420..0000000 --- a/internal_rewrite/c_base_weapon.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "c_base_weapon.hpp" - -char c_base_weapon::get_hud_icon( ) { - if( is_knife( ) ) return 'J'; - - switch( m_iItemDefinitionIndex( ) ) { - case WEAPON_DEAGLE: return 'F'; - case WEAPON_ELITE: return 'S'; - case WEAPON_FIVESEVEN: return 'U'; - case WEAPON_GLOCK: return 'C'; - case WEAPON_AK47: return 'B'; - case WEAPON_AUG: return 'E'; - case WEAPON_AWP: return 'R'; - case WEAPON_FAMAS: return 'T'; - case WEAPON_G3SG1: return 'I'; - case WEAPON_GALILAR: return 'V'; - case WEAPON_M249: return 'Z'; - case WEAPON_M4A1: - case WEAPON_M4A1_SILENCER: - return 'W'; - case WEAPON_MAC10: return 'L'; - case WEAPON_P90: return 'M'; - case WEAPON_UMP45: return 'Q'; - case WEAPON_XM1014: return ']'; - case WEAPON_BIZON: return 'D'; - case WEAPON_MAG7: return 'K'; - case WEAPON_NEGEV: return 'Z'; - case WEAPON_SAWEDOFF: return 'K'; - case WEAPON_TEC9: return 'C'; - case WEAPON_TASER: return 'Y'; - case WEAPON_HKP2000: return 'Y'; - case WEAPON_MP7: return 'X'; - case WEAPON_MP9: return 'D'; - case WEAPON_NOVA: return 'K'; - case WEAPON_P250: return 'Y'; - case WEAPON_SCAR20: return 'I'; - case WEAPON_SG556: return '['; - case WEAPON_SSG08: return 'N'; - case WEAPON_FLASHBANG: return 'G'; - case WEAPON_HEGRENADE: return 'H'; - case WEAPON_SMOKEGRENADE: return 'P'; - case WEAPON_MOLOTOV: return 'H'; - case WEAPON_DECOY: return 'G'; - case WEAPON_INCGRENADE: return 'H'; - case WEAPON_C4: return '\\'; - case WEAPON_USP_SILENCER: return 'Y'; - case WEAPON_CZ75A: return 'C'; - case WEAPON_R8REVOLVER: return 'F'; - default: return 'J'; - } -} \ No newline at end of file diff --git a/internal_rewrite/c_base_weapon.hpp b/internal_rewrite/c_base_weapon.hpp deleted file mode 100644 index f56770e..0000000 --- a/internal_rewrite/c_base_weapon.hpp +++ /dev/null @@ -1,324 +0,0 @@ -#pragma once -#include "util.hpp" -#include "IClientEntityList.hpp" -#include "netvars.hpp" - -enum ItemDefinitionIndex_t { - WEAPON_NONE, - WEAPON_DEAGLE = 1, - WEAPON_ELITE = 2, - WEAPON_FIVESEVEN = 3, - WEAPON_GLOCK = 4, - WEAPON_AK47 = 7, - WEAPON_AUG = 8, - WEAPON_AWP = 9, - WEAPON_FAMAS = 10, - WEAPON_G3SG1 = 11, - WEAPON_GALILAR = 13, - WEAPON_M249 = 14, - WEAPON_M4A1 = 16, - WEAPON_MAC10 = 17, - WEAPON_P90 = 19, - WEAPON_UMP45 = 24, - WEAPON_XM1014 = 25, - WEAPON_BIZON = 26, - WEAPON_MAG7 = 27, - WEAPON_NEGEV = 28, - WEAPON_SAWEDOFF = 29, - WEAPON_TEC9 = 30, - WEAPON_TASER = 31, - WEAPON_HKP2000 = 32, - WEAPON_MP7 = 33, - WEAPON_MP9 = 34, - WEAPON_NOVA = 35, - WEAPON_P250 = 36, - WEAPON_SCAR20 = 38, - WEAPON_SG556 = 39, - WEAPON_SSG08 = 40, - WEAPON_KNIFEGG = 41, - WEAPON_KNIFE = 42, - WEAPON_FLASHBANG = 43, - WEAPON_HEGRENADE = 44, - WEAPON_SMOKEGRENADE = 45, - WEAPON_MOLOTOV = 46, - WEAPON_DECOY = 47, - WEAPON_INCGRENADE = 48, - WEAPON_C4 = 49, - WEAPON_KNIFE_T = 59, - WEAPON_M4A1_SILENCER = 60, - WEAPON_USP_SILENCER = 61, - WEAPON_CZ75A = 63, - WEAPON_R8REVOLVER = 64, - WEAPON_KNIFE_BAYONET = 500, - WEAPON_KNIFE_FLIP = 505, - WEAPON_KNIFE_GUT = 506, - WEAPON_KNIFE_KARAMBIT = 507, - WEAPON_KNIFE_M9_BAYONET = 508, - WEAPON_KNIFE_TACTICAL = 509, - WEAPON_KNIFE_FALCHION = 512, - WEAPON_KNIFE_BOWIE = 514, - WEAPON_KNIFE_BUTTERFLY = 515, - WEAPON_KNIFE_PUSH = 516, - GLOVE_STUDDED_BLOODHOUND = 5027, - GLOVE_T_SIDE = 5028, - GLOVE_CT_SIDE = 5029, - GLOVE_SPORTY = 5030, - GLOVE_SLICK = 5031, - GLOVE_LEATHER_WRAP = 5032, - GLOVE_MOTORCYCLE = 5033, - GLOVE_SPECIALIST = 5034, - GLOVE_HYDRA = 5035, -}; - -class weapon_info_t { -public: - char pad_0000[ 4 ]; //0x0000 - char* weapon_name; //0x0004 - char pad_0008[ 12 ]; //0x0008 - int max_clip_ammo; //0x0014 - char pad_0018[ 12 ]; //0x0018 - int max_ammo; //0x0024 - char pad_0028[ 4 ]; //0x0028 - char* world_model; //0x002C - char* view_model; //0x0030 - char* dropped_model; //0x0034 - char pad_0038[ 4 ]; //0x0038 - char* N00000010; //0x003C - char pad_0040[ 56 ]; //0x0040 - char* empty_sound; //0x0078 - char pad_007C[ 4 ]; //0x007C - char* ammo_type; //0x0080 - char pad_0084[ 4 ]; //0x0084 - char* hud_name; //0x0088 - char* weapon_name2; //0x008C - char pad_0090[ 60 ]; //0x0090 - int type; - int price; //0x00CC - int kill_reward; //0x00D0 - char* anim_prefix; - float cycle_time; - float cycle_time_alt; - float time_to_idle; - float idle_interval; - - bool full_auto; //0x00E8 - char pad_00E9[ 3 ]; //0x00E9 - int damage; //0x00EC - float armor_ratio; //0x00F0 - char pad_00F4[ 4 ]; //0x00F4 - float penetration; //0x00F8 - char pad_00FC[ 8 ]; //0x00FC - float range; //0x0104 - float range_modifier; //0x0108 - float throw_velocity; - char pad_010C[ 12 ]; //0x010C - bool has_silencer; //0x011C - char pad_011D[ 15 ]; //0x011D - float max_speed; //0x012C - float max_speed_alt; //0x0130 - float spread; //0x0134 - float spread_alt; //0x0138 - float inaccuracy_crouch; //0x013C - float inaccuracy_crouch_alt; //0x0140 - float inaccuracy_stand; //0x0144 - float inaccuracy_stand_alt; //0x0148 - float inaccuracy_jump_start; //0x014C - float inaccuracy_jump; //0x0150 - float inaccuracy_jump_alt; //0x0154 - float inaccuracy_land; //0x0158 - float inaccuracy_land_alt; //0x015C - float inaccuracy_ladder; //0x0160 - float inaccuracy_ladder_alt; //0x0164 - float inaccuracy_fire; //0x0168 - float inaccuracy_fire_alt; //0x016C - float inaccuracy_move; //0x0170 - float inaccuracy_move_alt; //0x0174 - float inaccuracy_reload; //0x0178 - int recoil_seed; //0x017C - char pad_0180[ 60 ]; //0x0180 - int zoom_levels; //0x01BC - int zoom_fov1; //0x01C0 - int zoom_fov2; //0x01C4 -}; - -enum quality_t { - Default, - Geniune, - Vintage, - Unusual, - Community = 5, - Developer, - Self_Made, - Customized, - Strange, - Completed, - Tournament = 12, -}; - -class c_base_weapon { -public: - NETVAR( m_iItemDefinitionIndex, "m_iItemDefinitionIndex", "DT_BaseAttributableItem", 0, short ); - NETVAR( m_iClip1, "m_iClip1", "DT_BaseCombatWeapon", 0, int ); - NETVAR( m_flNextPrimaryAttack, "m_flNextPrimaryAttack", "DT_BaseCombatWeapon", 0, float ); - NETVAR( m_flNextSecondaryAttack, "m_flNextPrimaryAttack", "DT_BaseCombatWeapon", 4, float ); - NETVAR( m_flPostponeFireReadyTime, "m_flPostponeFireReadyTime", "DT_WeaponCSBase", 0, float ); - NETVAR( m_fThrowTime, "m_fThrowTime", "DT_BaseCSGrenade", 0, float ); - NETVAR( m_hOwner, "m_hOwner", "DT_BaseCombatWeapon", 0, uint32_t ); - NETVAR( m_bPinPulled, "m_bPinPulled", "DT_BaseCSGrenade", 0, bool ); - NETVAR( m_flThrowStrength, "m_flThrowStrength", "DT_BaseCSGrenade", 0, float ); - NETVAR( m_nModelIndex, "m_nModelIndex", "DT_BaseEntity", 0, int ); - - NETVAR( m_iViewModelIndex, "m_iViewModelIndex", "DT_BaseCombatWeapon", 0, int ); - NETVAR( m_iWorldModelIndex, "m_iWorldModelIndex", "DT_BaseCombatWeapon", 0, int ); - NETVAR( m_iWorldDroppedModelIndex, "m_iWorldDroppedModelIndex", "DT_BaseCombatWeapon", 0, int ); - NETVAR( m_hWeaponWorldModel, "m_hWeaponWorldModel", "DT_BaseCombatWeapon", 0, uint32_t ); - - NETVAR( m_iEntityQuality, "m_iEntityQuality", "DT_BaseAttributableItem", 0, int ); - NETVAR( m_iItemIDHigh, "m_iItemIDHigh", "DT_BaseAttributableItem", 0, int ); - NETVAR( m_iItemIDLow, "m_iItemIDLow", "DT_BaseAttributableItem", 0, int ); - NETVAR( m_iAccountID, "m_iAccountID", "DT_BaseAttributableItem", 0, int ); - NETVAR( m_szCustomName, "m_szCustomName", "DT_BaseAttributableItem", 0, char* ); - NETVAR( m_OriginalOwnerXuidLow, "m_OriginalOwnerXuidLow", "DT_BaseAttributableItem", 0, int ); - NETVAR( m_OriginalOwnerXuidHigh, "m_OriginalOwnerXuidHigh", "DT_BaseAttributableItem", 0, int ); - - NETVAR( m_nFallbackPaintKit, "m_nFallbackPaintKit", "DT_BaseAttributableItem" ,0, int ); - NETVAR( m_nFallbackSeed, "m_nFallbackSeed", "DT_BaseAttributableItem", 0, int ); - NETVAR( m_flFallbackWear, "m_flFallbackWear", "DT_BaseAttributableItem", 0, float ); - NETVAR( m_nFallbackStatTrak, "m_nFallbackStatTrak", "DT_BaseAttributableItem", 0, int ); - - NETVAR( m_hOwnerEntity, "m_hOwnerEntity", "DT_BaseAttributableItem", 0, uint32_t ); - NETVAR( m_flC4Blow, "m_flC4Blow", "DT_PlantedC4", 0, float ); - NETVAR( m_bBombTicking, "m_bBombTicking", "DT_PlantedC4", 0, bool ); - NETVAR( m_hBombDefuser, "m_hBombDefuser", "DT_PlantedC4", 0, uint32_t ); - NETVAR( m_bBombDefused, "m_bBombDefused", "DT_PlantedC4", 0, bool ); - NETVAR( m_flTimerLength, "m_flTimerLength", "DT_PlantedC4", 0, float ); - NETVAR( m_flDefuseLength, "m_flDefuseLength", "DT_PlantedC4", 0, float ); - NETVAR( m_flDefuseCountDown, "m_flDefuseCountDown", "DT_PlantedC4", 0, float ); - NETVAR( m_fLastShotTime, "m_fLastShotTime", "DT_WeaponCSBaseGun", 0, float ); - - __forceinline IClientEntity* ce( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - __forceinline operator IClientEntity*( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - template < typename t > - __forceinline t& get( std::ptrdiff_t offset ) { - return *reinterpret_cast< t* >( uintptr_t( this ) + offset ); - } - - __forceinline weapon_info_t* get_wpn_info( ) { - return util::get_vfunc< 444, weapon_info_t* >( this ); - } - - __forceinline void update_accuracy_penalty( ) { - return util::get_vfunc< 468, void >( this ); - } - - __forceinline float get_spread( ) { - return util::get_vfunc< 436, float >( this ); - } - - __forceinline float get_inaccuracy( ) { - return util::get_vfunc< 467, float >( this ); - } - - __forceinline void set_glove_model( int model_index ) { - return util::get_vfunc< 75, void >( this, model_index ); - } - - bool is_pistol( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WEAPON_DEAGLE: - case WEAPON_ELITE: - case WEAPON_FIVESEVEN: - case WEAPON_GLOCK: - case WEAPON_HKP2000: - case WEAPON_P250: - case WEAPON_TEC9: - case WEAPON_USP_SILENCER: - case WEAPON_R8REVOLVER: - return true; - default: - return false; - } - } - - bool is_sniper( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WEAPON_AWP: - case WEAPON_G3SG1: - case WEAPON_SCAR20: - case WEAPON_SSG08: - return true; - default: - return false; - } - } - - bool is_knife( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WEAPON_KNIFE: - case WEAPON_KNIFE_T: - case WEAPON_KNIFEGG: - case WEAPON_KNIFE_BAYONET: - case WEAPON_KNIFE_BUTTERFLY: - case WEAPON_KNIFE_FALCHION: - case WEAPON_KNIFE_FLIP: - case WEAPON_KNIFE_GUT: - case WEAPON_KNIFE_KARAMBIT: - case WEAPON_KNIFE_M9_BAYONET: - case WEAPON_KNIFE_PUSH: - case WEAPON_KNIFE_TACTICAL: - case WEAPON_KNIFE_BOWIE: - return true; - default: - return false; - } - } - - bool is_grenade( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WEAPON_FLASHBANG: - case WEAPON_HEGRENADE: - case WEAPON_SMOKEGRENADE: - case WEAPON_MOLOTOV: - case WEAPON_INCGRENADE: - case WEAPON_DECOY: - return true; - default: - return false; - } - } - - bool is_shotgun( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WEAPON_NOVA: - case WEAPON_SAWEDOFF: - case WEAPON_XM1014: - case WEAPON_MAG7: - return true; - default: - return false; - } - } - - bool is_rifle( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WEAPON_AK47: - case WEAPON_AUG: - case WEAPON_FAMAS: - case WEAPON_GALILAR: - case WEAPON_SG556: - case WEAPON_M4A1: - case WEAPON_M4A1_SILENCER: - return true; - default: - return false; - } - } - - char get_hud_icon( ); -}; \ No newline at end of file diff --git a/internal_rewrite/chams.cpp b/internal_rewrite/chams.cpp deleted file mode 100644 index 1d46bb2..0000000 --- a/internal_rewrite/chams.cpp +++ /dev/null @@ -1,341 +0,0 @@ -#include "chams.hpp" -#include "interface.hpp" -#include "d3d.hpp" -#include "context.hpp" -#include "hooks.hpp" - -static auto chams_mat = xors_raw( ( - R"("VertexLitGeneric" -{ - "$basetexture" "vgui/white_additive" - "$ignorez" "1" - "$nofog" "1" - "$model" "1" - "$nocull" "0" - "$selfillum" "1" - "$halflambert" "1" - "$znearer" "0" - "$flat" "1" - "$envmap" "env_cubemap" - "$envmaptint" "[.3 .3 .3]" - "$envmapcontrast" "1" - "$envmapsaturation" "1.0" - "$phong" "1" - "$phongexponent" "15.0" - "$normalmapalphaenvmask" "1" - "$phongboost" "6.0" - "$phongfresnelranges" "[.5 .5 1]" - "$BasemapAlphaPhongMask" "1" -})" -) ); - -static auto chams_mat_shine = xors_raw( ( - R"("VertexLitGeneric" -{ - "$basetexture" "vgui/white" - "$envmap" "env_cubemap" - "$envmaptint" "[.3 .3 .3]" - "$reflectivity" "[1.0 1.0 1.0]" - "$envmapcontrast" ".4" - "$envmapsaturation" "1.0" - "$model" "1" - "$flat" "0" - "$nocull" "1" - "$selfillum" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" -})" -) ); - -static auto chams_mat_flat = xors_raw( ( - R"("UnlitGeneric" -{ - "$basetexture" "vgui/white" - "$model" "1" - "$flat" "1" - "$nocull" "1" - "$selfillum" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" -})" -) ); - -namespace features -{ - void c_materials::make_cham_buffer( char* buf, int len, int type ) { - switch ( type ) { - case 1: - sprintf_s( buf, len - 1, chams_mat_flat.decrypt( ) ); - break; - case 2: - sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); - break; - default: - sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); - } - } - - void c_material::init( const char* name, const char* buf ) { - m_keyvalues = new KeyValues( name ); - m_keyvalues->LoadFromBuffer( name, buf ); - - // CreateMaterial already increments ref counter - m_mat = g_csgo.m_mat_system( )->CreateMaterial( name, m_keyvalues ); - } - - void c_material::destroy( ) { - if( m_mat ) { - m_mat->DecrementReferenceCount( ); - m_mat = nullptr; - } - - if( m_keyvalues ) { - delete m_keyvalues; - m_keyvalues = nullptr; - } - } - - void c_materials::force_material( IMaterial* mat, fclr_t clr ) { - if( !mat ) return; - - float col[ ] = { clr.r( ), clr.g( ), clr.b( ) }; - g_csgo.m_render_view( )->SetBlend( clr.a( ) ); - g_csgo.m_render_view( )->SetColorModulation( col ); - - g_csgo.m_model_render( )->ForcedMaterialOverride( mat ); - } - - void c_materials::initialize_materials( ) { - char buffer[ 1024 ]; - - make_cham_buffer( buffer, sizeof( buffer ), 0 ); - m_chams.init( xors( "chamsmat" ), buffer ); - memset( buffer, 0, 1024 ); - - make_cham_buffer( buffer, sizeof( buffer ), 1 ); - m_chams_flat.init( xors( "chamsmat_flat" ), buffer ); - memset( buffer, 0, 1024 ); - m_initialized = true; - } - - void c_materials::destroy_materials( ) { - m_initialized = false; - - m_chams.destroy( ); - m_chams_flat.destroy( ); - } - - void c_materials::update_materials( ) { - if( !m_initialized ) return; - if( m_chams.m_mat->m_ref_count <= 0 ) return; - - static float last_reflectivity{ }; - static float last_shine{ }; - static float last_luminance{ }; - static KeyValues* reflectivity; - static KeyValues* shine; - static KeyValues* luminance; - - if( !reflectivity ) { - for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { - if( it->m_iDataType != 1 ) continue; - if( strstr( it->m_sValue, xors( "[.3 .3 .3]" ) ) ) { - reflectivity = it; - } - } - } - - if( !shine ) { - for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { - if( it->m_flValue == 6.0f ) - shine = it; - } - } - - if( !luminance ) { - for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { - if( it->m_flValue == 15.0f ) { - luminance = it; - } - } - } - - if( reflectivity ) { - if( last_reflectivity != g_settings.visuals.chams.reflectivity( ) ) { - char buf[ 32 ]; - sprintf_s< 32 >( buf, xors( "[%1.1f %1.1f %1.1f]" ), - g_settings.visuals.chams.reflectivity( ), - g_settings.visuals.chams.reflectivity( ), - g_settings.visuals.chams.reflectivity( ) ); - - strcpy( reflectivity->m_sValue, buf ); - m_chams.m_mat->Refresh( ); - } - last_reflectivity = g_settings.visuals.chams.reflectivity( ); - } - - if( shine ) { - if( last_shine != g_settings.visuals.chams.shine( ) ) { - shine->m_flValue = g_settings.visuals.chams.shine( ) * 3.f; - m_chams.m_mat->Refresh( ); - } - last_shine = g_settings.visuals.chams.shine( ); - } - - if( luminance ) { - if( last_luminance != g_settings.visuals.chams.luminance( ) ) { - if( g_settings.visuals.chams.luminance == 0.f ) - luminance->m_flValue = 0.f; - else - luminance->m_flValue = ( 1.05f - g_settings.visuals.chams.luminance( ) ) * 10.f; - m_chams.m_mat->Refresh( ); - } - last_luminance = g_settings.visuals.chams.luminance( ); - } - } - - void c_chams::d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { - static auto d3d_draw = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); - - int team = ent->m_iTeamNum( ); - clr_t visible_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_visible_friendly( ) : g_settings.visuals.chams.color_visible_enemy( ); - clr_t hidden_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_hidden_friendly( ) : g_settings.visuals.chams.color_hidden_enemy( ); - - if( team == g_ctx.m_local->m_iTeamNum( ) && !g_settings.visuals.chams.friendlies ) - return; - - fclr_t fcol_vis = visible_col.to_fclr( ); - float value_vis[ 4 ] = { fcol_vis.r( ), fcol_vis.g( ), fcol_vis.b( ), fcol_vis.a( ) }; - - fclr_t fcol_hid = hidden_col.to_fclr( ); - float value_hid[ 4 ] = { fcol_hid.r( ), fcol_hid.g( ), fcol_hid.b( ), fcol_hid.a( ) }; - - float def[ 4 ] = { 1.f, 1.f, 1.f, 1.f }; - - IDirect3DBaseTexture9* prev_texture; - IDirect3DSurface9* prev_surface; - ulong_t z_enable; - - g_d3d.get_device( )->GetTexture( 0, &prev_texture ); - g_d3d.get_device( )->GetRenderTarget( 0, &prev_surface ); - g_d3d.get_device( )->GetRenderState( D3DRS_ZENABLE, &z_enable ); - - auto hr = g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); - - //printf( "hr: %08x\n", hr ); - - if( g_settings.visuals.chams.ignore_z ) { - g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, false ); - g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); - g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_hid, 1 ); - //g_d3d.get_device( )->SetTexture( 0, nullptr ); - d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); - } - - g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); - g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); - g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_vis, 1 ); - //g_d3d.get_device( )->SetTexture( 0, nullptr ); - - d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); - - g_d3d.get_device( )->SetPixelShaderConstantF( 0, def, 1 ); - g_d3d.get_device( )->SetPixelShaderConstantF( 1, def, 1 ); - g_d3d.get_device( )->SetRenderTarget( 0, prev_surface ); - g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); - - g_d3d.get_device( )->SetTexture( 0, prev_texture ); - - if( prev_texture ) - prev_texture->Release( ); - - if( prev_surface ) - prev_surface->Release( ); - } - - void c_chams::d3d_render_textures( ) { - if( !g_d3d.m_sil_txt ) - return; - - IDirect3DSurface9* backbuffer; - D3DSURFACE_DESC desc; - - g_d3d.get_device( )->GetRenderTarget( 0, &backbuffer ); - backbuffer->GetDesc( &desc ); - //backbuffer->Release( ); - - struct tex_vertex { - float x, y, z, r, h, w; - }; - - tex_vertex v[ ] = { - { 0.f, 0.f, 0.f, 1.0f, 0.f, 0.f }, - { ( float )desc.Width, 0.f, 0.f, 1.0f, 1.0f, 0.f }, - { 0.f, ( float )desc.Height, 0.f, 1.0f, 0.0f, 1.0f }, - { ( float )desc.Width, ( float )desc.Height, 0.f, 1.0f, 1.0f, 1.0f } - }; - - void* p; - - g_d3d.m_buffer->Lock( 0, 0, &p, 0 ); - memcpy( p, v, sizeof( v ) ); - g_d3d.m_buffer->Unlock( ); - - void* pixel_shader; - void* texture; - void* stream_src; - uint32_t stride; - uint32_t offset; - ulong_t fvf; - ulong_t dest_blend; - ulong_t alpha_blend; - - g_d3d.get_device( )->GetPixelShader( ( IDirect3DPixelShader9** )&pixel_shader ); - g_d3d.get_device( )->GetTexture( 0, ( IDirect3DBaseTexture9** )&texture ); - g_d3d.get_device( )->GetStreamSource( 0, ( IDirect3DVertexBuffer9** )&stream_src, &offset, &stride ); - g_d3d.get_device( )->GetFVF( &fvf ); - g_d3d.get_device( )->GetRenderState( D3DRS_DESTBLEND, &dest_blend ); - g_d3d.get_device( )->GetRenderState( D3DRS_ALPHABLENDENABLE, &alpha_blend ); - - g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); - g_d3d.get_device( )->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); - g_d3d.get_device( )->SetPixelShader( nullptr ); - g_d3d.get_device( )->SetTexture( 0, g_d3d.m_sil_txt ); - g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); - - g_d3d.get_device( )->SetStreamSource( 0, g_d3d.m_buffer, 0, sizeof( tex_vertex ) ); - g_d3d.get_device( )->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); - - //D3DXSaveSurfaceToFileA( "backbuffer_1.bmp", D3DXIFF_BMP, backbuffer, 0, 0 ); - //D3DXSaveSurfaceToFileA( "backbuffer_2.bmp", D3DXIFF_BMP, g_d3d.m_surface, 0, 0 ); - - - D3DRECT bar_rect{ }; - D3DCOLOR col{ }; - - bar_rect.x1 = 0; - bar_rect.y1 = 0; - bar_rect.x2 = desc.Width; - bar_rect.y2 = desc.Height; - - g_d3d.get_device( )->SetPixelShader( ( IDirect3DPixelShader9* )pixel_shader ); - g_d3d.get_device( )->SetTexture( 0, ( IDirect3DTexture9* )texture ); - g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, dest_blend ); - g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, alpha_blend ); - g_d3d.get_device( )->SetStreamSource( 0, ( IDirect3DVertexBuffer9* )stream_src, offset, stride ); - g_d3d.get_device( )->SetFVF( fvf ); - - //g_d3d.get_device( )->Clear( 1, &bar_rect, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, col, 0, 0 ); - g_d3d.get_device( )->SetRenderTarget( 0, backbuffer ); - backbuffer->Release( ); - - - } -} \ No newline at end of file diff --git a/internal_rewrite/chams.hpp b/internal_rewrite/chams.hpp deleted file mode 100644 index d7eb023..0000000 --- a/internal_rewrite/chams.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "sdk.hpp" - -namespace features -{ - enum ChamBufferType_t { - TYPE_NORMAL, - TYPE_FLAT, - TYPE_SHINE - }; - - class c_material { - public: - c_material( ) = default; - - void init( const char* mat, const char* buf ); - void destroy( ); - - operator IMaterial*( ) { - return m_mat; - } - - public: - IMaterial* m_mat; - KeyValues* m_keyvalues; - }; - - class c_materials { - public: - c_material m_chams{ }; - c_material m_chams_flat{ }; - - void make_cham_buffer( char* buf, int len, int type ); //type, 0 = normal, 1 = flat, 2 = shine - public: - void initialize_materials( ); - void destroy_materials( ); - void force_material( IMaterial* material, fclr_t color ); - void update_materials( ); - bool m_initialized{ }; - }; - - class c_chams { - public: - c_materials m_materials; - void d3d_render_textures( ); - void d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ); - }; -} \ No newline at end of file diff --git a/internal_rewrite/color.hpp b/internal_rewrite/color.hpp deleted file mode 100644 index 5ffd2a0..0000000 --- a/internal_rewrite/color.hpp +++ /dev/null @@ -1,278 +0,0 @@ -#pragma once -#include -#include - -//this is a fucking mess - -class fclr_t { - float R, G, B, A; -public: - fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } - - fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } - - fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } - - float& r( ) { return R; } - float& g( ) { return G; } - float& b( ) { return B; } - float& a( ) { return A; } - - fclr_t& operator =( fclr_t& c ) { - R = c.r( ); - G = c.g( ); - B = c.b( ); - A = c.a( ); - return *this; - } - - fclr_t operator+( const fclr_t& v ) const { - return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); - } - - explicit operator bool( ) const noexcept { - return ( R > 0 || G > 0 || B > 0 || A > 0 ); - } - - bool operator==( fclr_t& c ) const { - return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); - } -}; - -class clr_t { - uint8_t R, G, B, A; -public: - clr_t( ) = default; - - clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } - - clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } - - uint8_t& r( ) { return R; } - uint8_t& g( ) { return G; } - uint8_t& b( ) { return B; } - uint8_t& a( ) { return A; } - - clr_t& operator =( clr_t& c ) { - R = c.r( ); - G = c.g( ); - B = c.b( ); - A = c.a( ); - return *this; - } - - clr_t operator+( const clr_t& v ) const { - return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); - } - - clr_t operator*( float f ) { - return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); - } - - explicit operator bool( ) const noexcept { - return ( R > 0 || G > 0 || B > 0 || A > 0 ); - } - - float brightness( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - - float min = static_cast( R < G ? R : G ); - min = static_cast( min < B ? min : B ); - - float max = static_cast( R > G ? R : G ); - max = static_cast( max > B ? max : B ); - - out.v = max; - float delta = max - min; - if ( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if ( max > 0.0f ) { - out.s = delta / max; - } - else { - out.s = 0.0f; - out.h = NAN; - return out.h; - } - if ( R >= max ) - out.h = static_cast( G - B ) / delta; - else if ( G >= max ) - out.h = 2.0f + static_cast( B - R ) / delta; - else - out.h = 4.0f + static_cast( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if ( out.h < 0.0f ) - out.h += 360.0f; - - return out.v; - } - - float saturation( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - - float min = static_cast( R < G ? R : G ); - min = static_cast( min < B ? min : B ); - - float max = static_cast( R > G ? R : G ); - max = static_cast( max > B ? max : B ); - - out.v = max; - float delta = max - min; - if ( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if ( max > 0.0f ) { - out.s = delta / max; - } - else { - out.s = 0.0f; - out.h = NAN; - return out.h; - } - if ( R >= max ) - out.h = static_cast( G - B ) / delta; - else if ( G >= max ) - out.h = 2.0f + static_cast( B - R ) / delta; - else - out.h = 4.0f + static_cast( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if ( out.h < 0.0f ) - out.h += 360.0f; - - return out.s; - } - - static clr_t from_hsb( float hue, float saturation, float brightness ) { - float h = hue == 1.0f ? 0 : hue * 6.0f; - float f = h - ( int )h; - float p = brightness * ( 1.0f - saturation ); - float q = brightness * ( 1.0f - saturation * f ); - float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); - - if ( h < 1 ) { - return clr_t( - ( unsigned char )( brightness * 255 ), - ( unsigned char )( t * 255 ), - ( unsigned char )( p * 255 ) - ); - } - else if ( h < 2 ) { - return clr_t( - ( unsigned char )( q * 255 ), - ( unsigned char )( brightness * 255 ), - ( unsigned char )( p * 255 ) - ); - } - else if ( h < 3 ) { - return clr_t( - ( unsigned char )( p * 255 ), - ( unsigned char )( brightness * 255 ), - ( unsigned char )( t * 255 ) - ); - } - else if ( h < 4 ) { - return clr_t( - ( unsigned char )( p * 255 ), - ( unsigned char )( q * 255 ), - ( unsigned char )( brightness * 255 ) - ); - } - else if ( h < 5 ) { - return clr_t( - ( unsigned char )( t * 255 ), - ( unsigned char )( p * 255 ), - ( unsigned char )( brightness * 255 ) - ); - } - else { - return clr_t( - ( unsigned char )( brightness * 255 ), - ( unsigned char )( p * 255 ), - ( unsigned char )( q * 255 ) - ); - } - } - - static clr_t blend( clr_t first, clr_t second, float t ) { - return clr_t( - first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), - first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), - first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), - first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) - ); - } - - float hue( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - float min, max, delta; - - min = static_cast< float >( R < G ? R : G ); - min = static_cast< float >( min < B ? min : B ); - - max = static_cast< float >( R > G ? R : G ); - max = static_cast< float >( max > B ? max : B ); - - out.v = max; - delta = max - min; - if ( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if ( max > 0.0f ) { - out.s = ( delta / max ); - } - else { - out.s = 0.0f; - out.h = ( float )NAN; - return out.h; - } - if ( R >= max ) - out.h = static_cast< float >( G - B ) / delta; - else - if ( G >= max ) - out.h = 2.0f + static_cast< float >( B - R ) / delta; - else - out.h = 4.0f + static_cast< float >( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if ( out.h < 0.0f ) - out.h += 360.0f; - - return out.h; - } - - fclr_t to_fclr( ) { - return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; - } - - operator fclr_t( ) { - return this->to_fclr( ); - } - - bool operator==( clr_t& c ) const { - return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); - } -}; \ No newline at end of file diff --git a/internal_rewrite/con_alias.hpp b/internal_rewrite/con_alias.hpp deleted file mode 100644 index 62812f1..0000000 --- a/internal_rewrite/con_alias.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include -#include "simple_settings.hpp" - -template< typename var_type = bool > -class con_alias : public ISetting { -public: - con_alias( hash_t hash, con_var< var_type >* var ) : - m_var( var ), - m_value( var_type{ } ), - m_name( hash ), - m_is_var( true ) { }; - - con_alias( hash_t hash ) : - m_name( hash ), - m_value( 0 ), - m_var( nullptr ), - m_is_var( false ) { }; - - con_alias( hash_t hash, var_type&& rhs ) : - m_name( hash ), - m_value( rhs ), - m_var( nullptr ), - m_is_var( false ) { }; - - virtual std::string get_string( ) override { - if( m_is_var ) - return m_var->get_string( ); - else - return std::to_string( m_value ); - } - - virtual void set_value( int value ) override { - set_value_internal( value ); - } - - virtual void set_value( float value ) override { - set_value_internal( value ); - } - - virtual void set_value( ulong_t value ) override { - set_value_internal( value ); - } - -private: - template < typename t > - void set_value_internal( t&& val ) { - if( m_is_var ) - m_var->set( val ); - else - m_value = ( var_type )( val ); - } - -private: - bool m_is_var; - hash_t m_name; - var_type m_value; - con_var< var_type >* m_var; -}; \ No newline at end of file diff --git a/internal_rewrite/con_fn.hpp b/internal_rewrite/con_fn.hpp deleted file mode 100644 index c71cc08..0000000 --- a/internal_rewrite/con_fn.hpp +++ /dev/null @@ -1,172 +0,0 @@ -#pragma once -#include - -#include "simple_settings.hpp" - -//KEEP THIS UP TO DATE!! -enum ConFnVarType_t { - TYPE_NULL = 0, - TYPE_FLOAT = 'F', - TYPE_STRING = 'S', - TYPE_INTEGER = 'D', - TYPE_HEX = 'X' -}; - -class con_fn_base { -public: - virtual bool execute( const char* str ) = 0; - virtual const char* get_syntax( ) = 0; - virtual hash_t get_hash( ) = 0; -}; - -class con_fn : public con_fn_base { -public: - con_fn( hash_t hash, std::function< void __cdecl( const char*, const char* ) > function, const char* syntax ) { - m_hash = hash; - m_function = function; - strcpy_s< 64 >( m_syntax, syntax ); - for( size_t i{ }; i < strlen( m_syntax ); ++i ) { - if( m_syntax[ i ] == '%' ) { - m_args++; - } - } - } - - static ConFnVarType_t get_var_type( size_t arg, const char* syntax ) { - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( syntax ); ++i ) { - if( syntax[ i ] == '%' ) { - if( cur_arg++ == arg ) { - return ( ConFnVarType_t )( syntax[ i + 1 ] ); - } - } - } - - return TYPE_NULL; - } - - template < typename t > - static t get_arg( const char* str, size_t arg_index, const char* syntax ) { - auto arg_type = get_var_type( arg_index, syntax ); - - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - if( cur_arg++ == arg_index ) { - size_t start = i + 1; - size_t end = strlen( str ); - for( size_t i2 = start; i2 < strlen( str ); ++i2 ) { - if( str[ i2 ] == ' ' ) { - end = i2; - break; - } - } - - std::string str( str + start, end - start ); - - char* end_ptr = ( char* )str.c_str( ) + end; - if constexpr( std::is_integral_v< t > ) { - auto radix = get_var_type( arg_index, syntax ) == TYPE_HEX ? 16 : 10; - return std::strtol( str.c_str( ), &end_ptr, radix ); - } - - if constexpr( std::is_floating_point_v< t > ) { - return std::strtof( str.c_str( ), &end_ptr ); - } - - return ( t )str.c_str( ); - } - } - } - - return t{ }; - } - - virtual const char* get_syntax( ) override { - return m_syntax; - } - - virtual hash_t get_hash( ) override { - return m_hash; - } - - ConFnVarType_t get_var_type( size_t arg ) { - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( m_syntax ); ++i ) { - if( m_syntax[ i ] == '%' ) { - if( cur_arg++ == arg ) { - return ( ConFnVarType_t )( m_syntax[ i + 1 ] ); - } - } - } - - return TYPE_NULL; - } - - //returns false on failed execution - virtual bool execute( const char* str ) override { - size_t arg_count{ }; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - arg_count++; - } - } - - if( arg_count != m_args ) { - return false; - } - - std::string pass_str( " " ); - - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - size_t end = strlen( str ); - for( size_t i2 = i + 2; i2 < strlen( str ); ++i2 ) { - if( str[ i2 ] == ' ' ) { - end = i2; - } - } - - char* end_ptr = ( char* )( str + i + end ); - switch( get_var_type( cur_arg ) ) { - case TYPE_FLOAT: { - pass_str += std::to_string( strtof( str + i, &end_ptr ) ); - break; - } - case TYPE_INTEGER: { - pass_str += std::to_string( strtol( str + i, &end_ptr, 10 ) ); - break; - } - case TYPE_HEX: { - char buf[ 10 ]; - sprintf_s< 10 >( buf, "%08x", strtol( str + i, &end_ptr, 16 ) ); - pass_str += buf; - break; - } - case TYPE_STRING: { - std::string add_str( str + i, end - i ); - pass_str += add_str; - break; - } - default: - return false; - } - - if( end != strlen( str ) ) { - pass_str += ' '; - } - ++cur_arg; - } - } - - m_function( pass_str.c_str( ), m_syntax ); - return true; - } - -private: - hash_t m_hash{ }; - size_t m_args{ }; - char m_syntax[ 64 ]{ }; - std::function< void( __cdecl )( const char*, const char* ) > m_function{ }; -}; \ No newline at end of file diff --git a/internal_rewrite/console.cpp b/internal_rewrite/console.cpp deleted file mode 100644 index d922af3..0000000 --- a/internal_rewrite/console.cpp +++ /dev/null @@ -1,324 +0,0 @@ -#include "console.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "d3d.hpp" -#include "ui_draw.h" - -std::shared_ptr< console > g_con = std::make_shared< console >( ); - - -void console::draw_text( int x, int y, bool greyed, const char* fmt, ... ) { - va_list args; - char buf[ 512 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 512 >( buf, fmt, args ); - __crt_va_end( args ); - - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, "%s", buf ); - //g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); -} - -void console::draw_text( int x, int y, const char* fmt, ... ) { - va_list args; - char buf[ 512 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 512 >( buf, fmt, args ); - __crt_va_end( args ); - - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); -} - -void console::draw_rect( int x, int y, int w, int h, clr_t col ) { - g_d3d.draw_filled_rect( col, x, y, w, h ); -} - -void console::register_alias( std::shared_ptr< ISetting >& alias ) { - m_aliases.push_back( alias ); -} - -void console::capture_command( ) { - float current_time = GetTickCount( ) * 0.001f; - size_t length = strlen( m_cur_cmd ); - - for( size_t i{ }; i < 0xfe; ++i ) { - if( m_input->is_key_pressed( i ) ) { - float delta_time = current_time - m_last_key_input[ i ]; - if( fabs( delta_time ) > 0.2f ) { - if( i == KEYS_BACK ) { - m_cur_cmd[ length - 1 ] = 0; - m_last_key_input[ i ] = current_time; - continue; - } - - m_key_states[ i ] = 0xf0; - wchar_t pressed_char; - const auto scan = MapVirtualKeyA( i, 2 ); - auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); - - if( ret == 1 ) { - if( length < 200 ) { - m_cur_cmd[ length ] = ( char )( pressed_char ); - m_cur_cmd[ length + 1 ] = 0; - } - } - m_last_key_input[ i ] = current_time; - } - } - else { - m_last_key_input[ i ] = 0.f; - m_key_states[ i ] = 0; - } - } -} - -ISetting* console::find_var( hash_t var ) { - for( auto& it : data::holder_.get_nodes( ) ) { - auto setting = static_cast< ISetting* >( it ); - if( var == setting->get_hash( ) ) { - return setting; - } - } - - return nullptr; -} - -ISetting* console::find_alias( hash_t alias ) { - for( auto& it : m_aliases ) { - if( it->get_hash( ) == alias ) - return it.get( ); - } - - return nullptr; -} - -con_fn_base* console::find_fn( hash_t name ) { - for( auto& it : m_functions ) { - if( it->get_hash( ) == name ) { - return it; - } - } - - return nullptr; -} - -std::string console::impl_alias_str( std::string str ) { - for( size_t i{ }; i < str.length( ); ++i ) { - if( str[ i ] == ' ' && str[ i + 1 ] != ' ' ) { - size_t end = 0; - for( size_t i2{ i + 1 }; i2 < str.length( ); ++i ) { - if( str[ i2 ] == ' ' ) - end = i2; - } - - if( end ) { - std::string alias_str( str.c_str( ) + i, end - i ); - auto alias = find_alias( hash::fnv1a( alias_str ) ); - if( alias ) { - str.replace( alias_str.begin( ), alias_str.end( ), alias->get_string( ) ); - } - else { - g_con->log( xors( "couldnt find alias %s" ), alias_str.c_str( ) ); - } - } - } - } - - return str; -} - -void console::execute_command( const char* cmd ) { - if( !cmd[ 0 ] ) return; - std::string first_param( cmd, strlen( cmd ) ); - - size_t end{ }; - bool one_arg = true; - for( size_t i{ }; i < strlen( cmd ); ++i ) { - if( cmd[ i ] == ' ' ) { - first_param.resize( i ); - end = i; - one_arg = false; - break; - } - } - - if( one_arg ) { - first_param.resize( first_param.length( ) - 1 ); - } - - //find a command to execute - auto fn = find_fn( hash::fnv1a( first_param ) ); - if( fn ) { - //std::string alias_cmd = impl_alias_str( cmd ); - - if( !fn->execute( cmd ) ) { - log( xors( "invalid syntax" ) ); - } - return; - } - - //command not found, we're managing vars - if( !one_arg ) { - std::string second_param = ( cmd + end + 1 ); - bool is_floating_point = second_param.find( '.' ) != std::string::npos; - auto var = find_var( hash::fnv1a( first_param ) ); - - if( var ) { - auto setting_cast = static_cast< con_var< void* >* >( var ); - if( !setting_cast->is_integral( ) && !setting_cast->is_floating_point( ) ) { - auto value = std::strtol( second_param.c_str( ), 0, 16 ); - printf( xors( "value: %08x\n" ), value ); - var->set( value ); - } - - if( is_floating_point ) { - float value = std::strtof( second_param.c_str( ), 0 ); - var->set( value ); - } - else { - int value = std::strtol( second_param.c_str( ), 0, 10 ); - var->set( value ); - } - log( xors( "%s %s\n" ), first_param.c_str( ), second_param.c_str( ) ); - return; - } - } - - - log( xors( "unknown command: %s" ), first_param.c_str( ) ); -} - -void console::input( ) { - static int drag_x, drag_y; - int cursor_x, cursor_y; - int x = m_x, y = m_y; - bool clicked = m_input->is_key_pressed( KEYS_MOUSE1 ); - static bool is_hovered{ }; - m_input->get_cursor_pos( cursor_x, cursor_y ); - - auto is_top_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y && cursor_y < y + TOP_HEIGHT; - }; - - auto is_window_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y && cursor_y < y + HEIGHT; - }; - - auto is_bottom_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y + HEIGHT - TOP_HEIGHT - && cursor_y < y + HEIGHT; - }; - - if( clicked ) { - //m_consuming_input = is_window_hovered( ); - } - - if( !clicked && is_top_hovered( ) ) { - drag_x = cursor_x - m_x; - drag_y = cursor_y - m_y; - } - - if( clicked && is_hovered ) { - is_hovered = true; - m_x = cursor_x - drag_x; - m_y = cursor_y - drag_y; - } - else { - is_hovered = is_top_hovered( ); - } - - if( clicked ) { - m_active = is_bottom_hovered( ); - } - - if( m_active ) { - capture_command( ); - - static bool was_held{ }; - if( m_input->is_key_pressed( KEYS_RETURN ) ) { - if( !was_held ) { - execute_command( m_cur_cmd ); - m_cur_cmd[ 0 ] = 0; - } - was_held = true; - } - else was_held = false; - } -} - -void console::draw( ) { - if( !m_open ) { - m_consuming_input = false; - m_active = false; - return; - } - - static clr_t col = clr_t( 31, 31, 31, 255 ); - - input( ); - - RECT prev_rect{ }; - RECT new_rect{ m_x - 1, m_y - 1, - m_x + WIDTH + 1, m_y + HEIGHT + 1 }; - g_d3d.get_device( )->GetScissorRect( &prev_rect ); - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - draw_rect( m_x - 1, m_y - 1, WIDTH + 2, HEIGHT + 2, ui::ui_get_accent_col( ) ); - draw_rect( m_x, m_y, WIDTH, HEIGHT, col ); - draw_rect( m_x + 1, m_y, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); - - draw_rect( m_x + 1, m_y + HEIGHT - TOP_HEIGHT, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); - if( m_active ) { - draw_rect( m_x + 2, m_y + HEIGHT - TOP_HEIGHT + 1, WIDTH - 4, TOP_HEIGHT - 2, clr_t( 31, 31, 31 ) ); - auto fn = find_fn( hash::fnv1a( m_cur_cmd ) ); - if( fn ) { - std::string fn_str = m_cur_cmd; - fn_str += ' '; - fn_str += fn->get_syntax( ); - - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, "%s", fn_str.c_str( ) ); - } - - else { - auto var = find_var( hash::fnv1a( m_cur_cmd ) ); - if( var ) { - std::string var_str = m_cur_cmd; - var_str += ' '; - - var_str += var->get_string( ); - - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, var_str.c_str( ) ); - } - } - } - - std::string cur_cmd_str = m_cur_cmd; - if( m_active ) { - cur_cmd_str += '_'; - } - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, cur_cmd_str.c_str( ) ); - draw_text( m_x + 3, m_y + TOP_HEIGHT / 2 - 3, xors( "console" ) ); - - int cur_y = m_y + HEIGHT - TOP_HEIGHT; - for( int i = m_logs.size( ) - 1; i >= 0; --i ) { - constexpr int LINE_HEIGHT = 14; - auto& log = m_logs.at( i ); - - if( cur_y - LINE_HEIGHT < m_y + TOP_HEIGHT ) { - m_logs.erase( m_logs.begin( ) + i ); - continue; - } - - draw_text( m_x + 2, cur_y -= LINE_HEIGHT, log.m_msg ); - } - - g_d3d.get_device( )->SetScissorRect( &prev_rect ); -} \ No newline at end of file diff --git a/internal_rewrite/console.hpp b/internal_rewrite/console.hpp deleted file mode 100644 index 5226607..0000000 --- a/internal_rewrite/console.hpp +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once -#include -#include -#include -#include - -#include "con_fn.hpp" -#include "con_alias.hpp" -#include "input_system.hpp" -#include "math.hpp" - -#pragma warning(disable: 4996) - -class console { -public: - console( ) { - m_input = std::make_shared< util::c_input_manager >( ); - } - - static constexpr size_t TOP_HEIGHT = 22; - static constexpr size_t WIDTH = 400; - static constexpr size_t HEIGHT = 450; - - bool m_consuming_input{ }; - bool m_active{ }; - bool m_open{ }; - - struct con_log { - float m_time; - char m_msg[ 128 ]; - }; - - void draw_text( int x, int y, bool greyed, const char* msg, ... ); - void draw_text( int x, int y, const char* msg, ... ); - void draw_rect( int x, int y, int w, int h, clr_t col ); - void register_fn( con_fn_base* fn ) { m_functions.push_back( fn ); } - - void input( ); - void draw( ); - - auto& get_input( ) { - return m_input; - } - - void log( const char* fmt, ... ) { - va_list args; - char buf[ 128 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 128 >( buf, fmt, args ); - __crt_va_end( args ); - - con_log log; - log.m_time = ( float )GetTickCount( ) * 0.001f; - memcpy( log.m_msg, buf, 128 ); - - print( "%s\n", buf ); - - m_logs.push_back( log ); - } - - void print( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); - } - - void create( ) { -#ifdef _DEBUG - AllocConsole( ); - freopen( xors( "CONOUT$" ), "w", stdout ); - const char* hack_names[ ] = { - xors( "dunk hack" ), - xors( "dweeb dumpster" ), - xors( "nova killER" ), - xors( "moms credit card" ), - xors( "dad hook" ), - xors( "retard remover" ), - xors( "slam hook" ), - xors( "swoosh" ), - xors( "retard remover" ), - xors( "shotgun hack" ), - }; - - SetConsoleTitleA( hack_names[ math::random_number( 0, 9 ) ] ); -#endif - game_console_print = reinterpret_cast< msg_t >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); - } - - void destroy( ) { -#ifdef _DEBUG - FreeConsole( ); - fclose( stdout ); -#endif - } - - std::vector< con_log > m_logs; - std::vector< con_fn_base* > m_functions; - std::vector< std::shared_ptr< ISetting > > m_aliases; - - void register_alias( std::shared_ptr< ISetting >& alias ); - - using msg_t = void( __cdecl* )( const char*, ... ); - msg_t game_console_print; - -private: - ISetting* find_var( hash_t name ); - ISetting* find_alias( hash_t name ); - - std::string impl_alias_str( std::string str ); - - con_fn_base* find_fn( hash_t name ); - void capture_command( ); - void execute_command( const char* cmd ); - - int m_x{ 100 }, m_y{ 100 }; - - char m_cur_cmd[ 200 ]{ }; - uint8_t m_key_states[ 256 ]{ }; - float m_last_key_input[ 256 ]{ }; - std::shared_ptr< util::c_input_manager > m_input; -}; - -extern std::shared_ptr< console > g_con; \ No newline at end of file diff --git a/internal_rewrite/context.cpp b/internal_rewrite/context.cpp deleted file mode 100644 index 26af64c..0000000 --- a/internal_rewrite/context.cpp +++ /dev/null @@ -1,212 +0,0 @@ -#include "context.hpp" -#include "console.hpp" -#include "hooks.hpp" -#include "base_cheat.hpp" - -context::c_context g_ctx; - -NAMESPACE_REGION( context ) - -bool c_context::run_frame( ) { - m_local = g_csgo.m_entlist( )->GetClientEntity< >( - g_csgo.m_engine( )->GetLocalPlayer( ) ); - - return !!m_local; -} - -void c_context::on_cmove_end( user_cmd_t* cmd ) { - if( g_settings.menu.anti_untrusted ) - cmd->clamp( ); - - auto send = g_cheat.m_lagmgr.get_state( ); - - if( send ) { - m_last_fakeangle = cmd->m_viewangles; - - m_last_origin = m_local->m_vecOrigin( ); - } - else { - m_last_realangle = cmd->m_viewangles; - //m_last_realangle.x = m_last_fakeangle.x; - } - - if( g_cheat.m_lagmgr.get_choked( ) == 1 ) { - m_thirdperson_angle = m_last_realangle; - } - - m_thirdperson_angle.x = std::clamp( cmd->m_viewangles.x, -89.f, 89.f ); - if( g_cheat.m_lagmgr.get_sent( ) > 1 ) { - m_thirdperson_angle.y = m_last_fakeangle.y; - } - - //auto anim_state = g_cheat.m_ragebot.m_antiaim->get_animstate( ); - - - if( ( cmd->m_buttons & IN_ATTACK ) && m_local->can_attack( ) ) { - auto weap = m_local->get_weapon( ); - if( !weap->is_knife( ) && weap->m_iItemDefinitionIndex( ) != WEAPON_TASER && !weap->is_grenade( ) ) { - if( !m_has_incremented_shots && !m_has_fired_this_frame ) { - shot_data_t new_shot{ }; - new_shot.m_angle = cmd->m_viewangles; - new_shot.m_local_pos = m_local->get_eye_pos( ); - - m_last_shot++; - m_last_shot %= 128; - m_shot_data[ m_last_shot ] = new_shot; - - m_has_incremented_shots = true; - } - - m_has_fired_this_frame = true; - } - } - - auto wep = m_local->get_weapon( ); - if( wep ) { - weapon_info_t* wpn_info = m_local->get_weapon( )->get_wpn_info( ); - if( wpn_info && m_has_fired_this_frame ) - m_local->get_weapon( )->m_flNextPrimaryAttack( ) += wpn_info->cycle_time; - } - - if( g_settings.misc.log_hits( ) ) { - for( auto& it : m_shot_data ) { - if( !it.m_enemy_index ) - continue; - - if( !it.m_handled ) - break; - - if( !it.m_logged ) { - char print_str[ 100 ]{ 0 }; - memset( print_str, 0, 100 ); - - if( it.m_hit ) { - player_info_t info; - if( !g_csgo.m_engine( )->GetPlayerInfo( it.m_enemy_index, &info ) ) - continue; - - char name[ 32 ]; - auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_enemy_index ); - - ent->get_name_safe( name ); - - strenc::w_sprintf_s( print_str, 100, "[\3moneybot\1] hit %s in %s for %d\0", name, util::hitgroup_to_string( it.m_hit ).c_str( ), it.m_damage ); - } - else if( it.m_missed ) - strenc::w_sprintf_s( print_str, 100, "[\3moneybot\1] missed shot due to spread\0" ); - - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, print_str ); - g_con->game_console_print( "%s\n", print_str ); - } - - it.m_logged = true; - } - } - - static float last_shot = 0.f; - if( m_has_fired_this_frame ) - last_shot = g_csgo.m_globals->m_curtime; - else if( auto weapon = g_ctx.m_local->get_weapon( ) ) { - float fire_rate = weapon->get_wpn_info( )->cycle_time; - float tolerance = util::get_total_latency( ) * 2.f + fire_rate + TICK_INTERVAL( ); - if( std::abs( last_shot - g_csgo.m_globals->m_curtime ) > tolerance ) { - reset_shot_queue( ); - last_shot = g_csgo.m_globals->m_curtime; - } - } - - - m_has_incremented_shots = false; - if( std::abs( m_last_shot - m_last_shot_ack ) >= 10 ) - reset_shot_queue( ); - - *get_last_cmd( ) = *cmd; -} - -void c_context::reset_shot_queue( ) { - auto last_shot = m_shot_data[ m_last_shot ]; - m_last_shot = m_last_shot_ack = 0; - m_shot_data = { }; - m_shot_data[ 0 ] = last_shot; -} - -//predicted servertime of player, use this for breaking lby etc -float c_context::pred_time( ) { - calculate_tickbase( ); - - return m_tickbase * g_csgo.m_globals->m_interval_per_tick; -} - -//calculate tickbase depending on whether last ucmd was predicted -bool c_context::calculate_tickbase( ) { - if ( !m_local ) { - return false; - } - - //get current tickbase - auto player_tickbase = m_local->m_nTickBase( ); - - //disabled due to our engine pred being shit - m_tickbase = player_tickbase; - return true; - - if ( m_snapshot.empty( ) ) { - m_tickbase = player_tickbase; - return false; - } - - //if cmd wasnt predicted increment tickbase - auto snap_cmd = &m_snapshot.front( ); - if ( !snap_cmd->m_predicted ) { - if ( !m_tickbase ) { - m_tickbase = player_tickbase; - } - - m_tickbase++; - snap_cmd->m_predicted = true; - } - else { - m_tickbase = player_tickbase; - } - - return true; -} - -bool c_context::precache_model( const char* model ) { - - auto cache_table = g_csgo.m_string_table( )->FindTable( "modelprecache" ); - - if( !cache_table ) - return true; - - g_csgo.m_model_info( )->FindOrLoadModel( model ); - - int string_index = cache_table->AddString( false, model ); - - if( string_index == -1 ) - return false; - - return true; -} - -//save snapshots of usercommands -bool c_context::create_snapshot( user_cmd_t* ucmd ) { - user_cmd_t ucmd_copy; - - while ( m_snapshot.size( ) >= 64 ) { - m_snapshot.pop_back( ); - } - - if ( !ucmd ) { - return false; - } - - memcpy( &ucmd_copy, - ucmd, - sizeof( ucmd_copy ) ); - - m_snapshot.push_front( ucmd_copy ); - return true; -} - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/context.hpp b/internal_rewrite/context.hpp deleted file mode 100644 index 27f1a42..0000000 --- a/internal_rewrite/context.hpp +++ /dev/null @@ -1,85 +0,0 @@ -#pragma once -#include - -#include "util.hpp" -#include "sdk.hpp" - -NAMESPACE_REGION( context ) - -struct shot_data_t { - vec3_t m_local_pos; - vec3_t m_angle; - vec3_t m_enemy_pos; - int m_enemy_index; - int m_resolver_shots; - bool m_resolver_state; - bool m_missed{ false }; - struct { - vec3_t min; - vec3_t max; - float radius; - } m_hitbox; - int m_hitgroup; - bool m_handled{ }; - int m_hit{ }; - int m_damage{ }; - bool m_logged{ }; - matrix3x4 m_matrix[ 128 ]; -}; - -//replacement to the old global:: namespace -class c_context { -public: - //run localplayer check, pointer, is valid etc - bool run_frame( ); - float pred_time( ); - - void on_cmove_end( user_cmd_t* cmd ); - bool create_snapshot( user_cmd_t* ); - //calculate accurate tickbase - bool calculate_tickbase( ); - - user_cmd_t* get_last_cmd( ) { - return m_snapshot.empty( ) ? nullptr : &m_snapshot.front( ); - } - - bool precache_model( const char* model ); - -public: - c_base_player* m_local{ }; - int m_stage{ }; - //accurate tickbase - int m_tickbase{ }; - - bool m_revolver_shot{ }; - - bool m_drawing_postscreenspace{ }; - bool m_has_incremented_shots{ }; - bool m_drawing_screneend{ }; - float m_weapon_spread{ }; - float m_weapon_inaccuracy{ }; - - bool m_has_fired_this_frame{ }; - - float m_absyaw{ }; - vec3_t m_last_realangle{ }; - vec3_t m_last_fakeangle{ }; - vec3_t m_thirdperson_angle{ }; - vec3_t m_last_origin{ }; - - float m_fov{ 90.f }; -public: - void reset_shot_queue( ); - - int m_last_shot_ack; - int m_last_shot; - - std::array< shot_data_t, 128 > m_shot_data; - std::vector< int > m_cmd_numbers; -private: - std::deque< user_cmd_t > m_snapshot; -}; - -END_REGION - -extern context::c_context g_ctx; \ No newline at end of file diff --git a/internal_rewrite/create_move.cpp b/internal_rewrite/create_move.cpp deleted file mode 100644 index a59930e..0000000 --- a/internal_rewrite/create_move.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include - -#include "hooks.hpp" -#include "mem.hpp" -#include "interface.hpp" -#include "context.hpp" -#include "input_system.hpp" -#include "math.hpp" - -#include "base_cheat.hpp" - -/* -void __declspec( naked ) __stdcall hooks::hl_create_move_gate( int sequence_number, float input_sample_time, bool active ) { - __asm { - push ebp - mov ebp, esp - push ebx //push ebx (sendpacket) to the top of the stack - push esp //push the stack (with sendpacket on top) - push active - push input_sample_time - push sequence_number - call hl_create_move - pop ebx - pop ebp - ret 0xc - } -} -*/ - -bool __fastcall hooks::create_move( void* ecx_, void* edx_, float input_sample_frametime, user_cmd_t* ucmd ) { - stack_t stack( get_baseptr( ) ); - byte* send_packet = stack.next( ).local< byte* >( 0x1c ); - - bool ret = create_move_o( ecx_, edx_, input_sample_frametime, ucmd ); - - if( !ucmd->m_tick_count || !ucmd->m_cmd_nr ) - return ret; - - // when switching to non automatic weapons, it will sometimes not shoot when aimbotting so we reset attack flag - bool is_switching_weapon = false; - if( g_csgo.m_input( )->m_hSelectedWeapon != -1 ) { - is_switching_weapon = true; - } - - if( ret ) - g_csgo.m_engine( )->SetViewAngles( ucmd->m_viewangles ); - - // FIX ME NAVE - // ok love - // yes thank u - - g_ctx.create_snapshot( ucmd ); - g_cheat.m_extra.update_netchannel( ); - g_cheat.m_identity( ); - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { - static int last_frame = g_csgo.m_globals->m_framecount; - if( last_frame != g_csgo.m_globals->m_framecount ) - g_ctx.m_has_fired_this_frame = false; - - last_frame = g_csgo.m_globals->m_framecount; - - g_cheat.m_legitbot.sample_angle_data( ucmd->m_viewangles ); - - // u forgot to put this back in the right place after u removed - // my epic engine prediction that set seed to the player ptr - g_cheat.m_prediction.run_command(ucmd); - g_cheat.m_movement( ucmd ); - - //SUPER SECRET EXPLOIT DO NOT LEAK - if( g_settings.misc.no_crouch_cooldown ) - ucmd->m_buttons |= IN_BULLRUSH; - - g_cheat.m_extra.auto_revolver( ucmd ); - - g_cheat.m_legitbot.m_lagcomp( ucmd ); - g_cheat.m_legitbot.triggerbot( ucmd ); - - g_cheat.m_lagmgr( ucmd, send_packet ); - - g_cheat.m_visuals.update_hit_flags( ); - - g_cheat.m_ragebot( ucmd ); - - g_cheat.m_extra.no_recoil( ucmd ); - - g_cheat.m_move_rec( ucmd ); - - g_cheat.m_visuals.radar( ); - - g_cheat.m_extra.rank_reveal( ucmd ); - - if( g_cheat.m_lagmgr.get_choked( ) > 16 ) { - g_cheat.m_lagmgr.set_state( true ); - } - - vec3_t real_angle = g_ctx.m_thirdperson_angle; - - g_cheat.m_lagmgr.on_cmove_end( ); - g_ctx.on_cmove_end( ucmd ); - - auto cl = g_csgo.m_global_state->get_client_state( ); - if( g_cheat.m_lagmgr.get_state( ) ) { - g_ctx.m_cmd_numbers.push_back( ucmd->m_cmd_nr ); - } - else { - int choked = cl->m_netchannel->m_nChokedPackets; - //printf( "choked: %d\n", choked ); - - cl->m_netchannel->m_nChokedPackets = 0; - - send_datagram_o( cl->m_netchannel, 0, 0 ); - - cl->m_netchannel->m_nOutSequenceNr--; - cl->m_netchannel->m_nChokedPackets = choked; - } - - g_cheat.m_ragebot.m_antiaim->on_runcommand( ); - - - } - else { - g_ctx.reset_shot_queue( ); - } - - if( is_switching_weapon ) { - ucmd->m_buttons &= ~IN_ATTACK; - } - - //m_bIsValveDS - //if( *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ) - //g_settings.menu.anti_untrusted = true; - - ucmd->clamp( g_settings.menu.anti_untrusted ); - - return false; -} \ No newline at end of file diff --git a/internal_rewrite/csm_shadows.cpp b/internal_rewrite/csm_shadows.cpp deleted file mode 100644 index b0aa5ed..0000000 --- a/internal_rewrite/csm_shadows.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "hooks.hpp" - -int __fastcall hooks::cl_csm_shadows_get_int( void* ecx_, void* edx_ ) { - static auto old_fn = g_csgo.m_csm_shadows->get_old_function< decltype( &cl_csm_shadows_get_int ) >( 13 ); - - if( g_settings.visuals.no_cascade_shadows ) - return 0; - - return old_fn( ecx_, edx_ ); -} \ No newline at end of file diff --git a/internal_rewrite/d3d.cpp b/internal_rewrite/d3d.cpp deleted file mode 100644 index e807776..0000000 --- a/internal_rewrite/d3d.cpp +++ /dev/null @@ -1,387 +0,0 @@ -#include "d3d.hpp" -#include "interface.hpp" -#include "math.hpp" -#include "d3d_sprite.hpp" - -d3d::c_renderer g_d3d; -d3d::d3d_fonts_t d3d::fonts; - - -//theres shit still left to add like drawrect etc but thats really simple -//this is the base and it works so thats ok -//love -// - nave - -// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) -// DrawPrimitiveUP for each object will slow stuff down eventually -// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else - -namespace d3d -{ - void d3d_fonts_t::release( ) { - if( f_12 ) f_12->Release( ); - if( f_esp_small ) f_esp_small->Release( ); - if( f_16 ) f_16->Release( ); - if( f_18 ) f_18->Release( ); - if( f_menu ) f_menu->Release( ); - if( f_con ) f_con->Release( ); - - f_12 = f_esp_small = f_16 = f_18 = f_menu = f_con = nullptr; - } - - void d3d_fonts_t::create( IDirect3DDevice9* device ) { - auto create_font = [ & ]( ID3DXFont** font, const char* font_name, int width, int size, int weight ) { - //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); - - auto code = D3DXCreateFontA( device, size, width, weight, 0, false, DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); - - if( code < 0 ) throw xors( "fuck d3d" ); - }; - - create_font( &f_12, -#ifndef COMIC_SANS - xors( "Tahoma" ) -#else - xors( "Comic Sans MS" ) -#endif - , 0, 12, 0 ); //change this idc - create_font( &f_esp_small, xors( "Tahoma" ), 0, 11, 500 ); - create_font( &f_16, xors( "Verdana" ), 0, 16, 0 ); - create_font( &f_18, xors( "Verdana" ), 0, 24, 700 ); - create_font( &f_menu, -#ifndef COMIC_SANS - xors( "Tahoma" ) -#else - xors( "Comic Sans MS" ) -#endif - , 0, 12, -#ifndef COMIC_SANS - 300 -#else - 600 -#endif - ); - create_font( &f_con, xors( "Consolas" ), 6, 12, 300 ); - } - - - c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { - create_objects( ); - } - - bool c_renderer::run_frame( IDirect3DDevice9* device ) { - if( g_csgo.m_panic ) { - return false; - } - - if( !m_device ) { - m_device = device; - create_objects( ); - return false; - } - - return true; - } - - c_renderer::~c_renderer( ) { - if( !m_device ) - return; - - invalidate_objects( ); - } - - void c_renderer::on_device_lost( ) { - if( !m_device ) - return; - - invalidate_objects( ); - } - - void c_renderer::on_device_reset( ) { - if( !m_device ) - return; - - create_objects( ); - } - - void c_renderer::invalidate_objects( ) { - if( m_block ) m_block->Release( ); - fonts.release( ); - //m_buffer->Release( ); - //m_sil_txt->Release( ); - //m_surface->Release( ); - } - - void c_renderer::create_objects( ) { - D3DVIEWPORT9 viewport; - - if( !m_device ) return; - - if( m_device->GetViewport( &viewport ) < 0 ) { - return; - } - - if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { - return; - } - - if( !m_block ) { - return; - } - - // get display size. - m_width = viewport.Width; - m_height = viewport.Height; - - fonts.create( m_device ); - - /*IDirect3DSurface9* backbuffer; - D3DSURFACE_DESC desc; - - m_device->GetRenderTarget( 0, &backbuffer ); - backbuffer->GetDesc( &desc ); - backbuffer->Release( ); - - m_device->CreateTexture( desc.Width, desc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_sil_txt, 0 ); - m_sil_txt->GetSurfaceLevel( 0, &m_surface ); - - m_device->CreateVertexBuffer( 4 * 24, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &m_buffer, nullptr );*/ - } - - void c_renderer::begin( ) { - if( !m_device ) return; - - D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; - - m_device->SetViewport( &vp ); - - //m_sil_txt->GetSurfaceLevel( 0, &m_surface ); - - m_block->Capture( ); - - // set vertex stream declaration. - m_device->SetVertexShader( nullptr ); - m_device->SetPixelShader( nullptr ); - m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); - - m_device->SetRenderState( D3DRS_LIGHTING, false ); - m_device->SetRenderState( D3DRS_FOGENABLE, false ); - m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); - m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); - - m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); - m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); - m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); - m_device->SetRenderState( D3DRS_STENCILENABLE, false ); - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); - - m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); - m_device->SetRenderState( D3DRS_ALPHATESTENABLE, false ); - m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); - - m_device->SetTexture( 0, nullptr ); - m_device->SetTexture( 1, nullptr ); - m_device->SetTexture( 2, nullptr ); - m_device->SetTexture( 3, nullptr ); - - m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); - m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); - m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); - m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); - m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); - m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); - m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - - m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); - m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); - m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); - m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); - - m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); - m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); - /* commented out until further notice */ - //m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); - //m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); - // todo - dex; if we use textures, need to set those rendering states too - } - - void c_renderer::end( ) { - //m_device->SetTexture( 0, nullptr ); - //m_device->SetTexture( 1, nullptr ); - //m_device->SetTexture( 2, nullptr ); - //m_device->SetTexture( 3, nullptr ); - m_block->Apply( ); - //m_block->Release( ); - } - - void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { - d3d_vertex_t v[ 2 ] = { - d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why - d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) - }; //edit: do we wanna use z for shit? i mean we could for like menu stuff - //so it renders above other stuff - - m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); - } - - void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { - d3d_vertex_t v[ 5 ] = { - d3d_vertex_t( float( x ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y ), 1.0f, color ) - }; - - m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); - } - - void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { - d3d_vertex_t v[ 6 ] = { - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) - }; - - m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); - } - - void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { - d3d_vertex_t v[ 4 ]; - - switch( type ) { - case GRADIENT_VERTICAL: - v[ 0 ] = { float( x ), float( y ), 1.0f, start }; - v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; - v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; - v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; - break; - case GRADIENT_HORIZONTAL: - v[ 0 ] = { float( x ), float( y ), 1.0f, start }; - v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; - v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; - v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; - break; - } - - //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); - //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { - constexpr float PI = 3.1415926f; - const float step = PI * 2.0f / float( res ); - - int point_x = x + r, - point_y = y - r, - point_x_o{ }, - point_y_o{ }; - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - for( int i{ }; i <= res; i++ ) { - float theta = float( i ) * step; - - point_x = x + ( int )( r * cos( theta ) ); - point_y = y - ( int )( r * sin( theta ) ); - if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); - point_x_o = point_x; - point_y_o = point_y; - } - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { - d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); - const float step = M_PI * 2.0f / res; - - for( size_t i{ }; i < res; ++i ) { - float theta = i * step; - float x_off = r * cos( theta ); - float y_off = r * sin( theta ); - - v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; - } - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_text( ID3DXFont* font, clr_t color, - int x, int y, FontAlign_t align, long font_flags, const char* msg ) { - if( !msg ) return; - if( !font ) return; - - auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); - auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); - auto buf = msg; - - if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; - if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); - RECT rect{ x, y, 1000, 100 }; - - ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; - - if( font_flags & D3DFONTFLAG_DROPSHADOW ) { - RECT r{ rect }; - r.left++; - r.top++; - font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); - } - - if( font_flags & D3DFONTFLAG_OUTLINE ) { - for( int i = -1; i < 2; i++ ) { - if( !i ) continue; - RECT r{ rect }; - r.left += i; - r.top += i; - font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); - } - } - - font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); - } - - int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - RECT temp{ }; - font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); - - return ( temp.right - temp.left ); - } - - int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - RECT temp{ }; - font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); - - return ( temp.bottom - temp.top ); - } -} \ No newline at end of file diff --git a/internal_rewrite/d3d.hpp b/internal_rewrite/d3d.hpp deleted file mode 100644 index 36babe2..0000000 --- a/internal_rewrite/d3d.hpp +++ /dev/null @@ -1,129 +0,0 @@ -#ifndef D3D_HEADER //stackoverflow my niggas -#define D3D_HEADER - -#include -#include - -#pragma comment(lib, "d3d9.lib") -#pragma comment(lib, "d3dx9.lib") -#pragma warning(disable : 4838) - -#include -#include - -#include -#pragma comment(lib, "dwmapi.lib") - -#include "util.hpp" -#include "color.hpp" -#include "renderer.hpp" - -enum D3DFontFlags_t { - D3DFONTFLAG_OUTLINE = 0x10, - D3DFONTFLAG_DROPSHADOW = 0x100, -}; - -enum GradientType_t { - GRADIENT_HORIZONTAL, - GRADIENT_VERTICAL -}; - -namespace features { class c_chams; } - -//suck my dick -namespace d3d -{ - struct d3d_vertex_t { - d3d_vertex_t( float x, float y, float z, clr_t color ) : - m_x( x ), m_y( y ), m_z( z ), - m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; - - d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), - m_clr( 0 ) { }; - - float m_x; - float m_y; - float m_z; - float m_rhw = 1.f; - D3DCOLOR m_clr; - }; - - constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); - - struct d3d_fonts_t { - void release( ); - void create( IDirect3DDevice9* device ); - - ID3DXFont* f_12; - ID3DXFont* f_esp_small; - ID3DXFont* f_16; - ID3DXFont* f_18; - ID3DXFont* f_menu; - ID3DXFont* f_con; - }; - - class c_renderer { - private: - friend class features::c_chams; - - IDirect3DDevice9* m_device; - IDirect3DStateBlock9* m_block; - IDirect3DTexture9* m_chams; - IDirect3DTexture9* m_sil_txt; - IDirect3DVertexBuffer9* m_buffer; - IDirect3DSurface9* m_surface; - public: - ulong_t m_width; - ulong_t m_height; - - c_renderer( ) { }; - c_renderer( IDirect3DDevice9* device ); - ~c_renderer( ); - - void on_device_lost( ); - void on_device_reset( ); - auto get_device( ) { - return m_device; - } - - bool run_frame( IDirect3DDevice9* device ); - void begin( ); - void end( ); - - void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); - void draw_rect( clr_t color, int x, int y, int w, int h ); - void draw_filled_rect( clr_t color, int x, int y, int w, int h ); - void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); - void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); - void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); - - void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); - - template < FontAlign_t align = ALIGN_CENTER > - void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - draw_text( font, color, x, y, align, font_flags, buffer ); - } - - int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); - int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); - - private: - void invalidate_objects( ); - void create_objects( ); - }; - - extern d3d::d3d_fonts_t fonts; -} - -extern d3d::c_renderer g_d3d; - -#endif \ No newline at end of file diff --git a/internal_rewrite/d3d_sprite.cpp b/internal_rewrite/d3d_sprite.cpp deleted file mode 100644 index 8c26c37..0000000 --- a/internal_rewrite/d3d_sprite.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "d3d_sprite.hpp" - -std::vector< d3d::c_sprite* > d3d::sprites; - -namespace icons -{ - d3d::c_sprite sprite_legit; - d3d::c_sprite sprite_rage; - d3d::c_sprite sprite_visuals; - d3d::c_sprite sprite_misc; - d3d::c_sprite sprite_config; -} \ No newline at end of file diff --git a/internal_rewrite/d3d_sprite.hpp b/internal_rewrite/d3d_sprite.hpp deleted file mode 100644 index 3cf46a6..0000000 --- a/internal_rewrite/d3d_sprite.hpp +++ /dev/null @@ -1,158 +0,0 @@ -#pragma once -#include "d3d.hpp" -#include "console.hpp" - - -namespace d3d -{ - class c_sprite; - - extern std::vector< c_sprite* > sprites; - - class c_sprite { - public: - size_t m_width{ }; - size_t m_height{ }; - - IDirect3DDevice9* m_device{ }; - ID3DXSprite* m_sprite{ }; - IDirect3DTexture9* m_texture{ }; - const byte* m_image{ }; - size_t m_image_size{ }; - - - public: - c_sprite::c_sprite( ) { - sprites.push_back( this ); - } - - c_sprite::~c_sprite( ) { - on_reset( ); - } - - void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { - m_width = width; - m_height = height; - - m_device = device; - m_image = file; - m_image_size = img_size; - } - - void begin( IDirect3DDevice9* device ) { - m_device = device; - - if( !m_device ) { - return; - } - - if( !m_sprite ) - D3DXCreateSprite( m_device, &m_sprite ); - - if( !m_texture ) { - auto hr = D3DXCreateTextureFromFileInMemoryEx( - m_device, m_image, m_image_size, - m_width, m_height, D3DX_DEFAULT, 0, D3DFMT_A8B8G8R8, - D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, - 0, 0, &m_texture ); - } - - if( m_sprite ) - m_sprite->Begin( D3DXSPRITE_DONOTMODIFY_RENDERSTATE ); - } - - void end( ) { - if( !m_device || !m_sprite || !m_texture ) return; - m_sprite->End( ); - } - - void on_reset( ) { - if( m_sprite && m_device && m_texture ) { - m_sprite->OnLostDevice( ); - m_texture->Release( ); - m_texture = nullptr; - } - } - - void on_reset_end( ) { - if( m_sprite && m_device ) - m_sprite->OnResetDevice( ); - } - - void draw( int x, int y, clr_t color ) { - if( !m_device || !m_texture || !m_sprite ) { - return; - } - - const float scale = 0.8f; - - ulong_t - fill_mode, - adaptive_tess, - dest_blend, - cull, - stencil, - vertex_blend, - alpha_test; - - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, &fill_mode ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, &adaptive_tess ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, &dest_blend ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, &cull ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, &stencil ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, &vertex_blend ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, &alpha_test ); - - ulong_t mag_filter; - ulong_t min_filter; - m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, &mag_filter ); - m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, &min_filter ); - - m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC ); - m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC ); - - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, D3DFILL_SOLID ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, D3DCULL_NONE ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, D3DLINECAPS_ALPHACMP ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, D3DMULTISAMPLE_4_SAMPLES ); - - - ulong_t hr; - D3DXVECTOR2 center = D3DXVECTOR2( ( m_width * scale ) * 0.5f, ( m_height * scale ) * 0.5f ); - D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); - D3DXMATRIX matrix; - D3DXVECTOR2 scale_vec( scale, scale ); - D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale_vec, ¢er, 0.f, &trans ); - - hr = m_sprite->SetTransform( &matrix ); - - auto d3dcolor = D3DCOLOR_RGBA( color.r( ), - color.g( ), color.b( ), color.a( ) ); - hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); - - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, fill_mode ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, adaptive_tess ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, dest_blend ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, cull ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, stencil ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, vertex_blend ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, alpha_test ); - - m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, mag_filter ); - } - }; -} - -namespace icons -{ - extern d3d::c_sprite sprite_legit; - extern d3d::c_sprite sprite_rage; - extern d3d::c_sprite sprite_visuals; - extern d3d::c_sprite sprite_misc; - extern d3d::c_sprite sprite_config; -} \ No newline at end of file diff --git a/internal_rewrite/debug_show_spread.cpp b/internal_rewrite/debug_show_spread.cpp deleted file mode 100644 index 54da769..0000000 --- a/internal_rewrite/debug_show_spread.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" - -int __fastcall hooks::debug_show_spread_get_int( void* ecx_, void* edx_ ) { - static auto original_fn = g_csgo.m_debug_show_spread->get_old_function< decltype( &debug_show_spread_get_int ) >( 13 ); - - if( !g_settings.visuals.snipers_crosshair || !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) || g_ctx.m_local->m_bIsScoped( ) ) { - return original_fn( ecx_, 0 ); - } - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon || !weapon->is_sniper( ) ) { - return original_fn( ecx_, 0 ); - } - - return 3; -} \ No newline at end of file diff --git a/internal_rewrite/detours.cpp b/internal_rewrite/detours.cpp deleted file mode 100644 index a12520c..0000000 --- a/internal_rewrite/detours.cpp +++ /dev/null @@ -1,292 +0,0 @@ -#include "detours.h" -#include "hde32.h" - -// very MUCH comment i APPRECIATE cool - -memory::c_detours memory::detours; - -__forceinline static bool is_code_padding( uintptr_t address, size_t size ) -{ - uint8_t* code_ptr = (uint8_t*)address; - - if ( code_ptr[0] != 0x00 && code_ptr[0] != 0x90 && code_ptr[0] != 0xCC ) - return false; - - for ( int i = 1; i < size; ++i ) - { - if ( code_ptr[i] != code_ptr[0] ) - return false; - } - - return true; -} - -bool memory::c_detours::create_trampoline( detour_hook_t* hook ) -{ - if ( !hook->allocate_trampoline( ) ) - return false; - - instructions::long_jump_t call = { - 0xE8, - 0x00000000 - }; - - instructions::long_jump_t jmp = { - 0xE9, - 0x00000000 - }; - - instructions::JCC_REL jcc = { - 0x0F, 0x80, - 0x00000000 - }; - - uint8_t old_position = 0; - uint8_t new_position = 0; - uintptr_t jmp_dest = 0; - bool finished = false; - - hook->short_patch = false; - - const int max_instruction_boundaries = 8; - int instruction_boundaries = 0; - - do - { - hde32s hs; - uint8_t copy_size; - uintptr_t copy_src; - uintptr_t old_instruction = hook->m_original + old_position; - uintptr_t new_instruction = hook->m_trampoline + new_position; - - copy_size = hde32_disasm( (void*)old_instruction, &hs ); - if ( hs.flags & F_ERROR ) - return false; - - copy_src = old_instruction; - if ( old_position >= sizeof( instructions::long_jump_t ) ) - { - // the trampoline function is long enough. - // complete the function with the jump to the target function. - - jmp.opcode = 0xE9; - jmp.operand = (uint32_t)( old_instruction - ( new_instruction + sizeof( instructions::long_jump_t ) ) ); - copy_src = uintptr_t( &jmp ); - copy_size = sizeof( jmp ); - - finished = true; - } - else if ( hs.opcode == 0xE8 ) - { - // direct relative CALL - uintptr_t dest = old_instruction + hs.len + (int32_t)hs.imm.imm32; - - call.opcode = 0xE8; - call.operand = (uint32_t)( dest - ( new_instruction + sizeof( instructions::long_jump_t ) ) ); - - copy_src = uintptr_t( &call ); - copy_size = sizeof( call ); - } - else if ( ( hs.opcode & 0xFD ) == 0xE9 ) - { - // direct relative JMP (EB or E9) - uintptr_t dest = old_instruction + hs.len; - - if ( hs.opcode == 0xEB ) // short jmp - dest += (int8_t)hs.imm.imm8; - else - dest += (int32_t)hs.imm.imm32; - - // simply copy an internal jump. - if ( hook->m_original <= dest && dest < hook->m_original + sizeof( instructions::long_jump_t ) ) - { - if ( jmp_dest < dest ) - jmp_dest = dest; - } - else - { - jmp.operand = (uint32_t)( dest - ( new_instruction + sizeof( instructions::long_jump_t ) ) ); - - copy_src = uintptr_t( &jmp ); - copy_size = sizeof( instructions::long_jump_t ); - - // exit the function if it is not in the branch - finished = ( old_instruction >= jmp_dest ); - } - } - else if ( ( hs.opcode & 0xF0 ) == 0x70 || ( hs.opcode & 0xFC ) == 0xE0 || ( hs.opcode2 & 0xF0 ) == 0x80 ) - { - // direct relative JCC - uintptr_t dest = old_instruction + hs.len; - - if ( ( hs.opcode & 0xF0 ) == 0x70 // JCC - || ( hs.opcode & 0xFC ) == 0xE0 ) // LOOPNZ/LOOPZ/LOOP/JECXZ - dest += (int8_t)hs.imm.imm8; - else - dest += (int32_t)hs.imm.imm32; - - // simply copy an internal jump. - if ( (uintptr_t)hook->m_original <= dest && dest < ( (uintptr_t)hook->m_original + sizeof( instructions::long_jump_t ) ) ) - { - if ( jmp_dest < dest ) - jmp_dest = dest; - } - else if ( ( hs.opcode & 0xFC ) == 0xE0 ) - { - // LOOPNZ/LOOPZ/LOOP/JCXZ/JECXZ to the outside are not supported. - return false; - } - else - { - uint8_t cond = ( ( hs.opcode != 0x0F ? hs.opcode : hs.opcode2 ) & 0x0F ); - - jcc.opcode1 = 0x80 | cond; - jcc.operand = (uint32_t)( dest - ( new_instruction + sizeof( jcc ) ) ); - - copy_src = uintptr_t( &jcc ); - copy_size = sizeof( jcc ); - } - } - else if ( ( hs.opcode & 0xFE ) == 0xC2 ) - { - // RET (C2 or C3) - - // complete the function if not in a branch. - finished = ( old_instruction >= jmp_dest ); - } - - // can't alter the instruction length in a branch. - if ( old_instruction < jmp_dest && copy_size != hs.len ) - return false; - - // trampoline function is too large. - if ( new_position + copy_size > MEMORY_SLOT_SIZE ) - return false; - - // trampoline function has too many instructions. - if ( instruction_boundaries >= max_instruction_boundaries ) - return false; - - instruction_boundaries++; - - memcpy( (void*)( hook->m_trampoline + new_position ), (void*)copy_src, copy_size ); - - new_position += copy_size; - old_position += hs.len; - } - while ( !finished ); - - // can we do a regular 5 byte jmp patch? - if ( old_position < sizeof( instructions::long_jump_t ) && !is_code_padding( (uintptr_t)hook->m_original + old_position, sizeof( instructions::long_jump_t ) - old_position ) ) - { - // can we put 2 byte jmp patch? - if ( old_position < sizeof( instructions::short_jump_t ) && !is_code_padding( (uintptr_t)hook->m_original + old_position, sizeof( instructions::short_jump_t ) - old_position ) ) - return false; - - // can we put a 5 byte jmp patch above it? - if ( !is_code_padding( (uintptr_t)hook->m_original - sizeof( instructions::long_jump_t ), sizeof( instructions::long_jump_t ) ) ) - return false; - - hook->short_patch = true; - } - - return true; -} - -bool memory::c_detours::set_hook( detour_hook_t* hook, bool enable ) -{ - // hook is already in place silly - if ( hook->enabled == enable ) - return true; - - if ( enable ) - { - if ( hook->short_patch ) - { - uint8_t* target = (uint8_t*)( hook->m_original - sizeof( instructions::long_jump_t ) ); - - // prepare patch - instructions::short_patch_t jmp_patch; - jmp_patch.jmp.opcode = 0xE9; - jmp_patch.jmp.operand = (uint32_t)( hook->m_custom - hook->m_original - sizeof( instructions::long_jump_t ) ); - - jmp_patch.jmp_short.opcode = 0xEB; - jmp_patch.jmp_short.operand = (uint8_t)( 0 - sizeof( instructions::short_patch_t ) ); - - // overwrite protection - DWORD original_protection; - VirtualProtect( target, sizeof( instructions::short_patch_t ), PAGE_EXECUTE_READWRITE, &original_protection ); - - // place hook - memcpy( target, &jmp_patch, sizeof( instructions::short_patch_t ) ); - - // restore protection - VirtualProtect( target, sizeof( instructions::short_patch_t ), original_protection, &original_protection ); - - // let cpu know we altered code - FlushInstructionCache( GetCurrentProcess( ), target, sizeof( instructions::short_patch_t ) ); - } - else - { - // prepare patch - instructions::long_jump_t jmp_patch; - jmp_patch.opcode = 0xE9; - jmp_patch.operand = (uint32_t)( hook->m_custom - hook->m_original - sizeof( instructions::long_jump_t ) ); - - // overwrite protection - DWORD original_protection; - VirtualProtect( (void*)hook->m_original, sizeof( instructions::long_jump_t ), PAGE_EXECUTE_READWRITE, &original_protection ); - - // place hook - memcpy( (void*)hook->m_original, &jmp_patch, sizeof( instructions::long_jump_t ) ); - - // restore protection - VirtualProtect( (void*)hook->m_original, sizeof( instructions::long_jump_t ), original_protection, &original_protection ); - - // let cpu know we altered code - FlushInstructionCache( GetCurrentProcess( ), (void*)hook->m_original, sizeof( instructions::long_jump_t ) ); - } - - - } - else - { - if ( hook->short_patch ) - { - uint8_t* target = (uint8_t*)( hook->m_original - sizeof( instructions::long_jump_t ) ); - - // overwrite protection - DWORD original_protection; - VirtualProtect( target, sizeof( instructions::short_patch_t ), PAGE_EXECUTE_READWRITE, &original_protection ); - - // restore backup - memcpy( target, hook->m_original_bytes, sizeof( instructions::short_patch_t ) ); - - // restore protection - VirtualProtect( target, sizeof( instructions::short_patch_t ), original_protection, &original_protection ); - - // let cpu know we altered code - FlushInstructionCache( GetCurrentProcess( ), target, sizeof( instructions::short_patch_t ) ); - } - else - { - uint8_t* target = (uint8_t*)hook->m_original; - - // overwrite protection - DWORD original_protection; - VirtualProtect( target, sizeof( instructions::long_jump_t ), PAGE_EXECUTE_READWRITE, &original_protection ); - - // restore backup - memcpy( target, hook->m_original_bytes, sizeof( instructions::long_jump_t ) ); - - // restore protection - VirtualProtect( target, sizeof( instructions::long_jump_t ), original_protection, &original_protection ); - - // let cpu know we altered code - FlushInstructionCache( GetCurrentProcess( ), target, sizeof( instructions::long_jump_t ) ); - } - } - - hook->enabled = enable; - return true; -} \ No newline at end of file diff --git a/internal_rewrite/detours.h b/internal_rewrite/detours.h deleted file mode 100644 index d4998b5..0000000 --- a/internal_rewrite/detours.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include -#include -#include - -#define MEMORY_SLOT_SIZE 64 - -namespace memory -{ - namespace instructions - { -// we're dealing with opcodes, align by 1 byte -#pragma pack(push, 1) - struct short_jump_t - { - uint8_t opcode{ }; - uint8_t operand{ }; - }; - - struct long_jump_t - { - uint8_t opcode{ }; - uint32_t operand{ }; - }; - - struct short_patch_t - { - long_jump_t jmp{ }; - short_jump_t jmp_short{ }; - }; - - struct JCC_REL - { - uint8_t opcode0{ }; - uint8_t opcode1{ }; - uint32_t operand{ }; - }; -#pragma pack(pop) - } - - struct detour_hook_t - { - bool enabled{ }; - bool short_patch{ }; - - uintptr_t m_original{ }; - uintptr_t m_custom{ }; - uintptr_t m_trampoline{ }; - - uint8_t m_original_bytes[8]{ }; - - bool allocate_trampoline( ) - { - if ( m_trampoline ) - return false; - - m_trampoline = (uintptr_t)VirtualAlloc( nullptr, MEMORY_SLOT_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE ); - memset( (void*)m_trampoline, 0, MEMORY_SLOT_SIZE ); - - return m_trampoline; - } - - void restore( ) - { - if ( m_trampoline ) - { - VirtualFree( (void*)m_trampoline, MEMORY_SLOT_SIZE, MEM_RELEASE ); - m_trampoline = 0; - } - } - }; - - class c_detours - { - std::vector m_hooks; - - static bool create_trampoline( detour_hook_t* hook ); - - detour_hook_t* find_hook( uintptr_t custom_func ) - { - detour_hook_t* hook = nullptr; - - for ( auto& m_hook : m_hooks ) - { - if ( m_hook.m_custom == custom_func ) - { - return &m_hook; - } - } - - return nullptr; - } - - bool set_hook( detour_hook_t* hook, bool enable ); - - bool set_hook( uintptr_t custom_func, bool enable ) - { - detour_hook_t* hook = find_hook( custom_func ); - - if ( hook ) - return set_hook( hook, enable ); - - return false; - } - - public: - - template < typename fn = uintptr_t > - fn create_hook( fn custom_func, void* original_func ) - { - detour_hook_t hook; - hook.m_original = uintptr_t( original_func ); - hook.m_custom = intptr_t( custom_func ); - - if ( create_trampoline( &hook ) ) - { - if ( hook.short_patch ) - memcpy( hook.m_original_bytes, (void*)( hook.m_original - sizeof( instructions::long_jump_t ) ), sizeof( instructions::short_patch_t ) ); - else - memcpy( hook.m_original_bytes, (void*)( hook.m_original ), sizeof( instructions::long_jump_t ) ); - -#ifdef _DEBUG - printf( " $> prepared hook [ original: 0x%08x ] [ custom: 0x%08x ] [ short jmp: %d ] \n", uintptr_t( original_func ), uintptr_t( custom_func ), hook.short_patch ); -#endif - - m_hooks.push_back( hook ); - return (fn)hook.m_trampoline; - } -#ifdef _DEBUG - printf( " $> FAILED TO HOOK [ original: 0x%08x ] [ custom: hook 0x%08x ] \n", uintptr_t( original_func ), uintptr_t( custom_func ) ); -#endif - return (fn)0; - } - - void enable( ) - { - for ( auto& hook : m_hooks ) - set_hook( &hook, true ); - } - - void restore( ) - { - for ( auto& hook : m_hooks ) - { - set_hook( &hook, false ); - hook.restore( ); - } - - m_hooks.clear( ); - } - - template < typename fn = uintptr_t > - fn original( void* custom_func ) - { - auto hook = find_hook( (uintptr_t)custom_func ); - - if ( hook ) - return (fn)hook->m_trampoline; - - return (fn)0; - } - }; extern c_detours detours; -} - diff --git a/internal_rewrite/directx.cpp b/internal_rewrite/directx.cpp deleted file mode 100644 index fa40fb3..0000000 --- a/internal_rewrite/directx.cpp +++ /dev/null @@ -1,256 +0,0 @@ -#include -#include - -#include "settings.hpp" -#include "hooks.hpp" -#include "ui.h" -#include "base_cheat.hpp" -#include "context.hpp" -#include "mem.hpp" - -using namespace d3d; - -float ui::get_csgo_frametime( ) { - return g_csgo.m_frametime; -} - -float ui::anim_time; - -void on_d3d( IDirect3DDevice9* device ) { - constexpr float step = 1.0f / 2.f; - constexpr float fade_step = 1.0f / 7.f; - static float anim_time{ }; - static bool flip{ }; - static int anim_progress{ }; - - static bool sprites_init{ }; - if( !sprites_init ) { - ui::setup_sprites( device ); - sprites_init = true; - } - - if( g_settings.misc.hide_from_obs ) - g_cheat.m_visuals( ); - - if( g_settings.menu.open ) { - if( anim_time >= 0.95f ) { - flip = true; - } - if( anim_time <= 0.05f ) { - flip = false; - } - - if( flip ) - anim_time -= fade_step * ui::ui_get_frametime( ); - else - anim_time += fade_step * ui::ui_get_frametime( ); - - anim_time = std::clamp( anim_time, 0.f, 1.0f ); - - ui::set_animtime( anim_time ); - - anim_progress += ui::ui_get_frametime( ) * step * 255; - anim_progress = std::clamp( anim_progress, 0, 50 ); - g_d3d.draw_filled_rect( clr_t( 0, 0, 0, anim_progress ), - 0, 0, g_d3d.m_width, g_d3d.m_height ); - - ui::render( ); - } - else { - anim_progress = 0; - } -} - -long __stdcall hooks::d3d::draw( IDirect3DDevice9* device, D3DPRIMITIVETYPE type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { - return 0; - /*static auto draw_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); - - static auto ret_addr = pattern::first_code_match( GetModuleHandleA( xors( "studiorender.dll" ) ), xors( "EB 1F FF 75 F0" ), -8 ); - - std::function< void*( void** ) > find_ent; - find_ent = [ & ]( void** ebp ) -> void* { - if( !ebp ) - return nullptr; - - void** next = *( void*** )( ebp ); - if( ( uintptr_t )( ebp[ 1 ] ) == ret_addr ) - return next[ 4 ]; - - return find_ent( next ); - }; - - c_base_player* ent = ( c_base_player* )( find_ent( ( void** )( get_baseptr( ) ) ) ); - if( g_ctx.m_local && !!ent && ent->m_iHealth( ) > 0 && ent->m_iTeamNum( ) > 1 && g_settings.visuals.chams.enabled( ) && g_settings.misc.hide_from_obs ) { - g_cheat.m_chams.d3d_render_chams( ent, type, v_index, min_index, num_vert, start_index, prim_count ); - return true; - } - - auto result = draw_o( device, type, v_index, min_index, num_vert, start_index, prim_count ); - return result;*/ -} - -long __stdcall hooks::d3d::end_scene( IDirect3DDevice9* device ) { - static auto end_scene_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::end_scene ) >( 42 ); - if ( g_csgo.m_panic ) return end_scene_o( device ); - - static uintptr_t return_address = 0; - static uintptr_t gameoverlay_return_address = 0; - - g_csgo.m_d3d_thread = std::this_thread::get_id( ); - - if( !return_address ) { - return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( !gameoverlay_return_address ) { - MEMORY_BASIC_INFORMATION info; - VirtualQuery( _ReturnAddress( ), &info, sizeof( MEMORY_BASIC_INFORMATION ) ); - - char mod[ MAX_PATH ]; - GetModuleFileNameA( ( HMODULE )info.AllocationBase, mod, MAX_PATH ); - - if( strstr( mod, xors( "gameoverlay" ) ) ) - gameoverlay_return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( return_address != ( uintptr_t )( _ReturnAddress( ) ) && !g_settings.misc.hide_from_obs ) - return end_scene_o( device ); - - if( gameoverlay_return_address != ( uintptr_t )( _ReturnAddress( ) ) && g_settings.misc.hide_from_obs ) - return end_scene_o( device ); - - if( !g_csgo.m_panic && g_d3d.run_frame( device ) ) { - for( auto& it : ::d3d::sprites ) - it->begin( device ); - g_d3d.begin( ); - - //if( g_settings.misc.hide_from_obs ) - //g_cheat.m_chams.d3d_render_textures( ); - - on_d3d( device ); - - std::chrono::high_resolution_clock timer; - static auto last = timer.now( ); - auto now = timer.now( ); - - std::chrono::duration< double > delta = now - last; - last = timer.now( ); - - g_csgo.m_frametime = delta.count( ); - - if( !g_con->m_logs.empty( ) && g_settings.menu.logs_enable ) { - auto& logs = g_con->m_logs; - float time = ( float )GetTickCount( ) * 0.001f; - - auto data = logs.data( ); - - int cur_pos = 2; - for( int i = logs.size( ) - 1; i >= 0; --i ) { - if( cur_pos > g_d3d.m_height - 200 ) { - cur_pos -= 8; - break; - } - - float delta = time - data[ i ].m_time; - if( delta >= 5.0f ) { - break; - } - - clr_t col( 255, 255, 255 ); - if( delta > 4.f ) col.a( ) *= ( 6.f - delta ); - - g_d3d.draw_text< ALIGN_RIGHT >( fonts.f_con, col, g_d3d.m_width - 5, cur_pos, D3DFONTFLAG_DROPSHADOW, data[ i ].m_msg ); - cur_pos += 10; - } - } - - if( g_settings.menu.open || g_con->m_open ) { - ui::ui_draw_cursor( ); - } - - for( auto& it : ::d3d::sprites ) - it->end( ); - g_d3d.end( ); - } - - return end_scene_o( device ); -} - -long __stdcall hooks::d3d::present( IDirect3DDevice9* device, RECT* source, RECT* dest, HWND wnd_override, RGNDATA* reg ) { - static auto present_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::present ) >( 17 ); - - static uintptr_t return_address = 0; - if( !return_address ) { - return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( return_address && return_address != ( uintptr_t )( _ReturnAddress( ) ) ) - return present_o( device, source, dest, wnd_override, reg ); - - if( g_d3d.run_frame( device ) ) { - g_d3d.begin( ); - if( g_settings.misc.watermark ) { - static std::string date; - std::string str; - -#ifdef _DEBUG - static bool transformed = false; - if( !transformed ) { - date += __DATE__; - std::transform( date.begin( ), date.end( ), date.begin( ), - [ ]( char c ) { return ::tolower( c ); } ); - - transformed = true; - } -#endif - - str = xors( "moneybot | " ); - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - char latency_str[ 32 ]; - strenc::w_sprintf_s( latency_str, 32, xors( "lt: %1.2f + %1.2f | " ), nci->GetLatency( 0 ), nci->GetLatency( 1 ) ); - str += latency_str; - } - else { - str += xors( "unconnected | " ); - } - -#ifdef _DEBUG - str += date; -#else - str += g_header.username; -#endif - - g_d3d.draw_text< ALIGN_RIGHT >( ::d3d::fonts.f_menu, - ui::ui_get_text_col( ), g_d3d.m_width - 10, 8, - D3DFONTFLAG_DROPSHADOW, str.c_str( ) ); - } - - g_con->draw( ); - if( ( g_settings.menu.open || g_con->m_open ) && !g_settings.misc.hide_from_obs ) { - ui::ui_draw_cursor( ); - } - g_d3d.end( ); - } - - return present_o( device, source, dest, wnd_override, reg ); -} - -long __stdcall hooks::d3d::reset( IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params ) { - static auto reset_o = g_csgo.m_d3d->get_old_function< decltype( &hooks::d3d::reset ) >( 16 ); - if ( g_csgo.m_panic ) { - return reset_o( device, params ); - } - - for( auto& sprite : ::d3d::sprites ) - sprite->on_reset( ); - - g_d3d.on_device_lost( ); - long result = reset_o( device, params ); - g_d3d.on_device_reset( ); - - for( auto& sprite : ::d3d::sprites ) - sprite->on_reset_end( ); - - return result; -} \ No newline at end of file diff --git a/internal_rewrite/do_post_screen_space_effects.cpp b/internal_rewrite/do_post_screen_space_effects.cpp deleted file mode 100644 index 1cdd00c..0000000 --- a/internal_rewrite/do_post_screen_space_effects.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -bool __fastcall hooks::do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ) { - static auto old_fn = do_post_screen_space_effects_o; - - g_ctx.m_drawing_postscreenspace = true; - if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.m_local ) { - g_cheat.m_visuals.update_glow( ); - } - - bool ret = old_fn( ecx_, 0, setup ); - g_ctx.m_drawing_postscreenspace = false; - - return ret; -} \ No newline at end of file diff --git a/internal_rewrite/draw_model_execute.cpp b/internal_rewrite/draw_model_execute.cpp deleted file mode 100644 index 49825f6..0000000 --- a/internal_rewrite/draw_model_execute.cpp +++ /dev/null @@ -1,140 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" -#include "util.hpp" -#include "settings.hpp" -//this is so ugly dont even look at it - -//gets called once per frame for every entity -void __fastcall hooks::draw_model_execute( IVModelRender* ecx_, void* edx_, - void* render_ctx, const DrawModelState_t& state, - const ModelRenderInfo_t& info, matrix3x4* bone_to_world ) { - static auto dme_o = draw_model_execute_o; - - if( g_csgo.m_panic || g_ctx.m_drawing_postscreenspace || g_settings.misc.hide_from_obs ) - return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - - bool draw = true; - IMaterial* mat = g_settings.visuals.chams.flat( ) ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; - auto model_name = g_csgo.m_model_info( )->GetModelName( info.m_model ); - auto local_index = g_csgo.m_engine( )->GetLocalPlayer( ); - int local_team = 0; - if( g_ctx.m_local ) - local_team = g_ctx.m_local->m_iTeamNum( ); - int team = 0; - bool is_player = false; - - //printf( "model: %s\n", model_name ); - - if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index == local_index ) { - if( g_settings.misc.thirdperson( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) - && g_ctx.m_local->m_bIsScoped( ) ) { - float clr[ ] = { 1.0f, 1.0f, 1.0f }; - g_csgo.m_render_view( )->SetColorModulation( clr ); - g_csgo.m_render_view( )->SetBlend( 0.3f ); - return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - } - } - - if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index ) { - auto player = g_csgo.m_entlist( )->GetClientEntity< >( info.m_entity_index ); - - if( player && player->is_valid( ) && !player->m_bGunGameImmunity( ) ) { - is_player = true; - team = player->m_iTeamNum( ); - - if( g_settings.rage.active && ( team != local_team || g_settings.rage.friendlies ) && !player->has_valid_anim( ) ) - return; - - if( is_player ) { - bool should_draw = false; - if( g_settings.rage.enabled( ) && g_settings.rage.resolver( ) && g_settings.rage.bt_visualize( ) && ( team != local_team || g_settings.rage.friendlies( ) ) ) - should_draw = true; - if( g_settings.legit.enabled( ) && g_settings.legit.backtracking_visualize( ) && ( team != local_team || g_settings.rage.friendlies( ) ) ) - should_draw = true; - - - if( should_draw ) { - matrix3x4 render_matrix[ 128 ]; - - if( g_cheat.m_ragebot.m_lagcomp->get_render_record( info.m_entity_index, render_matrix ) ) { - fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); - - float backup_modulation[ 3 ]{ }; - bool backup_ignorez = false; - bool wanted_ignorez = g_settings.visuals.chams.ignore_z( ); - float backup_blend = 1.0f; - - backup_blend = g_csgo.m_render_view( )->GetBlend( ); - g_csgo.m_render_view( )->GetColorModulation( backup_modulation ); - - //BIG ROFL - if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) - && backup_blend == clr_hid.a( ) ) { - backup_ignorez = true; - } - - if( backup_ignorez == wanted_ignorez || ( !backup_ignorez && !g_settings.visuals.chams.clear_occlusion( ) ) || !g_settings.visuals.chams.enabled( ) ) { - auto flat_mat = g_cheat.m_chams.m_materials.m_chams_flat.m_mat; - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); - - clr_t bt_col = g_settings.legit.enabled( ) ? g_settings.legit.backtracking_col( ) : g_settings.rage.bt_col( ); - - g_cheat.m_chams.m_materials.force_material( g_cheat.m_chams.m_materials.m_chams_flat, bt_col ); - - dme_o( ecx_, edx_, render_ctx, state, info, render_matrix ); - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, backup_ignorez ); - } - - g_csgo.m_render_view( )->SetBlend( backup_blend ); - g_csgo.m_render_view( )->SetColorModulation( backup_modulation ); - g_csgo.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && - ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); - - if( draw ) { - //dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - //draw = false; - } - } - } - } - - if( g_settings.visuals.chams.enabled ) { - if( g_settings.visuals.chams.ignore_z && !g_ctx.m_drawing_screneend && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) && g_settings.visuals.chams.clear_occlusion ) - draw = false; - else if( ( !g_settings.visuals.chams.ignore_z || !g_settings.visuals.chams.clear_occlusion ) && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) { - fclr_t clr = team != local_team ? g_settings.visuals.chams.color_visible_enemy( ) : g_settings.visuals.chams.color_visible_friendly( ); - - if( g_settings.visuals.chams.ignore_z ) { - fclr_t clr = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ) : g_settings.visuals.chams.color_hidden_friendly( ); - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); - g_cheat.m_chams.m_materials.force_material( mat, clr ); - dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); - } - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - g_cheat.m_chams.m_materials.force_material( mat, clr ); - dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); - - g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); - g_csgo.m_render_view( )->SetBlend( 1.0f ); - draw = false; - } - } - - } - } - - if( g_settings.misc.transparent_vm && strstr( model_name, xors( "weapon" ) ) ) { - if( strstr( model_name, xors( "arms" ) ) ) { - g_csgo.m_render_view( )->SetBlend( 0.6f ); - } - } - - if( draw ) { - dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); - } - - g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); -} \ No newline at end of file diff --git a/internal_rewrite/draw_small_entities.cpp b/internal_rewrite/draw_small_entities.cpp deleted file mode 100644 index 2f88c74..0000000 --- a/internal_rewrite/draw_small_entities.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include - -#include "hooks.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "base_cheat.hpp" - -void __fastcall hooks::draw_small_entities( void* ecx, void* edx, bool state ) { - -#ifdef HEADER_MODULE - static auto ret_addr = g_header.patterns.draw_small_entities_retaddr + 6; -#else - static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_chl.dll( ), "FF 90 ? ? ? ? FF 15 ? ? ? ? 84 C0 74 28", 6 ); -#endif - - // please shoot me - // i have given up - // i want to leave - if( _ReturnAddress( ) == (void*)ret_addr ) { - g_ctx.m_stage = FRAME_RENDER_END; - g_cheat.m_visuals.world_modulate( ); - - //g_con->game_console_print( "render end\n" ); - // FRAME_RENDER_END - g_cheat.m_ragebot.m_lagcomp->store_visuals( ); - g_cheat.m_chams.m_materials.update_materials( ); - g_cheat.m_extra.no_recoil( true ); - } - - draw_small_entities_o( ecx, edx, state ); -} \ No newline at end of file diff --git a/internal_rewrite/emit_sound.cpp b/internal_rewrite/emit_sound.cpp deleted file mode 100644 index 13ae28a..0000000 --- a/internal_rewrite/emit_sound.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "base_cheat.hpp" -#include "hooks.hpp" -#include "settings.hpp" - -/*void __fastcall hooks::emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, - const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, - const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ) { - static auto emit_sound_o = g_csgo.m_engine_sound->get_old_function< decltype( &hooks::emit_sound ) >( 5 ); - - if( !g_csgo.m_panic && origin ) { - auto entity = g_csgo.m_entlist( )->GetClientEntity< >( ent ); - if( entity && entity->is_player( ) && entity->ce( )->IsDormant( ) && - ent >= 0 && ent <= 64 ) - g_cheat.m_visuals.update_position( ent, *origin ); - } - - if( strstr( sample, xors( "weapon" ) ) && g_settings.misc.no_sound ) - volume = 0.f; - - if( ( strstr( sample, xors( "player/footsteps" ) ) || strstr( sample, xors( "player/land" ) ) ) && origin && g_settings.visuals.sound ) { - g_cheat.m_visuals.store_sound( ent, *origin ); - } - - emit_sound_o( ecx_, 0, filter, ent, channel, sound, hash, sample, - volume, attenuation, seed, flags, pitch, origin, direction, - origins, update_pos, sound_time, speaker_entry ); -}*/ \ No newline at end of file diff --git a/internal_rewrite/end_lock.cpp b/internal_rewrite/end_lock.cpp deleted file mode 100644 index ee81d7a..0000000 --- a/internal_rewrite/end_lock.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include - -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::end_lock( void* ecx, void* edx ) { // THIS IS PROLLY NOT ENDLOCK, BUT WHATEVER - - - // signature: - // search "CL_CallPostDataUpdates: missing ent %d" in engine.dll. - // where framestagenotify gets called - static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_engine.dll( ), "FF 50 18 FF 75 F0", 0x27 ); - if( _ReturnAddress( ) == ret_addr ) { - g_ctx.m_stage = FRAME_NET_UPDATE_POSTDATAUPDATE_END; - g_cheat.m_visuals.world_modulate( ); - - //g_con->game_console_print( "net postdataupdate end\n" ); - } - - end_lock_o( ecx, edx ); -} \ No newline at end of file diff --git a/internal_rewrite/extra.cpp b/internal_rewrite/extra.cpp deleted file mode 100644 index 2408e7f..0000000 --- a/internal_rewrite/extra.cpp +++ /dev/null @@ -1,327 +0,0 @@ -#include "base_cheat.hpp" -#include "context.hpp" -#include "input_system.hpp" -#include "math.hpp" -#include "hooks.hpp" -#include "interface.hpp" -#include "detours.h" -#undef min - - -namespace features -{ - void c_extra::rank_reveal( user_cmd_t* ucmd ) { - if( !( ucmd->m_buttons & IN_SCORE ) || !g_settings.misc.rank_reveal( ) ) return; - - vec3_t a{ }; //stop this - static uintptr_t show_rank_addr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 8B 0D ? ? ? ? 68" ) ); - //reinterpret_cast( show_rank_addr )( &a ); - - } - - void c_extra::thirdperson( ) { - if( !g_ctx.m_local ) - return; - - static bool enabled = false; - static bool toggle = true; - static bool key_held = false; - - - if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.thirdperson_key( ) ) ) { - if( !key_held ) { - toggle ^= 1; - } - key_held = true; - } - else { - key_held = false; - } - - if( !g_settings.misc.thirdperson || !toggle ) { - if( enabled ) { - g_csgo.m_input( )->m_fCameraInThirdPerson = false; - enabled = false; - } - - return; - } - - vec3_t viewangles{ }; - if( g_ctx.m_local->is_alive( ) ) { - g_csgo.m_engine( )->GetViewAngles( viewangles ); - g_csgo.m_input( )->m_fCameraInThirdPerson = true; - g_csgo.m_input( )->m_vecCameraOffset = vec3_t( viewangles.x, viewangles.y, 150.0f ); - - constexpr float cam_hull_offset{ 16.f }; - - const vec3_t cam_hull_min( -cam_hull_offset, -cam_hull_offset, -cam_hull_offset ); - const vec3_t cam_hull_max( cam_hull_offset, cam_hull_offset, cam_hull_offset ); - vec3_t cam_forward, origin = g_ctx.m_local->get_eye_pos( ); - - cam_forward = math::angle_vectors( vec3_t( viewangles.x, viewangles.y, 0.f ) ); - - CTraceFilterWorldAndPropsOnly filter; - Ray_t ray; - CGameTrace tr; - - ray.Init( origin, origin - ( cam_forward * 150.f ), cam_hull_min, cam_hull_max ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, &tr ); - g_csgo.m_input( )->m_vecCameraOffset.z = 150.f * tr.fraction; - - enabled = true; - } - else if( g_csgo.m_entlist( )->GetClientEntityFromHandle< >( g_ctx.m_local->m_hObserverTarget( ) ) ) { - g_csgo.m_input( )->m_fCameraInThirdPerson = false; - g_ctx.m_local->m_iObserverMode( ) = 5; - } - } - - void c_extra::update_netchannel( ) { - - } - - void c_extra::add_latency( INetChannel* channel ) { - if ( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - float in_latency = nci->GetLatency( 0 ); - - //arbitrary number much - float latency = 0.15f - ( in_latency + g_csgo.m_globals->m_frametime ) - TICK_INTERVAL( ); - - if( g_settings.misc.net_fakeping_active && latency > 0.f ) { - channel->m_nInSequenceNr += 2 * 64 - ( 63 * latency ); - } - } - } - - void c_extra::no_recoil( user_cmd_t* cmd ) { - if( !g_settings.misc.no_recoil( ) ) - return; - - if( g_ctx.m_local && g_ctx.m_local->is_alive( ) ) { - static auto weapon_recoil_scale = g_csgo.m_cvar( )->FindVar( xors( "weapon_recoil_scale" ) ); - cmd->m_viewangles -= g_ctx.m_local->m_aimPunchAngle( true ) * weapon_recoil_scale->get_float( ); - cmd->m_viewangles.y = std::remainderf( cmd->m_viewangles.y, 360.f ); - } - } - - void c_extra::rich_presence_flex( ) { - g_csgo.m_steam_friends( )->set_rich_presence( "game:mode", "competitive" ); - g_csgo.m_steam_friends( )->set_rich_presence( "game:mapgroupname", "mg_active" ); - g_csgo.m_steam_friends( )->set_rich_presence( "game:score", "moneybot.cc" ); - } - - void c_extra::remove_rich_presence_flex( ) { - g_csgo.m_steam_friends( )->clear_rich_presence( ); - } - - // I am so, so, so, so sorry. - void c_extra::money_talk( IGameEvent *evt ) { - static float last_time = 0.0f; - - if ( !g_csgo.m_engine( )->IsConnected( ) || !g_csgo.m_engine( )->IsInGame( ) ) { - last_time = 0.0f; - } - - if ( !g_settings.misc.money_talk( ) ) - return; - - if ( evt && !strcmp( evt->GetName( ), xors( "player_death" ) ) ) { - const int player = g_csgo.m_engine( )->GetPlayerForUserID( evt->GetInt( xors( "attacker" ) ) ); - - if ( player == g_csgo.m_engine( )->GetLocalPlayer( ) ) { - if ( last_time <= g_csgo.m_globals->m_curtime ) { - g_csgo.m_engine( )->ClientCmd( xors( "say god i wish i had moneybot" ) ); - - last_time = g_csgo.m_globals->m_curtime + 0.1f; - } - } - } - } - - void c_extra::no_recoil( bool original ) { - static bool restore = false; - static vec3_t punch{ }; - static vec3_t view_punch{ }; - - if( !g_settings.misc.no_recoil( ) || !g_ctx.m_local || !g_ctx.m_local->is_alive( ) ) - return; - - if( !original ) { - punch = g_ctx.m_local->m_aimPunchAngle( true ); - view_punch = g_ctx.m_local->m_viewPunchAngle( ); - - g_ctx.m_local->m_aimPunchAngle( true ) = vec3_t( ); - g_ctx.m_local->m_viewPunchAngle( ) = vec3_t( ); - - restore = true; - } - - if( original && restore ) { - g_ctx.m_local->m_aimPunchAngle( true ) = punch; - g_ctx.m_local->m_viewPunchAngle( ) = view_punch; - - restore = false; - } - } - - void c_extra::auto_revolver( user_cmd_t* cmd ) { - if( !g_settings.misc.auto_revolver ) return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) return; - - int def_index = weapon->m_iItemDefinitionIndex( ); - if( def_index != WEAPON_R8REVOLVER ) return; - - static float next_time = 0.f; - - auto time = g_ctx.pred_time( ); - auto primaryattack = weapon->m_flNextPrimaryAttack( ); - auto nextattack = g_ctx.m_local->m_flNextAttack( ); - - if( primaryattack < time && nextattack < time ) { - if( next_time >= time ) { - g_ctx.m_revolver_shot = false; - cmd->m_buttons |= IN_ATTACK; - } - else { - next_time = time + 0.234375f; - g_ctx.m_revolver_shot = true; - } - } - else { - g_ctx.m_revolver_shot = false; - next_time = time + 0.234375f; - } - } - - void c_extra::no_flash( ) { - static bool once = false; - - - if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { - return; - } - - if( !g_settings.misc.no_flash ) { - if( once ) { - g_ctx.m_local->m_flMaxFlashAlpha( ) = 255.f; - } - return; - } - - once = true; - - if( g_ctx.m_local->m_flFlashDuration( ) ) - g_ctx.m_local->m_flMaxFlashAlpha( ) = std::numeric_limits< float >::min( ); - } - - //this is not how it works - void c_extra::disable_post_processing( ) { - static auto var = g_csgo.m_cvar( )->FindVar( xors( "mat_postprocess_enable" ) ); - var->m_flags |= 0; - var->set_value( !g_settings.misc.disable_post_process( ) ); - } - - void c_extra::float_ragdolls( ) { - static bool once = true;; - static auto var = g_csgo.m_cvar( )->FindVar( xors( "cl_ragdoll_gravity" ) ); - - if( !g_settings.visuals.floating_ragdolls ) { - if( !once ) { - var->set_value( 600 ); - } - once = true; - return; - } - - once = false; - var->m_flags |= 0; - var->set_value( -100 ); - } - - /*void c_extra::print_overwatch_info( ) { - for( int i{}; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); - if( !ent->is_player( ) ) - continue; - - g_csgo.m_cvar( )->ConsolePrintf( "name: " ); - g_csgo.m_cvar( )->ConsolePrintf( "userid: " ); - g_csgo.m_cvar( )->ConsolePrintf( "steam3: " ); - g_csgo.m_cvar( )->ConsolePrintf( "steam64: " ); - g_csgo.m_cvar( )->ConsolePrintf( "steam community link: " ); - g_csgo.m_cvar( )->ConsolePrintf( "rank: " ); - g_csgo.m_cvar( )->ConsolePrintf( "wins: " ); - } - }*/ - - void c_extra::no_smoke( ) { - static bool set = false; - static bool last_setting = g_settings.misc.no_smoke; - if( !g_ctx.m_local || !g_csgo.m_engine( )->IsInGame( ) ) { - last_setting = !g_settings.misc.no_smoke; - return; - } - - if( g_settings.misc.no_smoke || last_setting != g_settings.misc.no_smoke ) { - if( g_ctx.m_local && g_csgo.m_engine( )->IsInGame( ) ) { - static auto v_smoke_smokegrenade = g_csgo.m_mat_system( )->FindMaterial( xors( "particle\\vistasmokev1\\vistasmokev1_smokegrenade" ) ); - bool draw = g_settings.misc.no_smoke( ); - - if( v_smoke_smokegrenade ) - v_smoke_smokegrenade->SetMaterialVarFlag( MATERIAL_VAR_NO_DRAW, draw ); - } - } - - last_setting = g_settings.misc.no_smoke; - } - - void c_extra::server_information( ) { -/* if( !g_settings.misc.server_information( ) ) - return; - - auto lobby = g_csgo.m_mm( )->GetMatchSession( ); - if( !lobby ) - return; - - auto info = lobby->GetSessionSettings( ); - if( !info ) - return; - - auto q = info->get_string( xors( "game/mmqueue" ), xors( "no queue!" ) ); - if( !q || strcmp( q, xors( "reserved" ) ) ) - return; - - auto map = info->get_string( xors( "game/map" ), xors( "no map!" ) ); - if( !map ) - return; - - auto location = info->get_string( xors( "game/loc" ), xors( "no location!" ) ); - - g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "\n-----------------------\n" ) ); - g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "map: %s\n" ), map ); - g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "location: %s" ), location ); - g_csgo.m_cvar( )->ConsoleColorPrintf( clr_t( 231, 105, 105 ), xors( "\n-----------------------\n" ) ); - */ - } - - void c_extra::unlock_hidden_cvars( ) { - // Wouldn't this get you untrusted? - if ( g_settings.menu.anti_untrusted ) - return; - - auto it = g_csgo.m_cvar( )->FactoryInternalIterator( ); // genius code. list of cvars unlocked at https://github.com/saul/csgo-cvar-unhide/blob/master/cvarlist.md - for( it->SetFirst( ); it->IsValid( ); it->Next( ) ) { - auto cvar = ( cvar_t* )it->Get( ); - if( cvar ) { - cvar->m_flags &= ~FCVAR_HIDDEN; - cvar->m_flags &= ~FCVAR_DEVELOPMENTONLY; - } - } - } -} \ No newline at end of file diff --git a/internal_rewrite/extra.hpp b/internal_rewrite/extra.hpp deleted file mode 100644 index 7f0ac98..0000000 --- a/internal_rewrite/extra.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include -#include - -namespace features -{ - class c_extra { - bool m_fire_next{ }; - - public: - void rank_reveal( user_cmd_t* ucmd ); - void thirdperson( ); - - void update_netchannel( ); - void add_latency( INetChannel* channel ); - - void float_ragdolls( ); - void rich_presence_flex( ); - void remove_rich_presence_flex( ); - - void no_recoil( bool original ); - void no_recoil( user_cmd_t* cmd ); - - void no_smoke( ); - void no_flash( ); - - void disable_post_processing( ); - - void auto_revolver( user_cmd_t* ); - - void money_talk( IGameEvent *evt ); - - void server_information( ); - - void unlock_hidden_cvars( ); - - private: - using grenade_trace_t = std::vector< vec3_t >; - - }; -} \ No newline at end of file diff --git a/internal_rewrite/factory.cpp b/internal_rewrite/factory.cpp deleted file mode 100644 index 0e7bc03..0000000 --- a/internal_rewrite/factory.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "factory.hpp" -#ifndef IFACE_DLLMAIN -#include "fnv.hpp" - -#include - -NAMESPACE_REGION( factory ) -NAMESPACE_REGION( interfaces ) - -//iterate all exports inside of a module and find createinterface -uintptr_t c_interface_manager::find_createinterface( void* module_ ) { - IMAGE_DOS_HEADER* dos_header; - IMAGE_NT_HEADERS* nt_headers; - uintptr_t export_address; - IMAGE_EXPORT_DIRECTORY* export_dir; - const char* export_name; - uintptr_t* names; - uintptr_t* funcs; - uint16_t* ords; - uint32_t export_hash; - - dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); - nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); - - //find addresses of functions from nt headers - export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; - export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); - - if ( !export_dir->NumberOfFunctions ) - return uintptr_t{ }; - - names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); - funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); - - ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); - - if ( names && funcs && ords ) { - //iterate the exports - for ( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { - export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); - export_hash = hash::fnv1a( export_name ); - - if ( export_hash == fnv( "CreateInterface" ) ) { - return uintptr_t( module_ ) + funcs[ ords[ i ] ]; - } - } - } - - return uintptr_t{ }; -} - -c_interface_manager::c_interface_manager( ) { - auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); - auto peb = teb->ProcessEnvironmentBlock; - - auto root = &peb->Ldr->InMemoryOrderModuleList; - //iterate module list - for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { - PLDR_DATA_TABLE_ENTRY data_table; - HMODULE module_base; - uintptr_t create_interface_export; - uintptr_t create_interface_; - uintptr_t* list_iterator_ptr; - interface_iterator_t* list_iterator; - - data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); - module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); - create_interface_export = find_createinterface( module_base ); - - if ( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { - continue; - } - - //find the createinterface function - create_interface_ = follow_createinterface_export( create_interface_export ); - if ( !is_createinterface_fn( create_interface_ ) ) { - continue; - } - - //find the list iterator - list_iterator_ptr = find_list_ptr( create_interface_ ); - - //iterate the interface list - for ( list_iterator = reinterpret_cast< interface_iterator_t* >( - list_iterator_ptr ); - !!list_iterator; - list_iterator = list_iterator->m_next - ) { - std::string name( list_iterator->m_name ); - std::string module_name( util::unicode_to_ascii( - std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); - - uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); - - size_t version = [ & ]( ) { - std::string ret( name ); - ret.erase( std::remove_if( ret.begin( ), ret.end( ), - [ & ]( int i ) { return !::isdigit( i ); } - ), ret.end( ) ); - return atoi( ret.c_str( ) ); - }( ); - - m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); - } - } -} - -END_REGION -END_REGION -#endif \ No newline at end of file diff --git a/internal_rewrite/factory.hpp b/internal_rewrite/factory.hpp deleted file mode 100644 index d197951..0000000 --- a/internal_rewrite/factory.hpp +++ /dev/null @@ -1,156 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include "vmt.hpp" -#include "util.hpp" -#include "x86.hpp" -#include "console.hpp" - -//IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran -#ifndef _DEBUG -//#define IFACE_DLLMAIN -//#define HEADER_MODULE -#endif - -#ifdef IFACE_DLLMAIN -#include "iface_dllmain_impl.hpp" -#else - -NAMESPACE_REGION( factory ) - -namespace interfaces -{ - struct interface_iterator_t { - void* m_create_fn; - char* m_name; - - interface_iterator_t* m_next; - }; - - inline auto follow_createinterface_export( uintptr_t export_ ) { - /* - .text:006F5F00 CreateInterface proc near - .text:006F5F00 push ebp - .text:006F5F01 mov ebp, esp - .text:006F5F03 pop ebp - .text:006F5F04 jmp sub_6F5E90 - */ - uintptr_t jmp = export_ + 0x4; - uintptr_t jmp_target = jmp + *( uintptr_t* )( jmp + 0x1 ) + 0x5; - - return jmp_target; - } - - inline auto find_list_ptr( uintptr_t createinterface ) { - /* - .text:006F5E90 push ebp - .text:006F5E91 mov ebp, esp - .text:006F5E93 push esi - .text:006F5E94 mov esi, dword_2EEFDE4 - .text:006F5E9A push edi - */ - auto iterator_ptr = **( uintptr_t*** )( createinterface + 0x6 ); - - return iterator_ptr; - } - - inline bool is_createinterface_export( uintptr_t export_ ) { - return *( uint8_t* )( export_ ) == x86::encode_push_reg( x86::reg::ebp ) - && *( uint8_t* )( export_ + 4 ) == 0xe9 - && *( uint8_t* )( export_ + 9 ) == 0xcc - && *( uint8_t* )( export_ + 10 ) == 0xcc; - } - - inline bool is_createinterface_fn( uintptr_t fn_ ) { - return *( uint8_t* )( fn_ ) == x86::encode_push_reg( x86::reg::ebp ) - && *( uint8_t* )( fn_ + 4 ) == 0x8b - && *( uint8_t* )( fn_ + 10 ) == x86::encode_push_reg( x86::reg::edi ); - } - - class c_interface_manager { - public: - struct interface_data_t { - std::string m_name; - std::string m_module; - size_t m_version; - uintptr_t m_ptr; - - template < typename t > __forceinline t get( ) { - return reinterpret_cast< t >( m_ptr ); - } - }; - - c_interface_manager( ); - - //iterate the interface list to find our desired version - template < typename t = void* > - t find_interface( const std::string& module_, std::string name ) { - //avoid finding interfaces with matching names - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += "0"; - - for( auto& it : m_interfaces ) { - if( !it.m_module.compare( module_ ) - && !it.m_name.compare( name ) ) { - g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), - name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - - return it.get< t >( ); - } - } - - g_con->print( xors( "%s not found\n" ), name.c_str( ) ); - - return t{ }; - } - - template < typename t = void* > - t find_interface( std::string name ) { - //avoid finding interfaces with matching names - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += '0'; - - for( auto& it : m_interfaces ) { - if( strstr( it.m_name.c_str( ), name.c_str( ) ) ) { - g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), - name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - - return it.get< t >( ); - } - } - - g_con->print( xors( "%s not found\n" ), name.c_str( ) ); - - return t{ }; - } - - void dump_interface_list( ) { - for( auto& it : m_interfaces ) { - g_con->print( xors( "%s version %u in %s at 0x%08x\n" ), - it.m_name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - } - } - - private: - uintptr_t find_createinterface( void* module_ ); - - std::vector< interface_data_t > m_interfaces; - }; -} - -END_REGION -#endif - -extern HMODULE g_dll; -extern factory::interfaces::c_interface_manager g_factory; \ No newline at end of file diff --git a/internal_rewrite/fire_event_clientside.cpp b/internal_rewrite/fire_event_clientside.cpp deleted file mode 100644 index 10233a2..0000000 --- a/internal_rewrite/fire_event_clientside.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -bool __fastcall hooks::fire_event_clientside( void* ecx_, void* edx, IGameEvent* event_ ) { - static auto original_fn = fire_event_clientside_o; - - if( g_ctx.m_local && g_ctx.m_local->is_valid( ) && strstr( event_->GetName( ), xors( "player_death" ) ) ) - g_cheat.m_skins.replace_deaths( event_ ); - - g_cheat.m_extra.money_talk( event_ ); - - return original_fn( ecx_, edx, event_ ); -} \ No newline at end of file diff --git a/internal_rewrite/fnv.hpp b/internal_rewrite/fnv.hpp deleted file mode 100644 index 08a478b..0000000 --- a/internal_rewrite/fnv.hpp +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#pragma warning( disable : 4307 ) // '*': integral constant overflow -#pragma warning( disable : 4244 ) // possible loss of data - -#include -#include - -using hash_t = unsigned int; - -// used for compile-time FNV-1a 32bit hashes. -#define fnv( str ) \ - [&]() { \ - constexpr hash_t out = hash::fnv1a( str ); \ - \ - return out; \ - }() - -// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. -#define fnv_const( str ) Hash::fnv1a_32( str ) - -namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). -{ - // FNV-1a constants. - enum : hash_t { - FNV1A_PRIME = 0x1000193, - FNV1A_BASIS = 0x811C9DC5 - }; - - // compile-time strlen. - __forceinline constexpr size_t ct_strlen( const char *str ) { - size_t out = 1; - - for( ; str[ out ] != '\0'; ++out ); - - return out; - } - - // hash data. - __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { - hash_t out = FNV1A_BASIS; - - for( size_t i = 0; i < len; ++i ) - out = ( out ^ data[ i ] ) * FNV1A_PRIME; - - return out; - } - - // hash c-style string. - __forceinline constexpr hash_t fnv1a( const char *str ) { - hash_t out = FNV1A_BASIS; - size_t len = ct_strlen( str ); - - for( size_t i = 0; i < len; ++i ) - out = ( out ^ str[ i ] ) * FNV1A_PRIME; - - return out; - } - - // hash C++-style string ( runtime only ). - __forceinline hash_t fnv1a( const std::string &str ) { - return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); - } -} \ No newline at end of file diff --git a/internal_rewrite/frame_stage_notify.cpp b/internal_rewrite/frame_stage_notify.cpp deleted file mode 100644 index 91cd7aa..0000000 --- a/internal_rewrite/frame_stage_notify.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "base_cheat.hpp" - -#if 0 -const char* crash_str = R"(" -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -398274 entities in bone setup array.Should have been cleaned up by now -")"; -#endif - -void __fastcall hooks::frame_stage_notify( void* ecx_, void* edx_, ClientFrameStage_t stage ) { - static auto frame_stage_notify_o = g_csgo.m_chl->get_old_function< decltype( &hooks::frame_stage_notify ) >( 36 ); - - if ( g_csgo.m_panic ) - { - // unload from game thread - static bool unloaded = false; - if ( !unloaded) - { - g_csgo.uninitialize( ); - unloaded = true; - } - - return frame_stage_notify_o( ecx_, edx_, stage ); - } - g_ctx.m_stage = stage; - g_cheat.m_visuals.world_modulate( ); - - static bool rich_presence_active = false; - - switch ( stage ) { - case FRAME_NET_UPDATE_START: - g_ctx.run_frame( ); - g_cheat.m_ragebot.m_lagcomp->fsn_net_update_start( ); - - if( g_settings.misc.rich_presence( ) ) { - g_cheat.m_extra.rich_presence_flex( ); - rich_presence_active = true; - } - else if( rich_presence_active ) { - if( !g_settings.misc.rich_presence( ) ) - g_cheat.m_extra.remove_rich_presence_flex( ); - - rich_presence_active = false; - } - g_cheat.m_visuals.draw_sound( ); - g_cheat.m_visuals.draw_tracers( ); - frame_stage_notify_o( ecx_, 0, stage ); - - return; - - case FRAME_NET_UPDATE_POSTDATAUPDATE_START: - g_cheat.m_extra.float_ragdolls( ); - - g_cheat.m_player_mgr.frame_stage_notify( ); - g_cheat.m_prediction.frame_stage_notify( ); - g_cheat.m_ragebot.m_resolver->frame_stage_notify( ); - g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); - g_cheat.m_skins( ); - frame_stage_notify_o( ecx_, 0, stage ); - - return; - - case FRAME_RENDER_START: - g_cheat.m_extra.disable_post_processing( ); - g_cheat.m_extra.no_flash( ); - g_cheat.m_extra.no_recoil( false ); - util::disable_pvs( ); - g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); - //g_cheat.m_ragebot.m_lagcomp->invalidate_bone_caches( ); - if( g_csgo.m_input( )->m_fCameraInThirdPerson ) { - bool real_yaw = g_settings.rage.anti_aim( ); - if( g_ctx.get_last_cmd( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - g_ctx.m_local->m_vecThirdpersonAngles( ) = ( real_yaw ? g_ctx.m_thirdperson_angle : g_ctx.get_last_cmd( )->m_viewangles ); - } - } - - g_cheat.m_extra.no_smoke( ); - if( g_settings.misc.no_smoke ) { - static auto smoke_count = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "55 8B EC 83 EC 08 8B 15 ? ? ? ? 0F 57 C0" ) ); - **reinterpret_cast< int** >( smoke_count + 0x8 ) = 0; - } - break; - - case FRAME_RENDER_END: - //if( g_ctx.run_frame( ) ) { - // - //} - g_cheat.m_ragebot.m_lagcomp->store_visuals( ); - frame_stage_notify_o( ecx_, 0, stage ); - g_cheat.m_chams.m_materials.update_materials( ); - g_cheat.m_extra.no_recoil( true ); - return; - } - - frame_stage_notify_o( ecx_, 0, stage ); -} \ No newline at end of file diff --git a/internal_rewrite/get_player_info.cpp b/internal_rewrite/get_player_info.cpp deleted file mode 100644 index 0cd121a..0000000 --- a/internal_rewrite/get_player_info.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" - -bool __fastcall hooks::get_player_info( void* ecx_, void* edx, int ent_num, player_info_t* info ) { - static auto original_fn = g_csgo.m_engine->get_old_function< decltype( &get_player_info ) >( 8 ); - - - - return original_fn( ecx_, edx, ent_num, info ); -} \ No newline at end of file diff --git a/internal_rewrite/get_screen_size.cpp b/internal_rewrite/get_screen_size.cpp deleted file mode 100644 index be7e245..0000000 --- a/internal_rewrite/get_screen_size.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "hooks.hpp" -#include "settings.hpp" - -#include -#include "context.hpp" -#include "mem.hpp" - -void __fastcall hooks::get_screen_size( void* ecx, void* edx, int& w, int& h ) { - static auto draw_crosshair_h = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "8B 4C 24 10 0F 57 D2 99" ) ); - - stack_t stack( get_baseptr( ) ); - auto ret = stack.next( ).return_address( ); - //call original - get_screen_size_o( ecx, edx, w, h ); - - //alter screen width and height to adjust the crosshair position on screen - if( g_settings.visuals.recoil_crosshair && g_ctx.m_local ) { - if( ret == draw_crosshair_h || ret == draw_crosshair_h - 14 /* width call is 14 bytes above height call*/ ) { - w /= 2; - h /= 2; - - vec3_t punch_angles = g_ctx.m_local->m_aimPunchAngle( ) * 2.f; - - if( punch_angles.x < -0.1f ) { - float fov = g_ctx.m_fov; - float angle_step = h / fov; - - w -= int( punch_angles.y * angle_step ); - h += int( punch_angles.x * angle_step ); - } - - w *= 2; - h *= 2; - } - } -} \ No newline at end of file diff --git a/internal_rewrite/get_viewmodel_fov.cpp b/internal_rewrite/get_viewmodel_fov.cpp deleted file mode 100644 index be48dd3..0000000 --- a/internal_rewrite/get_viewmodel_fov.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "hooks.hpp" -#include "settings.hpp" - -float __fastcall hooks::get_viewmodel_fov( void* ecx, void* edx ) { - return get_viewmodel_fov_o( ecx, nullptr ) + float( g_settings.misc.viewmodel_fov ); -} diff --git a/internal_rewrite/hde32.cpp b/internal_rewrite/hde32.cpp deleted file mode 100644 index 8569287..0000000 --- a/internal_rewrite/hde32.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/* -* Hacker Disassembler Engine 32 C -* Copyright (c) 2008-2009, Vyacheslav Patkov. -* All rights reserved. -* -*/ - -#include -#include "hde32.h" -#include "table32.h" - -unsigned int hde32_disasm( const void *code, hde32s *hs ) -{ - uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0; - uint8_t *ht = hde32_table, m_mod, m_reg, m_rm, disp_size = 0; - - memset( (uint8_t*)hs, 0, sizeof( hde32s ) ); - - for ( x = 16; x; x-- ) - switch ( c = *p++ ) - { - case 0xf3: - hs->p_rep = c; - pref |= PRE_F3; - break; - case 0xf2: - hs->p_rep = c; - pref |= PRE_F2; - break; - case 0xf0: - hs->p_lock = c; - pref |= PRE_LOCK; - break; - case 0x26: case 0x2e: case 0x36: - case 0x3e: case 0x64: case 0x65: - hs->p_seg = c; - pref |= PRE_SEG; - break; - case 0x66: - hs->p_66 = c; - pref |= PRE_66; - break; - case 0x67: - hs->p_67 = c; - pref |= PRE_67; - break; - default: - goto pref_done; - } -pref_done: - - hs->flags = (uint32_t)pref << 23; - - if ( !pref ) - pref |= PRE_NONE; - - if ( ( hs->opcode = c ) == 0x0f ) - { - hs->opcode2 = c = *p++; - ht += DELTA_OPCODES; - } - else if ( c >= 0xa0 && c <= 0xa3 ) - { - if ( pref & PRE_67 ) - pref |= PRE_66; - else - pref &= ~PRE_66; - } - - opcode = c; - cflags = ht[ht[opcode / 4] + ( opcode % 4 )]; - - if ( cflags == C_ERROR ) - { - hs->flags |= F_ERROR | F_ERROR_OPCODE; - cflags = 0; - if ( ( opcode & -3 ) == 0x24 ) - cflags++; - } - - x = 0; - if ( cflags & C_GROUP ) - { - uint16_t t; - t = *(uint16_t *)( ht + ( cflags & 0x7f ) ); - cflags = (uint8_t)t; - x = (uint8_t)( t >> 8 ); - } - - if ( hs->opcode2 ) - { - ht = hde32_table + DELTA_PREFIXES; - if ( ht[ht[opcode / 4] + ( opcode % 4 )] & pref ) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - } - - if ( cflags & C_MODRM ) - { - hs->flags |= F_MODRM; - hs->modrm = c = *p++; - hs->modrm_mod = m_mod = c >> 6; - hs->modrm_rm = m_rm = c & 7; - hs->modrm_reg = m_reg = ( c & 0x3f ) >> 3; - - if ( x && ( ( x << m_reg ) & 0x80 ) ) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - - if ( !hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf ) - { - uint8_t t = opcode - 0xd9; - if ( m_mod == 3 ) - { - ht = hde32_table + DELTA_FPU_MODRM + t * 8; - t = ht[m_reg] << m_rm; - } - else - { - ht = hde32_table + DELTA_FPU_REG; - t = ht[t] << m_reg; - } - if ( t & 0x80 ) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - } - - if ( pref & PRE_LOCK ) - { - if ( m_mod == 3 ) - { - hs->flags |= F_ERROR | F_ERROR_LOCK; - } - else - { - uint8_t *table_end, op = opcode; - if ( hs->opcode2 ) - { - ht = hde32_table + DELTA_OP2_LOCK_OK; - table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK; - } - else - { - ht = hde32_table + DELTA_OP_LOCK_OK; - table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK; - op &= -2; - } - for ( ; ht != table_end; ht++ ) - if ( *ht++ == op ) - { - if ( !( ( *ht << m_reg ) & 0x80 ) ) - goto no_lock_error; - else - break; - } - hs->flags |= F_ERROR | F_ERROR_LOCK; - no_lock_error: - ; - } - } - - if ( hs->opcode2 ) - { - switch ( opcode ) - { - case 0x20: case 0x22: - m_mod = 3; - if ( m_reg > 4 || m_reg == 1 ) - goto error_operand; - else - goto no_error_operand; - case 0x21: case 0x23: - m_mod = 3; - if ( m_reg == 4 || m_reg == 5 ) - goto error_operand; - else - goto no_error_operand; - } - } - else - { - switch ( opcode ) - { - case 0x8c: - if ( m_reg > 5 ) - goto error_operand; - else - goto no_error_operand; - case 0x8e: - if ( m_reg == 1 || m_reg > 5 ) - goto error_operand; - else - goto no_error_operand; - } - } - - if ( m_mod == 3 ) - { - uint8_t *table_end; - if ( hs->opcode2 ) - { - ht = hde32_table + DELTA_OP2_ONLY_MEM; - table_end = ht + sizeof( hde32_table ) - DELTA_OP2_ONLY_MEM; - } - else - { - ht = hde32_table + DELTA_OP_ONLY_MEM; - table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM; - } - for ( ; ht != table_end; ht += 2 ) - if ( *ht++ == opcode ) - { - if ( *ht++ & pref && !( ( *ht << m_reg ) & 0x80 ) ) - goto error_operand; - else - break; - } - goto no_error_operand; - } - else if ( hs->opcode2 ) - { - switch ( opcode ) - { - case 0x50: case 0xd7: case 0xf7: - if ( pref & ( PRE_NONE | PRE_66 ) ) - goto error_operand; - break; - case 0xd6: - if ( pref & ( PRE_F2 | PRE_F3 ) ) - goto error_operand; - break; - case 0xc5: - goto error_operand; - } - goto no_error_operand; - } - else - goto no_error_operand; - - error_operand: - hs->flags |= F_ERROR | F_ERROR_OPERAND; - no_error_operand: - - c = *p++; - if ( m_reg <= 1 ) - { - if ( opcode == 0xf6 ) - cflags |= C_IMM8; - else if ( opcode == 0xf7 ) - cflags |= C_IMM_P66; - } - - switch ( m_mod ) - { - case 0: - if ( pref & PRE_67 ) - { - if ( m_rm == 6 ) - disp_size = 2; - } - else - if ( m_rm == 5 ) - disp_size = 4; - break; - case 1: - disp_size = 1; - break; - case 2: - disp_size = 2; - if ( !( pref & PRE_67 ) ) - disp_size <<= 1; - } - - if ( m_mod != 3 && m_rm == 4 && !( pref & PRE_67 ) ) - { - hs->flags |= F_SIB; - p++; - hs->sib = c; - hs->sib_scale = c >> 6; - hs->sib_index = ( c & 0x3f ) >> 3; - if ( ( hs->sib_base = c & 7 ) == 5 && !( m_mod & 1 ) ) - disp_size = 4; - } - - p--; - switch ( disp_size ) - { - case 1: - hs->flags |= F_DISP8; - hs->disp.disp8 = *p; - break; - case 2: - hs->flags |= F_DISP16; - hs->disp.disp16 = *(uint16_t *)p; - break; - case 4: - hs->flags |= F_DISP32; - hs->disp.disp32 = *(uint32_t *)p; - } - p += disp_size; - } - else if ( pref & PRE_LOCK ) - hs->flags |= F_ERROR | F_ERROR_LOCK; - - if ( cflags & C_IMM_P66 ) - { - if ( cflags & C_REL32 ) - { - if ( pref & PRE_66 ) - { - hs->flags |= F_IMM16 | F_RELATIVE; - hs->imm.imm16 = *(uint16_t *)p; - p += 2; - goto disasm_done; - } - goto rel32_ok; - } - if ( pref & PRE_66 ) - { - hs->flags |= F_IMM16; - hs->imm.imm16 = *(uint16_t *)p; - p += 2; - } - else - { - hs->flags |= F_IMM32; - hs->imm.imm32 = *(uint32_t *)p; - p += 4; - } - } - - if ( cflags & C_IMM16 ) - { - if ( hs->flags & F_IMM32 ) - { - hs->flags |= F_IMM16; - hs->disp.disp16 = *(uint16_t *)p; - } - else if ( hs->flags & F_IMM16 ) - { - hs->flags |= F_2IMM16; - hs->disp.disp16 = *(uint16_t *)p; - } - else - { - hs->flags |= F_IMM16; - hs->imm.imm16 = *(uint16_t *)p; - } - p += 2; - } - if ( cflags & C_IMM8 ) - { - hs->flags |= F_IMM8; - hs->imm.imm8 = *p++; - } - - if ( cflags & C_REL32 ) - { - rel32_ok: - hs->flags |= F_IMM32 | F_RELATIVE; - hs->imm.imm32 = *(uint32_t *)p; - p += 4; - } - else if ( cflags & C_REL8 ) - { - hs->flags |= F_IMM8 | F_RELATIVE; - hs->imm.imm8 = *p++; - } - -disasm_done: - - if ( ( hs->len = (uint8_t)( p - (uint8_t *)code ) ) > 15 ) - { - hs->flags |= F_ERROR | F_ERROR_LENGTH; - hs->len = 15; - } - - return (unsigned int)hs->len; -} - diff --git a/internal_rewrite/hde32.h b/internal_rewrite/hde32.h deleted file mode 100644 index dd2ef6d..0000000 --- a/internal_rewrite/hde32.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -* Hacker Disassembler Engine 32 -* Copyright (c) 2006-2009, Vyacheslav Patkov. -* All rights reserved. -* -* hde32.h: C/C++ header file -* -*/ - -#ifndef _HDE32_H_ -#define _HDE32_H_ - -/* stdint.h - C99 standard header -* http://en.wikipedia.org/wiki/stdint.h -* -* if your compiler doesn't contain "stdint.h" header (for -* example, Microsoft Visual C++), you can download file: -* http://www.azillionmonkeys.com/qed/pstdint.h -* and change next line to: -* #include "pstdint.h" -*/ - -#include - -#define F_MODRM 0x00000001 -#define F_SIB 0x00000002 -#define F_IMM8 0x00000004 -#define F_IMM16 0x00000008 -#define F_IMM32 0x00000010 -#define F_DISP8 0x00000020 -#define F_DISP16 0x00000040 -#define F_DISP32 0x00000080 -#define F_RELATIVE 0x00000100 -#define F_2IMM16 0x00000800 -#define F_ERROR 0x00001000 -#define F_ERROR_OPCODE 0x00002000 -#define F_ERROR_LENGTH 0x00004000 -#define F_ERROR_LOCK 0x00008000 -#define F_ERROR_OPERAND 0x00010000 -#define F_PREFIX_REPNZ 0x01000000 -#define F_PREFIX_REPX 0x02000000 -#define F_PREFIX_REP 0x03000000 -#define F_PREFIX_66 0x04000000 -#define F_PREFIX_67 0x08000000 -#define F_PREFIX_LOCK 0x10000000 -#define F_PREFIX_SEG 0x20000000 -#define F_PREFIX_ANY 0x3f000000 - -#define PREFIX_SEGMENT_CS 0x2e -#define PREFIX_SEGMENT_SS 0x36 -#define PREFIX_SEGMENT_DS 0x3e -#define PREFIX_SEGMENT_ES 0x26 -#define PREFIX_SEGMENT_FS 0x64 -#define PREFIX_SEGMENT_GS 0x65 -#define PREFIX_LOCK 0xf0 -#define PREFIX_REPNZ 0xf2 -#define PREFIX_REPX 0xf3 -#define PREFIX_OPERAND_SIZE 0x66 -#define PREFIX_ADDRESS_SIZE 0x67 - -#pragma pack(push,1) - -typedef struct -{ - uint8_t len; - uint8_t p_rep; - uint8_t p_lock; - uint8_t p_seg; - uint8_t p_66; - uint8_t p_67; - uint8_t opcode; - uint8_t opcode2; - uint8_t modrm; - uint8_t modrm_mod; - uint8_t modrm_reg; - uint8_t modrm_rm; - uint8_t sib; - uint8_t sib_scale; - uint8_t sib_index; - uint8_t sib_base; - union - { - uint8_t imm8; - uint16_t imm16; - uint32_t imm32; - } imm; - union - { - uint8_t disp8; - uint16_t disp16; - uint32_t disp32; - } disp; - uint32_t flags; -} hde32s; - -#pragma pack(pop) - -#ifdef __cplusplus -extern "C" { -#endif - - /* __cdecl */ - unsigned int hde32_disasm( const void *code, hde32s *hs ); - -#ifdef __cplusplus -} -#endif - -#endif /* _HDE32_H_ */ \ No newline at end of file diff --git a/internal_rewrite/hooks.cpp b/internal_rewrite/hooks.cpp deleted file mode 100644 index e786a2b..0000000 --- a/internal_rewrite/hooks.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "hooks.hpp" -#include "interface.hpp" -#include "detours.h" -#include "wipe.hpp" - -//god i'm so cool -namespace hooks { - decltype( &paint_traverse ) paint_traverse_o; - decltype( &create_move ) create_move_o; - decltype( &frame_stage_notify ) fsn_o; - decltype( &suppress_lists ) suppress_lists_o; - decltype( &draw_small_entities ) draw_small_entities_o; - decltype( &begin_lock ) begin_lock_o; - decltype( &end_lock ) end_lock_o; - decltype( &simulate ) simulate_o; - decltype( &run_command ) run_command_o; - decltype( &override_mouse_input ) override_mouse_input_o; - decltype( &draw_model_execute ) draw_model_execute_o; - decltype( &scene_end ) scene_end_o; - decltype( &get_viewmodel_fov ) get_viewmodel_fov_o; - decltype( &get_screen_size ) get_screen_size_o; - decltype( &override_view ) override_view_o; - decltype( &shut_down ) shut_down_o; - decltype( &lock_cursor ) lock_cursor_o; - decltype( &is_connected ) is_connected_o; - decltype( &in_prediction ) in_prediction_o; - decltype( &update_clientside_animation ) update_clientside_animation_o; - decltype( &material_system ) material_system_o; - decltype( &fire_event_clientside ) fire_event_clientside_o; - decltype( &send_datagram ) send_datagram_o; - decltype( &do_post_screen_space_effects ) do_post_screen_space_effects_o; - decltype( &on_screen_size_changed ) on_screen_size_changed_o; - decltype( &play_sound ) play_sound_o; - decltype( &convar_getint ) convar_getint_o; - decltype( &packet_start ) packet_start_o; -} - -hooks::c_netvar_proxy hooks::lby_proxy; -hooks::c_netvar_proxy hooks::last_shot_proxy; -hooks::c_netvar_proxy hooks::simtime_proxy; - -bool hooks::commit( factory::c_csgo* instance ) { - DELETE_START( 5 ); - - while ( !( instance->m_hwnd = FindWindowA( xors( "Valve001" ), 0 ) ) ) - Sleep( 100 ); - - window_procedure_o = reinterpret_cast< decltype( window_procedure_o ) >( - SetWindowLongA( instance->m_hwnd, GWLP_WNDPROC, - ( long )window_procedure ) - ); - - lby_proxy.init( g_netvars.get_prop( fnv( "DT_CSPlayer" ), fnv( "m_flLowerBodyYawTarget" ) ), &lby_proxy_fn ); - last_shot_proxy.init( g_netvars.get_prop( fnv( "DT_WeaponCSBaseGun" ), fnv( "m_fLastShotTime" ) ), &last_shot_proxy_fn ); - simtime_proxy.init( g_netvars.get_prop( fnv( "DT_BaseEntity" ), fnv( "m_flSimulationTime" ) ), &simtime_proxy_fn ); - - // god i'm thriving the d - auto* d = &memory::detours; - - instance->m_d3d->hook( 42, &hooks::d3d::end_scene ); - instance->m_d3d->hook( 16, &hooks::d3d::reset ); - instance->m_d3d->hook( 17, &hooks::d3d::present ); - //instance->m_d3d->hook( 82, &hooks::d3d::draw ); - //instance->m_engine->hook( 93, &hooks::is_hltv_proxy ); - //instance->m_engine->hook( 90, &hooks::is_paused ); - //instance->m_engine->hook( 27, &hooks::is_connected ); - - instance->m_debug_show_spread->hook( 13, &hooks::debug_show_spread_get_int ); - instance->m_netshowfragments->hook( 13, &hooks::net_showfragments_get_int ); - instance->m_csm_shadows->hook( 13, &hooks::cl_csm_shadows_get_int ); - - paint_traverse_o = d->create_hook( &hooks::paint_traverse, instance->m_panel->get_old_function< void* >( 41 ) ); - create_move_o = d->create_hook( &hooks::create_move, instance->m_clientmode->get_old_function< void* >( 24 ) ); - override_mouse_input_o = d->create_hook( &hooks::override_mouse_input, instance->m_clientmode->get_old_function< void* >( 23 ) ); - get_viewmodel_fov_o = d->create_hook( &hooks::get_viewmodel_fov, instance->m_clientmode->get_old_function< void* >( 35 ) ); - do_post_screen_space_effects_o = d->create_hook( &hooks::do_post_screen_space_effects, instance->m_clientmode->get_old_function< void* >( 44 ) ); - override_view_o = d->create_hook( &hooks::override_view, instance->m_clientmode->get_old_function< void* >( 18 ) ); - lock_cursor_o = d->create_hook( &hooks::lock_cursor, instance->m_surface->get_old_function< void* >( 67 ) ); - run_command_o = d->create_hook( &hooks::run_command, instance->m_prediction->get_old_function< void* >( 19 ) ); - in_prediction_o = d->create_hook( &hooks::in_prediction, instance->m_prediction->get_old_function< void* >( 14 ) ); - draw_model_execute_o = d->create_hook( &hooks::draw_model_execute, instance->m_model_render->get_old_function< void* >( 21 ) ); - scene_end_o = d->create_hook( &hooks::scene_end, instance->m_render_view->get_old_function< void* >( 9 ) ); - get_screen_size_o = d->create_hook( &hooks::get_screen_size, instance->m_surface->get_old_function< void* >( 44 ) ); - - on_screen_size_changed_o = d->create_hook( &hooks::on_screen_size_changed, instance->m_surface->get_old_function< void* >( 116 ) ); - play_sound_o = d->create_hook( &hooks::play_sound, instance->m_surface->get_old_function< void* >( 82 ) ); - material_system_o = d->create_hook( &hooks::material_system, instance->m_mat_system->get_old_function< void* >( 21 ) ); - suppress_lists_o = d->create_hook( &hooks::suppress_lists, instance->m_partition->get_old_function< void* >( 16 ) ); - draw_small_entities_o = d->create_hook( &hooks::draw_small_entities, instance->m_clientleaf->get_old_function< void* >( 39 ) ); - simulate_o = d->create_hook( &hooks::simulate, instance->m_engine_vgui->get_old_function< void* >( 39 ) ); - begin_lock_o = d->create_hook( &hooks::begin_lock, instance->m_mdl_cache->get_old_function< void* >( 33 ) ); - end_lock_o = d->create_hook( &hooks::end_lock, instance->m_mdl_cache->get_old_function< void* >( 34 ) ); - - auto packet_start = pattern::first_code_match< void* >( instance->m_engine.dll( ), xors( "55 8B EC 8B 45 08 89 81 ? ? ? ? 8B 45 0C 89 81 ? ? ? ? 5D C2 08 00 ? ? ? ? ? ? ? 56" ) ); - packet_start_o = d->create_hook( &::hooks::packet_start, packet_start ); - - auto update_clientside_anim = pattern::first_code_match< void* >( instance->m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 80 BE ? ? ? ? ? 74 36" ) ); - update_clientside_animation_o = d->create_hook( &hooks::update_clientside_animation, update_clientside_anim ); - - auto send_datagram = pattern::first_code_match< void* >( instance->m_engine.dll( ), xors( "55 8B EC 83 E4 F0 B8 ? ? ? ? E8 ? ? ? ? 56 57 8B F9 89 7C 24 18" ) ); - send_datagram_o = d->create_hook( &hooks::send_datagram, send_datagram ); - - d->enable( ); - - return true; - - DELETE_END( 5 ); -} diff --git a/internal_rewrite/hooks.hpp b/internal_rewrite/hooks.hpp deleted file mode 100644 index ab28545..0000000 --- a/internal_rewrite/hooks.hpp +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once -#include - -#include "util.hpp" -#include "d3d.hpp" -#include "interface.hpp" -#include "netvar_proxy.hpp" - -namespace hooks -{ - //hook like the hooker that u are - - long __stdcall window_procedure( HWND, uint32_t, uint32_t, long ); - extern decltype( &window_procedure ) window_procedure_o; - - void __fastcall paint_traverse( void*, void*, unsigned int, bool, bool ); - extern decltype( &paint_traverse ) paint_traverse_o; - - bool __fastcall create_move( void*, void*, float, user_cmd_t* ); - extern decltype( &create_move ) create_move_o; - - //void __fastcall hl_create_move( void*, void*, int, float, bool ); - void __fastcall frame_stage_notify( void*, void*, ClientFrameStage_t ); - extern decltype( &frame_stage_notify ) fsn_o; - - void __fastcall suppress_lists( void*, void*, int, bool ); - extern decltype( &suppress_lists ) suppress_lists_o; - - void __fastcall draw_small_entities( void*, void*, bool ); - extern decltype( &draw_small_entities ) draw_small_entities_o; - - void __fastcall begin_lock( void*, void* ); - extern decltype( &begin_lock ) begin_lock_o; - - void __fastcall end_lock( void*, void* ); - extern decltype( &end_lock ) end_lock_o; - - void __fastcall simulate( void*, void* ); - extern decltype( &simulate ) simulate_o; - - void __fastcall run_command( void*, void*, IClientEntity*, user_cmd_t*, IMoveHelper* ); - extern decltype( &run_command ) run_command_o; - - void __fastcall override_mouse_input( void*, void*, float*, float* ); - extern decltype( &override_mouse_input ) override_mouse_input_o; - - void __fastcall draw_model_execute( IVModelRender*, void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); - extern decltype( &draw_model_execute ) draw_model_execute_o; - - void __fastcall scene_end( void*, void* ); - extern decltype( &scene_end ) scene_end_o; - - float __fastcall get_viewmodel_fov( void*, void* ); - extern decltype( &get_viewmodel_fov ) get_viewmodel_fov_o; - - void __fastcall get_screen_size( void*, void*, int&, int& ); - extern decltype( &get_screen_size ) get_screen_size_o; - - void __fastcall override_view( void* ecx_, void* edx_, CViewSetup* setup ); - extern decltype( &override_view ) override_view_o; - - //void __fastcall emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, - // const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, - // const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ); - void __fastcall shut_down( void* ecx_, void* edx_ ); - extern decltype( &shut_down ) shut_down_o; - - void __fastcall lock_cursor( void* ecx_, void* edx_ ); - extern decltype( &lock_cursor ) lock_cursor_o; - - bool __fastcall is_connected( void* ecx_, void* edx_ ); - extern decltype( &is_connected ) is_connected_o; - - bool __fastcall in_prediction( void* ecx_, void* edx_ ); - extern decltype( &in_prediction ) in_prediction_o; - - void __fastcall update_clientside_animation( void* ecx_, void* edx_ ); - extern decltype( &update_clientside_animation ) update_clientside_animation_o; - - bool __fastcall material_system( void* ecx_, void* edx_, IMaterialSystem_Config_t* config, bool forceupdate ); - extern decltype( &material_system ) material_system_o; - - bool __fastcall fire_event_clientside( void* ecx_, void* edx, IGameEvent* event ); - extern decltype( &fire_event_clientside ) fire_event_clientside_o; - - void __cdecl lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); - void __cdecl last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ); - void __cdecl simtime_proxy_fn( const CRecvProxyData* proxy_data_const, void* ent, void* output ); - - int __fastcall send_datagram( INetChannel* channel, void* edx, void* datagram ); - extern decltype( &send_datagram ) send_datagram_o; - - bool __fastcall do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ); - extern decltype( &do_post_screen_space_effects ) do_post_screen_space_effects_o; - - void __fastcall on_screen_size_changed( void* ecx_, void* edx_, int old_h, int old_w ); - extern decltype( &on_screen_size_changed ) on_screen_size_changed_o; - - void __fastcall play_sound( void* ecx_, void* edx_, const char* name ); - extern decltype( &play_sound ) play_sound_o; - - void __fastcall packet_start( void* ecx, void* edx, int in_seq, int out_ack ); - extern decltype( &packet_start ) packet_start_o; - - int __fastcall cl_csm_shadows_get_int( void* ecx_, void* edx_ ); - int __fastcall debug_show_spread_get_int( void* ecx_, void* edx_ ); - int __fastcall net_showfragments_get_int( void* ecx_, void* edx_ ); - - extern c_netvar_proxy lby_proxy; - extern c_netvar_proxy last_shot_proxy; - extern c_netvar_proxy simtime_proxy; - - //do we wanna only run menu in d3d or visuals too? - namespace d3d { - long __stdcall end_scene( IDirect3DDevice9* ); - long __stdcall reset( IDirect3DDevice9*, D3DPRESENT_PARAMETERS* ); - long __stdcall present( IDirect3DDevice9*, RECT*, RECT*, HWND, RGNDATA* ); - long __stdcall draw( IDirect3DDevice9*, D3DPRIMITIVETYPE, int, uint32_t, uint32_t, uint32_t, uint32_t ); - } - - int __fastcall convar_getint( void* ecx_, void* edx_ ); - extern decltype( &convar_getint ) convar_getint_o; - - extern bool commit( factory::c_csgo* ); -} \ No newline at end of file diff --git a/internal_rewrite/icons.hpp b/internal_rewrite/icons.hpp deleted file mode 100644 index 840a413..0000000 --- a/internal_rewrite/icons.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "icons/legit.hpp" -#include "icons/rage.hpp" -#include "icons/visuals.hpp" -#include "icons/misc.hpp" -#include "icons/config.hpp" \ No newline at end of file diff --git a/internal_rewrite/icons/config.hpp b/internal_rewrite/icons/config.hpp deleted file mode 100644 index d488e6a..0000000 --- a/internal_rewrite/icons/config.hpp +++ /dev/null @@ -1,1752 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\config.png (4/1/2018 10:00:36 PM) - StartOffset: 00000000, EndOffset: 0000519A, Length: 0000519B */ - -namespace icons { -constexpr static size_t config_size = 20891; -namespace raw { -static unsigned char config[20891] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, - 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, - 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x66, - 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, 0x65, 0x34, - 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, 0x2D, 0x32, - 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, 0x64, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x30, 0x36, 0x32, 0x33, - 0x62, 0x65, 0x64, 0x36, 0x2D, 0x33, 0x35, 0x62, 0x35, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x37, - 0x61, 0x32, 0x34, 0x30, 0x39, 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, - 0x2D, 0x64, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, - 0x66, 0x66, 0x39, 0x62, 0x39, 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x37, 0x61, 0x32, 0x34, 0x30, 0x39, - 0x32, 0x30, 0x2D, 0x63, 0x66, 0x39, 0x35, 0x2D, 0x64, 0x39, 0x34, 0x38, - 0x2D, 0x39, 0x62, 0x38, 0x66, 0x2D, 0x36, 0x66, 0x66, 0x39, 0x62, 0x39, - 0x31, 0x35, 0x37, 0x35, 0x39, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, - 0x3A, 0x33, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x66, 0x32, 0x30, 0x35, 0x37, 0x36, 0x34, 0x39, 0x2D, 0x37, 0x30, - 0x65, 0x34, 0x2D, 0x39, 0x35, 0x34, 0x39, 0x2D, 0x62, 0x65, 0x38, 0x61, - 0x2D, 0x32, 0x37, 0x63, 0x64, 0x38, 0x65, 0x38, 0x34, 0x34, 0x64, 0x31, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x33, 0x33, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x55, 0x32, 0xFE, 0xAE, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0B, 0xBD, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x7B, 0x90, 0x95, 0x65, 0x1D, 0xC7, - 0x3F, 0xE7, 0xEC, 0xC2, 0xDE, 0x61, 0x59, 0x59, 0x02, 0x44, 0x28, 0x58, - 0xC0, 0x58, 0x09, 0x2C, 0x15, 0x44, 0x25, 0x35, 0x75, 0x6C, 0x14, 0xBB, - 0x20, 0x3A, 0x89, 0x63, 0xD9, 0xFD, 0xDE, 0x4C, 0xC3, 0x54, 0x96, 0x8D, - 0x91, 0x35, 0x43, 0x6A, 0x37, 0x2D, 0x29, 0x13, 0xB5, 0x2C, 0x2A, 0x8B, - 0xA9, 0x94, 0xA9, 0x2C, 0xBB, 0xDF, 0x30, 0x1C, 0xE4, 0xB2, 0x54, 0xC8, - 0x2D, 0x10, 0x01, 0xB9, 0x2E, 0xEC, 0xB2, 0xF7, 0x73, 0x9E, 0xFE, 0xF8, - 0xFD, 0x8E, 0x6E, 0xDC, 0xDE, 0xE7, 0x3D, 0x97, 0xF7, 0x76, 0x9E, 0xEF, - 0xCC, 0x99, 0xDD, 0x85, 0xF7, 0x3D, 0xE7, 0x3D, 0xEF, 0xF7, 0x7D, 0x9E, - 0xE7, 0x77, 0xF9, 0xFE, 0x7E, 0x4F, 0xCA, 0x18, 0x83, 0x43, 0x72, 0x91, - 0x76, 0xB7, 0xC0, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, - 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0x19, 0xA1, - 0x32, 0x61, 0xDF, 0xA7, 0x0A, 0x38, 0x13, 0xA8, 0x05, 0x1A, 0x80, 0x61, - 0xFA, 0xB3, 0x6E, 0xD0, 0xC3, 0x9C, 0x01, 0x8E, 0x01, 0x47, 0xF5, 0xD5, - 0x01, 0x74, 0x01, 0xCF, 0xEB, 0xFF, 0x39, 0x82, 0x23, 0x86, 0x51, 0xC0, - 0x6B, 0xF4, 0xE7, 0xAB, 0x81, 0x69, 0x40, 0x35, 0x50, 0xAF, 0xC4, 0xD6, - 0xEA, 0xDF, 0x29, 0x3D, 0x3E, 0x0B, 0xF4, 0x00, 0xDD, 0x40, 0xA7, 0xBE, - 0xBA, 0x80, 0xF5, 0xC0, 0x73, 0xC0, 0x3E, 0xE0, 0x59, 0xE0, 0x48, 0x12, - 0x08, 0x4E, 0xC5, 0x34, 0x54, 0x59, 0x0D, 0xCC, 0x00, 0xCE, 0x03, 0x66, - 0x02, 0xD3, 0x81, 0x26, 0x7D, 0x35, 0x28, 0x99, 0x69, 0x7D, 0xA5, 0x4E, - 0xF1, 0x1E, 0x46, 0xC9, 0xCE, 0xEA, 0xEF, 0xED, 0xC0, 0x21, 0xE0, 0x30, - 0xF0, 0x0C, 0xB0, 0x01, 0x78, 0x1A, 0x68, 0xD3, 0x63, 0x1C, 0xC1, 0x01, - 0xA0, 0x1E, 0xB8, 0x18, 0x98, 0x0B, 0xCC, 0x02, 0xA6, 0x02, 0x8D, 0x40, - 0x4D, 0x11, 0xED, 0x89, 0xAC, 0x4E, 0xE1, 0x87, 0x80, 0x8D, 0xC0, 0xDF, - 0x81, 0xBF, 0xEA, 0xCF, 0x7E, 0x47, 0x70, 0x69, 0x30, 0x14, 0xB8, 0x0C, - 0xB8, 0x0A, 0x78, 0x3D, 0x30, 0x51, 0x47, 0x6A, 0xA9, 0x97, 0x98, 0x01, - 0x1D, 0xD1, 0x9B, 0x81, 0xA7, 0x80, 0x27, 0x81, 0x7F, 0xE8, 0x88, 0x77, - 0x04, 0x17, 0x09, 0xD3, 0x80, 0xEB, 0x81, 0x6B, 0x74, 0xC4, 0x36, 0x84, - 0x60, 0xFD, 0x67, 0x95, 0xE8, 0x36, 0xE0, 0x71, 0x60, 0x05, 0xB0, 0xC3, - 0x11, 0x5C, 0xB8, 0x01, 0x78, 0x25, 0xF0, 0x7E, 0x60, 0x36, 0x30, 0x32, - 0x02, 0x6E, 0x5D, 0x06, 0xD8, 0x03, 0xFC, 0x11, 0x78, 0x10, 0xF8, 0x93, - 0x23, 0x38, 0x3F, 0x8C, 0x04, 0xDE, 0x09, 0xDC, 0xA0, 0x16, 0xF2, 0x90, - 0x88, 0x5D, 0x5F, 0x17, 0xB0, 0x16, 0x58, 0x06, 0xFC, 0x48, 0xFF, 0x76, - 0x6E, 0x92, 0x25, 0x26, 0x01, 0x1F, 0x07, 0xAE, 0x03, 0xC6, 0x46, 0x34, - 0x18, 0x53, 0xAB, 0x46, 0xDE, 0x19, 0xC0, 0x78, 0xE0, 0x9B, 0xC0, 0x7E, - 0x37, 0x82, 0xBD, 0x71, 0x0E, 0x70, 0x3B, 0xF0, 0x46, 0x0D, 0x52, 0x14, - 0x82, 0x0E, 0xF5, 0x65, 0xBB, 0x4E, 0x12, 0xC0, 0x18, 0xA2, 0x24, 0x35, - 0xEA, 0xCF, 0x7C, 0x61, 0xD4, 0x6F, 0x5E, 0x01, 0xDC, 0x09, 0xEC, 0x75, - 0x04, 0x9F, 0xDE, 0x98, 0x5A, 0x02, 0x5C, 0xA1, 0x6E, 0x4F, 0x3E, 0xD8, - 0xA1, 0x16, 0xEF, 0x0B, 0x1A, 0xB8, 0xD8, 0xA7, 0x24, 0x67, 0x4E, 0x32, - 0x73, 0x8D, 0x00, 0x5E, 0xA1, 0xFE, 0xF4, 0x68, 0x0D, 0x92, 0x8C, 0xC9, - 0xF3, 0x73, 0x8F, 0x02, 0x8F, 0x01, 0x77, 0x00, 0xBB, 0x1D, 0xC1, 0x27, - 0x62, 0x22, 0x70, 0x8F, 0x5A, 0xCA, 0x43, 0x7D, 0x9E, 0xDB, 0xA7, 0xAE, - 0xCB, 0x7A, 0x60, 0x95, 0x12, 0xDC, 0xAE, 0x53, 0x66, 0xAF, 0xBA, 0x3A, - 0xC7, 0x7F, 0xC9, 0x94, 0x7E, 0x4E, 0xB5, 0xAE, 0xF7, 0x8D, 0xFA, 0x80, - 0x9D, 0x0F, 0x9C, 0xAB, 0x46, 0x5D, 0x3E, 0x33, 0xC6, 0x72, 0xE0, 0xB3, - 0x51, 0x9A, 0xAE, 0xA3, 0x40, 0xF0, 0x08, 0xE0, 0x6E, 0x60, 0xA1, 0xDE, - 0x70, 0x3F, 0xF8, 0x3D, 0xF0, 0x3B, 0xB5, 0x6A, 0x77, 0x68, 0x70, 0xA2, - 0x17, 0x7F, 0x91, 0xA7, 0x94, 0xBE, 0x6A, 0x74, 0x4D, 0x7D, 0x25, 0x70, - 0xB5, 0xCE, 0x24, 0xE7, 0xFB, 0xBC, 0x9E, 0x76, 0xE0, 0x3E, 0x9D, 0xAE, - 0xFB, 0x1D, 0xC1, 0x50, 0x01, 0xDC, 0x06, 0x2C, 0x02, 0x86, 0xFB, 0x38, - 0xEF, 0x3F, 0xC0, 0x4F, 0x81, 0x95, 0x3A, 0x62, 0x4F, 0x36, 0x0D, 0x17, - 0x72, 0x4D, 0x67, 0x00, 0xAD, 0xC0, 0x5B, 0x80, 0xF9, 0x6A, 0xEC, 0xD9, - 0x62, 0x17, 0xB0, 0x58, 0xDD, 0xA8, 0xB2, 0x27, 0x78, 0x3E, 0xF0, 0x15, - 0xB5, 0x44, 0x6D, 0xF1, 0x2B, 0x60, 0xA9, 0x4E, 0xC7, 0x07, 0x29, 0x5D, - 0x9C, 0xB8, 0x02, 0xC9, 0x4C, 0xCD, 0x05, 0xDE, 0x87, 0x84, 0x48, 0x6D, - 0xF1, 0x6F, 0x75, 0xF3, 0x56, 0x95, 0x33, 0xC1, 0x13, 0x75, 0xCD, 0xBA, - 0x80, 0x53, 0x27, 0x04, 0x8E, 0xB7, 0x58, 0x97, 0x02, 0x0F, 0xEB, 0x7A, - 0xDB, 0x17, 0xD0, 0x75, 0xD6, 0x00, 0xAF, 0x03, 0x3E, 0x0A, 0x2C, 0xB0, - 0x3C, 0x27, 0xAB, 0xB3, 0xCB, 0x2D, 0x84, 0x9C, 0x95, 0xAA, 0x0C, 0xF1, - 0x73, 0x3F, 0xAC, 0x37, 0xCE, 0x86, 0xDC, 0x8C, 0x8E, 0xF4, 0xA5, 0xBA, - 0xD6, 0x06, 0x99, 0xDD, 0xE9, 0x56, 0x23, 0xAE, 0x5D, 0xAD, 0xE5, 0x77, - 0x59, 0x9C, 0x93, 0x46, 0xA2, 0x70, 0x6F, 0x07, 0xEE, 0x0D, 0x93, 0xE0, - 0xB0, 0x82, 0x08, 0x17, 0x02, 0x6F, 0xF3, 0xF1, 0x80, 0xDD, 0x03, 0x7C, - 0x1D, 0xD8, 0x4E, 0x38, 0xA9, 0xBB, 0x0C, 0x92, 0x59, 0x5A, 0xE2, 0x63, - 0x6D, 0xAD, 0xD1, 0xA9, 0x7D, 0x7A, 0xB9, 0x11, 0x5C, 0x0B, 0x7C, 0x40, - 0x7D, 0x4F, 0x1B, 0x3C, 0xA8, 0x96, 0xE9, 0x0B, 0x21, 0x2F, 0x67, 0x06, - 0xD8, 0x0A, 0x7C, 0x49, 0xA7, 0x5F, 0x1B, 0x4C, 0x05, 0x6E, 0x2E, 0x30, - 0x98, 0x12, 0x2B, 0x82, 0x2B, 0x90, 0x10, 0xDF, 0xD5, 0x96, 0xC7, 0xFF, - 0x41, 0xA7, 0xE6, 0xB0, 0xC9, 0x3D, 0x19, 0xC9, 0x1B, 0x2C, 0xBF, 0xEF, - 0x0D, 0xC0, 0xAB, 0xCA, 0x85, 0xE0, 0x34, 0xF0, 0x0E, 0xF5, 0x7D, 0xBD, - 0xF0, 0xBC, 0xFA, 0xC7, 0x9B, 0x88, 0x16, 0x0C, 0xA2, 0xF4, 0xB8, 0x0B, - 0x91, 0xFB, 0x78, 0x61, 0x82, 0x0F, 0xE3, 0x2C, 0xF6, 0x04, 0x4F, 0xF1, - 0x31, 0x7A, 0x1F, 0x45, 0xD2, 0x71, 0x51, 0x94, 0xCB, 0xF4, 0xEB, 0x34, - 0xFD, 0x43, 0xCB, 0x40, 0xCA, 0x8D, 0x48, 0xC4, 0xAC, 0x22, 0xE9, 0x04, - 0xCF, 0x07, 0x9A, 0x2D, 0x8E, 0x5B, 0x45, 0xC4, 0xD3, 0x70, 0x6A, 0x55, - 0x7F, 0x57, 0x0D, 0x3F, 0x2F, 0xB4, 0x00, 0xD7, 0x86, 0xF1, 0xB0, 0x06, - 0x49, 0x70, 0x35, 0x22, 0xB9, 0xB1, 0x71, 0x8B, 0x1E, 0x8E, 0xE0, 0xD4, - 0x7C, 0x32, 0x3C, 0x6B, 0x39, 0x8A, 0x2B, 0x91, 0xF4, 0xA7, 0x49, 0x32, - 0xC1, 0xB3, 0x81, 0xC9, 0x16, 0xC7, 0xAD, 0x47, 0x62, 0xCB, 0x7D, 0x31, - 0x20, 0xB8, 0x0B, 0x91, 0xF0, 0xD8, 0x64, 0x90, 0x5A, 0x81, 0x71, 0x49, - 0x26, 0x78, 0x0E, 0x92, 0xB5, 0xF1, 0xC2, 0x13, 0xC0, 0x4E, 0xE2, 0x83, - 0x8D, 0x48, 0xF8, 0xD4, 0x0B, 0x63, 0x10, 0xC1, 0x60, 0x62, 0x09, 0x9E, - 0x84, 0xB7, 0xF4, 0xE6, 0x00, 0x92, 0x21, 0xEA, 0x89, 0x11, 0xC1, 0x9D, - 0xD8, 0x69, 0xB3, 0xEA, 0x10, 0xF9, 0x51, 0x22, 0x09, 0x1E, 0xAE, 0x4E, - 0xBF, 0xD7, 0xFA, 0xBB, 0x5A, 0x47, 0x44, 0xDC, 0xB0, 0x0E, 0x51, 0x5C, - 0x7A, 0x59, 0xD3, 0x89, 0x9D, 0xA2, 0xA7, 0x5A, 0x3A, 0xFB, 0x5B, 0x90, - 0x0C, 0x51, 0xDC, 0xB0, 0x1D, 0x11, 0xE1, 0x79, 0x11, 0x3C, 0xC9, 0xD2, - 0x8B, 0x88, 0x1D, 0xC1, 0x63, 0x90, 0xAA, 0x04, 0xAF, 0x00, 0xC2, 0x26, - 0x44, 0x81, 0x11, 0x37, 0x74, 0x5A, 0x1A, 0x5A, 0x13, 0x80, 0xB3, 0x93, - 0x48, 0x70, 0xBD, 0x85, 0x93, 0xFF, 0x22, 0x92, 0x47, 0x8D, 0x23, 0x8C, - 0xCE, 0x3E, 0x5E, 0x0F, 0x67, 0xAD, 0xA5, 0xA1, 0x19, 0x3B, 0x82, 0xEB, - 0x2C, 0x3E, 0x6B, 0x3F, 0x22, 0x92, 0x8B, 0x2B, 0xB6, 0xE3, 0x9D, 0xFB, - 0xCD, 0x69, 0xC1, 0x12, 0x47, 0xF0, 0x30, 0x8B, 0xCF, 0xEA, 0x8C, 0x99, - 0xF5, 0x7C, 0x3C, 0x8E, 0x20, 0xD1, 0x2D, 0x2F, 0x82, 0xAB, 0x92, 0x48, - 0xB0, 0xCD, 0x97, 0xEA, 0x25, 0x86, 0xD5, 0x7B, 0x83, 0xD0, 0x87, 0x88, - 0x03, 0xBC, 0x30, 0x24, 0x89, 0x04, 0x1B, 0xBC, 0xC3, 0x74, 0x71, 0x6F, - 0x27, 0x91, 0xB6, 0xFC, 0x0E, 0xA9, 0x24, 0x12, 0xDC, 0x6B, 0x41, 0x70, - 0x25, 0xF1, 0xEE, 0x38, 0x90, 0xB2, 0xB8, 0xFE, 0x6C, 0xD0, 0xCB, 0x50, - 0x50, 0x04, 0x77, 0xE0, 0x2D, 0x6B, 0xAD, 0x0F, 0xDA, 0x00, 0x29, 0x32, - 0x9A, 0x2D, 0x7D, 0xDC, 0x81, 0x24, 0x12, 0xDC, 0x65, 0x31, 0x82, 0xC7, - 0x22, 0xA2, 0xF3, 0xB8, 0x62, 0x32, 0xDE, 0xDA, 0xEE, 0x34, 0x01, 0xA7, - 0x0C, 0x83, 0x24, 0xD8, 0xCB, 0x0F, 0x6E, 0x44, 0x04, 0x01, 0x71, 0x85, - 0x4D, 0xFD, 0x72, 0x07, 0x01, 0x27, 0x52, 0x82, 0x22, 0x78, 0x0B, 0x52, - 0x21, 0xEF, 0xB5, 0x06, 0x9F, 0x19, 0x53, 0x63, 0x6B, 0x04, 0x12, 0x86, - 0xF4, 0x32, 0x34, 0xB7, 0x03, 0xDB, 0x92, 0x48, 0xF0, 0x36, 0xA4, 0xC4, - 0xC4, 0x0B, 0xE7, 0x91, 0x7F, 0x85, 0x5F, 0x98, 0x18, 0x0F, 0x5C, 0x64, - 0x71, 0xDC, 0x2E, 0x02, 0x16, 0xC2, 0x07, 0x45, 0xF0, 0x31, 0xFD, 0x72, - 0x5E, 0x78, 0xAD, 0xC5, 0x48, 0x88, 0x22, 0x5A, 0xF1, 0x2E, 0xBF, 0x31, - 0x48, 0xBC, 0x3A, 0x93, 0x44, 0x82, 0x0D, 0x12, 0x67, 0xEE, 0xF5, 0x38, - 0x6E, 0x38, 0xF0, 0x86, 0x98, 0x91, 0x5B, 0x83, 0x94, 0xBD, 0x7A, 0xD9, - 0x18, 0x9D, 0xC0, 0x9F, 0xC3, 0x70, 0xCE, 0x83, 0xC2, 0x53, 0xD8, 0x89, - 0xE8, 0xAE, 0x27, 0x44, 0x1D, 0x71, 0x1E, 0x98, 0x01, 0x5C, 0x6E, 0x71, - 0xDC, 0x51, 0x44, 0x6E, 0x9B, 0x58, 0x82, 0xDB, 0xB0, 0x53, 0x20, 0x4E, - 0x41, 0x5A, 0x38, 0xC4, 0xC1, 0xD8, 0xAA, 0x42, 0x94, 0xA2, 0xA3, 0x2C, - 0x8E, 0x5D, 0x45, 0x08, 0x85, 0xE1, 0x41, 0xDE, 0xC4, 0x2E, 0xEC, 0x15, - 0x88, 0xEF, 0x45, 0x44, 0x02, 0x51, 0xC7, 0x4C, 0x44, 0xD4, 0x6E, 0x73, - 0x1F, 0x1F, 0x23, 0x84, 0x58, 0x7B, 0xD0, 0xA3, 0xE4, 0xB7, 0xD8, 0xA5, - 0x04, 0x5B, 0x91, 0xFA, 0x5A, 0x08, 0x41, 0x2C, 0x6E, 0x89, 0x6A, 0xA4, - 0x1B, 0xD0, 0x59, 0x16, 0xC7, 0x6E, 0xC4, 0x5B, 0xF1, 0x91, 0x08, 0x82, - 0xB7, 0x22, 0xAA, 0x49, 0x9B, 0x51, 0x7C, 0x93, 0x4E, 0x7F, 0x51, 0x6B, - 0xF1, 0x9B, 0xCB, 0x06, 0xDD, 0xEA, 0x63, 0x29, 0xF9, 0x09, 0x21, 0x35, - 0x67, 0x09, 0x9A, 0xE0, 0x63, 0xC0, 0xF7, 0x2C, 0x47, 0xF1, 0x18, 0xE0, - 0x33, 0x48, 0x53, 0x94, 0x28, 0xA1, 0x1F, 0x98, 0x07, 0x7C, 0x0C, 0x69, - 0xAB, 0x68, 0x33, 0x7A, 0x7F, 0x4E, 0x48, 0x55, 0x1A, 0x41, 0x13, 0x6C, - 0x80, 0x35, 0x96, 0xA3, 0x38, 0x85, 0xC8, 0x4C, 0x17, 0x23, 0x5A, 0xA6, - 0x28, 0xAD, 0xBB, 0xB7, 0x23, 0xE5, 0x28, 0x36, 0x58, 0x81, 0xF4, 0xA1, - 0x36, 0xE5, 0x40, 0x70, 0xCE, 0x1F, 0x5C, 0x66, 0x19, 0xF8, 0xA8, 0x50, - 0xBF, 0xF8, 0x73, 0x48, 0x18, 0x33, 0x6C, 0x4C, 0x47, 0x2A, 0x1E, 0x67, - 0x5A, 0xDA, 0x06, 0x1B, 0x91, 0x66, 0x31, 0xDD, 0x61, 0x5D, 0x70, 0x58, - 0xAE, 0xC8, 0x1A, 0xE0, 0x01, 0xCB, 0x63, 0x6B, 0x75, 0x2D, 0xFE, 0x2A, - 0xD2, 0xAC, 0x2C, 0x2C, 0x5C, 0x08, 0x7C, 0x03, 0xB8, 0x04, 0xBB, 0xB4, - 0x66, 0x2F, 0xD2, 0xBE, 0xE1, 0xB9, 0x30, 0x9F, 0xC8, 0xB0, 0x08, 0xEE, - 0x45, 0x2A, 0xF3, 0x7E, 0x69, 0x79, 0x7C, 0x03, 0x12, 0x2D, 0xBA, 0xCF, - 0x32, 0xA8, 0x50, 0x6C, 0x2C, 0x00, 0xBE, 0xA6, 0x24, 0xDB, 0x6A, 0xAA, - 0x96, 0xEB, 0xF4, 0xDC, 0x1B, 0x26, 0xC1, 0x61, 0x76, 0xD9, 0x49, 0xEB, - 0xF4, 0xFB, 0x00, 0xF6, 0x79, 0xE0, 0x7E, 0xA4, 0x47, 0xD6, 0x32, 0xBD, - 0x81, 0xA5, 0x0E, 0x1C, 0x8C, 0x47, 0x9A, 0xAE, 0xDC, 0xAC, 0x76, 0x80, - 0xAD, 0xCB, 0xB6, 0x1A, 0xF8, 0x08, 0x21, 0x44, 0xAE, 0xA2, 0x44, 0x30, - 0x48, 0x1C, 0x77, 0xA1, 0x8E, 0x4C, 0xDB, 0x2E, 0x77, 0x59, 0xB5, 0xC2, - 0x9F, 0x06, 0x1E, 0x02, 0xFE, 0x82, 0x77, 0x2A, 0xD2, 0x2F, 0xC6, 0xE8, - 0x4C, 0x71, 0xAB, 0xAE, 0xB7, 0x4D, 0xD8, 0x6B, 0xA9, 0xF6, 0x22, 0x81, - 0x9A, 0x27, 0x89, 0x40, 0x85, 0x64, 0x14, 0x5A, 0x19, 0x0E, 0x57, 0x97, - 0x63, 0xB1, 0xCF, 0xF3, 0x7A, 0x90, 0x36, 0x0F, 0xFF, 0x04, 0x7E, 0xA6, - 0x81, 0x84, 0xAD, 0x05, 0x5E, 0x4B, 0x2B, 0x92, 0xB2, 0x7C, 0x13, 0x92, - 0xD9, 0x1A, 0x8B, 0x3F, 0x15, 0x64, 0xBF, 0x8E, 0xDC, 0x47, 0x89, 0x48, - 0xF1, 0x7A, 0x54, 0x9A, 0x91, 0x8E, 0x46, 0x9A, 0x78, 0x7E, 0x30, 0x0F, - 0xB7, 0xAB, 0x4B, 0x47, 0xF4, 0x66, 0xA4, 0x32, 0x71, 0x27, 0x52, 0x98, - 0xBD, 0xC3, 0xC2, 0x7A, 0xAD, 0x53, 0x52, 0xA7, 0x20, 0x69, 0xCA, 0xAB, - 0x90, 0x02, 0xB1, 0x51, 0xBA, 0xD6, 0xFA, 0x55, 0x40, 0xDE, 0x86, 0xF4, - 0xF2, 0x8A, 0xCC, 0x96, 0x3C, 0x51, 0x21, 0x38, 0xA5, 0x6B, 0xDC, 0x22, - 0xE0, 0x43, 0x79, 0xFA, 0xD7, 0xFD, 0x7A, 0x63, 0xBB, 0x95, 0xEC, 0x5C, - 0xD7, 0xD9, 0xBE, 0x53, 0x1C, 0x9F, 0x6B, 0x3E, 0x3A, 0x4D, 0x5D, 0xB0, - 0x3A, 0x44, 0x36, 0x94, 0xCE, 0x83, 0xD8, 0x2C, 0xF0, 0x45, 0xB5, 0x9A, - 0x0F, 0x44, 0x29, 0x2A, 0x13, 0xA5, 0x7E, 0xD1, 0x29, 0x44, 0x95, 0x78, - 0xAD, 0x92, 0x3C, 0x33, 0x4F, 0x2B, 0x3F, 0x47, 0x76, 0x0F, 0x12, 0xE6, - 0xCC, 0x9E, 0xC6, 0xC8, 0xAB, 0x54, 0xA2, 0x2B, 0xC8, 0x4F, 0xAF, 0x3C, - 0x00, 0xFC, 0x0D, 0xB8, 0x1F, 0x49, 0x87, 0x1E, 0x22, 0x62, 0x88, 0x92, - 0x0E, 0x39, 0xD7, 0x3D, 0xFD, 0x80, 0x92, 0x93, 0x2A, 0xE0, 0x41, 0x19, - 0x4A, 0x30, 0x12, 0xDC, 0x14, 0x12, 0x7E, 0x7D, 0x31, 0x8A, 0xE4, 0x46, - 0x69, 0x04, 0xB7, 0x20, 0xF1, 0xDD, 0x59, 0xBA, 0x16, 0xB6, 0x10, 0x70, - 0x15, 0x5E, 0x01, 0xD8, 0xAF, 0xCB, 0xC1, 0x36, 0x64, 0xF3, 0xAC, 0x5F, - 0x10, 0xA1, 0xAE, 0xEF, 0x61, 0x13, 0x3C, 0x47, 0xA7, 0xE4, 0xCB, 0x91, - 0xB4, 0x5B, 0x93, 0x5A, 0xAD, 0x69, 0x02, 0x2E, 0xF1, 0x28, 0x00, 0xB9, - 0xED, 0xF1, 0xFA, 0x91, 0xE2, 0xF5, 0x2D, 0x48, 0x5A, 0x74, 0x25, 0xD2, - 0x50, 0xA6, 0x2C, 0x09, 0x9E, 0xA6, 0x01, 0x84, 0x2B, 0xD5, 0x15, 0x69, - 0x8C, 0x19, 0xA9, 0x5E, 0xEB, 0x7F, 0xBB, 0x12, 0xFD, 0x1B, 0x0D, 0xE4, - 0xEC, 0x29, 0x17, 0x82, 0x1B, 0x94, 0xD8, 0x85, 0x48, 0x25, 0x40, 0x18, - 0xBB, 0x98, 0x05, 0x85, 0x01, 0x44, 0x87, 0xB5, 0x01, 0x78, 0x04, 0x69, - 0xEC, 0xD6, 0x93, 0x64, 0x82, 0x2F, 0x02, 0x3E, 0x89, 0xF4, 0xCB, 0x6A, - 0x22, 0xBA, 0x4A, 0x8D, 0x62, 0x23, 0xA3, 0xEB, 0xF4, 0xAF, 0x91, 0x78, - 0xF6, 0xBA, 0xA4, 0x11, 0x3C, 0x04, 0x78, 0x37, 0xD2, 0x00, 0xBC, 0x85, - 0x78, 0x17, 0x98, 0x15, 0x82, 0x4E, 0x44, 0x78, 0xF8, 0x65, 0x24, 0x85, - 0x98, 0xB3, 0xC2, 0x4D, 0x9C, 0x09, 0x6E, 0x46, 0x54, 0x19, 0x37, 0x22, - 0xD1, 0xA1, 0x62, 0x4D, 0xC7, 0xFD, 0x1A, 0xD0, 0x18, 0x1C, 0xC4, 0xC8, - 0x6D, 0x80, 0x55, 0x45, 0x7E, 0x5B, 0xF3, 0xF4, 0xEA, 0xAC, 0x52, 0x7B, - 0x9C, 0xBB, 0x55, 0x4D, 0xF1, 0x8A, 0xB6, 0x07, 0x74, 0x3D, 0xBE, 0x1F, - 0x69, 0x70, 0xDE, 0x1D, 0xE7, 0x11, 0x3C, 0x01, 0xF8, 0x3C, 0xB2, 0x73, - 0x49, 0x43, 0x81, 0xEF, 0xB5, 0x67, 0x90, 0xAF, 0xB9, 0x1A, 0x91, 0xDF, - 0x1E, 0xD6, 0x51, 0x91, 0x1D, 0xE4, 0xAE, 0xF4, 0xAB, 0xC1, 0x56, 0x8F, - 0x7D, 0x15, 0x5F, 0x5A, 0xDF, 0xA7, 0x5D, 0x89, 0x6C, 0x1E, 0xF4, 0xEF, - 0x0D, 0xBA, 0x9C, 0x4C, 0x46, 0x62, 0xD3, 0x4D, 0x48, 0x22, 0x62, 0x64, - 0x81, 0x86, 0xD8, 0x61, 0x44, 0x61, 0x7A, 0x07, 0x25, 0x6E, 0x1B, 0x55, - 0x2A, 0x82, 0x27, 0x20, 0xED, 0xEF, 0xE7, 0x21, 0x21, 0xC0, 0x7C, 0x70, - 0x48, 0xFD, 0xCA, 0xAD, 0x48, 0x63, 0xF0, 0x2D, 0x3A, 0x4A, 0x8F, 0xE8, - 0x88, 0xCB, 0x45, 0xA9, 0xCC, 0xA0, 0xB5, 0xCE, 0xE8, 0x28, 0x4C, 0xFB, - 0x98, 0xFA, 0x52, 0xFA, 0x3E, 0x19, 0xFD, 0xBD, 0x62, 0xD0, 0xBF, 0xA7, - 0xF5, 0xEF, 0x6A, 0x25, 0x7B, 0x18, 0x22, 0xE7, 0x9D, 0xAB, 0xCB, 0xCD, - 0x9C, 0x02, 0x1E, 0xDE, 0x0E, 0xE0, 0x07, 0xC0, 0xA7, 0x29, 0x7E, 0x36, - 0xAC, 0xA4, 0x04, 0x8F, 0x43, 0x3A, 0xA2, 0xBF, 0x99, 0xFC, 0x5A, 0xD9, - 0xB7, 0x21, 0x42, 0x80, 0x35, 0x48, 0xA6, 0xA8, 0x53, 0x6F, 0x46, 0x1F, - 0x76, 0xAD, 0x20, 0x4A, 0x76, 0xAF, 0x78, 0xB9, 0x89, 0x4A, 0xBD, 0xCE, - 0x14, 0xB3, 0x91, 0x8D, 0x45, 0xAE, 0xC1, 0x5E, 0xA3, 0x75, 0x3C, 0xC9, - 0xDF, 0xD7, 0x65, 0xEC, 0x70, 0x1C, 0x08, 0x1E, 0x81, 0x04, 0xDC, 0xDF, - 0x9A, 0x07, 0xB9, 0xEB, 0x80, 0x1F, 0xEB, 0x68, 0xDD, 0xA4, 0x2E, 0x45, - 0x0F, 0xD1, 0xDD, 0x6D, 0x3B, 0xB7, 0x5B, 0x5A, 0x35, 0x22, 0x0E, 0xBC, - 0x42, 0x6D, 0x0D, 0xBF, 0x44, 0x77, 0x02, 0xDF, 0xD6, 0x91, 0xDC, 0x17, - 0x65, 0x82, 0xAB, 0xF4, 0x22, 0x17, 0xF9, 0x24, 0xF7, 0x20, 0x2F, 0xCB, - 0x5B, 0xD6, 0x22, 0xB1, 0xDD, 0xB8, 0x75, 0xBB, 0x1B, 0xA2, 0x4B, 0xD1, - 0x2C, 0x25, 0xF9, 0x26, 0xFC, 0xB5, 0x4B, 0x3A, 0xAC, 0x2E, 0xE4, 0x77, - 0xA2, 0x4C, 0xF0, 0x3C, 0x44, 0x4A, 0xD3, 0xEC, 0x73, 0xD4, 0xDE, 0x85, - 0xE4, 0x71, 0x0F, 0x12, 0xEF, 0x36, 0x4A, 0xB9, 0x87, 0x7C, 0xA4, 0x4E, - 0xD9, 0x9F, 0xC0, 0x5F, 0x29, 0xEC, 0x26, 0xE0, 0x3D, 0x88, 0x42, 0xA5, - 0x78, 0x30, 0xC6, 0x14, 0xE3, 0xD5, 0x62, 0x8C, 0x59, 0x6B, 0xFC, 0xE1, - 0x21, 0x63, 0xCC, 0x0C, 0x63, 0x4C, 0x8D, 0x31, 0x26, 0x55, 0xA4, 0xEB, - 0x88, 0xC2, 0x2B, 0x65, 0x8C, 0xA9, 0x33, 0xC6, 0x5C, 0x60, 0x8C, 0x59, - 0xE9, 0xE3, 0x7E, 0x0C, 0x18, 0x63, 0x1E, 0x37, 0xC6, 0x8C, 0x2B, 0xE6, - 0xF5, 0x14, 0xC3, 0x2F, 0x1D, 0xA6, 0x4F, 0x5E, 0xAB, 0x0F, 0x5F, 0x70, - 0x89, 0xBA, 0x08, 0x6D, 0xEA, 0x0B, 0x1A, 0x92, 0x03, 0xA3, 0xCB, 0xCC, - 0x1A, 0x44, 0x8A, 0xF4, 0x88, 0xE5, 0x79, 0x15, 0x48, 0x6C, 0x7E, 0x5E, - 0xD4, 0xA6, 0xE8, 0x8B, 0x91, 0x14, 0x59, 0x93, 0x65, 0xD8, 0xEE, 0x0B, - 0xBA, 0xD6, 0xEC, 0x4E, 0x18, 0xB1, 0xA7, 0xF2, 0xB1, 0xC7, 0x23, 0x7A, - 0xB3, 0x5B, 0x2C, 0xCF, 0xF9, 0xAF, 0x1A, 0x6C, 0x5B, 0x8B, 0x75, 0x01, - 0x85, 0xA0, 0x1A, 0x51, 0x5F, 0x34, 0x59, 0x1E, 0x7F, 0x2F, 0xA2, 0x59, - 0x2A, 0x07, 0x72, 0x51, 0xFF, 0x7A, 0x27, 0x52, 0xEA, 0xB2, 0xC2, 0xF2, - 0x9C, 0xF1, 0xC8, 0x96, 0x78, 0xA9, 0x28, 0x10, 0x7C, 0x09, 0x70, 0x99, - 0xE5, 0xB1, 0x4F, 0x20, 0xBB, 0x98, 0xED, 0x2B, 0x13, 0x72, 0x07, 0x93, - 0xBC, 0x0B, 0xF8, 0x14, 0xF0, 0x8C, 0x25, 0x27, 0x0B, 0x28, 0x52, 0x97, - 0x83, 0x42, 0x09, 0xBE, 0xCE, 0xD2, 0x6A, 0xDE, 0xA9, 0xD3, 0xD4, 0xEE, - 0x32, 0x23, 0x77, 0xF0, 0xBA, 0xBC, 0x4D, 0x6D, 0x0F, 0x1B, 0xC5, 0xE5, - 0x59, 0x1A, 0x4B, 0x08, 0x95, 0xE0, 0x16, 0x1D, 0xC1, 0x36, 0xEF, 0xF1, - 0x2D, 0xA4, 0x10, 0x2B, 0x4B, 0xF9, 0x22, 0x8B, 0xA4, 0x0C, 0x97, 0x5B, - 0x1A, 0x5C, 0x97, 0x6A, 0x20, 0x25, 0x34, 0x82, 0xCF, 0xC5, 0xAE, 0x18, - 0x6C, 0x15, 0x22, 0x4C, 0xEF, 0xC1, 0xE1, 0x18, 0xB2, 0x9B, 0xAA, 0x8D, - 0x01, 0x35, 0x07, 0xD9, 0x3C, 0x3B, 0x34, 0x82, 0x5B, 0xF1, 0x56, 0x65, - 0x66, 0x90, 0xDC, 0xE7, 0x16, 0xC7, 0xED, 0x4B, 0xC8, 0x15, 0x84, 0xDB, - 0xB8, 0x9F, 0x67, 0x87, 0x45, 0x70, 0xA3, 0x9A, 0xF2, 0x5E, 0xE7, 0xB7, - 0x21, 0xB1, 0xE5, 0x01, 0xC7, 0xEB, 0x4B, 0xE8, 0x45, 0x36, 0xD2, 0xDA, - 0x6B, 0xC1, 0xCD, 0x39, 0x61, 0x11, 0x3C, 0x12, 0xBB, 0xC6, 0xA1, 0x9B, - 0x91, 0x12, 0x12, 0x87, 0xFF, 0xC7, 0xBF, 0xB0, 0xDB, 0x67, 0xE9, 0x52, - 0xEC, 0x37, 0xD2, 0x2E, 0x2A, 0xC1, 0xCD, 0x78, 0xAB, 0x26, 0x06, 0x90, - 0x0A, 0xC0, 0x76, 0xC7, 0xE7, 0x09, 0x68, 0xC7, 0x6E, 0x83, 0xE9, 0xD1, - 0x14, 0x28, 0x96, 0xC8, 0x97, 0xE0, 0xD1, 0x78, 0x8B, 0xE6, 0x0E, 0x21, - 0xBA, 0xE0, 0x8C, 0xE3, 0xF3, 0x04, 0x74, 0x23, 0x89, 0x16, 0xAF, 0xF4, - 0x60, 0xA5, 0xAE, 0xC5, 0x81, 0x13, 0x3C, 0xDC, 0xE2, 0xDC, 0xA3, 0xC4, - 0x73, 0x17, 0xB3, 0xA0, 0xB0, 0xCF, 0xC2, 0x27, 0x4E, 0x87, 0x45, 0x70, - 0x2D, 0xDE, 0xA1, 0xB4, 0x7E, 0xE2, 0xB1, 0x45, 0x6C, 0x98, 0x2E, 0x93, - 0xD7, 0xFD, 0x49, 0x91, 0x9F, 0x2A, 0xA6, 0x60, 0x82, 0xAB, 0x2D, 0x09, - 0x76, 0xD6, 0xF3, 0xE9, 0xEF, 0x8F, 0x4D, 0xE0, 0xC7, 0x84, 0x41, 0xB0, - 0x0D, 0x32, 0x94, 0x77, 0xE4, 0xCA, 0x0B, 0x7D, 0x04, 0x10, 0xB6, 0x2D, - 0x65, 0xF9, 0x68, 0x13, 0x92, 0xDB, 0x9C, 0x41, 0xC0, 0xBB, 0x7D, 0xC5, - 0x84, 0xDC, 0xE9, 0xE4, 0xAF, 0x38, 0x8D, 0x04, 0xC1, 0xE3, 0x80, 0x3B, - 0x29, 0xCF, 0xE4, 0x82, 0x0D, 0x2A, 0x08, 0xA0, 0xCA, 0xA3, 0xB2, 0xC4, - 0x5F, 0xA0, 0xC2, 0xF1, 0x18, 0x2E, 0xD2, 0xEE, 0x16, 0x38, 0x82, 0x1D, - 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0xB0, 0x43, 0x74, 0x08, 0xCE, - 0x15, 0x62, 0x39, 0x94, 0x16, 0x05, 0xDF, 0xE7, 0x7C, 0xDD, 0xA4, 0x23, - 0x48, 0x3D, 0x4D, 0x35, 0x2E, 0x5A, 0x55, 0xCA, 0xC1, 0xD7, 0x41, 0x81, - 0x45, 0xE2, 0x51, 0xEA, 0x74, 0xE7, 0xE0, 0xD6, 0x60, 0x07, 0x47, 0xB0, - 0x83, 0x23, 0xD8, 0x11, 0xEC, 0xE0, 0x08, 0x76, 0x70, 0x04, 0x3B, 0x38, - 0x82, 0x1D, 0x1C, 0xC1, 0x0E, 0x8E, 0x60, 0x07, 0x47, 0x70, 0xD9, 0xE2, - 0x7F, 0x03, 0x00, 0xFF, 0x90, 0x57, 0xA9, 0xA4, 0xD4, 0xE2, 0xD9, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static unsigned char* config_icon = raw::config; -} \ No newline at end of file diff --git a/internal_rewrite/icons/legit.hpp b/internal_rewrite/icons/legit.hpp deleted file mode 100644 index 13a06f4..0000000 --- a/internal_rewrite/icons/legit.hpp +++ /dev/null @@ -1,1798 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\legit.png (4/1/2018 9:59:16 PM) - StartOffset: 00000000, EndOffset: 000053B8, Length: 000053B9 */ - -namespace icons { -constexpr static size_t legit_size = 21433; -namespace raw { -static unsigned char legit[21433] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, - 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, - 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x32, - 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, 0x39, 0x32, - 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, 0x2D, 0x35, - 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, 0x33, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x64, 0x63, 0x38, 0x34, - 0x38, 0x37, 0x30, 0x30, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x61, - 0x32, 0x66, 0x61, 0x64, 0x37, 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, - 0x2D, 0x39, 0x66, 0x34, 0x30, 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, - 0x37, 0x35, 0x61, 0x36, 0x31, 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, 0x32, 0x66, 0x61, 0x64, 0x37, - 0x64, 0x61, 0x2D, 0x66, 0x61, 0x64, 0x37, 0x2D, 0x39, 0x66, 0x34, 0x30, - 0x2D, 0x62, 0x64, 0x33, 0x31, 0x2D, 0x61, 0x37, 0x35, 0x61, 0x36, 0x31, - 0x30, 0x39, 0x31, 0x32, 0x32, 0x63, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, - 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x32, 0x33, 0x31, 0x33, 0x66, 0x37, 0x35, 0x35, 0x2D, 0x32, 0x37, - 0x39, 0x32, 0x2D, 0x66, 0x33, 0x34, 0x39, 0x2D, 0x61, 0x62, 0x33, 0x63, - 0x2D, 0x35, 0x35, 0x37, 0x35, 0x64, 0x62, 0x32, 0x39, 0x36, 0x62, 0x30, - 0x33, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x31, 0x34, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x78, 0xE1, 0xB7, 0x9F, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0D, 0xDB, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x70, 0xD5, 0xD5, 0x15, 0xC7, - 0xBF, 0x2F, 0x21, 0x46, 0x88, 0x24, 0x84, 0x04, 0x15, 0xC4, 0x32, 0xE0, - 0x82, 0x88, 0x8A, 0x80, 0x48, 0x47, 0xAA, 0x8E, 0xD6, 0x05, 0x5C, 0xAA, - 0xA2, 0xD6, 0xB1, 0x08, 0x6A, 0xD5, 0x56, 0xB4, 0x75, 0x5F, 0x6A, 0xDD, - 0x82, 0x6B, 0xC5, 0xE2, 0x86, 0xB4, 0xD6, 0xDA, 0xD6, 0x8D, 0x8A, 0x75, - 0x5C, 0xC6, 0x1D, 0xB4, 0x3A, 0x50, 0xB7, 0xBA, 0x55, 0x45, 0x44, 0x91, - 0x28, 0x22, 0xAB, 0x52, 0x76, 0x49, 0x42, 0x96, 0x6F, 0xFF, 0xB8, 0xDF, - 0x37, 0xF3, 0x4C, 0x21, 0xF9, 0x9D, 0x9B, 0xDF, 0x7B, 0xEF, 0x17, 0x72, - 0xCF, 0xCC, 0x6F, 0x70, 0xCC, 0xFB, 0xBD, 0x7B, 0xDF, 0xFD, 0xFC, 0xCE, - 0xB9, 0xE7, 0xDE, 0x7B, 0xCE, 0xF9, 0xA5, 0x48, 0x22, 0xC8, 0x96, 0x2B, - 0x05, 0x61, 0x08, 0x02, 0xE0, 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, - 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, - 0x20, 0x01, 0x70, 0x90, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, - 0x12, 0x00, 0x07, 0x09, 0x80, 0x03, 0xE0, 0x20, 0x01, 0x70, 0x90, 0xF6, - 0x27, 0x9D, 0x12, 0xD2, 0x8F, 0x42, 0x00, 0x83, 0x00, 0x1C, 0x09, 0x60, - 0x00, 0x80, 0x62, 0x00, 0x5F, 0x01, 0x78, 0x0B, 0xC0, 0x8B, 0x00, 0xBE, - 0x03, 0xD0, 0x98, 0x60, 0x25, 0xD9, 0x19, 0xC0, 0xF1, 0x00, 0x06, 0x02, - 0xD8, 0x06, 0xC0, 0x22, 0x00, 0xEF, 0x02, 0x78, 0x0A, 0xC0, 0xEA, 0x8E, - 0x0E, 0xB8, 0x04, 0xC0, 0xD1, 0x00, 0x2E, 0x05, 0x30, 0xA4, 0xD9, 0xDF, - 0x96, 0x01, 0x98, 0x0A, 0xE0, 0x3E, 0x00, 0x9F, 0x01, 0x48, 0x5A, 0x7C, - 0x51, 0x31, 0x80, 0x91, 0xEA, 0xFB, 0x88, 0x66, 0x7F, 0x5B, 0x07, 0xA0, - 0x3F, 0x80, 0x5B, 0x01, 0xAC, 0xCC, 0x5B, 0x0F, 0x49, 0xE6, 0xFB, 0xDA, - 0x9D, 0xE4, 0x7B, 0xDC, 0xBC, 0x6C, 0x20, 0x79, 0x3B, 0xC9, 0x01, 0x24, - 0x53, 0x09, 0xE8, 0x6F, 0xFA, 0xEA, 0x42, 0xF2, 0xF8, 0x56, 0xFA, 0x5E, - 0x4F, 0xF2, 0x12, 0x92, 0x9D, 0xF2, 0xD5, 0xCF, 0x24, 0xCC, 0xC1, 0x7B, - 0x00, 0xD8, 0xBD, 0x85, 0xBF, 0x77, 0x06, 0x70, 0x2E, 0x80, 0x73, 0xA4, - 0x11, 0xA9, 0x04, 0xF4, 0xB9, 0x0B, 0x80, 0x23, 0x00, 0x5C, 0xB1, 0x09, - 0xAB, 0xD3, 0xDC, 0x42, 0x8E, 0x94, 0x95, 0xEA, 0xB0, 0x4E, 0x56, 0x5F, - 0x00, 0x5B, 0xB7, 0xF2, 0x99, 0x22, 0x00, 0xE3, 0x75, 0xED, 0x92, 0x10, - 0xB3, 0x7C, 0x25, 0x80, 0xA1, 0x11, 0x3E, 0xBF, 0x03, 0x80, 0xD2, 0x8E, - 0x0C, 0x38, 0xAA, 0xF3, 0x54, 0x28, 0xC0, 0xE7, 0x49, 0x93, 0xF3, 0x21, - 0x5B, 0x4B, 0x73, 0xAF, 0x06, 0xB0, 0x77, 0xC4, 0x7B, 0x9A, 0xF2, 0xE9, - 0x3B, 0x24, 0x01, 0xF0, 0xE7, 0x00, 0xD6, 0x47, 0xFC, 0x6C, 0x11, 0x80, - 0x33, 0x01, 0x5C, 0x98, 0x07, 0xC8, 0xC5, 0x00, 0x46, 0x01, 0xA8, 0x32, - 0xC0, 0x05, 0x80, 0x2F, 0x01, 0xAC, 0xED, 0xC8, 0x80, 0x3F, 0x00, 0xF0, - 0x86, 0xE1, 0x29, 0x2F, 0x06, 0x70, 0x1A, 0x80, 0x8B, 0x00, 0xEC, 0x96, - 0xA3, 0x39, 0x39, 0x6D, 0x96, 0x27, 0x00, 0xD8, 0xCB, 0x70, 0xDF, 0x72, - 0x00, 0x33, 0x00, 0xD4, 0x75, 0x64, 0xC0, 0x5F, 0x03, 0xB8, 0x01, 0xC0, - 0x6C, 0x83, 0xB9, 0x2E, 0x06, 0x70, 0x86, 0x96, 0x27, 0x03, 0x65, 0xBE, - 0xB3, 0x25, 0x5B, 0x01, 0xF8, 0x89, 0xFA, 0xB8, 0xA7, 0xE1, 0xBE, 0xD5, - 0x00, 0xEE, 0x01, 0x30, 0x0D, 0x40, 0x7D, 0x47, 0x5E, 0x26, 0xA5, 0xAF, - 0xFD, 0x49, 0xBE, 0x4F, 0xB2, 0x81, 0xD1, 0xA5, 0x9E, 0xE4, 0xBD, 0x24, - 0x07, 0x91, 0x2C, 0xCC, 0x42, 0x9F, 0x8A, 0x49, 0x9E, 0x48, 0xF2, 0x23, - 0xDA, 0x64, 0x25, 0xC9, 0xEB, 0x49, 0x6E, 0x9B, 0xEF, 0x71, 0x4D, 0x12, - 0xE0, 0x34, 0xE4, 0xF7, 0x3C, 0x20, 0xFF, 0x99, 0xE4, 0xE0, 0x98, 0x21, - 0x77, 0x26, 0x79, 0x12, 0xC9, 0x8F, 0x8D, 0x70, 0x57, 0x90, 0x9C, 0x40, - 0xB2, 0x22, 0x09, 0x63, 0x9A, 0x34, 0xC0, 0x20, 0xB9, 0x1F, 0xC9, 0x77, - 0x8D, 0x90, 0x1B, 0x05, 0x79, 0x08, 0xC9, 0xA2, 0x18, 0xFA, 0x50, 0x42, - 0x72, 0x0C, 0xC9, 0xB9, 0x46, 0xB8, 0xDF, 0x08, 0x6E, 0x59, 0x52, 0xC6, - 0x33, 0x5B, 0x5F, 0x9C, 0x22, 0x59, 0xA0, 0x2B, 0x57, 0x90, 0x99, 0x01, - 0xB9, 0x2D, 0x3B, 0x47, 0xDB, 0x90, 0x1C, 0x47, 0xF2, 0x13, 0x63, 0xDB, - 0xCB, 0x48, 0x5E, 0x4B, 0xB2, 0x7B, 0x92, 0x14, 0x26, 0x15, 0x73, 0xFA, - 0x68, 0xA1, 0x36, 0xDB, 0xCB, 0xB5, 0xDB, 0x03, 0x2D, 0x81, 0x56, 0xE9, - 0xC0, 0xA0, 0xC9, 0xF0, 0x5D, 0x23, 0x00, 0x4C, 0x02, 0xB0, 0x8F, 0xC1, - 0x89, 0x6A, 0x02, 0xF0, 0x17, 0x00, 0xF7, 0xCA, 0x3B, 0x6F, 0x30, 0xF6, - 0xBF, 0x14, 0xC0, 0x71, 0x19, 0xCE, 0x5B, 0x54, 0x59, 0x06, 0x60, 0x0A, - 0x80, 0xC9, 0x00, 0xD6, 0x18, 0xC7, 0xAB, 0x44, 0xFF, 0x52, 0xFD, 0x8F, - 0xF5, 0x60, 0x25, 0x4E, 0xC0, 0x85, 0xDA, 0x65, 0x1A, 0x07, 0xE0, 0x30, - 0x00, 0x83, 0x35, 0xC0, 0x6F, 0x03, 0x78, 0x16, 0xC0, 0x63, 0x00, 0x16, - 0x1A, 0x07, 0x7D, 0x18, 0x80, 0x3B, 0x00, 0x0C, 0x37, 0x7A, 0xCA, 0x0F, - 0x00, 0xF8, 0x03, 0x80, 0xF7, 0x0D, 0xED, 0x75, 0xD3, 0x89, 0xD0, 0x25, - 0x5A, 0x7E, 0x45, 0xF2, 0x51, 0x01, 0x2C, 0x01, 0x70, 0xB7, 0xAE, 0xF5, - 0x86, 0x3E, 0x96, 0xC8, 0x2B, 0x3F, 0x04, 0xC0, 0xF6, 0xEA, 0xE7, 0x5A, - 0x00, 0xCF, 0x68, 0x6F, 0x60, 0x4D, 0x2C, 0x1B, 0x24, 0x31, 0x9A, 0x83, - 0x3E, 0x24, 0xA7, 0xB6, 0x60, 0xC2, 0x1E, 0x22, 0x39, 0xCC, 0x63, 0x8E, - 0xDC, 0x97, 0xE4, 0xDB, 0x1E, 0xE6, 0xFA, 0xAF, 0x24, 0x87, 0x46, 0x34, - 0xD7, 0x65, 0x24, 0x7F, 0x4E, 0xF2, 0x53, 0xC3, 0xF7, 0x37, 0x91, 0x5C, - 0x4C, 0xF2, 0xB7, 0x24, 0xBB, 0x1A, 0x7F, 0x53, 0x19, 0xC9, 0xD3, 0xF5, - 0xBB, 0x9A, 0xCB, 0xDB, 0x24, 0xCF, 0x8E, 0x6B, 0x1E, 0x8F, 0xD3, 0xE3, - 0xBC, 0x3A, 0xC2, 0xA0, 0x4C, 0xF5, 0x84, 0x3C, 0x9C, 0xE4, 0x9B, 0x1E, - 0x90, 0xFF, 0x26, 0xEF, 0xBA, 0x25, 0xC8, 0xDD, 0x34, 0xD8, 0x56, 0xB8, - 0x8B, 0x04, 0x77, 0x1B, 0xE3, 0x6F, 0x29, 0x27, 0x79, 0x16, 0xC9, 0xEA, - 0x16, 0xBE, 0x7F, 0xAE, 0x56, 0x14, 0xA9, 0xA4, 0x00, 0xEE, 0x4E, 0xF2, - 0xB9, 0x88, 0x83, 0xF3, 0xA8, 0x80, 0x59, 0x1D, 0xA1, 0xA1, 0x24, 0x5F, - 0xD7, 0xB2, 0xC8, 0x22, 0x7F, 0x27, 0xB9, 0xCF, 0x66, 0xDA, 0x2B, 0xD3, - 0x60, 0xCF, 0x37, 0xC2, 0xFD, 0x5A, 0xC7, 0x80, 0x25, 0x1E, 0x70, 0xCF, - 0xD5, 0xC3, 0xD1, 0x9A, 0xDC, 0x11, 0xC7, 0x8A, 0x20, 0x2E, 0xC0, 0x95, - 0x24, 0x9F, 0x37, 0x0C, 0xD2, 0x23, 0xF2, 0x76, 0xAD, 0xEB, 0xD6, 0x7D, - 0x48, 0xBE, 0xE1, 0x01, 0x79, 0xDA, 0x26, 0xDA, 0x2B, 0x25, 0x79, 0x06, - 0xC9, 0xCF, 0x8D, 0x70, 0x97, 0x90, 0xBC, 0x4C, 0xE7, 0xC1, 0x96, 0xBE, - 0x97, 0xCA, 0xF4, 0x2E, 0x8C, 0xD8, 0xD6, 0x73, 0x24, 0xB7, 0x4A, 0x0A, - 0xE0, 0x72, 0x92, 0x4F, 0x19, 0x07, 0xFD, 0x61, 0x92, 0x7B, 0x7B, 0x40, - 0x1E, 0xE6, 0x09, 0x79, 0x6A, 0x06, 0xE4, 0x2E, 0x24, 0x4F, 0x25, 0x39, - 0xCF, 0x08, 0x77, 0x29, 0xC9, 0x2B, 0x3C, 0xE6, 0xDC, 0xF4, 0xC3, 0x54, - 0x6D, 0x68, 0xEF, 0x49, 0x92, 0x5B, 0x27, 0x05, 0x70, 0x21, 0xC9, 0x5F, - 0x91, 0xAC, 0x35, 0x0E, 0xD8, 0x63, 0x32, 0xBD, 0xD6, 0x27, 0x75, 0x08, - 0xC9, 0x59, 0x24, 0x37, 0x7A, 0x40, 0xDE, 0x83, 0xE4, 0xC9, 0x46, 0xCD, - 0x6D, 0x94, 0xE6, 0x5E, 0xE2, 0xA1, 0xB9, 0xE5, 0x46, 0xCD, 0x4D, 0xB7, - 0x77, 0x77, 0x92, 0x34, 0x18, 0x24, 0x7B, 0x92, 0x7C, 0x96, 0x64, 0x9D, - 0x71, 0xD0, 0x1F, 0x6F, 0x61, 0x8E, 0x6C, 0xE9, 0xDA, 0x9B, 0xE4, 0x4C, - 0x23, 0xE4, 0x26, 0x92, 0xCF, 0x78, 0x3A, 0x54, 0x17, 0xCB, 0x99, 0xB4, - 0x6A, 0xEE, 0x99, 0x11, 0xE7, 0xDC, 0x4C, 0xB8, 0xD5, 0x24, 0x47, 0x24, - 0xC9, 0xC9, 0xCA, 0x1C, 0xF4, 0x7F, 0x7A, 0x40, 0x9E, 0x26, 0x4D, 0xB6, - 0x3A, 0x15, 0x83, 0x3D, 0x35, 0xD9, 0x3A, 0xE7, 0xFA, 0x38, 0x54, 0x5D, - 0x49, 0x9E, 0x66, 0x34, 0xCB, 0x8D, 0xD2, 0xF4, 0x5F, 0x7B, 0x58, 0x8A, - 0x9C, 0x6D, 0x55, 0x0E, 0x22, 0x39, 0xC3, 0x13, 0xF2, 0x0F, 0x3D, 0xE6, - 0x9D, 0xC1, 0x24, 0x5F, 0xC9, 0x02, 0xE4, 0xC6, 0x0C, 0x6F, 0xD9, 0xBA, - 0x14, 0x4A, 0xAF, 0x73, 0x2D, 0xD3, 0x40, 0x03, 0xC9, 0x05, 0x9A, 0xEA, - 0x4A, 0x93, 0xBE, 0x17, 0xBD, 0x9B, 0xBC, 0xC0, 0x5A, 0xE3, 0xA0, 0x3E, - 0x4D, 0xF2, 0x40, 0x0F, 0x53, 0xB8, 0x17, 0xC9, 0x97, 0x3C, 0x1E, 0xAA, - 0x96, 0x06, 0xFB, 0x4B, 0x92, 0xE7, 0x79, 0x3C, 0x70, 0x15, 0x9E, 0x73, - 0xEE, 0x7C, 0x92, 0xBF, 0xD4, 0x11, 0x65, 0xBB, 0x38, 0x4D, 0x1A, 0xE0, - 0x09, 0xF9, 0x09, 0x4F, 0xC8, 0x83, 0x48, 0xBE, 0x1C, 0x03, 0xE4, 0x06, - 0x92, 0x5F, 0xC8, 0x4C, 0x5A, 0x07, 0xBB, 0xBB, 0x20, 0x2D, 0xF4, 0x98, - 0x73, 0xCF, 0x8D, 0x1B, 0x6E, 0x2E, 0x8E, 0x0B, 0x07, 0xC8, 0xF1, 0xAA, - 0xF1, 0x70, 0xBC, 0xF6, 0xF7, 0x98, 0x87, 0x06, 0xC9, 0x07, 0xA8, 0xCD, - 0x31, 0xDC, 0x54, 0x86, 0xE6, 0x7E, 0x65, 0x6C, 0x6F, 0xBE, 0xEE, 0xEB, - 0xC2, 0x76, 0x7A, 0x1E, 0xDC, 0x5F, 0xC0, 0x6A, 0x3C, 0xCC, 0xF5, 0xC1, - 0x1E, 0xF3, 0xDF, 0x40, 0x92, 0x2F, 0x78, 0x40, 0x6E, 0xD0, 0xBA, 0x78, - 0xBC, 0xD1, 0xD9, 0x4B, 0x29, 0x72, 0xE3, 0x02, 0xCD, 0xD9, 0x96, 0xF6, - 0xE6, 0x6A, 0xAE, 0xDE, 0x8A, 0xED, 0xFC, 0xC0, 0x7F, 0x67, 0x6D, 0x84, - 0x58, 0x21, 0x3F, 0x4B, 0xF2, 0x10, 0x0F, 0x73, 0x3D, 0x90, 0xE4, 0x74, - 0x03, 0xE4, 0x46, 0x92, 0x9F, 0x49, 0x93, 0xAC, 0x70, 0x7B, 0x90, 0xBC, - 0x50, 0xDE, 0xB6, 0xF5, 0x61, 0x3A, 0xBD, 0x0D, 0x67, 0xE6, 0x89, 0x8B, - 0xE8, 0xE8, 0xAF, 0x35, 0xA8, 0x15, 0xF2, 0x93, 0x9A, 0x93, 0xAD, 0xCE, - 0xCE, 0x1E, 0xF2, 0xE6, 0x5B, 0xF3, 0xAE, 0x9B, 0x32, 0xCC, 0xA4, 0x15, - 0x6E, 0x25, 0xC9, 0xF3, 0x75, 0xAA, 0x64, 0x85, 0x7B, 0x56, 0xB6, 0xE1, - 0xE6, 0x23, 0x64, 0x67, 0x27, 0x99, 0xEB, 0x0D, 0x1E, 0xE6, 0xFA, 0x20, - 0x0F, 0xC8, 0xBB, 0x93, 0xFC, 0x57, 0x2B, 0xDB, 0x9A, 0x8B, 0x65, 0x96, - 0x3B, 0x79, 0x98, 0xE5, 0x8B, 0x8C, 0x70, 0xEB, 0x15, 0xE3, 0x75, 0x3A, - 0x73, 0x94, 0x67, 0x95, 0x8F, 0x30, 0x92, 0x7E, 0x9E, 0xE6, 0x7A, 0x3A, - 0xC9, 0x03, 0x3C, 0xCC, 0xF5, 0x01, 0xDA, 0xBB, 0x5E, 0x2F, 0x6D, 0x6D, - 0xD2, 0xF7, 0xD5, 0xC9, 0xAC, 0x5E, 0xEE, 0xA1, 0xB9, 0xDB, 0x69, 0x67, - 0x6B, 0xB9, 0x51, 0x73, 0x3F, 0x21, 0x39, 0x76, 0x4B, 0x88, 0xC9, 0x8A, - 0x32, 0x27, 0x3F, 0xED, 0x01, 0xF9, 0x05, 0x01, 0xB3, 0x2E, 0x27, 0x06, - 0x91, 0x7C, 0x40, 0xA6, 0x78, 0x81, 0x3C, 0xDD, 0xE9, 0x3A, 0xE4, 0xB7, - 0x3A, 0x38, 0x95, 0x9A, 0x73, 0x2D, 0x70, 0x1B, 0xB5, 0x3D, 0x7A, 0x5A, - 0x7B, 0x8F, 0xC9, 0xB2, 0xC8, 0x4E, 0x8A, 0xB9, 0x3A, 0x4C, 0x19, 0x84, - 0x51, 0xE5, 0x45, 0x00, 0x37, 0x29, 0x14, 0xC8, 0x92, 0x31, 0x50, 0xA1, - 0x50, 0x9C, 0x46, 0xA5, 0xC0, 0x2C, 0x50, 0xD0, 0x3D, 0x8C, 0xDF, 0x31, - 0x16, 0xC0, 0x65, 0x00, 0x7A, 0x1A, 0x72, 0xAF, 0xAA, 0x01, 0xDC, 0x0C, - 0xE0, 0x21, 0xE4, 0x3A, 0x91, 0x3D, 0xCF, 0x51, 0x7F, 0xFD, 0xE4, 0x44, - 0x59, 0xE7, 0xE4, 0xE7, 0x3D, 0x1D, 0xAF, 0xB6, 0x44, 0x89, 0x56, 0x68, - 0x29, 0x64, 0xF5, 0x96, 0xE7, 0x4A, 0x73, 0xF3, 0x92, 0x23, 0x9C, 0x84, - 0xD0, 0xCE, 0x3E, 0xDA, 0xBD, 0xB2, 0x42, 0x9E, 0xA1, 0x25, 0x54, 0x97, - 0x1C, 0xC0, 0xDD, 0x56, 0x66, 0xF9, 0x1B, 0xA3, 0x59, 0x4E, 0xC3, 0xCD, - 0x5B, 0xE2, 0x7A, 0x52, 0xE2, 0x77, 0xFB, 0xEA, 0x6C, 0x78, 0x9D, 0x11, - 0xF2, 0xCB, 0x24, 0x0F, 0xCD, 0x22, 0xE4, 0x34, 0x5C, 0x1F, 0x87, 0x6A, - 0x2E, 0x5D, 0x7C, 0x75, 0x51, 0x3E, 0xC7, 0x36, 0x49, 0x19, 0x0D, 0xFD, - 0x14, 0xCA, 0x63, 0x85, 0xFC, 0x12, 0xC9, 0x51, 0x1E, 0x51, 0x16, 0x51, - 0xE0, 0xF6, 0xD4, 0x69, 0x92, 0xC5, 0x2C, 0xA7, 0x97, 0x42, 0x63, 0xB3, - 0xB9, 0x43, 0xD5, 0x1E, 0x01, 0x67, 0x86, 0xDE, 0x5A, 0x21, 0xCF, 0x22, - 0x39, 0x32, 0xC6, 0x79, 0xAE, 0x80, 0xE4, 0x8E, 0x74, 0x09, 0x64, 0x2B, - 0x8C, 0x70, 0x67, 0x2B, 0x62, 0xA4, 0x30, 0x09, 0x63, 0x9A, 0xC4, 0xDC, - 0xA4, 0xDE, 0x24, 0x1F, 0xF4, 0x80, 0xFC, 0x38, 0xC9, 0xED, 0x63, 0xEA, - 0x43, 0x0F, 0x92, 0x37, 0x69, 0x1E, 0xB5, 0xC0, 0xFD, 0x90, 0x2E, 0x61, - 0x2D, 0x31, 0xE3, 0x99, 0xC4, 0x42, 0x68, 0x8B, 0x54, 0xFF, 0xE2, 0x29, - 0xD8, 0x6A, 0x4C, 0x1D, 0x0B, 0x57, 0x63, 0x2B, 0x0E, 0xD9, 0x53, 0x49, - 0xE6, 0x51, 0xC7, 0x67, 0xA3, 0xF2, 0x9B, 0x6F, 0x06, 0xF0, 0x68, 0x92, - 0x06, 0x33, 0xA9, 0x95, 0xEE, 0xBE, 0x06, 0x70, 0x1D, 0x80, 0xD7, 0x0C, - 0xE9, 0x1B, 0x4D, 0xCA, 0x89, 0x8A, 0x43, 0xB6, 0x37, 0xAC, 0x73, 0x1B, - 0x00, 0x7C, 0xA4, 0x04, 0xF1, 0x69, 0x49, 0x1B, 0xC8, 0xA4, 0x02, 0x2E, - 0x03, 0xD0, 0x4B, 0x1B, 0x19, 0x51, 0x01, 0xA7, 0x94, 0xBF, 0x14, 0x47, - 0x49, 0x87, 0x72, 0x43, 0xBB, 0x0D, 0x00, 0x66, 0x01, 0x78, 0x39, 0x89, - 0x03, 0x99, 0x44, 0xC0, 0x25, 0x4A, 0xC8, 0xBA, 0x45, 0xC9, 0x60, 0x51, - 0xFB, 0xB8, 0x0C, 0xC0, 0x17, 0x31, 0x55, 0xB4, 0x59, 0x21, 0xB3, 0x1B, - 0x35, 0xE9, 0xEE, 0x47, 0x00, 0xC6, 0x00, 0xD8, 0x36, 0x69, 0x83, 0xD9, - 0x29, 0x81, 0x70, 0x0F, 0x56, 0x81, 0x95, 0xE1, 0x86, 0xFB, 0x6A, 0x00, - 0x3C, 0x01, 0x60, 0x71, 0x4C, 0xFD, 0xF8, 0x1C, 0xC0, 0x5C, 0x44, 0xAB, - 0xA6, 0x53, 0x04, 0x60, 0x5F, 0x00, 0xBD, 0x95, 0x32, 0xFB, 0x20, 0x80, - 0x6F, 0x83, 0x06, 0xFF, 0xBF, 0x74, 0x05, 0x70, 0x28, 0x5C, 0xF5, 0xB8, - 0xFD, 0x0C, 0xF7, 0xAD, 0x07, 0x30, 0x1D, 0xC0, 0x44, 0x55, 0xB5, 0x89, - 0x43, 0xE6, 0x2B, 0xCF, 0x78, 0xA9, 0xC1, 0x22, 0xF4, 0xD2, 0x83, 0x39, - 0x0E, 0x40, 0x0F, 0x24, 0xA3, 0x22, 0x5F, 0x62, 0x96, 0x49, 0x5D, 0x49, - 0x8E, 0x66, 0xCB, 0x75, 0x1F, 0x37, 0x25, 0x6B, 0x48, 0xDE, 0x4F, 0xB2, - 0x57, 0x16, 0xFA, 0x54, 0xA4, 0xBD, 0xE7, 0x6A, 0xDA, 0xB2, 0x1A, 0x97, - 0x90, 0xBC, 0x54, 0x3B, 0x60, 0xA9, 0xB0, 0x0E, 0x76, 0x31, 0x57, 0xC7, - 0x91, 0x7C, 0xC7, 0x08, 0x77, 0x35, 0xC9, 0xFB, 0xB4, 0x66, 0xCD, 0xE6, - 0x3E, 0xF4, 0x38, 0x92, 0x73, 0x8C, 0x90, 0x17, 0xD3, 0x25, 0xA8, 0xF5, - 0xCC, 0x37, 0xE4, 0x7C, 0x82, 0x4D, 0x29, 0x40, 0x7C, 0x34, 0xC9, 0x7F, - 0x1B, 0xE1, 0xAE, 0x24, 0x79, 0x8F, 0xCE, 0x66, 0x73, 0xD1, 0xD7, 0xB1, - 0xDA, 0x7E, 0xB4, 0x42, 0xBE, 0x5C, 0x1B, 0x37, 0x1D, 0xEE, 0xB0, 0x21, - 0xA5, 0x18, 0xE2, 0x31, 0x74, 0xC5, 0x56, 0x2C, 0xF2, 0x5F, 0xBA, 0xDC, - 0xD9, 0x6E, 0x6D, 0x68, 0xDB, 0xE7, 0xBE, 0x93, 0x49, 0x7E, 0xE0, 0x61, - 0xAE, 0xAF, 0xD4, 0xB6, 0x67, 0x5E, 0x20, 0xE7, 0xCB, 0x8B, 0x2E, 0x87, - 0xAB, 0xFB, 0x78, 0x11, 0x5A, 0x2E, 0xC7, 0xDB, 0x5C, 0x56, 0xC2, 0x15, - 0x08, 0x9F, 0x60, 0xD8, 0xE5, 0x4A, 0xC1, 0x55, 0xAB, 0xEB, 0xAC, 0x02, - 0x31, 0x05, 0x00, 0x36, 0xE8, 0xAA, 0x31, 0x38, 0x51, 0x8F, 0xE8, 0xDF, - 0xCB, 0xB4, 0xD3, 0x15, 0xA5, 0x66, 0x48, 0x4F, 0xB8, 0x52, 0xC8, 0x94, - 0x77, 0xBD, 0xC4, 0x58, 0x88, 0xA6, 0xDD, 0x2D, 0x93, 0x52, 0x2A, 0x76, - 0x32, 0x12, 0xC0, 0xF9, 0x9E, 0x70, 0xAB, 0xE0, 0xAA, 0xF6, 0x44, 0x6D, - 0xAF, 0x52, 0xCB, 0x9D, 0xBD, 0x00, 0xF4, 0x13, 0xEC, 0xC5, 0x00, 0x3E, - 0x01, 0xF0, 0x8E, 0x0A, 0xC3, 0x44, 0x8D, 0xB2, 0x78, 0x54, 0xB0, 0x2E, - 0x37, 0x42, 0x1E, 0xAF, 0xFF, 0x7E, 0x58, 0xBB, 0x74, 0xDC, 0x12, 0xBD, - 0xE8, 0x74, 0x98, 0xE9, 0x29, 0x74, 0x25, 0x0B, 0x2D, 0xB2, 0x9C, 0xE4, - 0xEF, 0x3D, 0xCC, 0x72, 0x05, 0xC9, 0x5F, 0xC8, 0xB4, 0x6E, 0xEA, 0x3B, - 0x27, 0x29, 0x3E, 0xCC, 0x7A, 0xF2, 0x73, 0x92, 0x7E, 0x83, 0x25, 0x09, - 0x7D, 0x29, 0xC9, 0x6B, 0x72, 0x6D, 0xAE, 0x73, 0x09, 0xB8, 0x92, 0x2E, - 0xAB, 0xFE, 0x03, 0x8F, 0x39, 0xF7, 0x56, 0xDA, 0xAB, 0xCE, 0x74, 0x57, - 0x34, 0x45, 0x4B, 0xB9, 0xC0, 0x75, 0x24, 0x27, 0xEA, 0x2C, 0xBA, 0xC0, - 0x13, 0x72, 0x83, 0x11, 0xF2, 0x95, 0x24, 0x77, 0xD8, 0xD2, 0xC2, 0x66, - 0xCB, 0xE4, 0x89, 0xBE, 0xE7, 0x01, 0x77, 0x92, 0x51, 0x73, 0x53, 0xFA, - 0x7C, 0x54, 0x4B, 0xB1, 0x5A, 0xE7, 0xBE, 0x7D, 0x3C, 0x06, 0xFD, 0x44, - 0x0F, 0xC7, 0x6B, 0x19, 0x5D, 0x45, 0xA2, 0x9C, 0x40, 0xCE, 0x15, 0xDC, - 0x9F, 0x91, 0xFC, 0x8F, 0x11, 0xEE, 0x0A, 0x92, 0xB7, 0x19, 0x23, 0x35, - 0xD2, 0xC1, 0x71, 0x63, 0x75, 0x36, 0x6B, 0x79, 0x90, 0x6E, 0xF0, 0x84, - 0x7C, 0xBC, 0x7E, 0x9B, 0x05, 0xF2, 0xB7, 0x24, 0xAB, 0x72, 0xB1, 0x84, - 0xCA, 0x36, 0xDC, 0x6E, 0xDA, 0x28, 0xF8, 0xD0, 0x03, 0xEE, 0x24, 0xDA, - 0x13, 0xA1, 0x2B, 0x34, 0x0D, 0xCC, 0xF6, 0xC8, 0x2C, 0x5C, 0x25, 0x4D, - 0xF6, 0x99, 0x23, 0x4F, 0xF0, 0x84, 0x7C, 0xAD, 0x76, 0xE1, 0x52, 0xED, - 0x11, 0x70, 0x99, 0xD6, 0xB9, 0x1F, 0xE7, 0x40, 0x73, 0xD3, 0xED, 0x9D, - 0xE2, 0x61, 0x29, 0x36, 0x65, 0xAE, 0x7D, 0x21, 0x5B, 0xE7, 0xE4, 0x15, - 0x72, 0xBC, 0xB2, 0x66, 0xAE, 0xB3, 0x6D, 0x96, 0x3F, 0xF6, 0xD4, 0xDC, - 0x7C, 0xC0, 0x4D, 0xCB, 0x3A, 0x99, 0x6B, 0x1F, 0xC8, 0xC7, 0xCA, 0xCF, - 0xA8, 0x37, 0x4E, 0x0F, 0xD7, 0x65, 0xCB, 0xBB, 0xCE, 0x96, 0x59, 0x1E, - 0x43, 0x7B, 0x95, 0xF4, 0x6F, 0x3D, 0xE1, 0xA6, 0xDB, 0x9B, 0xCD, 0xF8, - 0x64, 0x4D, 0x1B, 0x20, 0x8F, 0xF6, 0x80, 0xBC, 0x8A, 0xAE, 0xCE, 0xF4, - 0x0F, 0xE2, 0x86, 0x1C, 0x37, 0xDC, 0x72, 0x2D, 0x4D, 0xE6, 0x78, 0xC0, - 0x9D, 0x48, 0x7B, 0xB2, 0x77, 0xDA, 0x5B, 0x9E, 0xC3, 0xF8, 0x65, 0x9D, - 0x02, 0xEF, 0xFA, 0x78, 0x42, 0x7E, 0xC7, 0x53, 0x93, 0x63, 0x85, 0x1C, - 0xF7, 0xF1, 0xDA, 0x4F, 0x69, 0xAB, 0x41, 0x45, 0x65, 0x0B, 0xFC, 0x8E, - 0xF6, 0x32, 0x45, 0x69, 0xB8, 0x16, 0xCD, 0x6D, 0x32, 0x46, 0x4A, 0xAE, - 0x25, 0x79, 0x8B, 0xD6, 0xC9, 0xD6, 0x41, 0x3F, 0x86, 0xE4, 0x5B, 0xB4, - 0x55, 0xFF, 0x59, 0x21, 0xCB, 0xD1, 0x97, 0x31, 0xE5, 0x0E, 0xC7, 0x05, - 0xB7, 0x80, 0xAE, 0x98, 0xD9, 0xEB, 0x46, 0xB8, 0x4B, 0x49, 0xDE, 0x6C, - 0xCC, 0x4C, 0x48, 0x65, 0x6C, 0x62, 0x58, 0xCD, 0xF2, 0x42, 0xF9, 0x05, - 0x35, 0x46, 0x4D, 0x4E, 0x6F, 0x86, 0x58, 0x77, 0xBC, 0x8E, 0xA6, 0x4B, - 0x5D, 0xDD, 0x68, 0xD4, 0xE4, 0x1B, 0xE9, 0x52, 0x54, 0x13, 0x03, 0xB8, - 0x84, 0xE4, 0x9D, 0x1E, 0x70, 0x6F, 0xF0, 0x30, 0xCB, 0x95, 0x74, 0xD5, - 0xE3, 0xE6, 0x7A, 0xB4, 0xF7, 0x1B, 0x79, 0xBB, 0xAF, 0xD2, 0x56, 0x8D, - 0x67, 0xAD, 0x20, 0xEF, 0xEA, 0x01, 0xF9, 0x18, 0x41, 0xAE, 0x33, 0x5A, - 0xB5, 0xD1, 0x4C, 0x50, 0xA5, 0xBB, 0x4A, 0xBA, 0xEA, 0x36, 0x96, 0xC1, - 0xAE, 0xA2, 0x3D, 0x99, 0xBB, 0x52, 0x7B, 0xCB, 0x9F, 0x7A, 0xC0, 0xBD, - 0x2E, 0x23, 0xF3, 0x61, 0x24, 0x5D, 0xE6, 0x7F, 0x9D, 0x51, 0x93, 0x6F, - 0xA7, 0xAB, 0x1C, 0x64, 0x85, 0x7C, 0x14, 0xC9, 0xD7, 0x8C, 0xED, 0xDD, - 0xCF, 0x04, 0x95, 0x13, 0xAE, 0xA0, 0x4B, 0xCE, 0xB6, 0xC0, 0xB5, 0x9A, - 0xE5, 0x4A, 0xBA, 0x1A, 0x54, 0x56, 0xCD, 0x5D, 0xA2, 0xF6, 0x9A, 0xA7, - 0x9A, 0x1E, 0xE1, 0x31, 0xE8, 0x6B, 0x75, 0x16, 0xDD, 0xDF, 0x63, 0x8E, - 0x4C, 0xB7, 0x17, 0xD5, 0xF1, 0x9A, 0xCE, 0x18, 0xEA, 0x66, 0xC5, 0x05, - 0xB8, 0x94, 0xAE, 0xBA, 0x7A, 0x94, 0xC1, 0x9E, 0x60, 0xD4, 0xDC, 0x14, - 0x5D, 0x4A, 0xCA, 0xD9, 0x74, 0x95, 0x70, 0x2C, 0xB2, 0x58, 0x1B, 0x09, - 0x9B, 0x7B, 0x98, 0x8E, 0xF4, 0x84, 0xEC, 0x7B, 0x0A, 0x75, 0x94, 0x1C, - 0xAF, 0x28, 0x90, 0xFF, 0xC1, 0x84, 0x95, 0x13, 0x3E, 0x91, 0x9B, 0x4F, - 0xB1, 0x4C, 0x17, 0xF5, 0xBC, 0xC6, 0xC3, 0x2C, 0x6F, 0x47, 0x57, 0x24, - 0x65, 0x9E, 0x87, 0xE6, 0x5E, 0x15, 0xA1, 0xBD, 0x51, 0x74, 0xC9, 0x6B, - 0x56, 0x73, 0x7D, 0x9B, 0xA7, 0x26, 0x1F, 0xC9, 0xD6, 0x2B, 0xD7, 0xD7, - 0x6A, 0xAC, 0x0A, 0x99, 0xA0, 0x65, 0x52, 0x67, 0x2D, 0x77, 0x16, 0xA9, - 0x83, 0x0D, 0xFA, 0x11, 0x35, 0x74, 0xD5, 0xE3, 0xAE, 0xA2, 0x5F, 0xDD, - 0xC7, 0x73, 0x3C, 0x34, 0x37, 0x0D, 0x37, 0x6A, 0xFA, 0xE6, 0xE1, 0x6C, - 0xBD, 0x1A, 0x4F, 0x73, 0xF9, 0x4E, 0x8E, 0xE5, 0x2E, 0x1E, 0xCE, 0x50, - 0xBA, 0xBD, 0xDA, 0xCD, 0xC0, 0x7D, 0x95, 0xAE, 0x42, 0x50, 0x9B, 0x9D, - 0xAC, 0xC2, 0xAA, 0xAA, 0xAA, 0xB8, 0x62, 0x07, 0x1A, 0x00, 0x7C, 0xA8, - 0x8C, 0x80, 0x0D, 0xCA, 0x0E, 0x58, 0x00, 0xF7, 0xFE, 0xA2, 0xA9, 0x70, - 0xAF, 0xB9, 0xA9, 0x35, 0xD6, 0xC3, 0x38, 0x01, 0xC0, 0x05, 0xB0, 0xBD, - 0x4A, 0x76, 0x29, 0xDC, 0x4B, 0x21, 0x27, 0x1A, 0xB2, 0x13, 0xAA, 0x15, - 0x53, 0xBD, 0x8B, 0xF2, 0x92, 0xA2, 0xC4, 0x8B, 0x17, 0x29, 0xAA, 0xA3, - 0x40, 0x81, 0xF2, 0x96, 0x44, 0xB9, 0x6A, 0x25, 0xD9, 0x55, 0x2A, 0x94, - 0x68, 0x23, 0xDC, 0xFB, 0x92, 0x56, 0x01, 0x78, 0x1D, 0xEE, 0x55, 0x42, - 0x6F, 0xC6, 0x12, 0x42, 0xC3, 0xEC, 0x14, 0x61, 0xE9, 0xAD, 0xCE, 0x37, - 0x29, 0xCA, 0x7F, 0xA9, 0xF1, 0xFE, 0x4A, 0xA5, 0xAD, 0x5C, 0x0C, 0xDB, - 0x1B, 0xBF, 0x33, 0xE1, 0xD6, 0x7A, 0xF4, 0x7B, 0x14, 0xDC, 0xCB, 0x9F, - 0x87, 0x2A, 0xB4, 0x27, 0x8A, 0x6C, 0x80, 0x7B, 0x11, 0xD7, 0x64, 0xB8, - 0x77, 0x05, 0x5B, 0x06, 0x74, 0x37, 0x7C, 0xFF, 0xBD, 0x49, 0x6B, 0x00, - 0x3C, 0x07, 0x60, 0x9E, 0x1E, 0x9C, 0xA6, 0xF6, 0x14, 0xB2, 0x63, 0x89, - 0xC4, 0x18, 0x4F, 0x5B, 0x21, 0xED, 0xB4, 0x59, 0xBE, 0x9A, 0x6D, 0xCF, - 0xAA, 0x3F, 0x54, 0x73, 0xB2, 0xC5, 0x5C, 0xD7, 0x91, 0xBC, 0xCB, 0xD3, - 0x5C, 0x77, 0xA8, 0x04, 0xF0, 0xEE, 0x5A, 0xE7, 0x5A, 0x1D, 0xAA, 0x74, - 0xBC, 0x53, 0x5C, 0xE5, 0x78, 0x0F, 0xA7, 0xFD, 0x15, 0x3E, 0x75, 0x24, - 0x27, 0x27, 0x0D, 0x72, 0x92, 0xE0, 0xF6, 0xD0, 0x3A, 0xD7, 0xEA, 0x50, - 0x2D, 0x92, 0xE6, 0xC6, 0x5D, 0x6B, 0x79, 0xA4, 0x20, 0x5B, 0xB6, 0x19, - 0x6B, 0x32, 0x1C, 0xAF, 0x82, 0x00, 0xF8, 0xFB, 0x4B, 0xA1, 0xF3, 0xE4, - 0x6D, 0x5B, 0xE1, 0x5E, 0xC1, 0xEC, 0xD5, 0xA0, 0xFA, 0xB1, 0x3C, 0x5A, - 0x4B, 0x69, 0xE2, 0x5A, 0x92, 0x53, 0xE4, 0x05, 0x77, 0x0A, 0x80, 0xDD, - 0xA9, 0x90, 0x15, 0x6E, 0xE6, 0xAB, 0xE5, 0xB2, 0x5D, 0xC9, 0xE6, 0x20, - 0xDA, 0x8B, 0x8C, 0xD7, 0x92, 0xFC, 0x23, 0x5D, 0x59, 0xE3, 0xBC, 0x42, - 0xCE, 0x77, 0xFA, 0x68, 0x01, 0x80, 0xFD, 0x15, 0x04, 0xDF, 0x37, 0xAA, - 0x5F, 0xA8, 0x60, 0xF5, 0x29, 0x70, 0xA5, 0x10, 0x37, 0x66, 0xB9, 0x8F, - 0xAF, 0x02, 0xB8, 0x51, 0xE5, 0x24, 0xA2, 0x96, 0x4E, 0x2C, 0x06, 0x70, - 0x2A, 0x80, 0x33, 0xB5, 0xDC, 0xEB, 0xB0, 0xF9, 0xC1, 0x65, 0x70, 0xB5, - 0x1F, 0xFB, 0x19, 0xEE, 0x59, 0x08, 0xE0, 0x4E, 0x00, 0xB7, 0xC2, 0x56, - 0xAB, 0xB2, 0x2D, 0xF2, 0x0A, 0x80, 0xEB, 0x55, 0xAA, 0x61, 0x43, 0xC4, - 0x7B, 0x3A, 0xEB, 0xB7, 0xF5, 0xED, 0xC8, 0x80, 0x7B, 0xC1, 0xBD, 0x00, - 0x3A, 0xAA, 0xE6, 0x7E, 0x05, 0xE0, 0x2E, 0x5D, 0x0D, 0x39, 0xEE, 0xEB, - 0x4C, 0x69, 0xF2, 0x2C, 0xC3, 0x83, 0x55, 0x01, 0x57, 0x74, 0xB5, 0xC3, - 0x96, 0x70, 0xE8, 0xA4, 0x1D, 0xA1, 0xA8, 0x70, 0x27, 0x0B, 0x6E, 0x63, - 0x9E, 0xFA, 0x3B, 0x33, 0x43, 0x31, 0x0E, 0x94, 0x29, 0x8E, 0x02, 0x39, - 0x9E, 0x4D, 0x8B, 0x76, 0x08, 0xF8, 0x3B, 0xED, 0x74, 0xF5, 0x6E, 0xE5, - 0x73, 0x0B, 0xB4, 0x7D, 0x37, 0x25, 0x8F, 0x70, 0x33, 0x21, 0x33, 0xC3, - 0x7F, 0x28, 0x6E, 0x65, 0xFB, 0x76, 0x49, 0x47, 0x36, 0xD1, 0xCB, 0x35, - 0xBF, 0xD5, 0xB7, 0xA2, 0xB9, 0xB7, 0x27, 0x04, 0x6E, 0x5A, 0x66, 0x69, - 0x4E, 0x9E, 0xD9, 0x82, 0xB9, 0x26, 0x80, 0x4F, 0x01, 0xCC, 0xC9, 0x69, - 0x36, 0x61, 0xC2, 0x34, 0x78, 0x1D, 0x5C, 0x91, 0xEC, 0x61, 0x00, 0x06, - 0xC3, 0x55, 0xD9, 0x49, 0x9B, 0xB3, 0x7A, 0x69, 0xEE, 0xBD, 0x3A, 0xA8, - 0x48, 0x0A, 0xDC, 0x4C, 0xC8, 0x54, 0x5F, 0x47, 0xC0, 0x55, 0xD8, 0x29, - 0xD4, 0xFF, 0xAB, 0x57, 0x8A, 0xEA, 0x9F, 0xE4, 0x14, 0xE6, 0x0D, 0x70, - 0x3E, 0x2B, 0xBE, 0x67, 0xCA, 0x21, 0x3A, 0x5C, 0x18, 0xA2, 0x8D, 0xF7, - 0x95, 0x70, 0x65, 0x8C, 0x66, 0x28, 0xA7, 0xB6, 0x01, 0xC9, 0x95, 0xE1, - 0x00, 0x4E, 0x51, 0xDF, 0x77, 0xD4, 0x81, 0xC1, 0x3C, 0xB8, 0xC2, 0x68, - 0x0F, 0xEB, 0x21, 0x46, 0x47, 0x07, 0x0C, 0xB8, 0xC4, 0xF0, 0xA1, 0x00, - 0x76, 0xD5, 0x51, 0xDA, 0xFB, 0x88, 0xAF, 0xEE, 0x55, 0xB6, 0xA5, 0x14, - 0x2E, 0xC9, 0x7C, 0x4F, 0x4D, 0x3B, 0xEF, 0xCA, 0xFA, 0xE4, 0x5D, 0x92, - 0x04, 0x38, 0xC8, 0x16, 0xE8, 0x64, 0x05, 0x09, 0x80, 0x83, 0x04, 0xC0, - 0x41, 0x02, 0xE0, 0x00, 0x38, 0x48, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, - 0x00, 0x07, 0x09, 0x80, 0x83, 0x04, 0xC0, 0x41, 0x02, 0xE0, 0x20, 0x01, - 0x70, 0x00, 0x1C, 0x24, 0x00, 0x0E, 0x12, 0x00, 0x07, 0x09, 0x80, 0x83, - 0x64, 0x47, 0xFE, 0x37, 0x00, 0x03, 0xCE, 0x9A, 0x67, 0x1F, 0xCC, 0x4A, - 0xE6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, - 0x82 -}; -} -static unsigned char* legit_icon = raw::legit; -} \ No newline at end of file diff --git a/internal_rewrite/icons/misc.hpp b/internal_rewrite/icons/misc.hpp deleted file mode 100644 index a955fe0..0000000 --- a/internal_rewrite/icons/misc.hpp +++ /dev/null @@ -1,1721 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\misc.png (4/1/2018 10:00:14 PM) - StartOffset: 00000000, EndOffset: 00005025, Length: 00005026 */ - -namespace icons { -constexpr static size_t misc_size = 20518; -namespace raw { -static unsigned char misc[20518] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, - 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, - 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, - 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, 0x35, 0x37, - 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, 0x2D, 0x63, - 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, 0x64, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x66, 0x37, 0x34, - 0x35, 0x33, 0x62, 0x38, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, - 0x34, 0x35, 0x36, 0x39, 0x37, 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, - 0x2D, 0x37, 0x37, 0x34, 0x33, 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, - 0x65, 0x38, 0x65, 0x34, 0x36, 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x34, 0x35, 0x36, 0x39, 0x37, - 0x37, 0x61, 0x2D, 0x38, 0x38, 0x64, 0x63, 0x2D, 0x37, 0x37, 0x34, 0x33, - 0x2D, 0x61, 0x35, 0x37, 0x63, 0x2D, 0x63, 0x65, 0x38, 0x65, 0x34, 0x36, - 0x31, 0x36, 0x62, 0x63, 0x63, 0x37, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, - 0x3A, 0x31, 0x33, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x61, 0x36, 0x61, 0x62, 0x64, 0x39, 0x62, 0x36, 0x2D, 0x34, 0x65, - 0x35, 0x37, 0x2D, 0x33, 0x63, 0x34, 0x63, 0x2D, 0x61, 0x37, 0x38, 0x30, - 0x2D, 0x63, 0x62, 0x30, 0x63, 0x32, 0x33, 0x65, 0x39, 0x30, 0x61, 0x31, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x32, 0x3A, 0x30, 0x30, 0x3A, 0x31, 0x33, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xCB, 0xA4, 0xEC, 0x39, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0A, 0x48, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x8C, 0x5D, 0x55, 0x15, 0xC7, - 0x7F, 0xF7, 0xDE, 0x79, 0xF7, 0xE1, 0xB4, 0xB4, 0xA5, 0x6F, 0x3A, 0xA5, - 0x28, 0x32, 0xA5, 0x9D, 0x92, 0x52, 0x04, 0x15, 0x94, 0x8A, 0x90, 0x5A, - 0x2D, 0x11, 0xA2, 0x35, 0x4A, 0x04, 0xF1, 0x91, 0xF8, 0xC2, 0x10, 0xEB, - 0x2B, 0xD1, 0xF8, 0x41, 0xE1, 0x83, 0xD1, 0x84, 0x48, 0x22, 0x31, 0x8A, - 0x04, 0x11, 0xD4, 0x08, 0x0D, 0x6D, 0xAC, 0x96, 0x48, 0x85, 0xAA, 0xA1, - 0x45, 0x91, 0x42, 0x5B, 0xEB, 0x4C, 0x87, 0x16, 0x28, 0xED, 0x40, 0xA7, - 0xD3, 0x4E, 0x3B, 0x73, 0x67, 0xDA, 0x79, 0xDC, 0xED, 0x87, 0xB5, 0x4E, - 0xE8, 0x87, 0xCA, 0xD9, 0x67, 0xEE, 0xB9, 0xF7, 0xEC, 0x73, 0xCF, 0xFE, - 0x27, 0x27, 0x43, 0xE1, 0xD0, 0x39, 0xF7, 0xFE, 0xCE, 0xDE, 0x7B, 0xAD, - 0xFF, 0x5E, 0x7B, 0xEF, 0x9C, 0x31, 0x06, 0xAF, 0xDA, 0x55, 0xDE, 0x7F, - 0x05, 0x1E, 0xB0, 0x97, 0x07, 0xEC, 0xE5, 0x01, 0x7B, 0x79, 0xC0, 0x5E, - 0xF1, 0xAB, 0xCE, 0xC1, 0x67, 0xCA, 0x01, 0x05, 0x7D, 0xF9, 0xEA, 0x80, - 0x7A, 0xFD, 0x73, 0xCE, 0x91, 0xE7, 0x2B, 0x01, 0x63, 0x7A, 0x8D, 0x9F, - 0x75, 0x79, 0xC0, 0x21, 0x6A, 0x01, 0x26, 0x01, 0x8B, 0x81, 0x99, 0xFA, - 0xCF, 0xD3, 0x80, 0xA9, 0xFA, 0xDF, 0x1A, 0x1C, 0xE8, 0x71, 0x4A, 0xC0, - 0x19, 0xA0, 0x08, 0x9C, 0x04, 0x4E, 0xE9, 0xCF, 0xFD, 0xC0, 0x09, 0xE0, - 0x34, 0x30, 0xE4, 0x01, 0xBF, 0xA9, 0x06, 0x60, 0x06, 0xB0, 0x10, 0xB8, - 0x4C, 0x7F, 0xAE, 0x02, 0xCE, 0x07, 0x9A, 0x80, 0x29, 0x0A, 0xBA, 0xC1, - 0xA1, 0x97, 0x71, 0x54, 0x41, 0x16, 0x15, 0x66, 0x11, 0xF8, 0x2F, 0xD0, - 0x09, 0xBC, 0x06, 0xFC, 0x13, 0x38, 0x02, 0xF4, 0xE9, 0xBD, 0xC9, 0x76, - 0x87, 0x09, 0x19, 0x1D, 0x8D, 0xC0, 0x3C, 0xE0, 0x72, 0xE0, 0x6A, 0xA0, - 0x1D, 0xB8, 0x44, 0x5B, 0x6E, 0x5A, 0x35, 0x0E, 0x1C, 0x05, 0xF6, 0x02, - 0xBB, 0x81, 0xED, 0xC0, 0xBF, 0x81, 0xD7, 0x81, 0x91, 0xAC, 0x00, 0xAE, - 0xD7, 0xD6, 0x79, 0x35, 0x70, 0x3D, 0x70, 0x15, 0xB0, 0xA4, 0x46, 0xE3, - 0x9B, 0x7D, 0xC0, 0x53, 0xC0, 0x36, 0xE0, 0xEF, 0xC0, 0x31, 0x1D, 0xB7, - 0x6B, 0x16, 0x70, 0x8B, 0x82, 0x5D, 0x03, 0xAC, 0x05, 0xDA, 0x32, 0x12, - 0xC8, 0x76, 0x02, 0x9B, 0x80, 0xAD, 0xC0, 0x3F, 0xB4, 0x7B, 0xAF, 0x39, - 0xC0, 0x0B, 0x80, 0x1B, 0x80, 0xDB, 0x75, 0x8C, 0xCD, 0x91, 0x2D, 0x8D, - 0x6A, 0x97, 0xFD, 0x00, 0xB0, 0x59, 0x03, 0xB3, 0x9A, 0x08, 0xB2, 0x72, - 0xC0, 0x3B, 0x81, 0xCF, 0x00, 0xEB, 0x75, 0xDC, 0xCD, 0xA2, 0xEA, 0x81, - 0xD5, 0xC0, 0x05, 0xC0, 0x6C, 0xE0, 0x31, 0xE0, 0x40, 0xDA, 0x5B, 0x70, - 0x0E, 0xE8, 0x00, 0xEE, 0x04, 0x6E, 0x02, 0x9A, 0xBD, 0xED, 0x00, 0x9A, - 0x4E, 0xFD, 0x06, 0xF8, 0x29, 0xD0, 0x95, 0x66, 0xC0, 0xCB, 0x81, 0xEF, - 0x2A, 0xDC, 0x38, 0x64, 0x34, 0x0F, 0x4D, 0xCA, 0x54, 0x28, 0xE8, 0x65, - 0x62, 0x18, 0x62, 0x86, 0x81, 0x07, 0x81, 0x9F, 0x54, 0x1A, 0x72, 0x5D, - 0x85, 0x5A, 0xEE, 0xDB, 0x81, 0x0D, 0x65, 0xC0, 0x1D, 0x51, 0x13, 0xE1, - 0x18, 0x30, 0x70, 0x56, 0x9A, 0x31, 0x08, 0xF4, 0x27, 0x60, 0x78, 0x94, - 0x80, 0x56, 0x60, 0xB2, 0xFE, 0xB9, 0x59, 0x73, 0xF4, 0xF3, 0xF4, 0xDF, - 0x35, 0x44, 0xFC, 0xFB, 0x9A, 0x81, 0x4F, 0xEB, 0xD8, 0xFC, 0x63, 0xE0, - 0xE5, 0x34, 0x01, 0x6E, 0x03, 0xEE, 0xD0, 0x31, 0x37, 0x6A, 0x0B, 0xED, - 0x07, 0x5E, 0xD2, 0xB7, 0xFA, 0x45, 0xFD, 0xD9, 0x8F, 0xB8, 0x47, 0x39, - 0x35, 0x15, 0x8A, 0x09, 0xB5, 0xE0, 0x49, 0x9A, 0x09, 0xE4, 0xD4, 0x84, - 0x99, 0x0E, 0xBC, 0x03, 0x58, 0x06, 0x2C, 0xD5, 0xF8, 0x62, 0x6A, 0x84, - 0xBF, 0xAF, 0x09, 0xB8, 0x4D, 0x3F, 0xCF, 0x5D, 0xFA, 0x42, 0x3B, 0x0F, - 0xB8, 0x19, 0xB8, 0x05, 0xB8, 0x55, 0xBB, 0x33, 0x5B, 0x0D, 0x02, 0xCF, - 0x01, 0x4F, 0x03, 0x7F, 0x05, 0x5E, 0x01, 0x5E, 0xC5, 0x61, 0x8F, 0x57, - 0xD5, 0x00, 0x2C, 0xD2, 0x58, 0x63, 0x25, 0xF0, 0x7E, 0x35, 0x6C, 0x5A, - 0x22, 0xBC, 0x34, 0x9F, 0x47, 0x9C, 0xB0, 0x87, 0x2A, 0x91, 0x27, 0xC7, - 0x39, 0x06, 0xE7, 0x81, 0x0F, 0x03, 0xF7, 0x02, 0xF3, 0x2D, 0xFF, 0x9F, - 0x31, 0x85, 0xF9, 0x47, 0xE0, 0x11, 0xC4, 0x01, 0x2A, 0x92, 0x4E, 0xB5, - 0x2A, 0xE8, 0xF5, 0x9A, 0xEB, 0xCF, 0x8F, 0x30, 0x56, 0xEF, 0x56, 0xD0, - 0x3B, 0x5C, 0x6E, 0xC1, 0x41, 0xD7, 0x6C, 0x0B, 0x77, 0x58, 0x73, 0xC3, - 0x5F, 0x03, 0x4F, 0x00, 0xBD, 0x29, 0x8F, 0x8E, 0xFB, 0x11, 0xE7, 0xAA, - 0x0B, 0x78, 0x5E, 0xC7, 0xD8, 0x95, 0x9A, 0x22, 0x85, 0xE9, 0x52, 0xE0, - 0x73, 0x3A, 0x3C, 0xC5, 0xFB, 0x3D, 0x18, 0x63, 0xE2, 0xB8, 0xEA, 0x8C, - 0x31, 0x5F, 0x37, 0xC6, 0x8C, 0x19, 0x3B, 0x0D, 0x18, 0x63, 0x1E, 0x36, - 0xC6, 0xAC, 0x8A, 0xE9, 0xF7, 0xBB, 0x78, 0xAD, 0x36, 0xC6, 0x6C, 0x31, - 0xC6, 0x8C, 0x58, 0x7E, 0x27, 0xC7, 0x8D, 0x31, 0xB7, 0x1A, 0x63, 0x0A, - 0x71, 0x3E, 0x47, 0x5C, 0x2D, 0xF8, 0x22, 0xE0, 0x13, 0x96, 0xE3, 0xEE, - 0x88, 0x5A, 0x77, 0x77, 0x03, 0x7B, 0x6A, 0x38, 0xDF, 0x7D, 0x52, 0x87, - 0x9B, 0x3C, 0x70, 0x9D, 0x45, 0xE4, 0x3F, 0x0D, 0xF8, 0x24, 0xF0, 0x37, - 0x6D, 0xC9, 0xB1, 0x8D, 0x9B, 0x71, 0x04, 0x56, 0x6B, 0x35, 0xEF, 0xB5, - 0xD1, 0x36, 0xE0, 0x47, 0x35, 0x0E, 0x37, 0xD0, 0x0E, 0x8D, 0x90, 0x9F, - 0xB7, 0xBC, 0xFF, 0x5D, 0xC0, 0x35, 0xC4, 0x68, 0xE5, 0xC6, 0x01, 0xF8, - 0x02, 0xE0, 0x66, 0xCB, 0xD6, 0xDB, 0xA5, 0x2D, 0x77, 0x57, 0x86, 0x9C, - 0xAB, 0xED, 0xC0, 0x3D, 0xC0, 0x1B, 0x16, 0xF7, 0x4E, 0x46, 0x3C, 0xFB, - 0x69, 0xAE, 0x00, 0xCE, 0x6B, 0x80, 0xD0, 0x61, 0x71, 0xEF, 0x10, 0xF0, - 0x0B, 0xFD, 0xC0, 0x59, 0xD3, 0x63, 0x9A, 0x06, 0xD9, 0xA4, 0x7D, 0xD7, - 0x68, 0x7E, 0xED, 0x04, 0xE0, 0xC9, 0x9A, 0xFB, 0xD9, 0x38, 0x39, 0x3B, - 0xF5, 0x43, 0x66, 0x51, 0x45, 0xE0, 0x3E, 0x64, 0x8E, 0x38, 0x4C, 0xB3, - 0x90, 0x79, 0xF2, 0x7A, 0x17, 0x00, 0xB7, 0x02, 0xD7, 0x5A, 0x06, 0x56, - 0xBF, 0x05, 0x7A, 0xC8, 0xAE, 0xBA, 0x35, 0xD7, 0xB7, 0xD1, 0x07, 0x22, - 0xBA, 0x62, 0x15, 0x03, 0x3C, 0x0B, 0xBB, 0x29, 0xC0, 0xBD, 0xC8, 0x84, - 0x77, 0xD6, 0xB5, 0x11, 0xA9, 0xD7, 0x0A, 0xD3, 0xF2, 0xB8, 0xC6, 0xE1, - 0x72, 0x01, 0x2F, 0x43, 0xEA, 0xAB, 0xC2, 0xF4, 0x27, 0xA4, 0x20, 0x2D, - 0x97, 0x61, 0xB8, 0x39, 0xA4, 0xFA, 0xF2, 0x2F, 0x16, 0xF7, 0x4E, 0x05, - 0xE6, 0xBA, 0x00, 0xF8, 0x0A, 0x8B, 0xB1, 0x62, 0x14, 0x78, 0x46, 0x03, - 0x8C, 0x2C, 0x2F, 0x65, 0x34, 0x88, 0x35, 0xFB, 0xB4, 0xC5, 0xBD, 0x4D, - 0xC0, 0x8A, 0xA4, 0x01, 0xD7, 0x21, 0xD5, 0x09, 0x61, 0x3A, 0x40, 0x05, - 0xA7, 0xC3, 0x52, 0xA8, 0x43, 0x84, 0xFB, 0xED, 0x05, 0xED, 0x1D, 0x13, - 0x05, 0xDC, 0x64, 0x19, 0xE9, 0xED, 0xB5, 0x1C, 0x77, 0xDE, 0xAA, 0x6B, - 0x73, 0xB1, 0xBB, 0x2D, 0x07, 0xB0, 0x4D, 0xB9, 0xCE, 0x14, 0xA2, 0xCD, - 0xC8, 0xFD, 0xDF, 0x56, 0x38, 0x51, 0xD5, 0x63, 0x57, 0x86, 0xD3, 0x8B, - 0xCC, 0xE7, 0x46, 0x4D, 0xBF, 0xDA, 0x78, 0xB3, 0x00, 0xBE, 0xE4, 0x18, - 0xE0, 0xBC, 0xE6, 0xF5, 0x3D, 0xC0, 0x41, 0xA2, 0x55, 0x4A, 0x1E, 0x45, - 0xA6, 0x42, 0x2F, 0xB5, 0xB8, 0xB7, 0x40, 0x99, 0x53, 0xA6, 0xE5, 0x00, - 0x2E, 0x58, 0xE6, 0xBF, 0x51, 0xAB, 0xFB, 0xE7, 0x00, 0x1F, 0xD3, 0x54, - 0x61, 0x81, 0x02, 0x36, 0x0E, 0xB6, 0xE0, 0x21, 0x6D, 0x89, 0x9B, 0x80, - 0x47, 0xB1, 0x9F, 0xE6, 0x34, 0xC8, 0x4C, 0x9A, 0x0D, 0x9B, 0x7C, 0x92, - 0x2D, 0x38, 0x6F, 0xF9, 0x00, 0x51, 0x82, 0xAB, 0xA0, 0x94, 0xE5, 0x6B, - 0xDA, 0x7A, 0x5D, 0xD7, 0x0A, 0xC4, 0xC5, 0x1B, 0x57, 0xC8, 0xA7, 0x2D, - 0x5F, 0x8E, 0xAA, 0x0D, 0x4D, 0xF9, 0x18, 0xDE, 0xE4, 0x38, 0x75, 0x31, - 0x32, 0xF1, 0x9D, 0x06, 0xB8, 0x81, 0x2E, 0x04, 0xBE, 0x8A, 0x78, 0xF2, - 0x71, 0x47, 0xDD, 0x89, 0x03, 0x8E, 0x5B, 0x1D, 0x48, 0x09, 0x4C, 0xDA, - 0xB4, 0x14, 0xFB, 0x25, 0x38, 0xB9, 0x6A, 0x06, 0x8E, 0xAE, 0x01, 0x6E, - 0x75, 0x30, 0xA0, 0xB2, 0xD1, 0x98, 0x46, 0xBD, 0xCE, 0xC9, 0x35, 0xC0, - 0xBD, 0xB8, 0x5F, 0x68, 0x77, 0x2E, 0x8D, 0x00, 0xC7, 0x3D, 0xE0, 0x70, - 0xED, 0x43, 0x4C, 0xF9, 0xB4, 0x69, 0x0F, 0x55, 0x58, 0xA5, 0x50, 0x0B, - 0x80, 0x5F, 0x42, 0x16, 0x68, 0x1D, 0x4A, 0x49, 0x4B, 0x1E, 0xD3, 0x3C, - 0xF8, 0x7E, 0xC4, 0x6B, 0x77, 0x4E, 0xAE, 0xED, 0xD1, 0xD1, 0x0F, 0xFC, - 0x0A, 0x31, 0x46, 0xDE, 0x8B, 0xAC, 0xFA, 0xAF, 0x77, 0xF0, 0x7B, 0xCB, - 0x21, 0xAB, 0x2E, 0xFE, 0x83, 0xD4, 0x50, 0x6D, 0x24, 0x81, 0xB5, 0xBF, - 0x69, 0x04, 0x8C, 0x7E, 0x71, 0x3F, 0x07, 0xB6, 0x00, 0x57, 0x22, 0xC5, - 0xE1, 0x2E, 0x02, 0xEE, 0xD2, 0x1E, 0xA7, 0x87, 0xE8, 0x4E, 0x5D, 0xA6, - 0x01, 0xA3, 0x86, 0x41, 0xB7, 0x5E, 0x05, 0x47, 0x9F, 0x31, 0x15, 0xC1, - 0x60, 0x5D, 0x0A, 0x9E, 0x31, 0x8D, 0x51, 0xB5, 0x0F, 0xB2, 0xBC, 0x3C, - 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x80, 0xBD, 0x3C, 0x60, 0x2F, - 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0x4A, 0x40, 0x69, 0x30, 0x3A, 0x5C, 0xAD, - 0xAA, 0x2C, 0x79, 0xC0, 0x13, 0xD7, 0x64, 0x64, 0x51, 0xF9, 0x6C, 0xC4, - 0x8B, 0xCE, 0xE1, 0x4E, 0xE1, 0x5D, 0x00, 0xF7, 0x14, 0xB2, 0x93, 0xEC, - 0x7E, 0xAA, 0xBC, 0xFF, 0x64, 0xDA, 0x01, 0xCF, 0x45, 0xAA, 0x2A, 0x3F, - 0x88, 0x54, 0x55, 0x36, 0x3B, 0x0A, 0x78, 0x10, 0x29, 0x7F, 0xDD, 0x08, - 0xFC, 0x1E, 0xC7, 0x36, 0x02, 0x77, 0x15, 0x70, 0x13, 0x52, 0x55, 0x79, - 0x07, 0xE9, 0x28, 0xBC, 0xEB, 0x40, 0xEA, 0x9B, 0x47, 0x81, 0x3F, 0xE0, - 0xE0, 0xAC, 0x92, 0x6B, 0x41, 0x56, 0xB0, 0x71, 0x69, 0x9A, 0xAA, 0x2A, - 0xDB, 0x80, 0x2F, 0xE1, 0x68, 0xB1, 0xA0, 0x8B, 0x55, 0x95, 0x69, 0xDC, - 0x47, 0xBA, 0x1D, 0x29, 0x9F, 0xF5, 0x80, 0x43, 0xD4, 0x9A, 0xE2, 0x8C, - 0xC4, 0x57, 0x55, 0x5A, 0xA8, 0x17, 0x47, 0x4B, 0x5F, 0x42, 0x34, 0x82, - 0x6C, 0x13, 0xEC, 0x01, 0x87, 0x68, 0x2F, 0xB2, 0x6F, 0x63, 0xDA, 0xB4, - 0x0B, 0xBB, 0xFD, 0x37, 0x32, 0x0F, 0xB8, 0x1B, 0x29, 0xBA, 0x7B, 0x85, - 0x74, 0x54, 0x72, 0x8C, 0x6A, 0x1E, 0x7C, 0x3F, 0x70, 0xD8, 0xA7, 0x49, - 0xE1, 0x1A, 0x40, 0xF6, 0xAE, 0x3C, 0x83, 0xEC, 0xDE, 0x73, 0x19, 0xD1, - 0xF7, 0x62, 0xAE, 0x96, 0x86, 0x91, 0x9D, 0x83, 0x9E, 0x42, 0x56, 0x18, - 0x96, 0x3C, 0x60, 0x3B, 0x1D, 0x47, 0x6A, 0xA3, 0x9F, 0x44, 0x36, 0xF3, - 0x6C, 0x71, 0x14, 0xF0, 0x00, 0x72, 0x08, 0xD6, 0x61, 0x12, 0x3C, 0x17, - 0x29, 0x8D, 0x80, 0x41, 0xAC, 0xBF, 0xFD, 0x7A, 0xF9, 0xAA, 0xCA, 0x1A, - 0x04, 0x9C, 0xBA, 0x2F, 0xD2, 0x55, 0xF9, 0xE9, 0x42, 0x0F, 0xD8, 0xCB, - 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x3C, 0x60, 0x2F, 0x0F, 0xD8, 0xCB, 0x03, - 0xF6, 0xF2, 0x80, 0xB3, 0xA4, 0x34, 0x18, 0x1D, 0x2E, 0x3A, 0x59, 0xC1, - 0x41, 0x99, 0x1E, 0xF0, 0x04, 0x35, 0x05, 0x39, 0xB7, 0x60, 0x0E, 0x6E, - 0xAE, 0xF0, 0x37, 0x88, 0x17, 0xDD, 0x83, 0x4C, 0x6F, 0x0E, 0x7B, 0xC0, - 0xF6, 0x9A, 0x07, 0x7C, 0x1C, 0xB8, 0x5E, 0x01, 0x37, 0x39, 0xFA, 0xDD, - 0x0D, 0x22, 0xBB, 0xE8, 0x3E, 0x8E, 0x9C, 0x07, 0xEC, 0xAB, 0x2A, 0x2D, - 0xD4, 0x88, 0x1C, 0x6C, 0xF9, 0x65, 0xEC, 0xF6, 0xA2, 0x4E, 0x5A, 0x2B, - 0x90, 0x7A, 0xAC, 0x21, 0xEC, 0xF7, 0xAA, 0xCC, 0x74, 0x90, 0x75, 0x09, - 0x52, 0x36, 0x9B, 0x06, 0xB8, 0x81, 0x16, 0xE1, 0xAB, 0x2A, 0xAD, 0xD5, - 0x81, 0xA3, 0xD5, 0x89, 0x21, 0x6A, 0x07, 0x16, 0x7B, 0xC0, 0xE1, 0x6A, - 0x25, 0x9D, 0x07, 0x77, 0xE4, 0x88, 0xE9, 0x18, 0x9C, 0x5A, 0x07, 0xDC, - 0x8B, 0xC3, 0xD5, 0x11, 0x6F, 0xA1, 0x33, 0xF8, 0xBD, 0x2A, 0xAD, 0xB4, - 0x0F, 0xE8, 0x4C, 0x21, 0xE0, 0x5D, 0xD4, 0x68, 0x55, 0x65, 0xDC, 0x0B, - 0xC2, 0xBA, 0x90, 0x0A, 0xC5, 0x83, 0x29, 0x31, 0x12, 0xC6, 0x34, 0x0F, - 0x8E, 0x5A, 0x55, 0x59, 0xB5, 0x85, 0x74, 0xE5, 0xA4, 0x49, 0x25, 0xEC, - 0x8A, 0xD4, 0xA3, 0xBC, 0x44, 0x41, 0x55, 0xE5, 0x10, 0xB0, 0x1A, 0x29, - 0xBA, 0x73, 0xB9, 0x6E, 0xEC, 0x59, 0xE4, 0xA0, 0xAB, 0xCD, 0x11, 0x5E, - 0x48, 0xDB, 0x23, 0x0E, 0x4C, 0xD2, 0x80, 0xC7, 0xB1, 0x3B, 0x70, 0x23, - 0xAA, 0x51, 0x71, 0x5C, 0x21, 0x6F, 0xD7, 0xA8, 0xBA, 0x11, 0x37, 0x0F, - 0xE5, 0x28, 0x22, 0xE7, 0x02, 0x1F, 0x26, 0xDA, 0xAA, 0xC2, 0x46, 0xEC, - 0xDC, 0xB9, 0x52, 0x1C, 0x9F, 0xBB, 0x1C, 0xC0, 0xA3, 0xD8, 0xB9, 0x37, - 0xE7, 0x23, 0xD6, 0xE3, 0x50, 0xC4, 0xD6, 0xD1, 0xA9, 0x5D, 0x76, 0xDE, - 0x51, 0xC0, 0x13, 0x2D, 0x06, 0x9C, 0x83, 0xDD, 0x02, 0x3B, 0x43, 0x0C, - 0xCB, 0x78, 0xCA, 0x01, 0x7C, 0xDA, 0xF2, 0xCD, 0x6D, 0x07, 0x16, 0x62, - 0x77, 0x40, 0xF2, 0xB9, 0x3E, 0x64, 0xAD, 0x55, 0x55, 0xCE, 0xB3, 0xCC, - 0x99, 0x8F, 0xC5, 0xF1, 0xD9, 0xCB, 0x09, 0xB2, 0xC6, 0xB1, 0x5B, 0x70, - 0xB5, 0x48, 0x01, 0x7B, 0x89, 0x16, 0x10, 0x7E, 0xA0, 0x67, 0x89, 0x98, - 0x4E, 0x49, 0x2F, 0x07, 0xB0, 0x01, 0x9E, 0xB3, 0xE8, 0x46, 0x0A, 0xD8, - 0x9D, 0x10, 0x9E, 0x05, 0x35, 0x03, 0xEF, 0xB1, 0xB8, 0x6F, 0x18, 0x39, - 0x26, 0x20, 0xF1, 0x34, 0x69, 0x27, 0x32, 0xAB, 0x12, 0xA6, 0xB5, 0xA4, - 0x6B, 0xD5, 0x7E, 0xA5, 0xB4, 0x54, 0xB3, 0x83, 0x30, 0xF5, 0x11, 0xD3, - 0x61, 0xDA, 0xE5, 0x02, 0x3E, 0x8C, 0xAC, 0x04, 0x0C, 0xD3, 0x32, 0xE0, - 0x43, 0x19, 0x87, 0x9B, 0x07, 0x6E, 0xC2, 0x6E, 0x22, 0xE5, 0x05, 0x85, - 0x9C, 0x38, 0xE0, 0x53, 0xC8, 0xEA, 0x3A, 0x9B, 0xDF, 0x73, 0x1B, 0x30, - 0x3D, 0xC3, 0x80, 0x57, 0x00, 0xEB, 0x2C, 0xEF, 0x7D, 0xC2, 0xB2, 0x67, - 0xAC, 0x38, 0xE0, 0xD3, 0xFA, 0x30, 0x36, 0x15, 0x0D, 0x57, 0x20, 0x73, - 0xBD, 0x0D, 0x19, 0x84, 0xDB, 0x02, 0xDC, 0x8E, 0xEC, 0xFD, 0x15, 0xA6, - 0x5E, 0xE4, 0xA0, 0x8F, 0x92, 0x0B, 0x80, 0x8D, 0x76, 0x27, 0xCF, 0x58, - 0xDC, 0x5B, 0x8F, 0x4C, 0xE4, 0xAF, 0xC9, 0x18, 0xDC, 0x7A, 0x64, 0xDF, - 0xAF, 0x9B, 0xB1, 0xAB, 0x2F, 0xDB, 0x42, 0x8C, 0x67, 0x47, 0xC5, 0x31, - 0xD9, 0xF0, 0x3A, 0xF0, 0x3B, 0x4B, 0x33, 0xA2, 0x0D, 0xF8, 0x06, 0x70, - 0x79, 0x46, 0xE0, 0x16, 0x90, 0xD2, 0xA3, 0x3B, 0x81, 0x99, 0x96, 0x43, - 0xDE, 0xE3, 0xD8, 0x1F, 0x55, 0x5B, 0x15, 0xC0, 0xE3, 0xC0, 0x9F, 0x91, - 0xC5, 0xD0, 0x36, 0xBA, 0x12, 0xF8, 0x26, 0xB2, 0x27, 0x56, 0xAD, 0xC3, - 0xBD, 0x0E, 0xD8, 0x80, 0xDD, 0x61, 0xD0, 0x00, 0xDB, 0x80, 0x1D, 0x71, - 0x47, 0x76, 0x71, 0xE8, 0x55, 0xE4, 0xAC, 0x23, 0x5B, 0x4F, 0x76, 0x1D, - 0xF0, 0x43, 0xE0, 0x06, 0xDC, 0x3C, 0xF8, 0x2A, 0x8E, 0x31, 0xF7, 0x46, - 0xE0, 0xDB, 0xC8, 0x01, 0x5F, 0x36, 0x3A, 0x01, 0x3C, 0x18, 0x57, 0x7A, - 0x14, 0x28, 0xCE, 0x99, 0x9A, 0x4D, 0xFA, 0xA1, 0xD6, 0x5A, 0xFE, 0xDE, - 0x1B, 0x35, 0x37, 0x9E, 0x05, 0x6C, 0x65, 0x62, 0x56, 0xA6, 0x8B, 0x9A, - 0xAF, 0x2F, 0xF0, 0x67, 0x89, 0x66, 0xF0, 0x3C, 0xAA, 0x2D, 0x18, 0x57, - 0x01, 0xF7, 0x02, 0xF7, 0x21, 0x1B, 0xA7, 0xCC, 0xB5, 0xB8, 0x3F, 0x07, - 0x5C, 0x05, 0xCC, 0xD0, 0x3C, 0x79, 0x0B, 0xF0, 0x22, 0xE2, 0xC1, 0xA6, - 0x51, 0xB3, 0x81, 0xE5, 0xFA, 0xE2, 0xAE, 0x21, 0x9A, 0x3D, 0xBB, 0x0B, - 0xF8, 0x19, 0x70, 0x32, 0xEE, 0x87, 0xCA, 0x19, 0x13, 0xEB, 0x44, 0xCD, - 0x24, 0xE0, 0x2B, 0xC0, 0x77, 0x88, 0xB6, 0xF3, 0xDB, 0x00, 0xB0, 0x1B, - 0x99, 0x22, 0xDC, 0x89, 0xD8, 0x74, 0x47, 0x90, 0xF2, 0x1D, 0x57, 0x37, - 0x46, 0xAB, 0x43, 0xAC, 0xC7, 0x79, 0x3A, 0xC6, 0xBE, 0x1B, 0xB1, 0x21, - 0xDB, 0x89, 0x36, 0x45, 0xFA, 0x06, 0xF0, 0x2D, 0x64, 0xE3, 0x19, 0x5C, - 0x07, 0x0C, 0x70, 0x1E, 0xF0, 0x3D, 0xE0, 0x8B, 0x13, 0xE8, 0x21, 0x4E, - 0xEA, 0x78, 0xBE, 0x07, 0xF1, 0xB9, 0x4F, 0x00, 0x47, 0x75, 0x5C, 0x72, - 0xA1, 0x56, 0x2B, 0xAF, 0x31, 0xC3, 0x5C, 0x1D, 0x5A, 0x66, 0x6A, 0x8F, - 0xB5, 0x14, 0x99, 0x44, 0x88, 0xBA, 0x0A, 0x63, 0x10, 0xB8, 0x1B, 0xB8, - 0x57, 0x23, 0xE8, 0x54, 0x00, 0x06, 0x39, 0xCF, 0xFE, 0x2E, 0x60, 0xFD, - 0x04, 0x03, 0xB9, 0x31, 0x85, 0x3B, 0x84, 0x9C, 0x48, 0x1A, 0x00, 0x36, - 0x0E, 0x01, 0x6E, 0xD5, 0x60, 0x6A, 0xFA, 0x04, 0x3F, 0xE3, 0x19, 0x1D, - 0xD2, 0x7E, 0x50, 0xC9, 0x61, 0xA9, 0x52, 0x80, 0x01, 0x2E, 0x06, 0xBE, - 0x0F, 0x7C, 0x34, 0xA6, 0x48, 0xD9, 0xA5, 0x0D, 0xC1, 0xCB, 0x55, 0x11, - 0x78, 0x48, 0x33, 0x89, 0x43, 0x15, 0x7D, 0xD8, 0x0A, 0x02, 0x06, 0x59, - 0xA9, 0xB0, 0x01, 0x31, 0xD9, 0x9D, 0xDC, 0x8D, 0x35, 0x01, 0x1D, 0x05, - 0x1E, 0x06, 0xEE, 0x01, 0x5E, 0xAE, 0xF8, 0xDB, 0x58, 0x61, 0xC0, 0x00, - 0x4B, 0x80, 0x2F, 0x20, 0x0B, 0xCA, 0x16, 0x64, 0x1C, 0x6E, 0x37, 0xF0, - 0x4B, 0xCD, 0x77, 0x8F, 0x54, 0xA5, 0xBB, 0xA9, 0x02, 0xE0, 0x20, 0x85, - 0x58, 0x07, 0xDC, 0x82, 0xD8, 0x94, 0x59, 0x9B, 0x70, 0x28, 0x22, 0x13, - 0x08, 0x8F, 0xA8, 0x5F, 0xD0, 0x5F, 0xB5, 0xF1, 0xA4, 0x4A, 0x80, 0x03, - 0x77, 0x67, 0x25, 0xF0, 0x29, 0xE0, 0x7D, 0xC8, 0x1A, 0xA4, 0x5A, 0xDF, - 0x61, 0x60, 0x54, 0x5B, 0xED, 0x56, 0x85, 0xFB, 0x02, 0x55, 0x3E, 0xD7, - 0xA1, 0x9A, 0x80, 0x03, 0x2D, 0x56, 0xD0, 0x1F, 0xD1, 0xD6, 0x1C, 0x9C, - 0xAC, 0x52, 0x6B, 0x2D, 0xF6, 0x00, 0xE2, 0xCF, 0x6F, 0x06, 0xFE, 0x05, - 0xBC, 0x96, 0x48, 0x44, 0x98, 0x00, 0x60, 0x10, 0x23, 0xFE, 0x42, 0xCD, - 0x21, 0x57, 0x29, 0xE8, 0x85, 0x88, 0x75, 0xD9, 0x98, 0x52, 0xA8, 0x43, - 0x1A, 0x40, 0x05, 0x60, 0x9F, 0x45, 0x1C, 0xAA, 0x83, 0x49, 0x66, 0x00, - 0x49, 0x01, 0x0E, 0x54, 0xA7, 0x79, 0xE4, 0x45, 0x7A, 0xAD, 0x54, 0xF0, - 0x6F, 0x53, 0xC3, 0x64, 0x0A, 0x30, 0xCD, 0x51, 0xA0, 0x7D, 0x88, 0x03, - 0xD7, 0xA7, 0x39, 0x7B, 0x27, 0x52, 0x08, 0xDF, 0xAD, 0xD7, 0x49, 0x1C, - 0x70, 0xE1, 0x92, 0x06, 0x7C, 0xB6, 0x1A, 0x10, 0x77, 0x68, 0x86, 0x9A, - 0x08, 0x33, 0x35, 0x38, 0x5B, 0x82, 0x7B, 0x4B, 0x4A, 0x8D, 0x02, 0xED, - 0x51, 0x93, 0x22, 0x38, 0x05, 0xAD, 0x0F, 0xC7, 0xAC, 0x55, 0x97, 0x00, - 0x9F, 0xAB, 0x1B, 0x6F, 0xD2, 0xD6, 0xEC, 0xE2, 0xCA, 0x86, 0x7E, 0xA4, - 0x64, 0xC9, 0xE9, 0x45, 0x72, 0x2E, 0x03, 0xF6, 0x8A, 0x41, 0x7E, 0x23, - 0x34, 0x0F, 0xD8, 0xCB, 0x03, 0xF6, 0xF2, 0x80, 0xBD, 0x92, 0xD1, 0xFF, - 0x06, 0x00, 0x3D, 0x67, 0xD1, 0x66, 0xCA, 0xCF, 0x19, 0x9B, 0x00, 0x00, - 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static unsigned char* misc_icon = raw::misc; -} \ No newline at end of file diff --git a/internal_rewrite/icons/rage.hpp b/internal_rewrite/icons/rage.hpp deleted file mode 100644 index 0bc349b..0000000 --- a/internal_rewrite/icons/rage.hpp +++ /dev/null @@ -1,1630 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\rage.png (4/1/2018 9:59:32 PM) - StartOffset: 00000000, EndOffset: 00004BD9, Length: 00004BDA */ - -namespace icons { -constexpr static size_t rage_size = 19418; -namespace raw { -static unsigned char rage[19418] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, - 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, - 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x65, - 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, 0x61, 0x36, - 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, 0x2D, 0x63, - 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, 0x39, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x65, 0x31, 0x37, 0x35, - 0x35, 0x65, 0x39, 0x63, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x34, - 0x31, 0x36, 0x37, 0x34, 0x65, 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, - 0x2D, 0x63, 0x39, 0x34, 0x38, 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, - 0x66, 0x31, 0x35, 0x61, 0x38, 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x34, 0x31, 0x36, 0x37, 0x34, 0x65, - 0x31, 0x31, 0x2D, 0x62, 0x37, 0x39, 0x38, 0x2D, 0x63, 0x39, 0x34, 0x38, - 0x2D, 0x39, 0x30, 0x31, 0x39, 0x2D, 0x62, 0x66, 0x31, 0x35, 0x61, 0x38, - 0x31, 0x65, 0x38, 0x31, 0x61, 0x36, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, - 0x3A, 0x33, 0x30, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x65, 0x66, 0x63, 0x62, 0x65, 0x35, 0x33, 0x30, 0x2D, 0x35, 0x65, - 0x61, 0x36, 0x2D, 0x61, 0x32, 0x34, 0x35, 0x2D, 0x38, 0x32, 0x38, 0x35, - 0x2D, 0x63, 0x35, 0x62, 0x63, 0x64, 0x36, 0x33, 0x61, 0x62, 0x39, 0x66, - 0x39, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x33, 0x30, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xB3, 0x93, 0x52, 0x50, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x05, 0xFC, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x6B, 0x88, 0x94, 0x55, 0x18, 0xC7, - 0x7F, 0xB3, 0xAB, 0x6B, 0xA9, 0xD9, 0x62, 0xBA, 0x56, 0xBB, 0x62, 0x94, - 0x90, 0xD9, 0x05, 0xB5, 0x48, 0x4B, 0x14, 0xBB, 0x80, 0x5D, 0xB4, 0xD8, - 0xAF, 0xF5, 0xA1, 0x02, 0x23, 0xB0, 0x08, 0xA2, 0x0F, 0x51, 0x51, 0x1F, - 0xBA, 0x10, 0xA5, 0x11, 0x14, 0x51, 0x54, 0xC2, 0x16, 0x11, 0x44, 0xD1, - 0xE5, 0x43, 0x45, 0x37, 0x37, 0x8C, 0xCC, 0xB2, 0x02, 0xD3, 0xC8, 0x56, - 0xB0, 0xA2, 0xD6, 0x75, 0x6D, 0xD5, 0x35, 0x37, 0xDB, 0xD5, 0xD9, 0x99, - 0x3E, 0x3C, 0xCF, 0xA0, 0x81, 0xF3, 0x9E, 0x33, 0x7B, 0x19, 0xDF, 0x77, - 0xF6, 0xFF, 0x83, 0x61, 0x84, 0x79, 0x77, 0xDE, 0x71, 0x7E, 0xEF, 0x39, - 0xE7, 0x39, 0xCF, 0x7B, 0xCE, 0x33, 0xB9, 0x62, 0xB1, 0x88, 0xA8, 0x5D, - 0xEA, 0xF4, 0x15, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, - 0x04, 0x0B, 0x09, 0x16, 0x12, 0x2C, 0xC1, 0x42, 0x82, 0x85, 0x04, 0x0B, - 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, 0x16, - 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, - 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, - 0x0B, 0x09, 0x96, 0x60, 0x51, 0x4B, 0x8C, 0xAB, 0xF0, 0xF8, 0x1C, 0x30, - 0x03, 0xC8, 0x03, 0x3D, 0xC3, 0x38, 0xEF, 0x49, 0xC0, 0xE9, 0xC0, 0x78, - 0xA0, 0x50, 0xE3, 0xDF, 0xF1, 0x61, 0xE0, 0x90, 0x3F, 0xFA, 0x81, 0x62, - 0x5A, 0x05, 0xCF, 0x05, 0x2E, 0x02, 0x16, 0xFA, 0x07, 0xDD, 0x08, 0x7C, - 0x07, 0x74, 0x55, 0x78, 0xCE, 0x8B, 0x81, 0x45, 0xC0, 0x7C, 0xA0, 0xA1, - 0x86, 0x05, 0xE7, 0x5C, 0xE6, 0xBF, 0xC0, 0x3E, 0xA0, 0x13, 0xD8, 0x0D, - 0xF4, 0xF9, 0xF3, 0x4E, 0x97, 0x3E, 0xAA, 0xFF, 0xFF, 0x5C, 0xE4, 0x0E, - 0xFF, 0xF9, 0xC0, 0x83, 0xC0, 0x02, 0x6F, 0x79, 0x83, 0xC0, 0x1F, 0xC0, - 0x27, 0xC0, 0x5A, 0xE0, 0xCF, 0xC8, 0xF3, 0x2D, 0x01, 0x1E, 0x00, 0xE6, - 0x01, 0xD3, 0xFC, 0x4B, 0xA8, 0x75, 0x06, 0x81, 0x01, 0xE0, 0x1F, 0xE0, - 0x6F, 0x17, 0xFE, 0x3B, 0xB0, 0xC9, 0x25, 0xFF, 0xEC, 0xCF, 0x7D, 0x27, - 0x4A, 0x70, 0x33, 0xF0, 0x1C, 0xD0, 0x7A, 0x9C, 0xD7, 0xFA, 0x81, 0x67, - 0x81, 0xFB, 0x22, 0xCE, 0x35, 0x0B, 0x68, 0x03, 0x96, 0x69, 0x64, 0x04, - 0x97, 0xBD, 0x17, 0xF8, 0xD1, 0x65, 0x6F, 0x06, 0xBE, 0x07, 0x7A, 0xAB, - 0x2D, 0xB8, 0x15, 0x78, 0x0B, 0xA8, 0x2F, 0xF3, 0xFA, 0x5E, 0xE0, 0x72, - 0xA0, 0x23, 0xF0, 0x3E, 0xB7, 0x03, 0x2F, 0xC9, 0xEB, 0x71, 0xE9, 0x05, - 0xB6, 0x03, 0x1F, 0x03, 0x9F, 0xBB, 0xE8, 0x43, 0xD5, 0x8A, 0xA2, 0xCF, - 0x4D, 0x90, 0x0B, 0x70, 0x1A, 0xB0, 0x32, 0xE2, 0x3C, 0x0B, 0xE5, 0xB1, - 0x2C, 0x8D, 0x1E, 0x97, 0xDC, 0x03, 0x3C, 0x06, 0xAC, 0x02, 0x66, 0x56, - 0x2B, 0xC8, 0x9A, 0x18, 0x78, 0xBD, 0xE8, 0x01, 0x58, 0x48, 0xF0, 0x14, - 0x3F, 0x36, 0x27, 0x9F, 0x65, 0x99, 0x02, 0x2C, 0x05, 0xE6, 0xF8, 0x77, - 0xBA, 0xCE, 0x5B, 0x73, 0x61, 0x34, 0x5B, 0xF0, 0x60, 0xE0, 0xF5, 0x82, - 0x4F, 0x05, 0x42, 0x1C, 0x91, 0xBF, 0x68, 0x9A, 0x80, 0xDB, 0x80, 0x47, - 0x81, 0x1B, 0x80, 0x09, 0xA3, 0xD5, 0x82, 0x73, 0x91, 0x57, 0xCF, 0x40, - 0xC4, 0x31, 0x05, 0x79, 0xAB, 0x88, 0x06, 0x60, 0xB9, 0x07, 0xB9, 0x53, - 0x81, 0x37, 0x3C, 0xA8, 0x1D, 0xD5, 0x44, 0x47, 0xD2, 0x85, 0x10, 0xEA, - 0xC6, 0x89, 0xE8, 0xA2, 0x4B, 0x53, 0x89, 0x5A, 0xE8, 0xC6, 0x8B, 0x1E, - 0xBB, 0x34, 0x78, 0x4F, 0x39, 0x61, 0x88, 0x2D, 0xF1, 0x02, 0xE0, 0x61, - 0x6F, 0x20, 0xAF, 0x63, 0x49, 0xA6, 0xAA, 0x0B, 0x1E, 0x29, 0x36, 0x00, - 0x1F, 0xF8, 0xE7, 0xCA, 0xD5, 0x80, 0xE0, 0x06, 0xE0, 0x14, 0x7F, 0x6E, - 0x04, 0xCE, 0x07, 0xCE, 0xF4, 0x5C, 0xC2, 0xC4, 0x0A, 0xDE, 0x6B, 0x96, - 0xE7, 0x21, 0x7A, 0x81, 0xF7, 0xB2, 0x2C, 0x78, 0x23, 0xF0, 0x8A, 0x5F, - 0xF9, 0xB5, 0x20, 0xB8, 0x0E, 0x4B, 0xC7, 0xD6, 0x7B, 0xEB, 0x3D, 0x07, - 0x38, 0x1B, 0x4B, 0xF4, 0x2C, 0x72, 0xE1, 0x93, 0x23, 0xDF, 0x6F, 0x36, - 0xF0, 0x10, 0x96, 0x11, 0xDB, 0x9C, 0x55, 0xC1, 0xF9, 0xC8, 0xF1, 0x3C, - 0xAB, 0x74, 0xFA, 0x45, 0xFC, 0xA1, 0xCB, 0xBD, 0x16, 0xB8, 0xCE, 0x23, - 0xE6, 0x98, 0x0B, 0x7A, 0x01, 0x96, 0x09, 0x5C, 0x4D, 0x64, 0x8A, 0x38, - 0x6D, 0x82, 0x27, 0x8D, 0x81, 0xE0, 0x29, 0x0F, 0xEC, 0xF1, 0xC7, 0x56, - 0x2C, 0x8B, 0x75, 0x93, 0x8B, 0x3E, 0x39, 0xE2, 0xEF, 0x57, 0x60, 0xF7, - 0x00, 0x9E, 0x8C, 0x19, 0x8F, 0x75, 0xBB, 0xF0, 0xC4, 0xD2, 0x03, 0xBC, - 0xE3, 0xE3, 0x6B, 0x1B, 0x71, 0xF9, 0xE8, 0x71, 0xC0, 0x1D, 0xC0, 0xA5, - 0x23, 0x35, 0x0F, 0xAE, 0xF6, 0xB8, 0x35, 0x16, 0xF9, 0x05, 0xCB, 0x60, - 0xBD, 0x10, 0x29, 0x79, 0x26, 0x70, 0x67, 0x4C, 0xA0, 0xA6, 0x16, 0x9C, - 0x1E, 0x76, 0x01, 0x6B, 0x3C, 0xC8, 0x8C, 0x49, 0x0A, 0xDD, 0x88, 0xDD, - 0x03, 0x90, 0xE0, 0x0C, 0xF1, 0x17, 0xF0, 0x94, 0x4F, 0x15, 0x63, 0xE2, - 0x95, 0x5B, 0x7D, 0x0A, 0x26, 0xC1, 0x19, 0xA2, 0x0B, 0x78, 0x02, 0xF8, - 0x2D, 0xE2, 0xD8, 0x95, 0xC0, 0x79, 0x12, 0x9C, 0x3D, 0xBE, 0xF5, 0xAE, - 0x3A, 0x14, 0x93, 0x4C, 0x01, 0xAE, 0x4F, 0x9A, 0x0D, 0x49, 0x70, 0x7A, - 0x69, 0x03, 0x76, 0x44, 0x1C, 0xB7, 0x3C, 0x69, 0x7A, 0x25, 0xC1, 0xE9, - 0xA5, 0x13, 0x78, 0x33, 0x62, 0xAE, 0x3B, 0x17, 0x4B, 0x65, 0x4A, 0x70, - 0x06, 0x79, 0x9B, 0xF0, 0x12, 0x9E, 0xA9, 0x58, 0x86, 0x2B, 0x27, 0xC1, - 0xD9, 0x63, 0x07, 0xB6, 0x94, 0x27, 0x14, 0x47, 0xCD, 0xA6, 0xCC, 0xAA, - 0x1B, 0x09, 0x4E, 0x37, 0x87, 0xB1, 0x3B, 0x6C, 0x21, 0x9A, 0xCA, 0xB9, - 0x94, 0xE0, 0x74, 0x53, 0x00, 0xBE, 0x21, 0xBC, 0x58, 0xA2, 0x89, 0x32, - 0xF7, 0x9A, 0x25, 0x38, 0xDD, 0x14, 0x81, 0x6E, 0xC2, 0x99, 0xAD, 0xE9, - 0x94, 0x49, 0x5B, 0x4A, 0x70, 0x36, 0x5A, 0x71, 0x28, 0x92, 0x9E, 0x84, - 0xDD, 0x77, 0x96, 0xE0, 0x0C, 0x52, 0xDA, 0x02, 0x93, 0x44, 0xBD, 0xC6, - 0xE0, 0xEC, 0x92, 0x27, 0x79, 0x5D, 0x3A, 0xDE, 0x85, 0x17, 0x24, 0x38, - 0x9B, 0x4C, 0x20, 0xBC, 0x30, 0x63, 0x3F, 0x65, 0x76, 0x42, 0x48, 0x70, - 0xBA, 0xA9, 0xC3, 0x32, 0x55, 0x21, 0xC1, 0xDD, 0xD8, 0xA6, 0x36, 0x09, - 0xCE, 0x20, 0x57, 0x11, 0x5E, 0xAF, 0xB5, 0xAF, 0x5C, 0x20, 0x26, 0xC1, - 0xE9, 0xA6, 0x11, 0xB8, 0x24, 0xE2, 0xB8, 0x4E, 0x8D, 0xC1, 0xD9, 0x64, - 0x29, 0xB6, 0xB3, 0x21, 0x89, 0x7E, 0x60, 0x8B, 0x04, 0x67, 0x8F, 0x71, - 0xD8, 0x6A, 0xCB, 0xD0, 0xBA, 0xAB, 0x2E, 0x60, 0x5B, 0xB9, 0xA9, 0x94, - 0x04, 0xA7, 0x97, 0x25, 0xC0, 0x95, 0x11, 0xC7, 0x7D, 0x4D, 0x42, 0xBD, - 0x14, 0x09, 0x4E, 0xEF, 0xD8, 0x7B, 0x37, 0xB6, 0xF7, 0x3A, 0xC4, 0xBB, - 0x24, 0x6C, 0x16, 0x90, 0xE0, 0x74, 0x72, 0x0B, 0x70, 0x4D, 0xC4, 0x71, - 0x5B, 0x81, 0xAF, 0x48, 0xC8, 0x74, 0x49, 0x70, 0xFA, 0xB8, 0x1A, 0xB8, - 0x0B, 0x2B, 0x35, 0x15, 0xE2, 0x35, 0x9F, 0x03, 0x23, 0xC1, 0xD9, 0x60, - 0x19, 0xF0, 0x08, 0x76, 0x03, 0x3F, 0xC4, 0x4F, 0xDE, 0x3D, 0x17, 0x42, - 0x91, 0x9A, 0x38, 0xF1, 0x34, 0x78, 0xCB, 0xBD, 0x1F, 0xB8, 0x2C, 0xE2, - 0xF8, 0x22, 0xF0, 0x22, 0xF0, 0x6B, 0x4C, 0x28, 0x9E, 0x26, 0xEA, 0xC7, - 0xA0, 0xDC, 0x66, 0x6C, 0x43, 0xD9, 0x2A, 0xE2, 0x92, 0x1A, 0x00, 0xEB, - 0xB1, 0xCA, 0x47, 0x85, 0xAC, 0x09, 0x1E, 0x4B, 0x75, 0x3C, 0xA6, 0xBB, - 0xD0, 0x56, 0x6C, 0x1B, 0x69, 0x4B, 0xE4, 0xDF, 0x75, 0x62, 0xBB, 0x1F, - 0xBA, 0x63, 0x27, 0xD3, 0x69, 0x62, 0x7F, 0x8D, 0x4B, 0x9D, 0xEA, 0x53, - 0xA0, 0x79, 0xC0, 0x62, 0xE0, 0x0A, 0xEC, 0x66, 0x42, 0x6C, 0x69, 0x87, - 0x3E, 0xE0, 0x69, 0xA0, 0x3D, 0xF6, 0x84, 0x69, 0x13, 0xDC, 0x02, 0x5C, - 0xE8, 0xFF, 0xAE, 0x95, 0x72, 0x4B, 0x75, 0x1E, 0x11, 0xB7, 0xB8, 0xD8, - 0xB3, 0xFC, 0x79, 0x16, 0xF1, 0xBB, 0xFB, 0xC1, 0xAA, 0x1D, 0xAD, 0xF3, - 0xC7, 0x91, 0xAC, 0x0A, 0x5E, 0x41, 0x60, 0xAF, 0x4D, 0x06, 0xA9, 0x77, - 0xC1, 0x33, 0xB0, 0xFA, 0x1C, 0x13, 0x29, 0xB3, 0xBC, 0x26, 0x81, 0x02, - 0xB6, 0x08, 0x7E, 0x2D, 0x56, 0xA4, 0x86, 0xAC, 0x0A, 0x9E, 0xE3, 0x0F, - 0x71, 0x94, 0x7E, 0x6C, 0x01, 0xFC, 0xE3, 0xC4, 0x17, 0x7D, 0x8D, 0x16, - 0x3C, 0x52, 0xDD, 0x64, 0xEE, 0x98, 0x87, 0x88, 0xA7, 0x07, 0xAB, 0x8F, - 0xF5, 0x3C, 0xE1, 0x5A, 0xA0, 0x43, 0x6E, 0xC1, 0xA1, 0xEE, 0xA4, 0x9E, - 0xB8, 0xDA, 0x1A, 0xE3, 0xE5, 0xAB, 0x22, 0x3A, 0x80, 0x97, 0x5D, 0xF0, - 0xAE, 0xA1, 0xBE, 0x49, 0x48, 0x70, 0x91, 0xF0, 0x92, 0xCD, 0x41, 0xC2, - 0x65, 0x07, 0x0A, 0x84, 0x4B, 0x22, 0x8A, 0xA3, 0x33, 0x89, 0x0D, 0xC0, - 0xAB, 0xC0, 0xA7, 0x0C, 0xB3, 0x8E, 0x74, 0x8C, 0xE0, 0xDD, 0x11, 0x82, - 0x3F, 0x8B, 0x10, 0xBC, 0x53, 0x5D, 0x74, 0x70, 0x0A, 0xB4, 0x15, 0x78, - 0x1F, 0xF8, 0x08, 0xBB, 0xC7, 0x3B, 0xEC, 0xF2, 0x8F, 0x31, 0x5D, 0xF4, - 0x36, 0xEC, 0xA6, 0xF2, 0x19, 0x09, 0xAF, 0x7F, 0x11, 0xF1, 0x3E, 0xED, - 0x58, 0x12, 0xFD, 0x54, 0xB9, 0xFC, 0xDF, 0x85, 0xBF, 0x07, 0xDB, 0x60, - 0xB6, 0xDE, 0x5B, 0xEE, 0x0F, 0xC0, 0xC1, 0x91, 0x3A, 0x41, 0xAC, 0xE0, - 0x67, 0x80, 0x7B, 0xB1, 0x32, 0xFC, 0xA5, 0x74, 0xE2, 0x11, 0xAC, 0x34, - 0xFD, 0x9A, 0xC8, 0x6E, 0x64, 0x13, 0x56, 0x39, 0x7E, 0xB5, 0x4F, 0xF8, - 0xC7, 0x22, 0xA5, 0xF2, 0xFE, 0x3D, 0x3E, 0xAE, 0x6E, 0x07, 0xBE, 0xC4, - 0xAA, 0xBE, 0x77, 0x54, 0x3A, 0x05, 0x8A, 0x8A, 0x6E, 0x23, 0x7F, 0xB3, - 0xA1, 0x11, 0xB8, 0x19, 0xFB, 0xED, 0x86, 0x19, 0xC7, 0x7C, 0xC8, 0x76, - 0xAC, 0x76, 0x62, 0x6C, 0x75, 0xBA, 0x69, 0x58, 0xE1, 0x90, 0xC5, 0x3E, - 0xE1, 0xAF, 0xE5, 0x1F, 0xE5, 0x28, 0x71, 0x18, 0x38, 0x80, 0x55, 0xC6, - 0x3F, 0xE0, 0x63, 0xEC, 0x16, 0x1F, 0xB2, 0xBA, 0xB0, 0xDF, 0xBE, 0xC8, - 0x8F, 0xD6, 0xC9, 0x63, 0x05, 0x83, 0x95, 0x09, 0x68, 0xC2, 0xEA, 0x42, - 0x94, 0x02, 0xAB, 0xCE, 0x21, 0x04, 0x4F, 0x93, 0xB1, 0x2C, 0x4E, 0xF3, - 0x18, 0x11, 0x3C, 0xE0, 0x5D, 0xEE, 0x41, 0x6C, 0x71, 0x7A, 0xE9, 0x57, - 0x58, 0xF2, 0xD5, 0x38, 0x79, 0x25, 0x82, 0x45, 0x06, 0xD1, 0x0D, 0x7F, - 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, - 0x42, 0x82, 0x25, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x42, 0x82, - 0x85, 0x04, 0x0B, 0x09, 0x96, 0x60, 0x21, 0xC1, 0x42, 0x82, 0x85, 0x04, - 0x0B, 0x09, 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x04, 0x0B, 0x09, - 0x16, 0x12, 0x2C, 0x24, 0x58, 0x48, 0xB0, 0x90, 0x60, 0x21, 0xC1, 0x12, - 0x2C, 0x6A, 0x8A, 0xFF, 0x06, 0x00, 0x0E, 0x16, 0x36, 0x06, 0x65, 0x03, - 0x35, 0x24, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, - 0x60, 0x82 -}; -} -static unsigned char* rage_icon = raw::rage; -} \ No newline at end of file diff --git a/internal_rewrite/icons/visuals.hpp b/internal_rewrite/icons/visuals.hpp deleted file mode 100644 index 3bd8c7b..0000000 --- a/internal_rewrite/icons/visuals.hpp +++ /dev/null @@ -1,1837 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\visuals.png (4/1/2018 10:00:00 PM) - StartOffset: 00000000, EndOffset: 00005593, Length: 00005594 */ - -namespace icons { -constexpr static size_t visuals_size = 21908; -namespace raw { -static unsigned char visuals[21908] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x39, 0x64, 0x36, 0xD2, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x2E, 0x23, 0x00, 0x00, 0x2E, - 0x23, 0x01, 0x78, 0xA5, 0x3F, 0x76, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43, - 0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, - 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x00, - 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67, 0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, - 0xDE, 0xF4, 0x42, 0x4B, 0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, - 0x20, 0x52, 0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10, - 0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45, 0x45, 0x04, - 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80, 0x8C, 0x15, 0x51, 0x2C, - 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4, 0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, - 0x8A, 0xCA, 0xFB, 0xE1, 0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, - 0xFE, 0xB5, 0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0, - 0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9, 0x42, 0x1E, - 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4, 0x2E, 0x40, 0x81, 0x0A, - 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3, 0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, - 0x00, 0xF8, 0x7E, 0x3C, 0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, - 0x78, 0xD3, 0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87, - 0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01, 0xC0, 0x74, - 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40, 0x7A, 0x8E, 0x42, 0xA6, - 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D, 0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, - 0x00, 0x60, 0xCB, 0x63, 0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, - 0x7F, 0xE6, 0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B, - 0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65, 0x88, 0x44, - 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A, 0x45, 0x00, 0x58, 0x30, - 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39, 0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, - 0x57, 0x66, 0x48, 0x00, 0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, - 0x00, 0x08, 0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B, - 0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00, 0x14, 0x46, - 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7, 0x2A, 0x00, 0x00, 0x78, - 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39, 0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, - 0x07, 0x57, 0x57, 0x2E, 0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, - 0x61, 0x02, 0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81, - 0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15, 0x11, 0xE0, - 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE, 0xCE, 0x36, 0x8E, 0xB6, - 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06, 0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, - 0xE5, 0xCF, 0xAB, 0x70, 0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, - 0x2C, 0x2F, 0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25, - 0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66, 0xB2, 0x0F, - 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3, 0x70, 0xF8, 0x7E, 0x3C, - 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9, 0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, - 0xC4, 0x42, 0x5B, 0x61, 0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, - 0x57, 0xFD, 0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2, - 0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2, 0xCC, 0xF4, - 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62, 0xDC, 0xE6, 0x8F, 0x47, - 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D, 0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, - 0x58, 0x2A, 0x14, 0xE3, 0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, - 0x32, 0xA5, 0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64, - 0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0, 0x6A, 0x3E, - 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03, 0xF6, 0x4B, 0x27, 0x10, - 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00, 0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, - 0x28, 0x08, 0x03, 0x80, 0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, - 0xFD, 0x47, 0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00, - 0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08, 0x00, 0x00, - 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4, 0xC1, 0x18, 0x2C, 0xC0, - 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1, 0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, - 0x24, 0xC4, 0xC2, 0x42, 0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, - 0x29, 0xAC, 0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F, - 0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70, 0x0E, 0x2E, - 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA, 0x61, 0x08, 0x9E, 0xC1, - 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41, 0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, - 0x88, 0x01, 0x62, 0x8A, 0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, - 0x21, 0xC1, 0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51, - 0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20, 0x55, 0x48, - 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C, 0x46, 0xBA, 0x91, 0x3B, - 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86, 0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, - 0x51, 0x3D, 0xD4, 0x0C, 0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, - 0xA2, 0x0B, 0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0, - 0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB, 0x68, 0x0F, - 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8, 0x18, 0x07, 0x33, 0xC4, - 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42, 0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, - 0xCB, 0xB1, 0x22, 0xAC, 0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, - 0xBB, 0x89, 0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0, - 0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48, 0x58, 0x4C, - 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24, 0x34, 0x11, 0xDA, 0x09, - 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2, 0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, - 0x26, 0xBA, 0x11, 0xF9, 0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, - 0x2C, 0x23, 0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4, - 0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02, 0x49, 0xB1, - 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E, 0x52, 0x23, 0xE9, 0x2C, - 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23, 0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, - 0x07, 0x39, 0x94, 0x2C, 0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, - 0xE4, 0x33, 0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40, - 0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A, 0x19, 0xE5, - 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32, 0x41, 0x55, 0xA3, 0x9A, - 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11, 0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, - 0xB6, 0x52, 0xAF, 0x51, 0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, - 0x83, 0x16, 0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17, - 0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95, 0x1E, 0x4E, - 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8, 0x97, 0xE8, 0x03, 0xF4, - 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83, 0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, - 0x18, 0x07, 0x18, 0x67, 0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, - 0xD3, 0x8B, 0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99, - 0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15, 0x91, 0xCA, - 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A, 0x2F, 0x54, 0xA9, 0xAA, - 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55, 0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, - 0x5E, 0x53, 0x7D, 0xAE, 0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, - 0x96, 0xAB, 0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9, - 0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4, 0x7E, 0x59, - 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F, 0x43, 0xA4, 0x51, 0xA0, - 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20, 0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, - 0x21, 0x6B, 0x0D, 0xAB, 0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, - 0xD9, 0x7C, 0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA, - 0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52, 0xF3, 0x94, - 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C, 0x74, 0x4E, 0x09, 0xE7, - 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A, 0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, - 0x1B, 0xA6, 0x34, 0x4C, 0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, - 0x96, 0x58, 0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE, - 0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81, 0x0E, 0x41, - 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F, 0xCE, 0x05, 0x9D, 0xE7, - 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A, 0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, - 0xAE, 0x2E, 0xAA, 0x6B, 0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, - 0xA7, 0xEE, 0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE, - 0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD, 0x6D, 0xFA, - 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C, 0x24, 0x06, 0xDB, 0x0C, - 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71, 0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, - 0xF1, 0x51, 0x43, 0x5D, 0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, - 0xE1, 0x84, 0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F, - 0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D, 0xC6, 0xA3, - 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA, 0x4D, 0xEE, 0x9A, 0x52, - 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B, 0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, - 0xCD, 0xA2, 0xCD, 0xD6, 0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, - 0x9B, 0xE7, 0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C, - 0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6, 0x59, 0xEE, - 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5, 0x58, 0x55, 0x5A, 0x5D, - 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25, 0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, - 0xA7, 0xB9, 0x4E, 0x93, 0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, - 0xB6, 0xC9, 0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE, - 0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7, 0xC5, 0xAE, - 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D, 0x8D, 0xFD, 0x3D, 0x07, - 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D, 0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, - 0x14, 0x3A, 0x56, 0x3A, 0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, - 0xF4, 0x96, 0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3, - 0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3, 0x47, 0x67, - 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B, 0x89, 0x4B, 0x82, 0xCB, - 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B, 0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, - 0x74, 0xF5, 0x71, 0x5D, 0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, - 0xC2, 0xED, 0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC, - 0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0, 0xC3, 0xC8, - 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F, 0x95, 0x30, 0x6B, 0xDF, - 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81, 0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, - 0x2F, 0x91, 0x57, 0xAD, 0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, - 0xEF, 0x17, 0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37, - 0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8, 0xB7, 0xCB, - 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43, 0x7F, 0x23, 0xFF, 0x64, - 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7, 0x80, 0x25, 0x01, 0x67, 0x03, 0x89, - 0x81, 0x41, 0x81, 0x5B, 0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, - 0x3F, 0x3A, 0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9, - 0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD, 0x21, 0x68, - 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98, 0xCE, 0x91, 0xCE, 0x69, - 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6, 0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, - 0xC3, 0x7E, 0x0C, 0x27, 0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, - 0x88, 0x58, 0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73, - 0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31, 0x4F, 0x39, - 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E, 0x6A, 0x3C, 0xDA, 0x37, - 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E, 0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, - 0x58, 0x49, 0x6C, 0x4B, 0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, - 0xBE, 0xDF, 0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B, - 0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2, 0xF4, 0x85, - 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96, 0x40, 0x4C, 0x88, 0x4E, - 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A, 0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, - 0x77, 0x25, 0x8E, 0x0A, 0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, - 0x36, 0xD1, 0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A, - 0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5, 0x33, 0xA5, - 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC, 0x4C, 0x0D, 0x4C, 0xDD, - 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76, 0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, - 0x31, 0x83, 0x92, 0x91, 0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, - 0x67, 0xEA, 0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE, - 0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B, 0xB3, 0x90, - 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6, 0xE8, 0x54, 0x5A, 0x28, - 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65, 0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, - 0x39, 0x96, 0xAB, 0x9E, 0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, - 0x37, 0x9C, 0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6, - 0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC, 0x6A, 0x39, - 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15, 0x05, 0x2B, 0x86, 0x56, - 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6, 0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, - 0x57, 0x97, 0xAE, 0x7E, 0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, - 0xCA, 0x82, 0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85, - 0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59, 0xDF, 0xB5, - 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89, 0x8A, 0xAE, 0x14, 0xDB, - 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28, 0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, - 0xCA, 0xBF, 0x99, 0xDC, 0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, - 0x66, 0xD2, 0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA, - 0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D, 0xDF, 0x56, - 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97, 0xCD, 0x28, 0xDB, 0xBB, - 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF, 0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, - 0xCE, 0xCD, 0x3B, 0x3F, 0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, - 0xEE, 0xD2, 0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B, - 0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD, 0x3E, 0xC9, - 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66, 0xD5, 0x65, 0xFB, 0x49, - 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89, 0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, - 0x5D, 0xAD, 0x4E, 0x6D, 0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, - 0x23, 0x0E, 0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52, - 0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE, 0x9D, 0xEF, - 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C, 0xC6, 0xE2, 0x23, 0x70, - 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09, 0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, - 0x76, 0x8C, 0x7B, 0xAC, 0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, - 0x2F, 0x6A, 0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B, - 0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE, 0x7A, 0xFC, - 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59, 0x79, 0x4A, 0xF3, 0x54, - 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3, 0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, - 0x95, 0x9D, 0x7D, 0x7E, 0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, - 0xE7, 0x63, 0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1, - 0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C, 0xF2, 0xB8, - 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8, 0x57, 0x9A, 0xAF, 0x3A, - 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C, 0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, - 0x9C, 0xBB, 0x9A, 0xAE, 0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, - 0x7B, 0x66, 0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79, - 0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD, 0xF3, 0x7A, - 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD, 0x7E, 0x72, 0x27, 0xFD, - 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27, 0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, - 0xF4, 0x40, 0xED, 0x41, 0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, - 0xDC, 0xD8, 0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC, - 0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F, 0x0F, 0x43, - 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86, 0xEB, 0x9E, 0x38, 0x3E, - 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD, 0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, - 0xCF, 0x26, 0x9E, 0x17, 0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, - 0x7E, 0xF8, 0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2, - 0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB, 0x19, 0xAF, - 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78, 0x33, 0x31, 0x5E, 0xF4, - 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC, 0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, - 0x4F, 0xE4, 0x7C, 0x20, 0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, - 0xD0, 0xA7, 0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3, - 0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x3A, 0xFD, 0x69, 0x54, 0x58, - 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, - 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, 0x3D, - 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, - 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, 0x39, - 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, - 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x3D, - 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, 0x65, - 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, 0x6B, - 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, 0x20, - 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, 0x33, - 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, 0x2C, - 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, 0x2D, - 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, 0x2F, - 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, 0x72, - 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, 0x73, - 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, - 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, 0x74, - 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, - 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, - 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, - 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, - 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, - 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, - 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x73, 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x2F, - 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, - 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, - 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, - 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, 0x54, - 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, - 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, - 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, - 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, - 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, - 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, - 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, - 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, - 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, - 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, 0x31, 0x61, - 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, 0x2D, 0x39, - 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, 0x34, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, - 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, 0x68, - 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x66, 0x36, 0x38, 0x37, - 0x35, 0x30, 0x30, 0x66, 0x2D, 0x33, 0x35, 0x62, 0x34, 0x2D, 0x31, 0x31, - 0x65, 0x38, 0x2D, 0x39, 0x31, 0x61, 0x34, 0x2D, 0x38, 0x38, 0x34, 0x37, - 0x30, 0x37, 0x30, 0x65, 0x31, 0x35, 0x34, 0x62, 0x3C, 0x2F, 0x78, 0x6D, - 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x30, - 0x33, 0x31, 0x65, 0x39, 0x31, 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, - 0x2D, 0x30, 0x65, 0x34, 0x61, 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, - 0x32, 0x31, 0x36, 0x34, 0x33, 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, 0x69, - 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, - 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, - 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, - 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x30, 0x33, 0x31, 0x65, 0x39, 0x31, - 0x33, 0x65, 0x2D, 0x31, 0x30, 0x65, 0x34, 0x2D, 0x30, 0x65, 0x34, 0x61, - 0x2D, 0x38, 0x39, 0x64, 0x61, 0x2D, 0x34, 0x32, 0x31, 0x36, 0x34, 0x33, - 0x36, 0x33, 0x36, 0x63, 0x32, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x34, 0x2D, 0x30, 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, - 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, - 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, - 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, - 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, 0x64, - 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3D, - 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, 0x65, - 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, - 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, - 0x3A, 0x30, 0x33, 0x33, 0x35, 0x64, 0x33, 0x38, 0x61, 0x2D, 0x64, 0x62, - 0x31, 0x61, 0x2D, 0x37, 0x38, 0x34, 0x31, 0x2D, 0x38, 0x38, 0x33, 0x34, - 0x2D, 0x39, 0x65, 0x36, 0x61, 0x61, 0x63, 0x37, 0x39, 0x30, 0x65, 0x64, - 0x34, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, - 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, - 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x34, 0x2D, 0x30, - 0x31, 0x54, 0x32, 0x31, 0x3A, 0x35, 0x39, 0x3A, 0x35, 0x38, 0x2B, 0x30, - 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, - 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, - 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, - 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, - 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, - 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, - 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, - 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, - 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, 0x67, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x78, 0x6D, - 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, 0x39, 0x30, 0x39, 0x62, 0x39, 0x65, - 0x35, 0x32, 0x2D, 0x39, 0x37, 0x62, 0x64, 0x2D, 0x34, 0x32, 0x39, 0x33, - 0x2D, 0x38, 0x30, 0x64, 0x32, 0x2D, 0x31, 0x31, 0x64, 0x65, 0x62, 0x64, - 0x36, 0x61, 0x33, 0x33, 0x65, 0x62, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, - 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x42, 0x61, - 0x67, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x41, 0x6E, 0x63, 0x65, - 0x73, 0x74, 0x6F, 0x72, 0x73, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, - 0x6F, 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, - 0x3E, 0x33, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x49, 0x43, 0x43, - 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, 0x73, 0x52, 0x47, 0x42, - 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2D, 0x32, 0x2E, - 0x31, 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x49, 0x43, 0x43, 0x50, 0x72, 0x6F, 0x66, 0x69, 0x6C, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, - 0x63, 0x3A, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, - 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x33, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, 0x30, 0x3C, - 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, - 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, 0x74, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, - 0x63, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, - 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, - 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x58, 0x44, 0x69, - 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, - 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, - 0x69, 0x6F, 0x6E, 0x3E, 0x31, 0x32, 0x30, 0x3C, 0x2F, 0x65, 0x78, 0x69, - 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, 0x69, 0x6D, 0x65, - 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x3E, 0x0A, 0x3C, 0x2F, - 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, 0x61, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x3C, - 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x65, 0x6E, 0x64, - 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x52, 0x1E, 0x40, 0x1C, 0x00, 0x00, - 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, - 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00, 0x00, - 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, - 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, 0x0F, 0xB6, 0x49, 0x44, - 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9D, 0x79, 0x94, 0x1C, 0x55, 0x15, 0xC6, - 0x7F, 0x3D, 0x7B, 0xB6, 0x21, 0x99, 0x6C, 0x10, 0x82, 0xC3, 0x12, 0x96, - 0x84, 0x18, 0x59, 0x13, 0x20, 0x91, 0x7D, 0x09, 0x04, 0x10, 0x34, 0x78, - 0x3C, 0x08, 0x02, 0xC1, 0x13, 0x8E, 0xE2, 0x71, 0x41, 0x51, 0x96, 0x28, - 0x22, 0xCA, 0x2E, 0x02, 0x46, 0x59, 0xC4, 0x05, 0x3D, 0x0A, 0x82, 0xEC, - 0x08, 0x42, 0x02, 0xB2, 0xC8, 0x2E, 0xA0, 0x01, 0x02, 0x21, 0x81, 0x24, - 0x98, 0x90, 0x90, 0x6D, 0x92, 0xC9, 0x4C, 0x66, 0xA6, 0x33, 0x33, 0xD7, - 0x3F, 0xEE, 0xED, 0x33, 0xCD, 0xD0, 0x5D, 0xFD, 0xAA, 0xA7, 0xAA, 0xBA, - 0x66, 0xA6, 0xEE, 0x39, 0x75, 0xD2, 0x67, 0x52, 0x5D, 0xFD, 0xDE, 0xFB, - 0xEA, 0xDD, 0x77, 0xEF, 0x7D, 0xDF, 0xBD, 0x2F, 0x25, 0x22, 0x24, 0xD2, - 0x77, 0xA5, 0x2C, 0x19, 0x82, 0x04, 0xE0, 0x44, 0x12, 0x80, 0x13, 0x89, - 0xAB, 0x54, 0xF4, 0x93, 0x7E, 0x6E, 0x03, 0x0C, 0x06, 0x52, 0x40, 0x03, - 0xD0, 0x9C, 0x00, 0xDC, 0x37, 0x64, 0x30, 0x30, 0x1D, 0x38, 0x1A, 0xA8, - 0x05, 0x04, 0xD8, 0x08, 0x3C, 0x08, 0x3C, 0xD3, 0x1F, 0x80, 0x4E, 0xF5, - 0x61, 0x2B, 0xBA, 0x12, 0xF8, 0x16, 0x70, 0x26, 0x50, 0x0F, 0x94, 0xDB, - 0xDF, 0xDB, 0x81, 0x45, 0xC0, 0x6D, 0x76, 0x75, 0x24, 0x00, 0xF7, 0x4E, - 0xDB, 0xE2, 0x18, 0x60, 0x2E, 0xB0, 0x93, 0xA9, 0xE6, 0x6C, 0xE9, 0x04, - 0xDE, 0x04, 0xCE, 0x05, 0x9E, 0xB3, 0x99, 0x9D, 0x18, 0x59, 0xBD, 0x48, - 0xAA, 0x80, 0x19, 0x79, 0xC0, 0xCD, 0xF4, 0x7B, 0x82, 0xA9, 0xEF, 0x3E, - 0xBD, 0x4C, 0xF5, 0x55, 0x80, 0x2B, 0x81, 0x1D, 0xF3, 0x80, 0x9B, 0x6D, - 0x7F, 0x8C, 0x49, 0x00, 0xEE, 0xBD, 0xFD, 0x72, 0x01, 0xAE, 0x3C, 0xF1, - 0x83, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x91, 0x04, 0xE0, 0x44, - 0x12, 0x80, 0x13, 0x49, 0x00, 0x4E, 0x24, 0x01, 0x38, 0x01, 0xB8, 0x8F, - 0x48, 0x2A, 0x81, 0x37, 0xBC, 0x28, 0xCE, 0xA7, 0xD0, 0x30, 0x21, 0xC0, - 0x1B, 0xC0, 0x86, 0x64, 0xA8, 0x3F, 0x26, 0x93, 0x80, 0xA1, 0xF6, 0x79, - 0x31, 0xB0, 0xAA, 0xB7, 0x00, 0x3C, 0x08, 0xDD, 0xBD, 0x39, 0x06, 0xD8, - 0xD6, 0xFE, 0xB6, 0x04, 0x78, 0x1A, 0x78, 0x18, 0x58, 0x19, 0xD1, 0x00, - 0x0A, 0xBA, 0x6B, 0x54, 0x48, 0xCA, 0x89, 0x76, 0xA3, 0xA1, 0x1E, 0x98, - 0x89, 0x6E, 0x5F, 0x0E, 0xB3, 0xBF, 0x7D, 0x60, 0x63, 0x73, 0x27, 0xD0, - 0x1A, 0x67, 0x80, 0x6B, 0x81, 0x0B, 0x81, 0xD3, 0x81, 0x91, 0x59, 0xCF, - 0x9E, 0x08, 0x4C, 0xB5, 0xCE, 0xDD, 0x6C, 0x1D, 0x0A, 0x5B, 0xD2, 0xC0, - 0x6A, 0x87, 0xFB, 0x3E, 0x8C, 0x10, 0xE0, 0x5D, 0xD1, 0xED, 0xCB, 0x93, - 0x81, 0x11, 0x59, 0xE3, 0x33, 0x09, 0xD8, 0x1B, 0xD8, 0x0E, 0xB8, 0x0E, - 0x68, 0x0B, 0xF6, 0x55, 0x17, 0x09, 0xE2, 0xAA, 0x12, 0x91, 0xD9, 0x22, - 0xB2, 0x46, 0x72, 0x4B, 0xA7, 0x88, 0xAC, 0x12, 0x91, 0xAB, 0x45, 0xA4, - 0x3E, 0xA0, 0xDF, 0xF4, 0xBA, 0xCA, 0x45, 0x64, 0xBA, 0xFD, 0x66, 0x3E, - 0x59, 0x24, 0x22, 0x53, 0x45, 0xA4, 0x2C, 0x82, 0xF6, 0xEC, 0x26, 0x22, - 0xB7, 0x88, 0xC8, 0x3A, 0x8F, 0xF1, 0x59, 0x6A, 0xED, 0x09, 0xF4, 0xB7, - 0x83, 0x32, 0xB2, 0x06, 0x02, 0x87, 0xD8, 0xCC, 0xCD, 0x67, 0xF0, 0x8C, - 0xB6, 0xD9, 0x7D, 0x2E, 0xB0, 0x43, 0xC8, 0xB3, 0xA5, 0x03, 0x78, 0x01, - 0xB8, 0x01, 0x58, 0x9E, 0xE3, 0xFF, 0x17, 0x01, 0xBF, 0x32, 0xFB, 0xA0, - 0x33, 0xE4, 0xB6, 0xEC, 0x02, 0x7C, 0xD7, 0x54, 0xF3, 0x70, 0x8F, 0xF1, - 0xA9, 0xB7, 0xD9, 0x3D, 0x20, 0x8E, 0x2A, 0xBA, 0x3C, 0x6B, 0x4D, 0xA1, - 0x00, 0xC8, 0x67, 0xDA, 0xE7, 0x1B, 0x80, 0x15, 0x21, 0x0E, 0x6C, 0x23, - 0xF0, 0x5B, 0x60, 0x21, 0x70, 0x7C, 0xD6, 0xE0, 0x7E, 0x68, 0x6B, 0xDE, - 0xAB, 0xC0, 0xE6, 0x90, 0xC1, 0xDD, 0x19, 0xF8, 0x01, 0xF0, 0x05, 0xA0, - 0xCE, 0x61, 0x7C, 0x76, 0x01, 0x6A, 0x80, 0x96, 0xB8, 0x01, 0xDC, 0xE9, - 0x38, 0x13, 0x52, 0x36, 0xCB, 0xBF, 0x62, 0x9F, 0xAF, 0x0F, 0x11, 0x64, - 0x01, 0xD6, 0x02, 0xF3, 0x80, 0xFF, 0x02, 0xD5, 0xF6, 0xF7, 0x16, 0xE0, - 0x23, 0x5B, 0xA7, 0xC3, 0x06, 0xF7, 0x42, 0x03, 0x77, 0x98, 0xE3, 0x77, - 0x36, 0x38, 0x1A, 0x87, 0x91, 0x03, 0xBC, 0x05, 0x78, 0x05, 0x65, 0x51, - 0xB8, 0xC8, 0xA8, 0x2C, 0x90, 0xAF, 0x0B, 0xD9, 0xBA, 0x6E, 0xC9, 0x61, - 0xD8, 0x49, 0x44, 0xE0, 0xCE, 0xCC, 0x72, 0x87, 0x5C, 0xE4, 0x31, 0x1B, - 0xCB, 0xD8, 0x05, 0x3A, 0xDA, 0x80, 0xBF, 0x02, 0x2F, 0xFA, 0xF8, 0x4E, - 0x66, 0x26, 0x9F, 0x1F, 0xC1, 0x9A, 0x2C, 0xDD, 0xAE, 0xB0, 0xD7, 0xDC, - 0x39, 0xC0, 0x29, 0x3E, 0xC1, 0x7D, 0xC8, 0xEC, 0x86, 0x8E, 0x38, 0x02, - 0x9C, 0xF1, 0x77, 0x7F, 0x02, 0xBC, 0xEE, 0xE3, 0x3B, 0x23, 0x80, 0x2F, - 0x03, 0xDF, 0xF6, 0x30, 0xD0, 0x7A, 0x93, 0x8C, 0x06, 0x2E, 0x02, 0x3E, - 0x8F, 0x72, 0xB1, 0x5D, 0x65, 0x3E, 0x70, 0xB5, 0xA3, 0x6B, 0x57, 0x32, - 0x80, 0xDB, 0x81, 0xA7, 0xEC, 0xED, 0x7D, 0xCD, 0x27, 0xC8, 0xA7, 0x03, - 0x27, 0xA1, 0x64, 0xB9, 0xDE, 0x2A, 0xD5, 0xC0, 0x19, 0x45, 0x80, 0x3B, - 0x0F, 0xB8, 0xCC, 0x96, 0xB8, 0xAD, 0x71, 0x8F, 0x64, 0xB5, 0x00, 0x4F, - 0x9A, 0x9A, 0xF9, 0x29, 0xB0, 0x9F, 0x0F, 0x75, 0x7D, 0x22, 0xF0, 0x68, - 0xC0, 0x46, 0xD7, 0x00, 0xB3, 0x4A, 0xB7, 0xCD, 0x8A, 0xAC, 0xAD, 0xB6, - 0xD0, 0xE0, 0x96, 0x80, 0x0D, 0xAD, 0xED, 0x81, 0x13, 0x8A, 0x58, 0x73, - 0x33, 0xE0, 0x86, 0x62, 0xF4, 0x85, 0x11, 0x8B, 0x6E, 0x45, 0x43, 0x93, - 0x73, 0x80, 0x9F, 0x01, 0xFB, 0xFA, 0x50, 0x6F, 0x83, 0x7A, 0xF0, 0xBB, - 0xDB, 0x00, 0x7B, 0x02, 0x7B, 0xD9, 0x20, 0x6F, 0x6B, 0xCF, 0xAC, 0xB2, - 0xFF, 0xAB, 0xCD, 0x72, 0x9F, 0x36, 0xA1, 0x59, 0x0D, 0x6B, 0xCD, 0x6D, - 0x6A, 0x34, 0xAD, 0xB3, 0x90, 0xE2, 0xB3, 0x1D, 0x86, 0xD9, 0xEF, 0xB9, - 0xCA, 0xE3, 0x36, 0x09, 0x42, 0x03, 0x37, 0x2C, 0x80, 0xB3, 0x41, 0xBE, - 0xD8, 0xDE, 0xD0, 0xFD, 0x43, 0x6A, 0x4B, 0x2D, 0x30, 0x05, 0x38, 0x0A, - 0xDD, 0xDC, 0xA8, 0x37, 0x60, 0xAB, 0xED, 0xAA, 0xB2, 0x65, 0xA8, 0x2C, - 0x6B, 0x39, 0xEA, 0xCC, 0xBA, 0xDA, 0xAC, 0xAD, 0x6D, 0x36, 0xAB, 0x97, - 0x01, 0x0B, 0x6C, 0xF0, 0x17, 0x01, 0x4D, 0x3E, 0x0D, 0x39, 0xD7, 0x1D, - 0xAC, 0x47, 0x81, 0xCB, 0x81, 0x97, 0xC3, 0x76, 0xD7, 0xC2, 0xCE, 0x6C, - 0xA8, 0x01, 0xA6, 0x01, 0x97, 0xD8, 0xBF, 0x5E, 0x72, 0x37, 0x1A, 0xE5, - 0x5A, 0xEB, 0xF0, 0xDC, 0x09, 0xC0, 0x64, 0xE0, 0x38, 0xFB, 0x3C, 0xC6, - 0xD4, 0x71, 0xA5, 0x01, 0xE9, 0x77, 0xAB, 0x50, 0x0C, 0xF0, 0xB4, 0x05, - 0x3F, 0x56, 0x00, 0x6F, 0x03, 0xF7, 0x03, 0xFF, 0x04, 0xD6, 0x3B, 0x3C, - 0x63, 0x2C, 0xF0, 0x47, 0xE0, 0xB0, 0x02, 0xF7, 0xDD, 0x6F, 0x06, 0xD5, - 0xAB, 0x11, 0xF8, 0xE2, 0x10, 0x41, 0x1C, 0xB6, 0x5A, 0x44, 0x0E, 0x17, - 0x91, 0xE7, 0x3C, 0xE2, 0xC2, 0x2B, 0x44, 0xE4, 0x04, 0x8B, 0x21, 0x7B, - 0x3D, 0xAB, 0x4E, 0x44, 0x4E, 0x15, 0x91, 0x47, 0x45, 0x64, 0xB9, 0x88, - 0x34, 0x5B, 0x1C, 0x37, 0x68, 0x69, 0x17, 0x91, 0x26, 0x11, 0x79, 0x4F, - 0x44, 0xEE, 0x11, 0x91, 0x13, 0x45, 0xA4, 0xB6, 0x40, 0xDB, 0x2A, 0x45, - 0xE4, 0x0C, 0x11, 0xD9, 0xE0, 0xF1, 0xDC, 0x07, 0x44, 0x64, 0x8A, 0xC5, - 0xEE, 0xA3, 0x18, 0xFB, 0x48, 0x00, 0xCE, 0x80, 0x7C, 0xA4, 0x0D, 0x56, - 0x73, 0xB7, 0x81, 0x7C, 0x43, 0x44, 0xCE, 0x15, 0x91, 0x11, 0x1E, 0xDF, - 0x1F, 0x28, 0x22, 0x07, 0x8B, 0xC8, 0x1D, 0x16, 0x94, 0x6F, 0x09, 0x09, - 0xD8, 0x5C, 0x9B, 0x00, 0x2D, 0x22, 0xB2, 0xD8, 0x36, 0x0B, 0xF6, 0x2E, - 0xD0, 0xCF, 0x51, 0x22, 0x72, 0x81, 0x88, 0xBC, 0xDF, 0xED, 0x39, 0x8D, - 0x22, 0xF2, 0x7B, 0x11, 0x99, 0x16, 0x25, 0xB8, 0x22, 0x12, 0x69, 0xF2, - 0x59, 0x0D, 0xBA, 0x25, 0x36, 0xDD, 0x54, 0x6A, 0x95, 0xA9, 0xBE, 0x97, - 0x2C, 0x94, 0xD8, 0x98, 0x27, 0xDC, 0x39, 0x1A, 0x98, 0x05, 0x9C, 0x86, - 0xA6, 0xA3, 0x0C, 0x20, 0x7A, 0xB6, 0x86, 0xD8, 0x7A, 0xFC, 0x0E, 0xF0, - 0x6B, 0xE0, 0x01, 0x34, 0xCF, 0x38, 0x57, 0x28, 0xB6, 0xCE, 0x0C, 0xCB, - 0xC9, 0x66, 0x23, 0xB4, 0x00, 0x4B, 0xCD, 0xD7, 0x5D, 0x13, 0x89, 0x5A, - 0x8E, 0x70, 0x0D, 0xCE, 0x35, 0x00, 0x43, 0xCC, 0x00, 0x4A, 0x99, 0xDF, - 0xD7, 0xEC, 0xD1, 0xE9, 0x4F, 0x99, 0x35, 0xFE, 0x39, 0x73, 0xA5, 0x4A, - 0x4D, 0xC3, 0xE9, 0x30, 0x63, 0xEC, 0x2F, 0x16, 0x62, 0xFD, 0x28, 0xCF, - 0x7D, 0x55, 0xD6, 0xCF, 0x72, 0x7B, 0x69, 0x5B, 0xAD, 0x9F, 0x91, 0x67, - 0x31, 0xC6, 0x35, 0x7D, 0x34, 0x05, 0x7C, 0xC6, 0xC0, 0x3D, 0xD2, 0x67, - 0xE0, 0x20, 0x8A, 0xD9, 0xDC, 0x60, 0xB3, 0xF8, 0x12, 0xE0, 0x7F, 0x71, - 0x8E, 0xBE, 0xC4, 0x15, 0xE0, 0xC3, 0xCD, 0xC5, 0x3A, 0x90, 0x80, 0xF7, - 0x47, 0x03, 0x94, 0xCD, 0xC0, 0xDF, 0x81, 0xEF, 0xC7, 0x19, 0xE4, 0x38, - 0x02, 0x3C, 0x05, 0xB8, 0x02, 0xA5, 0xF9, 0x14, 0x1B, 0xBA, 0x6C, 0x44, - 0x37, 0xF3, 0xD7, 0x98, 0x8F, 0xBB, 0xD2, 0xAE, 0x32, 0x8B, 0x38, 0x8D, - 0x31, 0x9B, 0x60, 0x14, 0xB0, 0x0F, 0x5D, 0x5B, 0x89, 0x7E, 0x65, 0x8B, - 0xCD, 0xE4, 0xF3, 0xC2, 0x88, 0x23, 0xC7, 0x39, 0xD0, 0x51, 0xAC, 0x8C, - 0x02, 0xBE, 0x07, 0x1C, 0x54, 0x04, 0xB8, 0x9D, 0x16, 0x38, 0xF8, 0x17, - 0xBA, 0xF1, 0xF1, 0x1A, 0x5D, 0xFB, 0xAB, 0x2D, 0x74, 0x71, 0x9D, 0xAA, - 0xB3, 0x7C, 0xE6, 0xE1, 0x16, 0x84, 0xD9, 0x15, 0x38, 0x14, 0xE5, 0x47, - 0xF9, 0x91, 0x81, 0x16, 0x9E, 0xDC, 0x00, 0x5C, 0xE0, 0x33, 0x30, 0xD2, - 0xEF, 0x66, 0xF0, 0x60, 0xE0, 0xC7, 0xC0, 0x39, 0xF6, 0xD9, 0x8F, 0xE1, - 0xF3, 0x92, 0x05, 0x4A, 0x5E, 0x04, 0xDE, 0x33, 0xA3, 0xAD, 0x29, 0xCB, - 0x2A, 0x97, 0x1C, 0x6B, 0x3C, 0x66, 0x04, 0x0D, 0xB2, 0xD9, 0xBC, 0x87, - 0xBD, 0x58, 0x33, 0x6D, 0x56, 0xFB, 0x91, 0x8D, 0x16, 0x76, 0xFC, 0x79, - 0x02, 0x70, 0x7E, 0x99, 0x6D, 0xAA, 0xB9, 0xCE, 0xC7, 0x77, 0x96, 0xA1, - 0x4C, 0xCD, 0x79, 0x06, 0x6C, 0x33, 0xC5, 0x33, 0x22, 0xAA, 0x6C, 0x66, - 0xEF, 0x81, 0x12, 0x17, 0xCE, 0x31, 0x8D, 0xE2, 0x2A, 0xCB, 0x81, 0xAF, - 0x03, 0x8F, 0xC4, 0x0A, 0xE1, 0x28, 0x9D, 0x6E, 0x8F, 0x6B, 0x3F, 0x11, - 0x79, 0xC5, 0x67, 0x10, 0xE2, 0x31, 0x11, 0x99, 0x21, 0x22, 0x43, 0x1D, - 0x22, 0x60, 0x7E, 0xAE, 0x0A, 0x0B, 0xBA, 0x9C, 0x2E, 0x22, 0xAF, 0xFA, - 0x68, 0x4F, 0x87, 0xB5, 0x69, 0xE7, 0x98, 0x8C, 0x69, 0xA0, 0xAC, 0xCA, - 0x9E, 0x48, 0x1D, 0xF0, 0x55, 0x73, 0x8B, 0x5C, 0xE5, 0xCF, 0x28, 0xC7, - 0xF8, 0x09, 0x53, 0x8F, 0x41, 0xB2, 0x20, 0xDA, 0x81, 0x75, 0xC0, 0x7D, - 0xC0, 0x0F, 0xED, 0x37, 0x5C, 0xA4, 0xCC, 0xE2, 0xED, 0x27, 0x13, 0xA3, - 0xB4, 0x99, 0x38, 0x00, 0x7C, 0x98, 0xA9, 0xC4, 0x4A, 0xC7, 0xFB, 0x7F, - 0x63, 0x06, 0xCD, 0xBB, 0x84, 0x90, 0x09, 0x90, 0x25, 0x4D, 0xE8, 0x46, - 0xC3, 0x37, 0xD1, 0x0D, 0x02, 0x57, 0xA3, 0x6B, 0x16, 0x4A, 0x64, 0x4F, - 0x00, 0x36, 0x77, 0xE5, 0x44, 0x34, 0x84, 0xE9, 0x22, 0x77, 0x02, 0x97, - 0x9A, 0xCB, 0xD3, 0x19, 0x41, 0xFB, 0x5A, 0xD0, 0xF0, 0xE4, 0xB5, 0xC0, - 0xB3, 0x8E, 0xDF, 0xD9, 0x0D, 0x65, 0x52, 0x56, 0x25, 0x00, 0x6B, 0x20, - 0xE3, 0x68, 0xDC, 0xAA, 0xDD, 0xBC, 0x82, 0x6E, 0xB3, 0x45, 0x99, 0x6E, - 0x92, 0x71, 0xBF, 0xFE, 0x0D, 0x5C, 0x69, 0x86, 0x9C, 0x8B, 0xEB, 0x79, - 0x02, 0x9A, 0xB2, 0xD3, 0xAF, 0x01, 0x1E, 0x08, 0x1C, 0xE0, 0x68, 0xA9, - 0xAE, 0x32, 0x0B, 0x7B, 0x21, 0xA5, 0xA9, 0x4A, 0xD7, 0x86, 0x52, 0x91, - 0xAE, 0xC2, 0x8D, 0x2C, 0xBF, 0x87, 0x45, 0xE3, 0xCA, 0xFB, 0x33, 0xC0, - 0xE3, 0xD0, 0x0D, 0xFB, 0x42, 0x6D, 0x68, 0xB7, 0x35, 0xF0, 0x31, 0x82, - 0x4E, 0xCC, 0xF2, 0x27, 0xAD, 0xB6, 0x44, 0xCC, 0x77, 0xB8, 0xB7, 0xD2, - 0x6C, 0x8B, 0xD1, 0xFD, 0x19, 0xE0, 0x09, 0xB6, 0x5E, 0xB9, 0xF8, 0x97, - 0x7F, 0x20, 0x60, 0x42, 0x78, 0x91, 0xB2, 0x19, 0xB8, 0x05, 0xB7, 0x7C, - 0xE7, 0x43, 0x2D, 0x42, 0xD6, 0x2F, 0x01, 0xAE, 0x03, 0x8E, 0xC0, 0x2D, - 0x54, 0xFA, 0x28, 0xFE, 0xB8, 0xD6, 0x61, 0xCB, 0x53, 0x68, 0x29, 0x62, - 0x97, 0x25, 0x68, 0x9F, 0x52, 0x1B, 0x5B, 0xA5, 0x02, 0xB8, 0x16, 0xB7, - 0x70, 0x60, 0x0B, 0x70, 0x2F, 0x01, 0xE7, 0xEB, 0x04, 0xB0, 0x1E, 0xDF, - 0xE1, 0xE8, 0x7B, 0x1F, 0x89, 0xBF, 0xC8, 0x5C, 0x9F, 0x01, 0x78, 0x88, - 0x63, 0xC7, 0x5F, 0x44, 0xC9, 0x69, 0x71, 0xDB, 0xF2, 0x7A, 0x0D, 0xB7, - 0x44, 0xF6, 0x1D, 0xE9, 0x19, 0x15, 0xB8, 0xC7, 0x92, 0x4F, 0x45, 0x0E, - 0x46, 0xB7, 0xEB, 0x46, 0xE3, 0x56, 0xE6, 0x20, 0x65, 0xEE, 0x44, 0x33, - 0x4A, 0xBF, 0x59, 0x5C, 0xE0, 0xFE, 0x51, 0x74, 0x11, 0xD1, 0xBD, 0x64, - 0x3E, 0xBA, 0xF5, 0x17, 0x37, 0xF9, 0xD0, 0x82, 0x20, 0x3B, 0x39, 0xBC, - 0xC8, 0x43, 0x1D, 0xED, 0x91, 0x89, 0xB8, 0xD1, 0x91, 0x52, 0x74, 0xB1, - 0x40, 0x57, 0xA0, 0xF9, 0x4C, 0x2D, 0x7E, 0x00, 0x1E, 0x0F, 0x7C, 0xCD, - 0xFC, 0xD3, 0x81, 0x3E, 0x67, 0x79, 0x1A, 0xA5, 0x9B, 0x5E, 0xE5, 0xB1, - 0x4E, 0x55, 0xA0, 0x04, 0xF5, 0x1A, 0x87, 0xE7, 0x2D, 0x23, 0x9E, 0xB2, - 0x05, 0xDD, 0x9A, 0x9C, 0x55, 0xE0, 0xBE, 0x11, 0x78, 0xA7, 0x8E, 0xD6, - 0xA2, 0x74, 0xA4, 0x59, 0x36, 0xDB, 0x2B, 0x7D, 0xB4, 0xA1, 0x13, 0xE5, - 0xB4, 0x3D, 0x62, 0x46, 0xE8, 0x62, 0x17, 0x80, 0xEB, 0xD0, 0x6C, 0xBF, - 0x99, 0xA6, 0x5A, 0x8A, 0xE1, 0x17, 0x8F, 0x41, 0xF9, 0x53, 0xDF, 0xB0, - 0x41, 0xC8, 0xF5, 0x9B, 0xE3, 0x1D, 0x9E, 0xD5, 0x88, 0x46, 0x91, 0xE2, - 0x2A, 0x9B, 0x1C, 0xEE, 0x19, 0x60, 0xDA, 0x2A, 0x95, 0x43, 0x0B, 0x96, - 0xA3, 0xC5, 0x6A, 0x2E, 0x41, 0xB9, 0x67, 0xE5, 0x45, 0x8C, 0xF7, 0x18, - 0x94, 0xEC, 0x5F, 0x85, 0x6E, 0x57, 0x6E, 0x2A, 0xB4, 0x06, 0xCF, 0x30, - 0x70, 0x87, 0xD0, 0x45, 0x20, 0xF7, 0x73, 0x95, 0xA1, 0x1B, 0xEA, 0x7B, - 0xA3, 0x89, 0x58, 0x43, 0xF2, 0x34, 0xCC, 0x85, 0x41, 0xB1, 0x94, 0xDC, - 0xE5, 0x17, 0xE2, 0x22, 0x6B, 0x71, 0x4B, 0x73, 0xC9, 0x37, 0x51, 0x76, - 0x04, 0xCE, 0x32, 0x35, 0x5F, 0x59, 0xE4, 0x78, 0x67, 0x2A, 0x2B, 0x9C, - 0x46, 0x1E, 0xC2, 0x7D, 0x77, 0x80, 0x27, 0x7B, 0x80, 0xE2, 0x77, 0x6D, - 0x3F, 0xCC, 0x82, 0x19, 0xB9, 0xD6, 0x10, 0x17, 0xF7, 0x68, 0x23, 0xD1, - 0xC4, 0x9B, 0x8B, 0x95, 0x77, 0x71, 0xCB, 0x78, 0xC8, 0xB7, 0xAE, 0x8E, - 0x45, 0xF3, 0xA8, 0x82, 0x30, 0x74, 0x47, 0x03, 0x9F, 0x76, 0x01, 0x78, - 0x48, 0x80, 0x03, 0x30, 0xCC, 0xC3, 0x82, 0x74, 0x51, 0x45, 0x5B, 0x63, - 0x0E, 0x70, 0x13, 0x6E, 0x1C, 0xE7, 0x7C, 0x06, 0x6A, 0x15, 0xC1, 0x51, - 0xA6, 0x52, 0xE4, 0x21, 0x27, 0x76, 0x07, 0x38, 0xC8, 0x8A, 0x74, 0xAB, - 0xC8, 0x4D, 0x0E, 0x17, 0x47, 0x1F, 0x32, 0xEE, 0xE5, 0xF6, 0x47, 0x3A, - 0xBA, 0x40, 0xE2, 0xE1, 0x4F, 0x07, 0x49, 0x82, 0x6F, 0x71, 0x01, 0x78, - 0x81, 0xA9, 0xC6, 0x20, 0xE4, 0x31, 0x53, 0x63, 0x7E, 0x3A, 0xDD, 0xDD, - 0x02, 0x8D, 0x73, 0x42, 0xF8, 0xEE, 0xE4, 0x2F, 0x8B, 0xD4, 0x5D, 0x13, - 0xE5, 0xEA, 0xEF, 0x62, 0xE0, 0xF9, 0x80, 0xDA, 0xB2, 0x0C, 0x8D, 0xB0, - 0x15, 0x04, 0xF8, 0x49, 0xB4, 0xF4, 0x50, 0x4F, 0xCB, 0xF8, 0x3C, 0x87, - 0xD6, 0x9C, 0xD8, 0x9A, 0xC7, 0xBC, 0x77, 0x61, 0x1F, 0xEE, 0x82, 0x5B, - 0xAC, 0xBA, 0x54, 0x52, 0xED, 0xF0, 0x02, 0x8A, 0x79, 0x03, 0xB9, 0x00, - 0x5E, 0x03, 0xDC, 0x6A, 0x71, 0x83, 0x9E, 0xC8, 0x06, 0x94, 0x04, 0xF1, - 0xB2, 0x8B, 0x9B, 0xB4, 0x12, 0x2D, 0x10, 0xD6, 0x66, 0x7E, 0xF0, 0x10, - 0xC7, 0x59, 0x24, 0x59, 0xC0, 0xBD, 0x02, 0xFC, 0x0E, 0x3D, 0x78, 0x2A, - 0x97, 0x7B, 0xB0, 0x15, 0xF8, 0x8F, 0xC3, 0x33, 0x07, 0x9A, 0xFB, 0xF0, - 0x7C, 0x0C, 0x23, 0x59, 0x65, 0xB8, 0xD5, 0x14, 0x69, 0x36, 0x43, 0x2C, - 0x57, 0xFB, 0x33, 0xC5, 0xDA, 0xBE, 0x63, 0x7E, 0xF0, 0x5E, 0x16, 0x1B, - 0x70, 0x5D, 0x9A, 0xDA, 0x50, 0x2E, 0xF6, 0x9D, 0x28, 0x37, 0x3B, 0xED, - 0x02, 0x70, 0x87, 0xB9, 0x26, 0xD7, 0xA2, 0x34, 0xD4, 0xC1, 0x8E, 0xCE, - 0x77, 0xCA, 0xBE, 0xDB, 0x6C, 0xEE, 0xCD, 0x46, 0x8F, 0x75, 0x56, 0x4C, - 0x3D, 0x35, 0x51, 0x98, 0x1E, 0xBB, 0xBB, 0x0D, 0x66, 0xDC, 0x8E, 0x9F, - 0xDB, 0x06, 0xAD, 0xEC, 0xE7, 0xE2, 0x09, 0xAC, 0x2D, 0xF0, 0x02, 0x3C, - 0x63, 0xC1, 0xA1, 0x7A, 0xFC, 0x25, 0xD6, 0xA5, 0xED, 0xD9, 0xCB, 0xBC, - 0xD6, 0xF2, 0x8A, 0x3C, 0x2A, 0xB4, 0x81, 0xE2, 0x43, 0x84, 0x2E, 0x60, - 0x34, 0x98, 0x6A, 0x29, 0x04, 0xF0, 0x74, 0xE0, 0x97, 0x76, 0x6F, 0x9C, - 0x66, 0xF1, 0x48, 0x0A, 0x27, 0xB4, 0x67, 0x82, 0x21, 0x8D, 0x0E, 0xE3, - 0xB5, 0x1A, 0xB7, 0xC4, 0x77, 0xDF, 0xE3, 0x5D, 0x56, 0xE0, 0x8B, 0xC5, - 0x5C, 0x2E, 0xD2, 0xE8, 0xD8, 0xA1, 0x3D, 0xD1, 0x54, 0x96, 0xB8, 0xA9, - 0xE8, 0xA9, 0xB8, 0x31, 0x51, 0xDE, 0x72, 0x8C, 0x78, 0x85, 0x36, 0xDE, - 0xA5, 0xDA, 0x4D, 0x5A, 0x8F, 0x06, 0xEB, 0x5D, 0xA2, 0x40, 0xA7, 0x50, - 0xE2, 0x1D, 0x99, 0x6E, 0x52, 0x0B, 0x7C, 0xC9, 0x71, 0xE9, 0x9A, 0x4F, - 0x89, 0x8B, 0xA1, 0x97, 0x0A, 0xE0, 0x26, 0x33, 0x30, 0x5C, 0x76, 0xA9, - 0x0E, 0x45, 0xC9, 0x79, 0x71, 0x91, 0x63, 0xD1, 0x88, 0x9F, 0x8B, 0x96, - 0x5A, 0x5A, 0xEA, 0x60, 0x4D, 0x29, 0x29, 0x3B, 0x0B, 0x51, 0xB6, 0x62, - 0x21, 0x19, 0x0B, 0x9C, 0x6A, 0x56, 0x75, 0xA9, 0x65, 0x04, 0x1A, 0x63, - 0x1F, 0xEA, 0x70, 0xEF, 0xB3, 0xC4, 0x60, 0x37, 0xAC, 0x94, 0x00, 0xBF, - 0x6F, 0xC1, 0x90, 0x42, 0x52, 0x81, 0x72, 0xA7, 0xCF, 0xC2, 0xDF, 0x76, - 0x5A, 0xD0, 0x52, 0x85, 0x56, 0x01, 0x3A, 0xD8, 0xF1, 0xFE, 0x7F, 0x58, - 0x1F, 0xFB, 0x2D, 0xC0, 0x69, 0xBA, 0x52, 0x3D, 0x0B, 0xC9, 0x70, 0x34, - 0xB1, 0xAB, 0x94, 0xAA, 0xFA, 0x38, 0x7B, 0xC9, 0x5C, 0xEC, 0x81, 0x97, - 0x6C, 0xFD, 0xED, 0xEC, 0xCF, 0x00, 0x63, 0xD1, 0x97, 0x27, 0x1C, 0xAD, - 0xE4, 0xF1, 0x68, 0xA1, 0xCF, 0x09, 0x25, 0x68, 0xE7, 0x01, 0x68, 0x39, - 0x89, 0x7A, 0xC7, 0xFB, 0x9F, 0x26, 0x9A, 0xB3, 0x29, 0x62, 0x0F, 0x70, - 0x03, 0x70, 0x8F, 0xE3, 0x60, 0xA4, 0x50, 0x12, 0xDB, 0x15, 0x44, 0x97, - 0x35, 0x90, 0x32, 0x37, 0xED, 0x7A, 0xDC, 0x4B, 0x32, 0xBE, 0x00, 0xDC, - 0x45, 0x3C, 0x68, 0xBE, 0xB1, 0x48, 0x3E, 0x7B, 0x0E, 0xF8, 0x1B, 0xEE, - 0xC7, 0xE0, 0xCC, 0x40, 0x13, 0xAD, 0xA7, 0x52, 0x7C, 0xE9, 0x05, 0x17, - 0xA9, 0xB6, 0x40, 0xCB, 0x5C, 0x03, 0xD9, 0x45, 0x5A, 0x81, 0x3F, 0xA1, - 0x44, 0xC1, 0x58, 0x48, 0x5C, 0x12, 0xC0, 0x77, 0x45, 0x03, 0xE6, 0x87, - 0x38, 0xDE, 0xDF, 0x81, 0x86, 0xF7, 0x6E, 0x45, 0x29, 0xAC, 0xEB, 0x02, - 0x6E, 0xCF, 0x76, 0x68, 0xB1, 0xF2, 0xD9, 0x68, 0xF5, 0x76, 0x57, 0xB9, - 0x0F, 0x4D, 0x1C, 0x5F, 0x9B, 0x00, 0xFC, 0x49, 0x39, 0x19, 0x0D, 0x4B, - 0x6E, 0xEF, 0xE3, 0x3B, 0x1B, 0xD1, 0x60, 0xFB, 0xFD, 0xB6, 0x9E, 0x37, - 0x04, 0xE0, 0x06, 0x4D, 0x45, 0xB3, 0x03, 0x67, 0xE2, 0xAF, 0xC2, 0xCF, - 0x22, 0x94, 0x87, 0x36, 0x9F, 0x18, 0x49, 0x9C, 0x00, 0xAE, 0x46, 0x09, - 0x7F, 0x17, 0xE1, 0xBF, 0x74, 0xD2, 0x5B, 0x68, 0x64, 0xEC, 0x61, 0xFB, - 0xBC, 0x12, 0xF7, 0xF0, 0x66, 0x39, 0xBA, 0x6B, 0x35, 0xC9, 0xD4, 0xFF, - 0x11, 0x3E, 0x67, 0x6D, 0xE6, 0x45, 0x3B, 0xCF, 0xD4, 0x73, 0x7B, 0x02, - 0x70, 0x7E, 0x19, 0x83, 0xB2, 0x03, 0x4F, 0x2B, 0xC2, 0xE7, 0x15, 0x94, - 0x60, 0xF0, 0x8E, 0x59, 0xE6, 0xEF, 0xA2, 0x61, 0xC2, 0x15, 0xE8, 0xFE, - 0x76, 0x47, 0x96, 0xDD, 0xB1, 0x3D, 0xBA, 0x23, 0x34, 0xD4, 0x0C, 0xB6, - 0x23, 0xD1, 0xBD, 0xE7, 0x1D, 0x8B, 0x68, 0x73, 0x0B, 0x9A, 0x5A, 0x7A, - 0x15, 0xA5, 0x4D, 0x8E, 0xEB, 0x15, 0x00, 0x63, 0x6E, 0xD0, 0x1C, 0x34, - 0xDE, 0x5B, 0x6C, 0x29, 0x84, 0xCC, 0x2E, 0x4E, 0x93, 0x01, 0x9D, 0x39, - 0x46, 0x27, 0x65, 0x9A, 0x62, 0x77, 0x5B, 0x67, 0xAB, 0x51, 0xEE, 0xD8, - 0xE0, 0x1E, 0xB4, 0xF7, 0x66, 0xB4, 0x18, 0xDA, 0x66, 0x62, 0x28, 0x71, - 0xAD, 0x74, 0x37, 0xC9, 0x54, 0xF5, 0xC9, 0x04, 0x43, 0xDB, 0xC9, 0x14, - 0x00, 0xCF, 0x50, 0x7B, 0x83, 0xA8, 0xA1, 0x91, 0x06, 0x6E, 0x37, 0x8B, - 0x7E, 0x11, 0x31, 0x95, 0x38, 0xD7, 0xAA, 0x9C, 0x48, 0xD7, 0x91, 0x70, - 0x83, 0x62, 0xD6, 0xBE, 0xF5, 0xC0, 0x4D, 0xE8, 0xE9, 0x6D, 0x0D, 0xC4, - 0x8F, 0x90, 0x50, 0x52, 0x80, 0x33, 0x2C, 0x91, 0x32, 0x9B, 0x05, 0x69, - 0x8F, 0xB5, 0x6B, 0x9C, 0xA9, 0xEA, 0xD9, 0x84, 0x7F, 0xB6, 0x92, 0xAB, - 0x7B, 0xB6, 0xC4, 0xD4, 0xF2, 0x4D, 0x1E, 0xED, 0xAE, 0x44, 0x37, 0x47, - 0xAA, 0x50, 0x8A, 0x52, 0x3B, 0x25, 0xAA, 0x82, 0x17, 0x25, 0xC0, 0x83, - 0xD0, 0xD2, 0x06, 0xA7, 0xD2, 0xC5, 0xE6, 0x6F, 0x40, 0xCF, 0x47, 0x98, - 0x67, 0xBE, 0x63, 0xAE, 0xD8, 0x6D, 0x15, 0xBA, 0x27, 0x3C, 0xCB, 0xFC, - 0xE4, 0x52, 0xD1, 0x69, 0x5B, 0xAC, 0x9D, 0xB7, 0x03, 0x0F, 0xE6, 0xB1, - 0x96, 0x53, 0x68, 0x52, 0xDD, 0xF1, 0x28, 0xF1, 0xBF, 0xD6, 0x5E, 0xE0, - 0x85, 0x28, 0x05, 0x6A, 0x09, 0xC5, 0x1F, 0xFA, 0x51, 0x9C, 0x44, 0x58, - 0xF1, 0xFD, 0x14, 0x2B, 0xEB, 0x9F, 0xEE, 0x56, 0x40, 0xEC, 0x03, 0x11, - 0xB9, 0x52, 0x44, 0xB6, 0xF3, 0xF8, 0x7E, 0x99, 0x88, 0x8C, 0x17, 0x91, - 0xEB, 0xAD, 0xE2, 0x7B, 0x5A, 0xA2, 0x93, 0x56, 0x11, 0x59, 0x28, 0x22, - 0x97, 0x89, 0xC8, 0x4E, 0x05, 0x8E, 0xA3, 0x1D, 0x2B, 0x22, 0x73, 0x45, - 0x64, 0x7D, 0xB7, 0x67, 0x6C, 0x16, 0x91, 0xF9, 0x56, 0xB8, 0xAD, 0x3A, - 0xCA, 0x42, 0x68, 0x51, 0x82, 0xFB, 0xBA, 0xC7, 0x20, 0xAE, 0x11, 0x91, - 0xB3, 0x1D, 0xCE, 0xF2, 0x1D, 0x64, 0xE7, 0x27, 0xDC, 0x6A, 0xE7, 0x29, - 0xB4, 0xDA, 0xB1, 0x00, 0x61, 0x9C, 0xD9, 0xD0, 0x2C, 0x22, 0x6F, 0x8B, - 0xC8, 0x8D, 0x22, 0x72, 0x8C, 0x1D, 0x2B, 0x40, 0x81, 0x97, 0xF0, 0xFC, - 0x6E, 0x47, 0x16, 0x74, 0x97, 0x67, 0x44, 0xE4, 0x58, 0x11, 0xA9, 0x89, - 0x0A, 0xE0, 0xB0, 0xAB, 0xCD, 0x0E, 0xB0, 0xA8, 0xD0, 0x45, 0x78, 0x67, - 0x14, 0x8E, 0x34, 0x35, 0xFC, 0x38, 0xDE, 0xB5, 0x97, 0x9B, 0x4D, 0x3D, - 0x3E, 0x85, 0x16, 0x0E, 0x3D, 0xCC, 0xFE, 0xDD, 0xDD, 0x96, 0x80, 0xEA, - 0x22, 0x55, 0x78, 0x86, 0xF6, 0xDB, 0x6A, 0x6B, 0xE5, 0x02, 0x8B, 0x8C, - 0x3D, 0x89, 0xD2, 0x80, 0x5D, 0x5C, 0xA0, 0x9D, 0xAD, 0xAF, 0x5E, 0xC4, - 0x84, 0xCF, 0x5A, 0x1B, 0x2B, 0x89, 0xA8, 0xA8, 0x4C, 0x98, 0x00, 0xD7, - 0x58, 0x87, 0xE7, 0x18, 0x00, 0x85, 0xA4, 0x0E, 0x77, 0xD6, 0x46, 0x23, - 0xBA, 0xA1, 0xFE, 0x84, 0xAD, 0xEB, 0x93, 0x51, 0x82, 0xDE, 0x34, 0x0B, - 0x37, 0xD6, 0xD0, 0x55, 0x45, 0xB6, 0xDC, 0xC3, 0x60, 0xDA, 0x62, 0x57, - 0xE6, 0xC8, 0xD9, 0x67, 0x2D, 0x12, 0xF6, 0x32, 0x5A, 0x13, 0xCB, 0x4F, - 0x54, 0x2A, 0x13, 0x38, 0x29, 0x24, 0x93, 0xD1, 0x12, 0x89, 0x62, 0x20, - 0xA7, 0x7B, 0x23, 0xC0, 0x35, 0xE8, 0x19, 0x7E, 0x17, 0x3B, 0x82, 0x4B, - 0x91, 0xBE, 0xE9, 0x56, 0xB4, 0xF0, 0xF7, 0x1B, 0x66, 0x8C, 0x4D, 0xB0, - 0x41, 0x1E, 0x63, 0xE1, 0xC7, 0xDD, 0xD0, 0xCC, 0xBB, 0x4E, 0xBA, 0x76, - 0xCE, 0x3A, 0xEC, 0xF3, 0x6A, 0xF3, 0x5F, 0x97, 0xD3, 0x75, 0xFA, 0xD9, - 0xC2, 0x1E, 0x86, 0x1A, 0x5D, 0xFB, 0xB0, 0x5F, 0x37, 0x90, 0xB7, 0xF6, - 0x26, 0x80, 0x33, 0x6A, 0xF9, 0x47, 0xB8, 0x97, 0x11, 0x12, 0x94, 0xA0, - 0xD6, 0x13, 0x06, 0x62, 0x9A, 0x4F, 0x66, 0x4C, 0xD4, 0x9A, 0x5B, 0xD6, - 0x91, 0x35, 0x93, 0x33, 0x00, 0x6F, 0x0E, 0xD8, 0x75, 0x59, 0x83, 0x72, - 0xB0, 0x5C, 0xD3, 0x6D, 0xF6, 0x47, 0xEB, 0x63, 0x57, 0xA1, 0x59, 0xFA, - 0xAD, 0xBD, 0x01, 0xE0, 0x01, 0xC0, 0x17, 0x4D, 0x2D, 0x8F, 0xF3, 0xF1, - 0xBD, 0x95, 0xE8, 0x49, 0x26, 0xEB, 0x03, 0x6E, 0x4F, 0x23, 0xD1, 0xD5, - 0xF8, 0x58, 0x81, 0xEE, 0x6C, 0x4D, 0xC1, 0xFD, 0x10, 0x91, 0x7D, 0x6D, - 0xAC, 0x52, 0xE8, 0xF9, 0x0F, 0x81, 0x83, 0x5C, 0x16, 0xF0, 0xCB, 0x32, - 0xB3, 0x08, 0x70, 0x3F, 0x42, 0xF3, 0xA1, 0xE6, 0x11, 0xEF, 0x7C, 0x60, - 0x17, 0x2D, 0x74, 0x2F, 0x70, 0x1B, 0xFE, 0xD8, 0x1C, 0x7B, 0x9B, 0x11, - 0x3A, 0x9D, 0x30, 0x98, 0xA3, 0x01, 0x9A, 0xE4, 0x07, 0x99, 0xBF, 0xE8, - 0xE7, 0x54, 0xB1, 0x95, 0x76, 0x52, 0x58, 0x6D, 0x9C, 0x8A, 0x68, 0xF7, - 0xF0, 0xAA, 0x13, 0x91, 0x6B, 0xEC, 0xB4, 0x33, 0x3F, 0xF2, 0xBC, 0x88, - 0x8C, 0x8B, 0x6B, 0x41, 0xF0, 0xC1, 0xE6, 0xE6, 0x8C, 0xF7, 0xF1, 0xB6, - 0x7F, 0x08, 0xDC, 0x68, 0xB3, 0x37, 0x0A, 0x35, 0x5A, 0x1E, 0x51, 0x14, - 0x6C, 0x03, 0x7A, 0xB2, 0xE8, 0x2D, 0xF8, 0xDB, 0x61, 0x3A, 0x10, 0xDD, - 0x8B, 0x2E, 0x8B, 0xA3, 0x8A, 0xAE, 0xF2, 0x61, 0x2D, 0x67, 0x83, 0x7B, - 0x33, 0xE1, 0x6E, 0xB3, 0x95, 0x9B, 0x45, 0x3F, 0x1A, 0xAD, 0xAC, 0xB7, - 0x17, 0x4A, 0xC1, 0x0D, 0x3B, 0xB1, 0xBC, 0x01, 0xDD, 0x23, 0xBE, 0xD9, - 0xA7, 0x21, 0x37, 0x8D, 0x80, 0x37, 0x56, 0x82, 0xAC, 0x11, 0xE1, 0xE2, - 0x5E, 0x74, 0x1A, 0xB8, 0x37, 0xD8, 0x5A, 0xB5, 0x29, 0xC4, 0x41, 0xAE, - 0xB0, 0x98, 0xF7, 0xA1, 0x68, 0xAE, 0xF3, 0x78, 0x7B, 0xB9, 0x16, 0xA0, - 0xDC, 0xA9, 0xC7, 0x43, 0xD6, 0x1C, 0xEB, 0x51, 0x06, 0x68, 0x07, 0x5A, - 0x77, 0xCC, 0xC5, 0xF0, 0xAA, 0x0E, 0xDA, 0xF0, 0x0D, 0xEA, 0x61, 0x69, - 0xEB, 0x50, 0xA7, 0x87, 0x56, 0xC8, 0x54, 0x66, 0x9B, 0x6B, 0xE0, 0x6E, - 0x0C, 0x79, 0x16, 0x0D, 0x43, 0xCB, 0xF1, 0x9F, 0xCD, 0xC7, 0x29, 0x40, - 0x13, 0xD1, 0xFC, 0xA2, 0x4B, 0xAD, 0x1D, 0xCD, 0x21, 0xCF, 0xE4, 0x6B, - 0xEC, 0xC5, 0x9A, 0x8D, 0x77, 0xC9, 0x87, 0x0E, 0x34, 0xDB, 0x3F, 0xD8, - 0xF6, 0x04, 0xB4, 0x98, 0x97, 0x89, 0xC8, 0x49, 0x76, 0x0E, 0x70, 0x67, - 0x9E, 0x13, 0x49, 0x96, 0x8A, 0xC8, 0x79, 0x22, 0xB2, 0x4D, 0x04, 0x86, - 0x4E, 0xCA, 0xCE, 0xF2, 0xF5, 0x32, 0x74, 0x96, 0x59, 0x9B, 0x53, 0x11, - 0x19, 0x5E, 0x97, 0x8B, 0xC8, 0x3A, 0x8F, 0xF1, 0x79, 0x53, 0x44, 0x26, - 0xC5, 0xD5, 0xC8, 0xEA, 0xB4, 0xF8, 0xF0, 0x6D, 0x36, 0x4B, 0x5B, 0x2D, - 0x3A, 0xB3, 0xD5, 0x3E, 0x2F, 0x41, 0xC9, 0xE3, 0x61, 0xAB, 0xE5, 0x6C, - 0x7F, 0xFC, 0x28, 0xBC, 0xCB, 0x42, 0xD5, 0xA3, 0x5C, 0xAC, 0x28, 0xF2, - 0x9D, 0x36, 0xD8, 0x4C, 0x9E, 0x8B, 0xC6, 0xDA, 0xBB, 0x8F, 0xCF, 0xFB, - 0x28, 0x17, 0x6D, 0x41, 0x9C, 0x03, 0x1D, 0x9B, 0x50, 0xDA, 0xEB, 0x5B, - 0x68, 0xB2, 0xD8, 0xF0, 0x2C, 0x3F, 0xF7, 0x2E, 0x34, 0x0F, 0x29, 0x2A, - 0xDE, 0x52, 0x05, 0x6E, 0xD5, 0x6C, 0x6B, 0x89, 0x8E, 0xFC, 0xDF, 0x80, - 0x1E, 0x49, 0xBB, 0xC0, 0xE2, 0x05, 0x43, 0xCD, 0x76, 0x59, 0x8D, 0x72, - 0xBB, 0x1F, 0x8F, 0x7B, 0x24, 0x4B, 0x6C, 0x1D, 0xBE, 0xDB, 0x82, 0x16, - 0x99, 0x7A, 0x13, 0x4D, 0x44, 0x5F, 0x31, 0x36, 0xE5, 0xA3, 0x6F, 0x51, - 0x9E, 0x71, 0xD4, 0x68, 0xC1, 0x90, 0x27, 0x2D, 0xA8, 0x21, 0x16, 0x14, - 0xD9, 0x14, 0xE6, 0x9B, 0x1E, 0x86, 0x6C, 0x8C, 0xC0, 0x88, 0x72, 0x79, - 0xE1, 0xE2, 0x2A, 0x91, 0x8D, 0x4F, 0x19, 0x7D, 0x57, 0xA4, 0x97, 0xBF, - 0x04, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x27, 0x00, 0x27, 0x43, 0x90, 0x00, - 0x9C, 0x48, 0x02, 0x70, 0x22, 0x09, 0xC0, 0x89, 0x24, 0x00, 0x07, 0x2C, - 0xA9, 0x80, 0xEE, 0x49, 0x00, 0x8E, 0xA1, 0x74, 0xE2, 0x56, 0xF3, 0x3A, - 0x9D, 0x00, 0xDC, 0x3B, 0x25, 0x8D, 0xD2, 0x61, 0xBD, 0xF6, 0xA8, 0xDB, - 0xF0, 0xCF, 0x7D, 0x4E, 0x00, 0x8E, 0x89, 0xB4, 0xA3, 0xB5, 0x32, 0xDE, - 0xCE, 0x03, 0x60, 0x1A, 0xCD, 0x58, 0xB8, 0xAF, 0xAF, 0x03, 0x5C, 0xD1, - 0x47, 0xFB, 0xD5, 0x81, 0x12, 0xCA, 0x87, 0xA1, 0xB5, 0x33, 0x76, 0xA0, - 0x8B, 0x8F, 0x95, 0x21, 0xCB, 0xFF, 0x02, 0x25, 0xBE, 0xF7, 0xE9, 0x70, - 0x65, 0x5C, 0x13, 0xC0, 0x83, 0xD4, 0x50, 0x87, 0xA3, 0x95, 0xEA, 0x86, - 0xD3, 0xC5, 0x07, 0x7B, 0x88, 0x18, 0x67, 0xE5, 0x27, 0x00, 0xF7, 0xCC, - 0xAA, 0xEE, 0x37, 0x1D, 0xEE, 0xCB, 0x2A, 0x3A, 0x97, 0xF4, 0x2B, 0x60, - 0xFB, 0x83, 0x1F, 0x9C, 0x48, 0x02, 0x70, 0xDF, 0x97, 0xFF, 0x0F, 0x00, - 0xAE, 0x7B, 0xCD, 0x15, 0x78, 0xF2, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, - 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static unsigned char* visuals_icon = raw::visuals; -} \ No newline at end of file diff --git a/internal_rewrite/identity.cpp b/internal_rewrite/identity.cpp deleted file mode 100644 index b58e75b..0000000 --- a/internal_rewrite/identity.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "identity.hpp" -#include "settings.hpp" -#include "interface.hpp" -#include "pattern.hpp" - -#include "context.hpp" - -namespace features -{ - void c_identity::clantag_changer( ) { - static auto fn_offset = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "53 56 57 8B DA 8B F9 FF 15" ) ); - static auto fn = reinterpret_cast< void( __fastcall* )( const char*, const char* ) >( fn_offset ); - static bool was_enabled = false; - - if ( !g_settings.misc.clantag_changer( ) ) { - if ( was_enabled ) { - fn( "", " " ); - static cvar_t* cl_clanid = g_csgo.m_cvar( )->FindVar( xors( "cl_clanid" ) ); - auto backup_val = cl_clanid->get_int( ); - cl_clanid->set_value( 0 ); - cl_clanid->set_value( backup_val ); - was_enabled = false; - } - - return; - } - - static const std::string moneybot_string = xors( "dmt hook " ); - static std::string clantag_str = moneybot_string; - - static auto next_settime = g_csgo.m_globals->m_curtime; - auto curtime = g_csgo.m_globals->m_curtime; - - if( !was_enabled || std::abs( curtime - next_settime ) > 1.f ) { - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - - if( nci ) { - auto tick = TIME_TO_TICKS( g_ctx.pred_time( ) + nci->GetLatency( 0 ) ); - clantag_str = moneybot_string; - if( tick % 15 ) - return; - - next_settime = curtime; - } - } - - was_enabled = true; - - if ( curtime > next_settime ) { - const int length = clantag_str.length( ); - clantag_str.insert( 0, 1, clantag_str[ length - 2 ] ); - clantag_str.erase( length - 1, 1 ); - - std::string set = clantag_str; - set.resize( 15 ); - set[ 14 ] = '$'; - - auto is_full = set.find( xors( "moneybot" ) ) != std::string::npos; - - next_settime = curtime + ( is_full ? 0.85f : 0.4f ); - fn( set.c_str( ), set.c_str( ) ); - } - } - - void c_identity::name_changer( ) { - static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "name" ) ); - auto set_name = [ ]( const char* name ) { - *( int* )( uintptr_t( &cvar->m_change_callback ) + 0xc ) = 0; - cvar->set_value( name ); - }; - - static bool activated = false; - static char original_name[ 100 ]{ }; - - if( !g_settings.misc.name_changer ) { - if( activated ) { - set_name( original_name ); - } - - activated = false; - return; - } - - if( !activated ) { - strcpy( original_name, cvar->get_string( ) ); - if( g_settings.misc.name_changer == 1 ) { - char new_name[ 128 ]; - memset( new_name, '$', sizeof( new_name ) ); - set_name( new_name ); - } - if( g_settings.misc.name_changer == 2 ) { - set_name( xors( "moneybot.cc" ) ); - } - if( g_settings.misc.name_changer == 101 ) { - set_name( "­­­\n\xAD\xAD\xAD" ); - } - } - else if( g_settings.misc.name_changer == 101 ) { - char new_name[ 15 ]; - for( size_t i{ }; i < 15; ++i ) { - auto is_upper = !( math::random_number( 0, 256 ) & 1 ); - new_name[ i ] = is_upper ? math::random_number( 65, 90 ) : math::random_number( 97, 122 ); - } - - set_name( new_name ); - } - - activated = true; - } -} \ No newline at end of file diff --git a/internal_rewrite/identity.hpp b/internal_rewrite/identity.hpp deleted file mode 100644 index aecba35..0000000 --- a/internal_rewrite/identity.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "sdk.hpp" - -namespace features -{ - class c_identity { - private: - void clantag_changer( ); - void name_changer( ); - public: - void operator()( ) { - clantag_changer( ); - name_changer( ); - } - }; -} \ No newline at end of file diff --git a/internal_rewrite/iface_dllmain_impl.hpp b/internal_rewrite/iface_dllmain_impl.hpp deleted file mode 100644 index f8209ec..0000000 --- a/internal_rewrite/iface_dllmain_impl.hpp +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -namespace factory -{ - namespace interfaces - { - class c_interface_manager { - struct reg { - char m_key; - uintptr_t m_ptr; - uintptr_t m_module; - char m_module_name[ 64 ]; - char m_name[ 64 ]; - }; - - size_t m_count; - reg* m_regs; - - void decrypt_str( char* buf, size_t size, char key ) { - for( size_t i{ }; i < size; ++i ) { - buf[ i ] ^= key; - } - } - - public: - void init( uintptr_t iface_addr ) { - m_count = *( size_t* )( iface_addr ); - m_regs = ( reg* )( iface_addr + 4 ); - } - - template < typename t = void* > - t find_interface( const std::string& module_, std::string name ) { - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += '0'; - - char name_buf[ 64 ]; - char module_buf[ 64 ]; - - for( size_t i{ }; i < m_count; ++i ) { - auto& reg = m_regs[ i ]; - - memcpy( name_buf, reg.m_name, 64 ); - memcpy( module_buf, reg.m_module_name, 64 ); - - decrypt_str( name_buf, 64, reg.m_key ); - decrypt_str( module_buf, 64, reg.m_key ); - - if( !module_.compare( module_buf ) && strstr( name_buf, name.c_str( ) ) ) { - return ( t )( reg.m_ptr ); - } - } - - return t{ }; - } - - template < typename t = void* > - t find_interface( std::string name ) { - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += '0'; - - char name_buf[ 64 ]; - char module_buf[ 64 ]; - - for( size_t i{ }; i < m_count; ++i ) { - auto& reg = m_regs[ i ]; - - memcpy( name_buf, reg.m_name, 64 ); - memcpy( module_buf, reg.m_module_name, 64 ); - - decrypt_str( name_buf, 64, reg.m_key ); - decrypt_str( module_buf, 64, reg.m_key ); - - if( strstr( name_buf, name.c_str( ) ) ) { - return ( t )( reg.m_ptr ); - } - } - - return t{ }; - } - }; - } -} \ No newline at end of file diff --git a/internal_rewrite/in_prediction.cpp b/internal_rewrite/in_prediction.cpp deleted file mode 100644 index 3123d06..0000000 --- a/internal_rewrite/in_prediction.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "mem.hpp" -#include "hooks.hpp" -#include "context.hpp" - -#undef max - -bool __fastcall hooks::in_prediction( void* ecx_, void* edx_ ) { -#ifdef HEADER_MODULE - static auto ret_address = g_header.patterns.in_prediction_retaddr; -#else - static auto ret_address = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "84 C0 75 08 57 8B CE E8 ? ? ? ? 8B 06" ) ); -#endif - - if( g_ctx.m_local && ret_address && g_settings.rage.enabled( ) ) { - stack_t stack( get_baseptr( ) ); - int local_team = g_ctx.m_local->m_iTeamNum( ); - - if( stack.return_address( ) == ret_address ) { - for( size_t i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_valid( ) || ent == g_ctx.m_local || !ent->has_valid_anim( ) ) - continue; - - if( ent->m_iTeamNum( ) != local_team || g_settings.rage.friendlies ) { - //printf( "model bone counter: %d %d\n", ent->m_iMostRecentModelBoneCounter( ), c_base_player::g_iModelBoneCounter( ) ); - ent->m_iMostRecentModelBoneCounter( ) = c_base_player::g_iModelBoneCounter( ); - ent->m_flLastBoneSetupTime( ) = g_csgo.m_globals->m_curtime; - } - } - } - } - - return in_prediction_o( ecx_, 0 ); -} \ No newline at end of file diff --git a/internal_rewrite/input_system.cpp b/internal_rewrite/input_system.cpp deleted file mode 100644 index 6040cca..0000000 --- a/internal_rewrite/input_system.cpp +++ /dev/null @@ -1,527 +0,0 @@ -#include - -#include "input_system.hpp" -#include "util.hpp" - -util::c_input_manager g_input; - -NAMESPACE_REGION( util ) - -const char* const key_names_short[] = { - "unk", - "m1", - "m2", - "can", - "m3", - "m4", - "m5", - "unk", - "back", - "tab", - "unk", - "unk", - "clr", - "ret", - "unk", - "unk", - "shift", - "ctrl", - "alt", - "pause", - "caps", - "kana", - "unk", - "junja", - "final", - "kanji", - "unk", - "esc", - "convert", - "nonconvert", - "accept", - "modechange", - " ", - "prior", - "next", - "end", - "home", - "left", - "up", - "right", - "down", - "slct", - "prnt", - "execute", - "snapshot", - "ins", - "del", - "help", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "lwin", - "rwin", - "apps", - "unk", - "unk", - "num0", - "num1", - "num2", - "num3", - "num4", - "num5", - "num6", - "num7", - "num8", - "num9", - "*", - "+", - "sep", - "-", - ",", - "/", - "f1", - "f2", - "f3", - "f4", - "f5", - "f6", - "f7", - "f8", - "f9", - "f10", - "f11", - "f12", - "f13", - "f14", - "f15", - "f16", - "f17", - "f18", - "f19", - "f20", - "f21", - "f22", - "f23", - "f24", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "numlock", - "scroll", - "oem_nec_equal", - "oem_fj_masshou", - "oem_fj_touroku", - "oem_fj_loya", - "oem_fj_roya", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "lshift", - "rshift", - "lctrl", - "rctrl", - "lalt", - "ralt", -}; - -const char* const key_names[] = { - "unknown", - "mouse_1", - "mouse_2", - "cancel", - "mouse_3", - "mouse_4", - "mouse_5", - "unknown", - "back", - "tab", - "unknown", - "unknown", - "clear", - "return", - "unknown", - "unknown", - "shift", - "control", - "alt", - "pause", - "capital", - "kana", - "unknown", - "junja", - "final", - "kanji", - "unknown", - "escape", - "convert", - "nonconvert", - "accept", - "modechange", - "space", - "prior", - "next", - "end", - "home", - "left", - "up", - "right", - "down", - "select", - "print", - "execute", - "snapshot", - "insert", - "delete", - "help", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "lwin", - "rwin", - "apps", - "unknown", - "unknown", - "numpad0", - "numpad1", - "numpad2", - "numpad3", - "numpad4", - "numpad5", - "numpad6", - "numpad7", - "numpad8", - "numpad9", - "multiply", - "add", - "separator", - "subtract", - "decimal", - "divide", - "f1", - "f2", - "f3", - "f4", - "f5", - "f6", - "f7", - "f8", - "f9", - "f10", - "f11", - "f12", - "f13", - "f14", - "f15", - "f16", - "f17", - "f18", - "f19", - "f20", - "f21", - "f22", - "f23", - "f24", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "numlock", - "scroll", - "oem_nec_equal", - "oem_fj_masshou", - "oem_fj_touroku", - "oem_fj_loya", - "oem_fj_roya", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "lshift", - "rshift", - "lcontrol", - "rcontrol", - "lmenu", - "rmenu", -}; - -void c_input_manager::capture_mouse_move( ulong_t lparam ) { - m_mouse_pos[ 0 ] = LOWORD( lparam ); - m_mouse_pos[ 1 ] = HIWORD( lparam ); -} - -void c_input_manager::clear_keys( ) { - memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) ); -} - -bool c_input_manager::register_key_press( int key_event, int key ) -{ - switch ( key_event ) { - case KEYDOWN: { - if ( is_valid_key( key ) ) - m_pressed_keys[ key ] = true; - return true; - } - case KEYUP: { - if ( is_valid_key( key ) ) - m_pressed_keys[ key ] = false; - return true; - } - case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? - if ( key == KEYS_ALT ) - m_pressed_keys[ key ] = true; - break; - } - case SYSKEYUP: { - if ( key == KEYS_ALT ) - m_pressed_keys[ key ] = false; - break; - } - case LBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE1 ] = true; - return true; - case LBUTTONUP: - m_pressed_keys[ KEYS_MOUSE1 ] = false; - return true; - case RBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE2 ] = true; - return true; - case RBUTTONUP: - m_pressed_keys[ KEYS_MOUSE2 ] = false; - return true; - case MBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE3 ] = true; - return true; - case MBUTTONUP: - m_pressed_keys[ KEYS_MOUSE3 ] = false; - return true; - case XBUTTONDOWN: { - bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true - m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; - return true; - } - case XBUTTONUP: { - bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true - m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; - return true; - } - case MOUSEWHEEL: { - short scroll_input = ( short )HIWORD( key ); - m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; - return true; - } - } - - return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK -} - -bool c_input_manager::is_key_pressed( int key ) { - auto k = key; - return is_valid_key( k ) && m_pressed_keys[ k ]; -} - -const char* c_input_manager::get_key_name( int key ) { - if ( !is_valid_key( key ) || key > KEYS_MAX ) - return key_names[ KEYS_NONE ]; - - return key_names[ key ]; -} - -const char* c_input_manager::get_short_name( int key ) { - return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; -} - -VirtualKeys_t c_input_manager::is_any_key_pressed( ) { - for ( size_t i{ }; i < KEYS_MAX; ++i ) { - if ( m_pressed_keys[ i ] ) { - return VirtualKeys_t( i ); - } - } - - return KEYS_NONE; -} - -int c_input_manager::get_scroll_state( ) { - int current_state = m_scroll_wheel_state; - m_scroll_wheel_state = 0; - return current_state; -} - -char c_input_manager::get_pressed_char( int* out ) { - size_t pressed_character{ }; - for ( size_t i{ }; i < KEYS_MAX; ++i ) { - if ( is_key_pressed( VirtualKeys_t( i ) ) ) { - if ( ( i >= KEYS_A && i <= KEYS_Z ) - || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { - pressed_character = i; - } - } - } - - if ( pressed_character ) { - if ( out ) { - *out = int( pressed_character ); - } - - if ( is_key_pressed( KEYS_SHIFT ) ) { - if ( pressed_character >= KEYS_A - && pressed_character <= KEYS_Z ) - return char( pressed_character ); - - //gay way to shift it to symbols - if ( pressed_character >= KEYS_N0 - && pressed_character <= KEYS_N9 ) { - switch ( pressed_character ) { - case KEYS_N0: - return ')'; - case KEYS_N1: - return '!'; - case KEYS_N2: - return '@'; - case KEYS_N3: - return '#'; - case KEYS_N4: - return '$'; - case KEYS_N5: - return '%'; - case KEYS_N6: - return '^'; - case KEYS_N7: - return '&'; - case KEYS_N8: - return '*'; - case KEYS_N9: - return '('; - } - } - } - else { - if ( pressed_character >= KEYS_A - && pressed_character <= KEYS_Z ) - return char( ::tolower( pressed_character ) ); - - if ( pressed_character >= KEYS_N0 - && pressed_character <= KEYS_N9 ) - return char( pressed_character ); - } - } - else if ( is_key_pressed( KEYS_SPACE ) ) { - if ( out ) - *out = KEYS_SPACE; - - return ' '; - } - else if ( is_key_pressed( KEYS_BACK ) ) { - if ( out ) - *out = KEYS_BACK; - - return 0; - } - - if ( out ) - *out = KEYS_NONE; - - return 0; -} - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/input_system.hpp b/internal_rewrite/input_system.hpp deleted file mode 100644 index 338c493..0000000 --- a/internal_rewrite/input_system.hpp +++ /dev/null @@ -1,186 +0,0 @@ -#pragma once -#include "util.hpp" - -enum VirtualKeyEvents_t { - KEYDOWN = 0x0100, - KEYUP = 0x0101, - SYSKEYDOWN = 0x104, - SYSKEYUP = 0x105, - LBUTTONDOWN = 0x0201, - LBUTTONUP = 0x0202, - RBUTTONDOWN = 0x0204, - RBUTTONUP = 0x0205, - MBUTTONDOWN = 0x0207, - MBUTTONUP = 0x0208, - MOUSEWHEEL = 0x020A, - XBUTTONDOWN = 0x020B, - XBUTTONUP = 0x020C, -}; - -enum VirtualKeys_t { - KEYS_NONE = 0, - KEYS_MOUSE1 = 0X01, - KEYS_MOUSE2 = 0X02, - KEYS_CANCEL = 0X03, - KEYS_MOUSE3 = 0X04, - KEYS_MOUSE4 = 0X05, - KEYS_MOUSE5 = 0X06, - KEYS_BACK = 0X08, - KEYS_TAB = 0X09, - KEYS_CLEAR = 0X0C, - KEYS_RETURN = 0X0D, - KEYS_SHIFT = 0X10, - KEYS_CONTROL = 0X11, - KEYS_ALT = 0X12, - KEYS_PAUSE = 0X13, - KEYS_CAPSLOCK = 0X14, - KEYS_ESCAPE = 0X1B, - KEYS_CONVERT = 0X1C, - KEYS_NONCONVERT = 0X1D, - KEYS_ACCEPT = 0X1E, - KEYS_MODECHANGE = 0X1F, - KEYS_SPACE = 0X20, - KEYS_PRIOR = 0X21, - KEYS_NEXT = 0X22, - KEYS_END = 0X23, - KEYS_HOME = 0X24, - KEYS_LEFT = 0X25, - KEYS_UP = 0X26, - KEYS_RIGHT = 0X27, - KEYS_DOWN = 0X28, - KEYS_SELECT = 0X29, - KEYS_PRINT = 0X2A, - KEYS_EXECUTE = 0X2B, - KEYS_SNAPSHOT = 0X2C, - KEYS_INSERT = 0X2D, - KEYS_DELETE = 0X2E, - KEYS_HELP = 0X2F, - KEYS_N0 = 0X30, - KEYS_N1 = 0X31, - KEYS_N2 = 0X32, - KEYS_N3 = 0X33, - KEYS_N4 = 0X34, - KEYS_N5 = 0X35, - KEYS_N6 = 0X36, - KEYS_N7 = 0X37, - KEYS_N8 = 0X38, - KEYS_N9 = 0X39, - KEYS_A = 0X41, - KEYS_B = 0X42, - KEYS_C = 0X43, - KEYS_D = 0X44, - KEYS_E = 0X45, - KEYS_F = 0X46, - KEYS_G = 0X47, - KEYS_H = 0X48, - KEYS_I = 0X49, - KEYS_J = 0X4A, - KEYS_K = 0X4B, - KEYS_L = 0X4C, - KEYS_M = 0X4D, - KEYS_N = 0X4E, - KEYS_O = 0X4F, - KEYS_P = 0X50, - KEYS_Q = 0X51, - KEYS_R = 0X52, - KEYS_S = 0X53, - KEYS_T = 0X54, - KEYS_U = 0X55, - KEYS_V = 0X56, - KEYS_W = 0X57, - KEYS_X = 0X58, - KEYS_Y = 0X59, - KEYS_Z = 0X5A, - KEYS_LEFTWINDOWS = 0X5B, - KEYS_RIGHTWINDOWS = 0X5C, - KEYS_APPLICATION = 0X5D, - KEYS_NUMPAD0 = 0X60, - KEYS_NUMPAD1 = 0X61, - KEYS_NUMPAD2 = 0X62, - KEYS_NUMPAD3 = 0X63, - KEYS_NUMPAD4 = 0X64, - KEYS_NUMPAD5 = 0X65, - KEYS_NUMPAD6 = 0X66, - KEYS_NUMPAD7 = 0X67, - KEYS_NUMPAD8 = 0X68, - KEYS_NUMPAD9 = 0X69, - KEYS_MULTIPLY = 0X6A, - KEYS_ADD = 0X6B, - KEYS_SEPARATOR = 0X6C, - KEYS_SUBTRACT = 0X6D, - KEYS_DECIMAL = 0X6E, - KEYS_DIVIDE = 0X6F, - KEYS_F1 = 0X70, - KEYS_F2 = 0X71, - KEYS_F3 = 0X72, - KEYS_F4 = 0X73, - KEYS_F5 = 0X74, - KEYS_F6 = 0X75, - KEYS_F7 = 0X76, - KEYS_F8 = 0X77, - KEYS_F9 = 0X78, - KEYS_F10 = 0X79, - KEYS_F11 = 0X7A, - KEYS_F12 = 0X7B, - KEYS_NUMLOCK = 0X90, - KEYS_SCROLLLOCK = 0X91, - KEYS_LEFTSHIFT = 0XA0, - KEYS_RIGHTSHIFT = 0XA1, - KEYS_LEFTCONTROL = 0XA2, - KEYS_RIGHTCONTROL = 0XA3, - KEYS_LEFTMENU = 0XA4, - KEYS_RIGHTMENU = 0XA5, - KEYS_PERIOD = 0xBE, - KEYS_MAX = 0XA6, - KEYS_LAST = 0xfe -}; - -namespace util -{ - class c_input_manager { - public: - bool m_pressed_keys[ KEYS_LAST ]{ }; - int m_mouse_pos[ 2 ]{ }; - int m_scroll_wheel_state{ }; - - - c_input_manager( ) { - memset( m_pressed_keys, 0, KEYS_LAST ); - } - - void capture_mouse_move( ulong_t lparam ); - - //resets all keys so unpressed - void clear_keys( ); - - //registers a key press from wndproc - bool register_key_press( int key_event, int key ); - - //checks if the key is pressed - bool is_key_pressed( int key ); - - //returns the first found key pressed, or KEY_NONE if none are - VirtualKeys_t is_any_key_pressed( ); - - //returns the last scroll state and resets it to 0 - int get_scroll_state( ); - - //returns the key's name - const char* get_key_name( int key ); - const char* get_short_name( int key ); - - //returns the first found currently pressed key - char get_pressed_char( int* pressed_key = nullptr ); - - //check if a key is valid - inline bool is_valid_key( int key ) { return key > KEYS_NONE && key < KEYS_LAST; } - - //get cursor pos - inline void get_cursor_pos( int& x, int& y ) { - x = m_mouse_pos[ 0 ]; - y = m_mouse_pos[ 1 ]; - } - }; -} - -extern util::c_input_manager g_input; \ No newline at end of file diff --git a/internal_rewrite/interface.cpp b/internal_rewrite/interface.cpp deleted file mode 100644 index e424c0f..0000000 --- a/internal_rewrite/interface.cpp +++ /dev/null @@ -1,271 +0,0 @@ -#include - -#include "interface.hpp" -#include "console.hpp" -#include "hooks.hpp" -#include "renderer.hpp" -#include "pattern.hpp" -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "modules.hpp" -#include "wipe.hpp" - -using namespace factory; - -interfaces::c_interface_manager g_factory; -factory::c_csgo g_csgo; - -bool factory::create_interfaces( c_csgo* instance, header_t* header ) { - DELETE_START( 0 ); - - -#ifndef HEADER_MODULE - header->client_panorama = ( uintptr_t )GetModuleHandleA( "client_panorama.dll" ); - header->vguimatsurface = ( uintptr_t )GetModuleHandleA( "vguimatsurface.dll" ); - header->shaderapidx9 = ( uintptr_t )GetModuleHandleA( "shaderapidx9.dll" ); - header->vstdlib = ( uintptr_t )GetModuleHandleA( "vstdlib.dll" ); - header->steam_api = ( uintptr_t )GetModuleHandleA( "steam_api.dll" ); -#endif - - instance->create( &instance->m_chl, xors( "VClient" ) ); - instance->create( &instance->m_surface, xors( "VGUI_Surface" ) ); - instance->create( &instance->m_panel, xors( "VGUI_Panel" ) ); - instance->create( &instance->m_engine, xors( "VEngineClient" ) ); - instance->create( &instance->m_entlist, xors( "VClientEntityList" ) ); - instance->create( &instance->m_prediction, xors( "VClientPrediction" ) ); - instance->create( &instance->m_cvar, xors( "VEngineCvar" ) ); - instance->create( &instance->m_game_movement, xors( "GameMovement" ) ); - instance->create( &instance->m_model_info, xors( "VModelInfoClient" ) ); - instance->create( &instance->m_trace, xors( "EngineTraceClient" ) ); - instance->create( &instance->m_model_render, xors( "VEngineModel" ) ); - instance->create( &instance->m_mat_system, xors( "VMaterialSystem" ) ); - instance->create( &instance->m_render_view, xors( "VEngineRenderView" ) ); - instance->create( &instance->m_phys_props, xors( "VPhysicsSurfaceProps" ) ); - instance->create( &instance->m_engine_sound, xors( "IEngineSoundClient" ) ); - instance->create( &instance->m_event_mgr, xors( "GAMEEVENTSMANAGER002" ) ); - instance->create( &instance->m_string_table, xors( "VEngineClientStringTable" ) ); - instance->create( &instance->m_partition, xors( "SpatialPartition" ) ); - instance->create( &instance->m_clientleaf, xors( "ClientLeafSystem002" ) ); - instance->create( &instance->m_mdl_cache, xors( "MDLCache" ) ); - instance->create( &instance->m_engine_vgui, xors( "VEngineVGui" ) ); - instance->create( &instance->m_input_sys, xors( "InputSystemVersion" ) ); - - auto d3d_device = pattern::first_code_match( (HMODULE)header->shaderapidx9, - xors( "A1 ?? ?? ?? ?? 50 8B 08 FF 51 0C" ) ) + 0x1; - -#ifdef HEADER_MODULE - auto move_helper = header->patterns.move_helper + 0x2; -#else - auto move_helper = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "8B 0D ?? ?? ?? ?? 8B 46 08 68" ) ) + 0x2; -#endif - -#ifdef HEADER_MODULE - auto beam_ptr = header->patterns.beam_ptr + 0x1; -#else - auto beam_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "B9 ? ? ? ? A1 ? ? ? ? FF 10 A1 ? ? ? ? B9" ), 0x1 ); -#endif - - auto mm_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "89 4C 24 10 8B 0D ? ? ? ? 53" ), 0x6 ); - - instance->create( &instance->m_d3d, **reinterpret_cast< uintptr_t** >( d3d_device ) ); - instance->create( &instance->m_move_helper, **reinterpret_cast< uintptr_t** >( move_helper ) ); - instance->create( &instance->m_beams, *reinterpret_cast< uintptr_t* >( beam_ptr ) ); - //instance->create( &instance->m_mm, **reinterpret_cast< uintptr_t** >( mm_ptr ) ); - - instance->m_steam_pipe_handle = ( ( SteamPipeHandle( __cdecl* )( ) )GetProcAddress( ( HMODULE )header->steam_api, xors( "SteamAPI_GetHSteamPipe" ) ) )( ); - instance->m_steam_user_handle = ( ( SteamUserHandle( __cdecl* )( ) )GetProcAddress( ( HMODULE )header->steam_api, xors( "SteamAPI_GetHSteamUser" ) ) )( ); - - uintptr_t steam_client_ptr = ( ( uintptr_t ( __cdecl* )( void ) )GetProcAddress( ( HMODULE )header->steam_api, xors( "SteamClient" ) ) )( ); - instance->create( &instance->m_steam_client, steam_client_ptr ); - - uintptr_t steam_friends_ptr = ( uintptr_t )instance->m_steam_client( )->GetISteamFriends( instance->m_steam_user_handle, instance->m_steam_pipe_handle, "SteamFriends015" ); - instance->create( &instance->m_steam_friends, steam_friends_ptr ); - - - auto kv_fn = ( void*( __cdecl* )( ) )( GetProcAddress( - ( HMODULE )header->vstdlib, - xors( "KeyValuesSystem" ) ) ); - - instance->m_keyvalues = ( IKeyValuesSystem* )kv_fn( ); - - uintptr_t* globals = **reinterpret_cast< uintptr_t*** >( - instance->m_chl->get_old_function( 0 ) + 0x1b ); - instance->m_globals = reinterpret_cast< global_vars_t* >( globals ); - - uintptr_t* client_mode = **reinterpret_cast< uintptr_t*** >( - instance->m_chl->get_old_function( 10 ) + 0x5 ); - instance->create( &instance->m_clientmode, uintptr_t( client_mode ) ); - - uintptr_t input = *reinterpret_cast< uintptr_t* >( - instance->m_chl->get_old_function( 16 ) + 0x1 ); - instance->create( &instance->m_input, input ); - - uintptr_t** global_state = pattern::first_code_match< uintptr_t** >( instance->m_engine.dll( ), - xors( "B9 ? ? ? ? 56 FF 50 14 8B 34 85" ), 0x1 ); - instance->m_global_state = reinterpret_cast< CGlobalState* >( *global_state ); - - auto clientstate = instance->m_global_state->get_client_state( ); - if( clientstate && clientstate->m_netchannel ) - instance->create( &instance->m_net_channel, ( uintptr_t )clientstate->m_netchannel ); - - uintptr_t var_ptr = ( uintptr_t )instance->m_cvar( )->FindVar( xors( "weapon_debug_spread_show" ) ); - instance->create( &instance->m_debug_show_spread, var_ptr ); - - uintptr_t cl_interpolate = ( uintptr_t )( instance->m_cvar( )->FindVar( xors( "cl_interpolate" ) ) ); - instance->create( &instance->m_interpolate, cl_interpolate ); - - uintptr_t net_showfragments = ( uintptr_t )( instance->m_cvar( )->FindVar( xors( "net_showfragments" ) ) ); - instance->create( &instance->m_netshowfragments, net_showfragments ); - - uintptr_t cl_csm_shadows = ( uintptr_t )( instance->m_cvar( )->FindVar( xors( "cl_csm_shadows" ) ) ); - instance->create( &instance->m_csm_shadows, cl_csm_shadows ); - - instance->listeners.bullet_impact.init( ); - instance->listeners.player_hurt.init( ); - instance->listeners.round_start.init( ); - instance->listeners.molotov_detonate.init( ); - instance->listeners.weapon_fire.init( ); - instance->listeners.player_death.init( ); - - DELETE_END( 0 ); - return true; -} - - -con_fn clear_fn{ fnv( "clear" ), [ ]( const char*, const char* ) { g_con->m_logs.clear( ); }, "" }; -con_fn enable_logs_fn{ fnv( "log_enable" ), - [ ]( const char* a, const char* ) { - g_settings.menu.logs_enable ^= 1; - g_con->log( g_settings.menu.logs_enable ? xors( "logs enabled" ) : xors( "logs disabled" ) ); - }, - "" -}; - -con_fn fnv_fn{ fnv( "fnv" ), - [ ]( const char* a, const char* ) { - auto print = hash::fnv1a( a ); - g_con->log( "%08x", print ); - }, - "%S" -}; - -con_fn sum_fn{ fnv( "sum" ), - [ ]( const char* a, const char* syntax ) { - auto arg_1 = con_fn::get_arg< int >( a, 0, syntax ); - auto arg_2 = con_fn::get_arg< int >( a, 1, syntax ); - g_con->log( "%d + %d = %d", arg_1, arg_2, arg_1 + arg_2 ); - }, - "%D %D" -}; - -con_fn dump_cfg{ fnv( "dump_cfg" ), - [ ]( const char* , const char* ) { - for( auto& it : data::holder_.get_nodes( ) ) { - auto setting = static_cast< ISetting* >( it ); - g_con->log( "%08x: %s", setting->get_hash( ), setting->get_string( ).c_str( ) ); - } - }, - "" -}; - -con_fn retard_fn{ fnv( "retard" ), - [ ]( const char*, const char* ) { - g_con->log( "snuze" ); - }, - "" -}; - -con_fn unload_fn{ fnv( "unload" ), - [ ]( const char*, const char* ) { - g_csgo.m_panic = true; - ExitProcess( 0 ); - }, - "" -}; - - -/*con_fn alias_fn{ fnv( "alias" ), - [ ]( const char* a, const char* b ) { - auto var_type = std::string( b ); - if( var_type.length( ) > 1 ) { - g_con->log( xors( "unknown var type: %s" ), var_type.c_str( ) ); - return; - } - - switch( b[ 0 ] ) { - case TYPE_STRING: { - std::shared_ptr< con_alias< const char* > >( fnv( ) ) - } - } - }, - "%S %S" -};*/ - -void factory::c_csgo::initialize( ) { - DELETE_START( 0 ) - - m_panic = false; - - g_con->create( ); - auto now = std::chrono::high_resolution_clock::now( ); - g_con->print( xors( "hello\n" ) ); - - factory::create_interfaces( &g_csgo, &g_header ); - - g_fonts.initialize( ); - - g_netvars.init( ); - - g_settings.load( ); - - g_con->register_fn( &clear_fn ); - g_con->register_fn( &enable_logs_fn ); - g_con->register_fn( &fnv_fn ); - g_con->register_fn( &sum_fn ); - g_con->register_fn( &dump_cfg ); - g_con->register_fn( &retard_fn ); - g_con->register_fn( &unload_fn ); - - hooks::commit( &g_csgo ); - - g_cheat.m_chams.m_materials.initialize_materials( ); - - util::calculate_spread_runtime( ); - - auto after = std::chrono::high_resolution_clock::now( ); - std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); - - std::chrono::duration< float > delta = after - now; - - g_con->log( xors( "cheat initialized\n" ) ); - g_con->log( xors( "time taken: %f\n" ), delta.count( ) ); - - // open the menu so people actually know when the cheat loaded - g_settings.menu.open = true; - - DELETE_END( 0 ); -} - -void factory::c_csgo::uninitialize( ) { - m_panic = true; - g_con->destroy( ); - - //restore wndproc - if ( hooks::window_procedure_o ) { - SetWindowLongA( m_hwnd, GWLP_WNDPROC, ( long )hooks::window_procedure_o ); - } - - //unreference materials - g_cheat.m_chams.m_materials.destroy_materials( ); - - //restore all interfaces - restore( ); - - Sleep( 100 ); - - //free the library - FreeLibraryAndExitThread( g_dll, 0 ); -} diff --git a/internal_rewrite/interface.hpp b/internal_rewrite/interface.hpp deleted file mode 100644 index 332971a..0000000 --- a/internal_rewrite/interface.hpp +++ /dev/null @@ -1,185 +0,0 @@ -#pragma once -#include - -#include "factory.hpp" -#include "sdk.hpp" -#include "listener.hpp" -#include "modules.hpp" - -NAMESPACE_REGION( factory ) - -struct IDirect3DDevice9; - -//interface holder -template < typename t > -class c_interface_base { - friend class c_csgo; -public: - t* operator( )( ) { - return m_interface; - } - - //calls a virtual - template< size_t index, typename ret = void, - class... Args > - ret call( Args... args ) { - return util::get_vfunc< ret( __thiscall* )( void*, Args... ) > - ( m_interface, index )( m_interface, args... ); - } - - //also calls a virtual but you supply the typedef instead of return type - template< typename def, size_t index, class... Args > - auto call( Args... args ) { - return util::get_vfunc< def > - ( m_interface, index )( m_interface, args... ); - } - - //allows you to cast the interface - template< typename t0 = t* > - t0 get( ) { - return ( t0 )m_interface; - } - - void operator( )( t* ptr ) { - m_interface = ptr; - m_hook.reset( ); - m_hook = std::make_shared< hooks::c_vmt >( static_cast< void* >( ptr ) ); - - /*find the module the interface is located in - i know i could just pass the pointer but traps are gay*/ - MEMORY_BASIC_INFORMATION info; - VirtualQuery( ptr, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); - - m_dll = static_cast< HMODULE >( info.AllocationBase ); - } - - void operator( )( void* ptr ) { - operator( )( static_cast< t* >( ptr ) ); - } - - decltype( auto ) operator->( ) { - return m_hook; - } - - template< typename t2 = decltype( m_dll ) > - t2 dll( ) { - return ( t2 )m_dll; - } - -protected: - t* m_interface; - HMODULE m_dll; - std::shared_ptr< hooks::c_vmt > m_hook; -}; - -//declare your interfaces here -class c_csgo { -public: - c_interface_base< IBaseClientDLL > m_chl; - c_interface_base< ISurface > m_surface; - c_interface_base< IPanel > m_panel; - c_interface_base< IClientMode > m_clientmode; - c_interface_base< IVEngineClient > m_engine; - c_interface_base< IClientEntityList > m_entlist; - c_interface_base< IDirect3DDevice9 > m_d3d; - c_interface_base< IPrediction > m_prediction; - c_interface_base< ICSGameMovement > m_game_movement; - c_interface_base< IMoveHelper > m_move_helper; - c_interface_base< IVModelInfoClient > m_model_info; - c_interface_base< IVModelRender > m_model_render; - c_interface_base< IMaterialSystem > m_mat_system; - c_interface_base< IEngineTrace > m_trace; - c_interface_base< IPhysicsSurfaceProps > m_phys_props; - c_interface_base< IVRenderView > m_render_view; - c_interface_base< ICVar > m_cvar; - c_interface_base< IGameEventManager2 > m_event_mgr; - c_interface_base< CHudChat > m_hud_chat; - c_interface_base< IVEngineSound > m_engine_sound; - c_interface_base< INetChannel > m_net_channel; - c_interface_base< cvar_t > m_debug_show_spread; - c_interface_base< cvar_t > m_interpolate; - c_interface_base< cvar_t > m_netshowfragments; - c_interface_base< cvar_t > m_csm_shadows; - c_interface_base< ISteamClient > m_steam_client; - c_interface_base< ISteamFriends > m_steam_friends; - c_interface_base< IViewRenderBeams > m_beams; - //c_interface_base< CMatchFramework > m_mm; - c_interface_base< uintptr_t > m_input_sys; - c_interface_base< CStringTable > m_string_table; - c_interface_base< CInput > m_input; - c_interface_base< uintptr_t > m_partition; - c_interface_base< uintptr_t > m_clientleaf; - c_interface_base< uintptr_t > m_mdl_cache; - c_interface_base< uintptr_t > m_engine_vgui; - c_interface_base< c_base_player > m_local; - SteamUserHandle m_steam_user_handle; - SteamPipeHandle m_steam_pipe_handle; - IKeyValuesSystem* m_keyvalues; - global_vars_t* m_globals; - CGlobalState* m_global_state; - float m_frametime; - std::thread::id m_main_thread; - std::thread::id m_d3d_thread; - - - HWND m_hwnd{ }; - bool m_panic{ }; - - struct { - generic_listener_t player_death { xors( "player_death" ), &listeners::player_death }; - generic_listener_t bullet_impact{ xors( "bullet_impact" ), &listeners::bullet_impact }; - generic_listener_t player_hurt{ xors( "player_hurt" ), &listeners::player_hurt }; - generic_listener_t round_start{ xors( "round_start" ), &listeners::round_start }; - generic_listener_t molotov_detonate{ xors( "molotov_detonate" ), &listeners::molotov_detonate }; - generic_listener_t weapon_fire{ xors( "weapon_fire" ), &listeners::weapon_fire }; - } listeners; -public: - //find the interface inside of the module - void create( void* iface, const std::string& name, const std::string& mod ) { - auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); - auto ptr = g_factory.find_interface( mod, name ); - if( !ptr ) - return; - - ( *interface_ )( ptr ); - m_container.push_back( interface_ ); - } - - void create( void* iface, uintptr_t pointer ) { - auto interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); - - //msvc is retarded - ( *interface_ )( ( void* )pointer ); - m_container.push_back( interface_ ); - } - - void create( void* iface, const std::string& name ) { - auto* interface_ = static_cast< c_interface_base< uintptr_t >* >( iface ); - auto ptr = g_factory.find_interface( name ); - if( !ptr ) - return; - - ( *interface_ )( ptr ); - m_container.push_back( interface_ ); - } - - void __cdecl initialize( ); - void __cdecl uninitialize( ); - -private: - //restore the vmts to their original - void restore( ) { - for ( const auto& it : m_container ) { - it->m_hook->restore( ); - } - } - -private: - std::vector< c_interface_base< uintptr_t >* > m_container; -}; - -bool create_interfaces( c_csgo* instance, header_t* ); - -END_REGION - -extern factory::c_csgo g_csgo; \ No newline at end of file diff --git a/internal_rewrite/internal_rewrite.vcxproj b/internal_rewrite/internal_rewrite.vcxproj deleted file mode 100644 index ec68f0f..0000000 --- a/internal_rewrite/internal_rewrite.vcxproj +++ /dev/null @@ -1,572 +0,0 @@ - - - - - Debug - Win32 - - - Online - Win32 - - - Online - x64 - - - optimize_test - Win32 - - - optimize_test - x64 - - - pHit - Win32 - - - pHit - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {140DEC51-B0E7-4289-BB6F-79686422318E} - internal_rewrite - 10.0.17763.0 - moneybot - - - - DynamicLibrary - true - v141 - MultiByte - - - DynamicLibrary - true - v141 - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - false - - - DynamicLibrary - true - v141 - MultiByte - - - DynamicLibrary - true - v141 - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(ProjectDir)\protobuf_src;C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - $(SolutionDir)\bin - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - $(SolutionDir)\bin - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - $(SolutionDir)\online - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - $(SolutionDir)\pHit - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - $(SolutionDir)\bin - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - - Level2 - Disabled - true - /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) - _DEBUG;_WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS;_SCL_SECURE_NO_WARNINGS - true - false - EnableFastChecks - NotUsing - precompiled.hpp - - - false - /FAs %(AdditionalOptions) - DebugFastLink - false - false - - - - - Level2 - Full - true - /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG;_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS - true - false - Default - AnySuitable - true - StreamingSIMDExtensions2 - Fast - true - MultiThreadedDLL - _DEBUG - NotUsing - precompiled.hpp - - - false - /FAs %(AdditionalOptions) - DebugFastLink - false - false - - - - - Level3 - Disabled - true - /std:c++latest %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG - - - - - Level3 - Disabled - true - /std:c++latest %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;_DEBUG - - - - - Level3 - Full - true - true - true - /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS - true - StreamingSIMDExtensions2 - Precise - CompileAsCpp - false - AnySuitable - Neither - NotUsing - precompiled.hpp - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - /std:c++latest %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS - NotUsing - precompiled.hpp - false - true - - - true - true - false - - - - - Level3 - MaxSpeed - false - true - false - /std:c++latest /Zc:threadSafeInit- %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS - NotUsing - precompiled.hpp - true - false - false - false - false - false - StreamingSIMDExtensions2 - false - false - false - stdcpplatest - None - MultiThreadedDLL - - - true - true - true - - - - - Level3 - MaxSpeed - true - true - true - /std:c++latest %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - /std:c++latest %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS - - - true - true - - - - - Level3 - MaxSpeed - true - true - true - /std:c++latest %(AdditionalOptions) - _WINDLL;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS - - - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/internal_rewrite/internal_rewrite.vcxproj.filters b/internal_rewrite/internal_rewrite.vcxproj.filters deleted file mode 100644 index a871845..0000000 --- a/internal_rewrite/internal_rewrite.vcxproj.filters +++ /dev/null @@ -1,571 +0,0 @@ - - - - - {111ce6db-2b60-4a90-b3a8-f418abb6e441} - - - {46408dc1-0b1f-43a7-b32d-4b3f1a4e3393} - - - {e3e56c63-e162-43dc-af43-e40c4b463299} - - - {037f8374-e510-46a1-b5e3-f418537a7e61} - - - {c1fd811f-a868-4a60-9bf4-1c81c22c61ce} - - - {de79d40e-dbca-46ba-ac40-4adcd316d638} - - - {5b0550fa-f13e-4b35-83a2-2b8ae64dc7ee} - - - {1e1c2f2b-1cb9-4040-8a0f-f03ecfb56522} - - - {3a5a53ed-6526-48c1-ade4-05eaefe13c86} - - - {8bc3e769-d369-4e50-ad7d-20b9c4d6680b} - - - {37890891-fcc3-4432-9cdf-e586bded2aa1} - - - - - - factory - - - context - - - hooks - - - hooks - - - utility - - - factory - - - factory - - - hooks - - - utility - - - utility - - - hooks - - - context - - - hooks - - - features - - - hooks - - - features - - - features - - - hooks - - - features - - - sdk - - - sdk - - - features - - - sdk - - - hooks - - - hooks - - - utility - - - features - - - features - - - features - - - features - - - hooks - - - hooks - - - features - - - features - - - features - - - features - - - hooks - - - hooks - - - features - - - hooks - - - hooks\hookers - - - features - - - features - - - features - - - features - - - utility - - - hooks - - - utility - - - features - - - hooks - - - hooks - - - hooks - - - utility - - - hooks - - - hooks - - - hooks - - - features - - - hooks - - - hooks - - - sdk\valve - - - features - - - ui - - - ui - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks\hookers - - - hooks\hookers - - - hooks - - - hooks - - - - - factory - - - factory - - - sdk - - - sdk - - - utility - - - utility - - - context - - - sdk - - - sdk - - - features - - - utility - - - hooks - - - sdk - - - sdk - - - utility - - - sdk - - - utility - - - sdk - - - sdk - - - sdk - - - sdk - - - factory - - - sdk - - - sdk\valve - - - sdk\valve - - - sdk - - - utility - - - ui - - - utility - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - context - - - context - - - protection - - - protection - - - sdk - - - features - - - hooks\hookers - - - hooks\hookers - - - features - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - ui - - - features - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - features - - - features - - - sdk - - - sdk - - - ui - - - utility - - - features - - - features - - - sdk - - - sdk - - - features - - - features - - - sdk - - - features - - - sdk - - - sdk - - - hooks\hookers - - - features - - - ui - - - features - - - utility - - - resource - - - resource - - - resource - - - resource - - - resource - - - resource - - - utility - - - utility - - - utility - - - sdk - - - features - - - factory - - - sdk - - - sdk\valve - - - ui - - - sdk - - - hooks\hookers - - - hooks\hookers - - - hooks\hookers - - - factory - - - utility - - - \ No newline at end of file diff --git a/internal_rewrite/is_connected.cpp b/internal_rewrite/is_connected.cpp deleted file mode 100644 index 159d036..0000000 --- a/internal_rewrite/is_connected.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "mem.hpp" -#include "hooks.hpp" - -bool __fastcall hooks::is_connected( void* ecx_, void* edx_ ) { - static auto inventory = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "84 C0 75 04 B0 01 5F" ) ); - static auto is_connected_o = g_csgo.m_engine->get_old_function< decltype( &is_connected ) >( 27 ); - stack_t stack( get_baseptr( ) ); - - if( stack.return_address( ) == inventory && g_settings.misc.unlock_inventory( ) ) - return false; - - - return is_connected_o( ecx_, 0 ); -} \ No newline at end of file diff --git a/internal_rewrite/lag_mgr.cpp b/internal_rewrite/lag_mgr.cpp deleted file mode 100644 index 0233e4a..0000000 --- a/internal_rewrite/lag_mgr.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include "lag_mgr.hpp" -#include "c_base_player.hpp" -#include "context.hpp" -#include "interface.hpp" -#include "base_cheat.hpp" - -namespace features -{ - void c_lagmgr::on_antiaim( ) { - if( m_sent_ticks ) { - *m_sendpacket = false; - } - } - - bool c_lagmgr::predict_position( float dist ) { - vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); - - auto i = util::get_closest_player( ); - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_valid( ) ) - return true; - - auto wep = ent->get_weapon( ); - if( !wep ) { - return true; - } - - float dmg_begin = g_cheat.m_autowall.run( ent, g_ctx.m_local, local_pos, false ); - bool is_visible = dmg_begin > 10.f; - - if( !is_visible ) { - vec3_t position = local_pos; - - vec3_t velocity_ang = math::vector_angles( vec3_t( ), g_ctx.m_local->m_vecVelocity( ) ); - vec3_t velocity_dir = math::angle_vectors( velocity_ang ); - - //fuck getting pulled back on peek - position += velocity_dir * 20.f; - - float dmg = g_cheat.m_autowall.run( ent, g_ctx.m_local, position, false ); - - if( dmg > 25.f ) - return false; - } - - return true; - } - - void c_lagmgr::fakelag( ) { - //2017 sucked - //i hope 2018 goes better - - if( !g_settings.rage.fakelag.mode( ) || - !g_settings.rage.fakelag.ticks( ) ) { - m_breaking_lc = false; - return; - } - - static float last_rand = 0.f; - - auto& settings = g_settings.rage.fakelag; - - auto weapon = g_ctx.m_local->get_weapon( ); - - if( g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) { - return; - } - - bool moving = g_ctx.m_local->m_vecVelocity( ).length2d( ) > 0.f; - - vec3_t delta = g_ctx.m_last_origin - g_ctx.m_local->m_vecOrigin( ); - int max_ticks = g_settings.rage.fakelag.ticks( ); - if( settings.fluctuate ) - max_ticks *= last_rand; - - static bool changed = false; - static auto cl_sendmove = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "55 8B EC A1 ? ? ? ? 81 EC ? ? ? ? B9 ? ? ? ? 53 8B 98" ), 0 ); - - if( !changed ) { - ulong_t old; - VirtualProtect( ( void* )( cl_sendmove + 0xbd ), 1, PAGE_EXECUTE_READWRITE, &old ); - *( uint8_t* )( cl_sendmove + 0xbd ) = 50; - VirtualProtect( ( void* )( cl_sendmove + 0xbd ), 1, old, nullptr ); - } - - changed = true; - - max_ticks = math::min( max_ticks, 16 ); - - bool force_send = m_held_ticks >= max_ticks; - if( settings.mode == 1 ) { - if( delta.length2dsqr( ) > 4096.f ) { - force_send = get_choked( ) > 3; - } - } - - if( settings.mode == 2 ) { - static bool broken_lc = false; - bool should_send = false; - - if( broken_lc ) { - should_send = math::random_number( 0, 100 ) % 2; - if( get_choked( ) > 1 ) - broken_lc = false; - } - - if( should_send ) - force_send = true; - else if( delta.length2dsqr( ) > 4096.f ) { - force_send = get_choked( ) > 3; - broken_lc = true; - } - } - - bool send = true; - static bool was_onground{ }; - - if( settings.in_move && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) && moving ) { - send = false; - } - - if( settings.on_peek && moving ) { - static int choke_ticks = 0; - - bool peeking = predict_position( 20.f + g_ctx.m_local->m_vecVelocity( ) * TICK_INTERVAL( ) * 2.f ); - bool predicted = predict_position( 20.f ); - - if( !peeking && predicted ) { - choke_ticks = 0; - send = true; - } - else if( !predicted ) - choke_ticks = settings.ticks; - - if( choke_ticks ) { - send = !choke_ticks--; - } - } - - if( settings.in_air && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - send = false; - } - - if( settings.avoid_ground ) { - static int choked = 0; - - if( !was_onground && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - choked = settings.ticks; - } - - if( choked ) - send = !--choked; - } - - if( settings.jump_reset ) { - if( settings.avoid_ground ) { - if( was_onground && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - send = get_choked( ) > 0; - } - } - else { - if( !was_onground && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - send = get_choked( ) > 0; - } - } - } - - was_onground = ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ); - - if( settings.on_duck && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - float amt = g_ctx.m_local->m_flDuckAmount( ); - if( m_cmd->m_buttons & IN_DUCK ) { - if( amt < 1.0f ) - send = false; - } else if( amt > 0.f ) - send = false; - } - - static int wep_choke = 0; - if( wep_choke ) - send = !--wep_choke; - - if( m_cmd->m_weaponselect && settings.on_select ) { - wep_choke = max_ticks; - } - - if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) && - !settings.in_attack ) { - if( !weapon->is_grenade( ) || ( weapon->is_grenade( ) && weapon->m_fThrowTime( ) < TICK_INTERVAL( ) ) ) { - send = get_choked( ) > 0; - } - } - - *m_sendpacket = ( send || force_send ) && !get_sent( ); - if( *m_sendpacket ) { - m_breaking_lc = delta.length2d( ) > 64.f; - last_rand = ( 1.f + math::random_number( -settings.fluctuate, settings.fluctuate( ) ) * 0.01f ); - } - } - - void c_lagmgr::on_cmove_end( ) { - if( !m_sendpacket ) return; - - if( *m_sendpacket ) { - ++m_sent_ticks; - m_held_ticks = 0; - m_has_fired = false; - } - else { - ++m_held_ticks; - m_sent_ticks = 0; - - if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) ) { - m_has_fired = true; - } - } - } -} \ No newline at end of file diff --git a/internal_rewrite/lag_mgr.hpp b/internal_rewrite/lag_mgr.hpp deleted file mode 100644 index d495210..0000000 --- a/internal_rewrite/lag_mgr.hpp +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once -#include "sdk.hpp" -#include "settings.hpp" -#include "console.hpp" - -namespace features -{ - class c_lagmgr { - public: - void operator()( user_cmd_t* cmd, byte* sendpacket ) { - if( !sendpacket ) return; - if( !cmd ) return; - - m_cmd = cmd; - m_sendpacket = sendpacket; - - if( g_settings.rage.anti_aim( ) ) { - on_antiaim( ); - } - - //let fakelag override whatever happened in antiaim - //this also means we will call stuff like fakewalk etc - //after this - fakelag( ); - } - - void on_cmove_end( ); - - void set_state( bool state ) { - *m_sendpacket = state; - } - - int get_choked( ) const { - return m_held_ticks; - } - - bool has_fired( ) const { - return m_has_fired; - } - - int get_sent( ) const { - return m_sent_ticks; - } - - bool get_state( ) const { - return m_sendpacket ? !!*m_sendpacket : true; - } - - bool is_breaking_lc( ) const { - return m_breaking_lc; - } - - private: - void on_antiaim( ); - bool predict_position( float dist ); - void fakelag( ); - - user_cmd_t* m_cmd{ }; - byte* m_sendpacket{ }; - int m_sent_ticks{ }; - int m_held_ticks{ }; - bool m_breaking_lc{ }; - bool m_has_fired{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/legitbot.cpp b/internal_rewrite/legitbot.cpp deleted file mode 100644 index c3c0010..0000000 --- a/internal_rewrite/legitbot.cpp +++ /dev/null @@ -1,331 +0,0 @@ -#include "interface.hpp" -#include "input_system.hpp" -#include "context.hpp" -#include "legitbot.hpp" -#include "settings.hpp" -#include "math.hpp" - -namespace features -{ - int c_legitbot::get_aim_target( float fov ) { - float best_fov = fov ? fov : g_settings.legit.active->m_fov; - int target{ -1 }; - vec3_t aim_angle{ }; - vec3_t cur_angle{ }; - vec3_t local_pos{ }; - vec3_t aim_pos{ }; - - g_csgo.m_engine( )->GetViewAngles( cur_angle ); - local_pos = g_ctx.m_local->get_eye_pos( ); - - for ( int i{ 1 }; i <= g_csgo.m_globals->m_maxclients; ++i ) { - auto entity = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if ( !entity ) continue; - if ( entity == g_ctx.m_local ) continue; - if ( !entity->is_valid( ) ) continue; - int team = entity->m_iTeamNum( ); - if ( team == g_ctx.m_local->m_iTeamNum( ) - && !g_settings.legit.friendlies( ) ) { - continue; - } - - bool visible = entity->is_visible( 0 ); - if( !visible && g_settings.legit.backtracking_target( ) ) { - auto record = m_lagcomp.find_best_record( i ); - if( record ) { - visible = util::trace_ray( local_pos, record->m_position, - g_ctx.m_local->ce( ), entity->ce( ) ); - } - } - - if ( !visible ) { - continue; - } - - aim_angle = math::vector_angles( local_pos, entity->get_hitbox_pos( 0 ) ); - aim_angle.clamp( ); - - float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); - if( fov < best_fov ) { - best_fov = fov; - target = i; - } - } - - return target; - } - - void c_legitbot::assist( c_base_player* target, float* x, float* y ) { - vec3_t aim_ang; - vec3_t move_ang; - vec3_t view_ang; - vec3_t enemy_pos; - vec3_t local_pos; - vec3_t view_delta; - vec3_t delta; - vec2_t pixels; - - local_pos = g_ctx.m_local->get_eye_pos( ); - enemy_pos = target->get_hitbox_pos( 0 ); - - aim_ang = math::vector_angles( local_pos, enemy_pos ); - aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * g_settings.legit.active->m_rcs; - - move_ang = pixels_to_angle( vec2_t( *x, *y ) ); - g_csgo.m_engine( )->GetViewAngles( view_ang ); - - view_delta = ( aim_ang - view_ang ).clamp( ); - - move_ang *= g_settings.legit.active->m_assist_strength; - float delta_y = std::abs( move_ang.y ); - float delta_x = std::abs( move_ang.x ); - - delta.x = std::clamp( view_delta.x, -delta_x, delta_x ); - delta.y = std::clamp( view_delta.y, -delta_y, delta_y ); - - pixels = angle_to_pixels( delta ); - *x += pixels.x; *y += pixels.y; - } - - void c_legitbot::triggerbot( user_cmd_t* cmd ) { - static float time_at = 0.f; - - if( !g_settings.legit.triggerbot( ) ) - return; - - if( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.trigger_key( ) ) && !time_at ) // sometimes people will let go of their triggerbot key too quickly and will cause them to not shoot. - return; - - vec3_t viewangles{ }; - vec3_t forward{ }; - g_csgo.m_engine( )->GetViewAngles( viewangles ); - - auto wep = g_ctx.m_local->get_weapon( ); - if( !wep ) return; - if( wep->is_knife( ) ) return; - - auto wpn_info = wep->get_wpn_info( ); - if( !wpn_info ) return; - - const float length = wpn_info->range; - const float current_time = TICKS_TO_TIME( g_csgo.m_globals->m_tickcount ); - - if( time_at && abs( current_time - time_at ) > 0.3f ) { - time_at = 0.f; // delta too big - } - - if( length > 1.0f ) { - if( !time_at ) { - viewangles += g_ctx.m_local->m_aimPunchAngle( ) * 2.f; - - forward = math::angle_vectors( viewangles ); - forward *= length; - - vec3_t src = g_ctx.m_local->get_eye_pos( ); - vec3_t dst = src + forward; - - CTraceFilter filter{ }; - CGameTrace tr{ }; - Ray_t ray{ }; - - filter.pSkip = g_ctx.m_local; - ray.Init( src, dst ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); - - if( tr.m_pEnt ) { - auto ent = tr.m_pEnt->as< c_base_player >( ); - if( ent->is_valid( ) ) { - if( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.legit.friendlies ) { - time_at = current_time; - } - } - } - } - - if( time_at ) { - if( ( current_time - time_at ) >= g_settings.legit.trigger_delay( ) ) { - cmd->m_buttons |= IN_ATTACK; - time_at = 0.f; - } - } - } - } - - void c_legitbot::sample_angle_data( const vec3_t& cur_angles ) { - auto time = g_csgo.m_globals->m_curtime; - - if ( !m_aiming ) { - m_angle_samples.push_front( { cur_angles, time } ); - } - - while ( m_angle_samples.size( ) > g_settings.legit.sample_size( ) ) { - m_angle_samples.pop_back( ); - } - } - - float c_legitbot::get_avg_delta( ) { - if ( m_angle_samples.empty( ) ) - return 0.f; - - float avg_delta{ }; - - for ( auto& it : m_angle_samples ) { - static vec3_t last_angle = it.m_viewangles; - - //doing this implements nonsticky aswell - //once you already are at the target - //after lets say a flick - //it will reduce the aim speed - //making it not "stick" to the bone - //as we dont store records when aiming - float time_delta = g_csgo.m_globals->m_curtime - it.m_time; - float delta_diff = m_deltatime / ( time_delta * 2.f ); - - vec3_t angle_delta = ( last_angle - it.m_viewangles ).clamp( ); - float delta_length = angle_delta.length( ) * delta_diff; - - avg_delta += delta_length; - last_angle = it.m_viewangles; - } - - //scale the delta down - return avg_delta / float( g_settings.legit.sample_size( ) ); - } - - vec2_t c_legitbot::angle_to_pixels( const vec3_t& angle ) { - static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); - static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); - - float x = angle.x / m_pitch->get_float( ); - float y = angle.y / m_yaw->get_float( ); - - return vec2_t( -y, x ); - } - - vec3_t c_legitbot::pixels_to_angle( const vec2_t& pixel ) { - static auto m_yaw = g_csgo.m_cvar( )->FindVar( xors( "m_yaw" ) ); - static auto m_pitch = g_csgo.m_cvar( )->FindVar( xors( "m_pitch" ) ); - - float x = pixel.x * m_pitch->get_float( ); - float y = pixel.y * m_yaw->get_float( ); - - return vec3_t( -y, x, 0.f ).clamp( ); - } - - bool c_legitbot::update_settings( ) { - if ( !g_ctx.run_frame( ) ) return false; - - auto weapon = g_ctx.m_local->get_weapon( ); - if ( !weapon ) return false; - - if ( weapon->is_grenade( ) || weapon->is_knife( ) ) { - return false; - } - - if ( weapon->is_rifle( ) ) { - g_settings.legit.active = &g_settings.legit.rifles; - } - else if ( weapon->is_sniper( ) ) { - g_settings.legit.active = &g_settings.legit.snipers; - } - else if ( weapon->is_pistol( ) ) { - g_settings.legit.active = &g_settings.legit.pistols; - } - else { - g_settings.legit.active = &g_settings.legit.general; - } - - return true; - } - - void c_legitbot::aim_at_target( c_base_player* target, float* x, float* y ) { - vec3_t aim_ang; - vec3_t cur_ang; - vec3_t delta; - vec2_t pixels; - vec2_t mouse; - - g_csgo.m_engine( )->GetViewAngles( cur_ang ); - - if ( g_settings.legit.backtracking( ) && m_lagcomp.find_best_record( target->ce( )->GetIndex( ) ) ) { - aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), - m_lagcomp.get_backtracked_position( target->ce( )->GetIndex( ) ) ).clamp( ); - } - else { - aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), - target->get_hitbox_pos( 0 ) ).clamp( ); - } - - aim_ang -= g_ctx.m_local->m_aimPunchAngle( ) * 2.f * ( g_settings.legit.active->m_rcs / 100.f ); - - delta = ( aim_ang - cur_ang ).clamp( ); - float delta_length = delta.length( ); - - if ( delta_length ) { - float final_time = delta_length / ( g_settings.legit.active->m_speed( ) / 100.f ); - m_curtime += m_deltatime; - - if ( m_curtime > final_time ) { - m_curtime = final_time; - } - - float aim_progress = m_curtime / final_time; - delta *= aim_progress; - aim_ang = delta; - - pixels = angle_to_pixels( delta ); - *x += pixels.x; - *y += pixels.y; - } - } - - void c_legitbot::aimbot( float* x, float* y ) { - if ( !g_settings.legit.enabled( ) ) return; - if ( !update_settings( ) ) return; - - m_aiming = false; - static float old_time = g_csgo.m_globals->m_curtime; - float time = g_csgo.m_globals->m_curtime; - - m_deltatime = time - old_time; - if ( g_settings.legit.dynamic_smoothing( ) ) { - float avg_delta = get_avg_delta( ) * g_settings.legit.smooth_factor( ); - if ( avg_delta > m_deltatime ) { - m_deltatime = avg_delta; - } - } - - old_time = time; - - bool in_attack = false; - if ( g_settings.legit.activation_type == 0 ) - in_attack = true; - if ( g_settings.legit.activation_type == 1 - && g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) { - in_attack = true; - } - if( g_settings.legit.trigger_magnet - && g_settings.legit.triggerbot - && g_input.is_key_pressed( g_settings.legit.trigger_key ) ) { - in_attack = true; - } - - int target_index = get_aim_target( ); - auto target = g_csgo.m_entlist( )->GetClientEntity< >( target_index ); - - if ( target_index != -1 ) { - if( in_attack ) { - m_aiming = true; - aim_at_target( target, x, y ); - } - if( g_settings.legit.assist ) { - assist( target, x, y ); - } - } - else { - m_curtime = 0; - } - } -} \ No newline at end of file diff --git a/internal_rewrite/legitbot.hpp b/internal_rewrite/legitbot.hpp deleted file mode 100644 index f543fd4..0000000 --- a/internal_rewrite/legitbot.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once -#include -#include - -#include "sdk.hpp" - -namespace features -{ - class c_legitbot { - public: - void operator()( float* x, float* y ) { - aimbot( x, y ); - } - - //call once per tick - void sample_angle_data( const vec3_t& angle ); - void triggerbot( user_cmd_t* cmd ); - private: - struct aim_record_t { - vec3_t m_viewangles; - float m_time; - }; - - struct lag_record_t { - int m_tickcount{ }; - vec3_t m_position{ }; - matrix3x4 m_matrix[ 128 ]{ }; - - bool is_valid( ); - }; - - class c_lagcomp { - public: - friend class c_legitbot; - using lag_deque_t = std::deque< lag_record_t >; - - lag_record_t* find_best_record( int ent_index ); - vec3_t get_backtracked_position( int ent_index ); - auto& get_records( int ent_index ) { - return m_data[ ent_index ]; - } - - void store( ); - void operator()( user_cmd_t* cmd ); - - private: - bool backtrack_entity( int ent_index ); - bool can_backtrack_entity( int ent_index ); - void store_player( int ent_index ); - - lag_deque_t m_data[ 65 ]; - user_cmd_t* m_cmd; - }; - - vec2_t angle_to_pixels( const vec3_t& angle ); - vec3_t pixels_to_angle( const vec2_t& pixel ); - void aimbot( float* x, float* y ); - void assist( c_base_player* player, float* x, float* y ); - void aim_at_target( c_base_player*, float*, float* ); - - bool update_settings( ); - float get_avg_delta( ); - int get_aim_target( float fov = 0.f ); - - private: - float m_deltatime{ }; - float m_curtime{ }; - bool m_aiming{ }; - - std::deque< aim_record_t > m_angle_samples; - - public: - c_lagcomp m_lagcomp; - }; -} \ No newline at end of file diff --git a/internal_rewrite/legitbot_lagcomp.cpp b/internal_rewrite/legitbot_lagcomp.cpp deleted file mode 100644 index c80bcbd..0000000 --- a/internal_rewrite/legitbot_lagcomp.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "legitbot.hpp" -#include "interface.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "math.hpp" -#include "base_cheat.hpp" -#include "input_system.hpp" -#include "d3d.hpp" - -namespace features -{ - bool c_legitbot::lag_record_t::is_valid( ) { - return util::is_tick_valid( m_tickcount ); - } - - void c_legitbot::c_lagcomp::store_player( int ent_index ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - vec3_t pos = ent->get_hitbox_pos( 0 ); - int tickcount = TIME_TO_TICKS( ent->m_flSimulationTime( ) ); - - lag_record_t new_record; - if ( ent->ce( )->SetupBones( new_record.m_matrix, 128, 0x100, 0.f ) ) { - new_record.m_position = pos; - new_record.m_tickcount = tickcount; - - m_data[ ent_index ].push_front( new_record ); - } - - while ( !m_data[ ent_index ].empty( ) && - ( m_data[ ent_index ].size( ) > TIME_TO_TICKS( 1.0f ) ) ) { - m_data[ ent_index ].pop_back( ); - } - } - - bool c_legitbot::c_lagcomp::can_backtrack_entity( int ent_index ) { - if ( m_data[ ent_index ].empty( ) ) { - return false; - } - - for( auto& it : m_data[ ent_index ] ) { - if( it.is_valid( ) ) return true; - } - - return false; - } - - c_legitbot::lag_record_t* c_legitbot::c_lagcomp::find_best_record( int ent_index ) { - c_legitbot::lag_record_t* best_record = nullptr; - float best_fov{ g_settings.legit.backtracking_fov( ) }; - vec3_t cur_angle; - vec3_t aim_angle; - vec3_t aim_pos; - vec3_t cur_pos; - int cur_tick; - - if( m_data[ ent_index ].empty( ) ) { - return nullptr; - } - - if( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) { - best_fov = 360.f; - } - - g_csgo.m_engine( )->GetViewAngles( cur_angle ); - cur_pos = g_ctx.m_local->get_eye_pos( ); - cur_tick = g_csgo.m_globals->m_tickcount; - - for( auto& it : m_data[ ent_index ] ) { - int delta = std::abs( cur_tick - it.m_tickcount ); - - if( !( g_settings.misc.net_fakelag( ) && g_settings.misc.net_fakeping_active ) ) { - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - float max_latency = g_settings.legit.backtracking_time + nci->GetLatency( 0 ); - if( delta > TIME_TO_TICKS( max_latency ) ) - continue; - } - } - - if( !it.is_valid( ) ) - continue; - - aim_pos = it.m_position; - aim_angle = math::vector_angles( cur_pos, aim_pos ).clamp( ); - - float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); - if ( fov < best_fov ) { - best_fov = fov; - best_record = ⁢ - } - } - - return best_record; - } - - vec3_t c_legitbot::c_lagcomp::get_backtracked_position( int ent_index ) { - if( !m_data[ ent_index ].size( ) ) return vec3_t( ); - auto lag_record = find_best_record( ent_index ); - - vec3_t last_position{ }; - for( auto& it : util::reverse_iterator( m_data[ ent_index ] ) ) { - if( it.is_valid( ) ) last_position = it.m_position; break; - } - - return lag_record ? lag_record->m_position : last_position; - } - - void c_legitbot::c_lagcomp::store( ) { - for ( int i = 1; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if ( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { - store_player( i ); - } - else { - m_data[ i ].clear( ); - } - } - } - - bool c_legitbot::c_lagcomp::backtrack_entity( int ent_index ) { - if ( !m_cmd ) return false; - - if ( !can_backtrack_entity( ent_index ) ) return false; - - auto best_record = find_best_record( ent_index ); - - if ( best_record ) { - m_cmd->m_tick_count = best_record->m_tickcount; - return true; - } - - return false; - } - - void c_legitbot::c_lagcomp::operator()( user_cmd_t* cmd ) { - if ( !g_settings.legit.enabled( ) || !g_settings.legit.backtracking( ) ) - return; - - m_cmd = cmd; - store( ); - - auto target = g_cheat.m_legitbot.get_aim_target( g_settings.legit.backtracking_fov( ) ); - bool active = false; - - if ( g_settings.legit.activation_type( ) == 0 ) - active = true; - if ( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) - active = true; - - if ( active && target != -1 ) { - backtrack_entity( target ); - } - } -} \ No newline at end of file diff --git a/internal_rewrite/level_init_pre_entity.cpp b/internal_rewrite/level_init_pre_entity.cpp deleted file mode 100644 index c4d8c38..0000000 --- a/internal_rewrite/level_init_pre_entity.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "hooks.hpp" -#include "chams.hpp" -#include "base_cheat.hpp" - -void __fastcall hooks::level_init_pre_entity( void* ecx_, void* edx_, const char* map_name ) { - static auto original_fn = g_csgo.m_chl->get_old_function< decltype( &level_init_pre_entity ) >( 5 ); - - bool has_level_initialized = **( bool** )( ( uintptr_t )original_fn + 8 ); - - // obviously source engine is perfect - // "HACK: Bogus, but the logic is too complicated in the engine" - - if( !has_level_initialized ) { - //g_cheat.m_chams.m_materials.initialize_materials( ); - } - - return original_fn( ecx_, edx_, map_name ); -} \ No newline at end of file diff --git a/internal_rewrite/listener.cpp b/internal_rewrite/listener.cpp deleted file mode 100644 index eb5caf4..0000000 --- a/internal_rewrite/listener.cpp +++ /dev/null @@ -1,239 +0,0 @@ -#include "listener.hpp" -#include "interface.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -#undef PlaySound - -generic_listener_t::generic_listener_t( const char* name, void( *function )( IGameEvent* ) ) : - m_function( function ), m_name( name ) { } - -generic_listener_t::~generic_listener_t( ) { - if( m_registered ) - g_csgo.m_event_mgr( )->RemoveListener( this ); - -} - -void generic_listener_t::init( ) { - g_csgo.m_event_mgr( )->AddListener( this, m_name, false ); - m_registered = true; -} - -namespace listeners -{ - void weapon_fire( IGameEvent* e ) { - if( !g_csgo.m_panic && e ) { - int userid = e->GetInt( xors( "userid" ) ); - if( g_csgo.m_engine( )->GetPlayerForUserID( userid ) == g_csgo.m_engine( )->GetLocalPlayer( ) ) { - auto wep = e->GetString( xors( "weapon" ) ); - - if( !strstr( wep, xors( "knife" ) ) && !strstr( wep, xors( "taser" ) ) && !strstr( wep, xors( "molotov" ) ) && !strstr( wep, xors( "grenade" ) ) && !strstr( wep, xors( "flashbang" ) ) ) { - g_ctx.m_last_shot_ack++; - g_ctx.m_last_shot_ack %= 128; - - auto m_last_shot = g_ctx.m_last_shot_ack; - auto m_shot_data = g_ctx.m_shot_data; - - auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack ]; - if( shot.m_enemy_index && shot.m_resolver_state ) { - //g_cheat.m_ragebot.m_resolver->increment_shots( shot.m_enemy_index ); - } - } - } - } - } - - void bullet_impact( IGameEvent* e ) { - if( !g_csgo.m_panic && e ) { - static float last_time = g_csgo.m_globals->m_curtime; - float x = e->GetFloat( xors( "x" ) ); - float y = e->GetFloat( xors( "y" ) ); - float z = e->GetFloat( xors( "z" ) ); - int user_id = e->GetInt( xors( "userid" ) ); - int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); - - vec3_t impact{ x, y, z }; - if( player_id == g_csgo.m_engine( )->GetLocalPlayer( ) ) { - g_cheat.m_visuals.store_shot( impact, true ); - - if( g_ctx.m_last_shot_ack > g_ctx.m_last_shot ) { - g_ctx.reset_shot_queue( ); - } - - auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack ]; - - if( shot.m_enemy_index && !shot.m_handled ) { - vec3_t ang = math::vector_angles( shot.m_local_pos, impact ); - vec3_t dir = math::angle_vectors( ang ); - //csgo is gay - dir *= 8192.f; - - vec3_t pos = shot.m_local_pos; - - bool intersect = util::intersects_hitbox( pos, dir, shot.m_hitbox.min * 1.05f, shot.m_hitbox.max * 1.05f, shot.m_hitbox.radius * 1.05f ); - - if( !intersect ) { - if( shot.m_enemy_index ) { - g_cheat.m_ragebot.m_resolver->on_missed_spread( shot.m_enemy_index, g_ctx.m_last_shot_ack ); - shot.m_missed = true; - } - } - else { - if( shot.m_resolver_state ) { - //g_cheat.m_ragebot.m_resolver->increment_shots( shot.m_enemy_index ); - } - - shot.m_missed = false; - } - shot.m_handled = true; - } - } - - if( g_settings.visuals.bullet_tracers( ) && last_time != g_csgo.m_globals->m_curtime ) { - g_cheat.m_visuals.store_tracer( player_id, vec3_t( x, y, z ) ); - } - - last_time = g_csgo.m_globals->m_curtime; - } - } - - void player_hurt( IGameEvent* e ) { - if( !g_csgo.m_panic && e ) { - - int user_id = e->GetInt( xors( "userid" ) ); - int attacker = e->GetInt( xors( "attacker" ) ); - int hitgroup = e->GetInt( xors( "hitgroup" ) ); - int dmg = e->GetInt( xors( "dmg_health" ) ); - int hp = e->GetInt( xors( "health" ) ); - int attacker_id = g_csgo.m_engine( )->GetPlayerForUserID( attacker ); - int player_id = g_csgo.m_engine( )->GetPlayerForUserID( user_id ); - - g_cheat.m_visuals.store_ent_dmg( attacker_id, player_id, dmg ); - if( attacker_id == g_csgo.m_engine( )->GetLocalPlayer( ) && user_id != attacker_id ) { - g_cheat.m_visuals.store_hit( ); - - auto& shot = g_ctx.m_shot_data[ g_ctx.m_last_shot_ack % 128 ]; - - if( shot.m_hitgroup == hitgroup && shot.m_resolver_state && !shot.m_missed && hitgroup != HITGROUP_GENERIC ) { - g_cheat.m_ragebot.m_resolver->listener( player_id, g_ctx.m_last_shot_ack ); - } - - if( shot.m_enemy_index && hitgroup != HITGROUP_GENERIC ) { - shot.m_hit = hitgroup; - shot.m_handled = true; - shot.m_logged = false; - shot.m_damage = dmg; - } - else if( g_settings.misc.log_hits( ) ) { - char print_str[ 100 ]; - sprintf_s( print_str, "[\3moneybot\1] hit player in %s for %d", util::hitgroup_to_string( hitgroup ).c_str( ), dmg ); - - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, print_str ); - g_con->game_console_print( "%s\n", print_str ); - } - - if( shot.m_enemy_index ) { - g_cheat.m_visuals.store_hit( &shot ); - //g_cheat.m_visuals.store_shot( shot.m_enemy_pos, true ); - } - } - } - } - - void round_start( IGameEvent* e ) { - g_cheat.m_visuals.on_round_start( ); - - if( g_ctx.run_frame( ) ) { - switch( g_settings.misc.autobuy.main_weapon ) { - case 1: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy g3sg1" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy scar20" ) ); - break; - case 2: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg08" ) ); - break; - case 3: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy awp" ) ); - break; - case 4: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ak47" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy m4a1" ) ); - break; - case 5: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy ssg556" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy aug" ) ); - break; - case 6: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mac10" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy mp9" ) ); - break; - } - - switch( g_settings.misc.autobuy.secondary_weapon ) { - case 1: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy deagle" ) ); - break; - case 2: - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy elite" ) ); - break; - } - - if( g_ctx.m_local->m_iAccount( ) > 1000 ) { - if( g_settings.misc.autobuy.armor( ) ) { - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vest" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy vesthelm" ) ); - } - - if( g_settings.misc.autobuy.zeus( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy taser 34" ) ); - - - if( g_settings.misc.autobuy.defuser( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy defuser" ) ); - - - if( g_settings.misc.autobuy.molly( ) ) { - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy molotov" ) ); - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy incgrenade" ) ); - } - - if( g_settings.misc.autobuy.smoke( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy smokegrenade" ) ); - - - if( g_settings.misc.autobuy.grenade( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy hegrenade" ) ); - - - if( g_settings.misc.autobuy.flash( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); - - - if( g_settings.misc.autobuy.decoy( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy decoy" ) ); - - - if( g_settings.misc.autobuy.flash( ) ) - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "buy flashbang" ) ); - } - } - } - - void molotov_detonate( IGameEvent* e ) { - //1 line pro - float x = e->GetFloat( xors( "x" ) ); - float y = e->GetFloat( xors( "y" ) ); - float z = e->GetFloat( xors( "z" ) ); - if( !( x && y && z ) ) - return; - - vec3_t pos{ x, y, z }; - auto thrower = g_csgo.m_engine( )->GetPlayerForUserID( e->GetInt( xors( "userid" ) ) ); - g_cheat.m_visuals.store_firegrenades( thrower, pos ); - - } - - void player_death( IGameEvent *evt ) { - g_cheat.m_extra.money_talk( evt ); - } -} \ No newline at end of file diff --git a/internal_rewrite/listener.hpp b/internal_rewrite/listener.hpp deleted file mode 100644 index 5e18879..0000000 --- a/internal_rewrite/listener.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include "sdk.hpp" - -struct generic_listener_t : public IGameEventListener2 { - generic_listener_t( const char* event_name, - void( *function )( IGameEvent* ) ); - - generic_listener_t( ) = default; - - ~generic_listener_t( ); - - void init( ); - - void FireGameEvent( IGameEvent* event ) override { m_function( event ); } - int GetEventDebugID( ) override { return 0x2a; } -private: - void( *m_function )( IGameEvent* ); - const char* m_name{ }; - bool m_registered{ }; -}; - -namespace listeners { - extern void bullet_impact( IGameEvent* e ); - extern void player_hurt( IGameEvent* e ); - extern void round_start( IGameEvent* e ); - extern void molotov_detonate( IGameEvent* e ); - extern void weapon_fire( IGameEvent* e ); - extern void player_death( IGameEvent *e ); -} \ No newline at end of file diff --git a/internal_rewrite/lock_cursor.cpp b/internal_rewrite/lock_cursor.cpp deleted file mode 100644 index 6edb52a..0000000 --- a/internal_rewrite/lock_cursor.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "hooks.hpp" - -void __fastcall hooks::lock_cursor( void* ecx_, void* edx_ ) { - if( g_settings.menu.open || g_con->m_open ) { - g_csgo.m_surface( )->UnlockCursor( ); - return; - } - - lock_cursor_o( ecx_, 0 ); -} \ No newline at end of file diff --git a/internal_rewrite/match_framework.h b/internal_rewrite/match_framework.h deleted file mode 100644 index f63efb1..0000000 --- a/internal_rewrite/match_framework.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#pragma once -#include "util.hpp" -#include "KeyValues.hpp" - -class CMatchSessionOnlineHost { -public: - KeyValues* GetSessionSettings( ) { - using fn = KeyValues* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 1 )( this ); - } - void UpdateSessionSettings( KeyValues* packet ) { - util::get_vfunc< 2, void >( this, packet ); - } -}; - -class CMatchFramework { -public: - CMatchSessionOnlineHost* GetMatchSession( ) { - using fn = CMatchSessionOnlineHost* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 13 )( this ); - } -}; diff --git a/internal_rewrite/materialsystem_config.cpp b/internal_rewrite/materialsystem_config.cpp deleted file mode 100644 index 102d09b..0000000 --- a/internal_rewrite/materialsystem_config.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "hooks.hpp" -#include "settings.hpp" - -bool __fastcall hooks::material_system( void* ecx, void* edx, IMaterialSystem_Config_t* config, bool forceupdate ) { - static auto original_fn = material_system_o; - - config->m_fullbright = g_settings.visuals.fullbright( ); - - return original_fn( ecx, edx, config, forceupdate ); -} diff --git a/internal_rewrite/math.cpp b/internal_rewrite/math.cpp deleted file mode 100644 index 79389a9..0000000 --- a/internal_rewrite/math.cpp +++ /dev/null @@ -1,301 +0,0 @@ -#include -#include "math.hpp" -#include "interface.hpp" - -using _m128 = __m128; - -namespace math -{ - uint32_t md5_pseudorandom( uint32_t seed ) { - using fn = uint32_t( __thiscall * )( uint32_t seed ); - - static auto func = pattern::first_code_match< fn >( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 70 6A 58" ) ); - if( !func ) { - return 0; - } - - return func( seed ); - } - - static const __declspec( align( 16 ) ) uint32_t g_simd_component_mask[ 4 ][ 4 ] = { - { INT_MAX, 0, 0, 0 }, - { 0, INT_MAX, 0, 0 }, - { 0, 0, INT_MAX, 0 }, - { 0, 0, 0, INT_MAX } - }; - - void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ) { - //SSE concat transforms - turbo mode engaged - - _m128 last_mask = *( _m128* )( &g_simd_component_mask[ 3 ] ); - _m128 row_a0 = _mm_loadu_ps( in[ 0 ] ); - _m128 row_a1 = _mm_loadu_ps( in[ 1 ] ); - _m128 row_a2 = _mm_loadu_ps( in[ 2 ] ); - - _m128 row_b0 = _mm_loadu_ps( in2[ 0 ] ); - _m128 row_b1 = _mm_loadu_ps( in2[ 1 ] ); - _m128 row_b2 = _mm_loadu_ps( in2[ 2 ] ); - - _m128 a0 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 0, 0, 0, 0 ) ); - _m128 a1 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 1, 1, 1, 1 ) ); - _m128 a2 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 2, 2, 2, 2 ) ); - - _m128 mul00 = _mm_mul_ps( a0, row_b0 ); - _m128 mul01 = _mm_mul_ps( a1, row_b1 ); - _m128 mul02 = _mm_mul_ps( a2, row_b2 ); - _m128 out0 = _mm_add_ps( mul00, _mm_add_ps( mul01, mul02 ) ); - - a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); - a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); - a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); - - _m128 mul10 = _mm_mul_ps( a0, row_b0 ); - _m128 mul11 = _mm_mul_ps( a1, row_b1 ); - _m128 mul12 = _mm_mul_ps( a2, row_b2 ); - _m128 out1 = _mm_add_ps( mul10, _mm_add_ps( mul11, mul12 ) ); - - a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); - a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); - a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); - - _m128 mul20 = _mm_mul_ps( a0, row_b0 ); - _m128 mul21 = _mm_mul_ps( a0, row_b1 ); - _m128 mul22 = _mm_mul_ps( a0, row_b2 ); - _m128 out2 = _mm_add_ps( mul20, _mm_add_ps( mul21, mul22 ) ); - - a0 = _mm_and_ps( row_a0, last_mask ); - a1 = _mm_and_ps( row_a1, last_mask ); - a2 = _mm_and_ps( row_a2, last_mask ); - - out0 = _mm_add_ps( out0, a0 ); - out1 = _mm_add_ps( out1, a1 ); - out2 = _mm_add_ps( out2, a2 ); - - *( _m128* )( out[ 0 ] ) = out0; - *( _m128* )( out[ 1 ] ) = out1; - *( _m128* )( out[ 2 ] ) = out2; - } - - void math::set_matrix_position( vec3_t pos, matrix3x4& matrix ) { - for( size_t i{ }; i < 3; ++i ) { - matrix[ i ][ 3 ] = pos[ i ]; - } - } - - vec3_t math::get_matrix_position( const matrix3x4& src ) { - return vec3_t( src[ 0 ][ 3 ], src[ 1 ][ 3 ], src[ 2 ][ 3 ] ); - } - - void angle_matrix( vec3_t angles, matrix3x4& matrix ) { - float sr, sp, sy, cr, cp, cy; - - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - sr = sinf( angles.z * M_PIRAD ); - cr = cosf( angles.z * M_PIRAD ); - - matrix[ 0 ][ 0 ] = cp * cy; - matrix[ 1 ][ 0 ] = cp * sy; - matrix[ 2 ][ 0 ] = -sp; - - float crcy = cr * cy; - float crsy = cr * sy; - float srcy = sr * cy; - float srsy = sr * sy; - matrix[ 0 ][ 1 ] = sp * srcy - crsy; - matrix[ 1 ][ 1 ] = sp * srsy + crcy; - matrix[ 2 ][ 1 ] = sr * cp; - - matrix[ 0 ][ 2 ] = ( sp*crcy + srsy ); - matrix[ 1 ][ 2 ] = ( sp*crsy - srcy ); - matrix[ 2 ][ 2 ] = cr * cp; - - matrix[ 0 ][ 3 ] = 0.f; - matrix[ 1 ][ 3 ] = 0.f; - matrix[ 2 ][ 3 ] = 0.f; - } - - void angle_imatrix( vec3_t angles, matrix3x4& matrix ) { - float sr, sp, sy, cr, cp, cy; - - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - sr = sinf( angles.z * M_PIRAD ); - cr = cosf( angles.z * M_PIRAD ); - - matrix[ 0 ][ 0 ] = cp * cy; - matrix[ 0 ][ 1 ] = cp * sy; - matrix[ 0 ][ 2 ] = -sp; - matrix[ 1 ][ 0 ] = sr * sp*cy + cr * -sy; - matrix[ 1 ][ 1 ] = sr * sp*sy + cr * cy; - matrix[ 1 ][ 2 ] = sr * cp; - matrix[ 2 ][ 0 ] = ( cr*sp*cy + -sr * -sy ); - matrix[ 2 ][ 1 ] = ( cr*sp*sy + -sr * cy ); - matrix[ 2 ][ 2 ] = cr * cp; - matrix[ 0 ][ 3 ] = 0.f; - matrix[ 1 ][ 3 ] = 0.f; - matrix[ 2 ][ 3 ] = 0.f; - } - - void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ) { - angle_matrix( angles, matrix ); - set_matrix_position( origin, matrix ); - } - - vec3_t matrix_angles( const matrix3x4& matrix ) { - //thx strackoverflow - vec3_t angles; - float forward[ 3 ]; - float left[ 3 ]; - float up[ 3 ]; - - forward[ 0 ] = matrix[ 0 ][ 0 ]; - forward[ 1 ] = matrix[ 1 ][ 0 ]; - forward[ 2 ] = matrix[ 2 ][ 0 ]; - left[ 0 ] = matrix[ 0 ][ 1 ]; - left[ 1 ] = matrix[ 1 ][ 1 ]; - left[ 2 ] = matrix[ 2 ][ 1 ]; - up[ 2 ] = matrix[ 2 ][ 2 ]; - - float xy_dist = sqrtf( forward[ 0 ] * forward[ 0 ] + forward[ 1 ] * forward[ 1 ] ); - - if( xy_dist > 0.001f ) { - angles.y = RAD2DEG( atan2f( forward[ 1 ], forward[ 0 ] ) ); - angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); - angles.z = RAD2DEG( atan2f( left[ 2 ], up[ 2 ] ) ); - } - else { - angles.y = RAD2DEG( atan2f( -left[ 0 ], left[ 1 ] ) ); - angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); - - angles.z = 0; - } - - return angles; - } - - void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ) { - angles.y += degrees; - angles.clamp( ); - - vec3_t rotated( 0, degrees, 0 ); - matrix3x4 rotated_matrix; - angle_matrix( rotated, rotated_matrix ); - - vec3_t delta = get_matrix_position( matrix ) - origin; - vec3_t out = vector_transform( delta, rotated_matrix ); - - matrix3x4 bone_rotation, matrix_out; - memcpy( &bone_rotation, &matrix, sizeof( matrix3x4 ) ); - - set_matrix_position( vec3_t( ), bone_rotation ); - concat_transforms( rotated_matrix, bone_rotation, matrix_out ); - auto angles_out = matrix_angles( matrix_out ); - angle_matrix( angles_out, matrix, out ); - } - - float approach_angle( float to, float from, float speed ) { - float delta = std::remainderf( to - from, 360.f ); - - if( delta > speed ) - from += speed; - else if( delta < -speed ) - from -= speed; - else from = to; - - return std::clamp( from, -180.f, 180.f ); - } - - float snap_yaw( float value ) { - //this is actually what the code looks like in the game btw - float sign = 1.0f; - if( value < 0.0f ) { - sign = -1.0f; - value = -value; - } - - if( value < 23.0f ) - value = 0.0f; - else if( value < 67.0f ) - value = 45.0f; - else if( value < 113.0f ) - value = 90.0f; - else if( value < 157 ) - value = 135.0f; - else - value = 180.0f; - - return ( value * sign ); - } - - float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ) { - vec3_t u = s2 - s1; - vec3_t v = k2 - k1; - vec3_t w = s1 - k1; - float a = u.dot( u ); - float b = u.dot( v ); - float c = v.dot( v ); - float d = u.dot( w ); - float e = v.dot( w ); - float D = a*c - b*b; - float sc, sN, sD = D; - float tc, tN, tD = D; - - if( D < SMALL_NUM ) { - sN = 0.0f; - sD = 1.0f; - tN = e; - tD = c; - } - else { - sN = ( b*e - c*d ); - tN = ( a*e - b*d ); - if( sN < 0.0f ) { - sN = 0.0f; - tN = e; - tD = c; - } - else if( sN > sD ) { - sN = sD; - tN = e + b; - tD = c; - } - } - - if( tN < 0.0f ) { - tN = 0.0; - - if( -d < 0.0f ) - sN = 0.0; - else if( -d > a ) - sN = sD; - else { - sN = -d; - sD = a; - } - } - else if( tN > tD ) { - tN = tD; - - if( ( -d + b ) < 0.0f ) - sN = 0; - else if( ( -d + b ) > a ) - sN = sD; - else { - sN = ( -d + b ); - sD = a; - } - } - - sc = ( abs( sN ) < SMALL_NUM ? 0.0f : sN / sD ); - tc = ( abs( tN ) < SMALL_NUM ? 0.0f : tN / tD ); - - vec3_t dP = w + ( u * sc ) - ( v * tc ); - - return dP.length(); - } -} \ No newline at end of file diff --git a/internal_rewrite/math.hpp b/internal_rewrite/math.hpp deleted file mode 100644 index b965600..0000000 --- a/internal_rewrite/math.hpp +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include -#include "util.hpp" -#include "pattern.hpp" -#include "sdk.hpp" - -static constexpr long double M_PI = 3.14159265358979323846f; -static constexpr long double M_RADPI = 57.295779513082f; -static constexpr long double M_PIRAD = 0.01745329251f; -static constexpr float SMALL_NUM = 0.00000001f; -static constexpr float M_PI_F = ( ( float )( M_PI ) ); -__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } -__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } - -namespace { - //make a random generator and seed it with a p random number - static std::random_device rd; - static std::mt19937 gen( rd( ) ); -} - -NAMESPACE_REGION( math ) - -#undef min -#undef max - -template < typename t > -t min( const t& t1, const t& t2 ) { - return t1 < t2 ? t1 : t2; -} - -template < typename t, typename... ts_ > -t min( const t& t1, const t& t2, ts_&&... ts ) { - return t1 < t2 ? - min( t1, std::forward< ts_ >( ts )... ) : - min( t2, std::forward< ts_ >( ts )... ); -} - -template < typename t > -t max( const t& t1, const t& t2 ) { - return t1 > t2 ? t1 : t2; -} - -template < typename t, typename... ts_ > -t max( const t& t1, const t& t2, ts_&&... ts ) { - return t1 > t2 ? - max( t1, std::forward< ts_ >( ts )... ) : - max( t2, std::forward< ts_ >( ts )... ); -} - -template < typename t > -t lerp( const t& t1, const t& t2, float progress ) { - return t1 + ( t2 - t1 ) * progress; -} - -// todo - dex; make 2 random generator funcs here, this one only works for floats normally - -template < typename t > -__forceinline t random_number( t min, t max ) { - if constexpr( !std::is_integral_v< t > ) { - std::uniform_real_distribution< t > dist( min, max ); - return dist( gen ); - } - else { - std::uniform_int_distribution< t > dist( min, max ); - return dist( gen ); - } -} - -__forceinline vec3_t get_rotated_pos( vec3_t start, float rotation, float distance ) { - float rad = DEG2RAD( rotation ); - start.x += cos( rad ) * distance; - start.y += sin( rad ) * distance; - - return start; -} - -__forceinline vec3_t vector_angles( const vec3_t& start, const vec3_t& end ) { - vec3_t delta = end - start; - - float magnitude = sqrtf( delta.x * delta.x + delta.y * delta.y ); - float pitch = atan2f( -delta.z, magnitude ) * M_RADPI; - float yaw = atan2f( delta.y, delta.x ) * M_RADPI; - - vec3_t angle( pitch, yaw, 0.0f ); - return angle.clamp( ); -} - - -__forceinline vec3_t vector_angles( const vec3_t& v ) { - float magnitude = sqrtf( v.x * v.x + v.y * v.y ); - float pitch = atan2f( -v.z, magnitude ) * M_RADPI; - float yaw = atan2f( v.y, v.x ) * M_RADPI; - - vec3_t angle( pitch, yaw, 0.0f ); - return angle; -} - -__forceinline vec3_t angle_vectors( const vec3_t& angles ) { - float sp, sy, cp, cy; - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - - return vec3_t{ cp * cy, cp * sy, -sp }; -} - -__forceinline void angle_vectors( const vec3_t& angles, vec3_t* forward, vec3_t* right, vec3_t* up ) { - float sr, sp, sy, cr, cp, cy; - - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - sr = sinf( angles.z * M_PIRAD ); - cr = cosf( angles.z * M_PIRAD ); - - if ( forward ) { - forward->x = cp * cy; - forward->y = cp * sy; - forward->z = -sp; - } - - if ( right ) { - right->x = -1 * sr * sp * cy + -1 * cr * -sy; - right->y = -1 * sr * sp * sy + -1 * cr * cy; - right->z = -1 * sr * cp; - } - - if ( up ) { - up->x = cr * sp * cy + -sr * -sy; - up->y = cr * sp * sy + -sr * cy; - up->z = cr * cp; - } -} - -__forceinline float find_closest_step( float angle, float step ) { - int steps = ( int )( angle / step + 0.5f ); - - return steps * step; -} - -__forceinline vec3_t vector_transform( const vec3_t& in, const matrix3x4& matrix ) { - vec3_t out; - for ( int i{ }; i < 3; i++ ) - out[ i ] = in.dot( ( const vec3_t& )matrix[ i ] ) + matrix[ i ][ 3 ]; - - return out; -} - -extern void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ); -extern void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ); -extern void set_matrix_position( vec3_t pos, matrix3x4& src ); -extern vec3_t get_matrix_position( const matrix3x4& pos ); -extern vec3_t matrix_angles( const matrix3x4& matrix ); -extern void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ); -extern void angle_imatrix( vec3_t angles, matrix3x4& matrix ); -extern void angle_matrix( vec3_t angles, matrix3x4& matrix ); -extern float approach_angle( float to, float from, float speed ); -extern float snap_yaw( float value ); -extern uint32_t md5_pseudorandom( uint32_t seed ); -extern float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ); - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/mem.hpp b/internal_rewrite/mem.hpp deleted file mode 100644 index 37db3ad..0000000 --- a/internal_rewrite/mem.hpp +++ /dev/null @@ -1,66 +0,0 @@ -#pragma once -#include -#include "util.hpp" - -#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) - -class stack_t { - uintptr_t m_ptr; - -public: - __forceinline stack_t( ) : m_ptr( get_baseptr( ) ) { } - - __forceinline stack_t( uintptr_t ptr ) : m_ptr( ptr ) { } - - template < typename t = uintptr_t > - __forceinline t get( ) { - return ( t )m_ptr; - } - - template < typename t = uintptr_t > - __forceinline t return_address( ) { - return *( t* )( m_ptr + sizeof( void* ) ); - } - - template < typename t = uintptr_t > - __forceinline t address_of_return_address( ) { - return ( t )( m_ptr + sizeof( uintptr_t ) ); - } - - __forceinline stack_t& next( ) { - return *( stack_t* )( m_ptr ); - } - - template < typename t = uintptr_t > - __forceinline t local( size_t at ) { - return ( t )( m_ptr - at ); - } - - template < typename t = uintptr_t > - __forceinline t arg( size_t at ) { - return ( t )( m_ptr + at ); - } -}; - -namespace util { - template < typename t = uint8_t > - __forceinline t* memcpy( t* dst, t* src, size_t size = sizeof( t ) ) { - __movsb( - ( uint8_t* )dst, - ( uint8_t* )src, - size - ); - - return dst; - } - - __forceinline void* memset( uint8_t* dst, uint8_t val, size_t size ) { - __stosb( - dst, - val, - size - ); - - return dst; - } -} \ No newline at end of file diff --git a/internal_rewrite/modules.hpp b/internal_rewrite/modules.hpp deleted file mode 100644 index 6e78bf3..0000000 --- a/internal_rewrite/modules.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once -#include - -struct patterns_t -{ - uint32_t beam_ptr; // B9 ? ? ? ? A1 ? ? ? ? FF 10 A1 ? ? ? ? B9 - uint32_t move_helper; // 8B 0D ? ? ? ? 8B 46 08 68 - uint32_t calc_abs_velocity; // 55 8B EC 83 E4 F8 83 EC 1C 53 56 57 8B F9 F7 87 - uint32_t animstate_update; // 55 8B EC 83 E4 F8 83 EC 18 56 57 8B F9 F3 0F 11 54 24 - uint32_t draw_small_entities_retaddr; // FF 90 ? ? ? ? FF 15 ? ? ? ? 84 C0 74 28 - uint32_t is_breakable_ptr; // 55 8B EC 51 56 8B F1 85 F6 74 68 83 BE - uint32_t set_abs_angles; // 55 8B EC 83 E4 F8 83 EC 64 53 56 57 8B F1 E8 - uint32_t set_abs_origin; // 55 8B EC 83 E4 F8 51 53 56 57 8B F1 - uint32_t glow_manager; // 0F 11 05 00 00 00 00 83 C8 01 - uint32_t smoke_count; // 55 8B EC 83 EC 08 8B 15 ? ? ? ? 0F 57 C0 - uint32_t in_prediction_retaddr; // 84 C0 75 08 57 8B CE E8 ? ? ? ? 8B 06 - uint32_t net_update_retaddr; // 5F 5E 5D C2 04 00 83 3D ? ? ? ? ? -}; - - -struct header_t { - uint8_t xor_key{ }; - - char username[ 32 ]{ }; - - uintptr_t client_panorama{ }; - uintptr_t vguimatsurface{ }; - uintptr_t shaderapidx9{ }; - uintptr_t vstdlib{ }; - uintptr_t steam_api{ }; - - patterns_t patterns{ }; -}; - -extern header_t g_header; \ No newline at end of file diff --git a/internal_rewrite/movement.cpp b/internal_rewrite/movement.cpp deleted file mode 100644 index 3793e1b..0000000 --- a/internal_rewrite/movement.cpp +++ /dev/null @@ -1,345 +0,0 @@ -#include "movement.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "context.hpp" - -#include -#include "base_cheat.hpp" -#include "input_system.hpp" -#include "renderer.hpp" - -NAMESPACE_REGION( features ) - -float get_ideal_strafe_step( float speed ) { - static auto* sv_airaccelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); - float airaccel = std::min< float >( sv_airaccelerate->get_float( ), 30.f ); - - return RAD2DEG( std::asinf( 30.f / speed ) ) * 0.5f; -} - -void rotate_movement( user_cmd_t* cmd, float rotation ) { - rotation = rotation * M_PIRAD; - - float cos_rot = cos( rotation ); - float sin_rot = sin( rotation ); - - float new_forwardmove = ( cos_rot * cmd->m_forwardmove ) - ( sin_rot * cmd->m_sidemove ); - float new_sidemove = ( sin_rot * cmd->m_forwardmove ) + ( cos_rot * cmd->m_sidemove ); - - cmd->m_forwardmove = new_forwardmove; - cmd->m_sidemove = new_sidemove; -} - -void c_movement::bhop( ) { - if ( !g_settings.misc.bunny_hop ) - return; - - if ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || - g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) - return; - - //jump like you nohat - if ( m_ucmd->m_buttons & IN_JUMP && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - m_ucmd->m_buttons &= ~IN_JUMP; - } -} - -void c_movement::auto_strafer( ) { - if( !g_settings.misc.auto_strafe ) - return; - - vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); - float speed = velocity.length2d( ); - - bool use_original = !g_settings.rage.enabled && !g_settings.rage.anti_aim; - - auto cmd = use_original ? m_ucmd : g_ctx.get_last_cmd( ); - - auto on_ground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - if( cmd && ( m_ucmd->m_buttons & IN_JUMP ) && ( speed > 1.0f || g_settings.misc.air_duck( ) ) && !on_ground ) { - if( !cmd->m_forwardmove && !cmd->m_sidemove ) { - if( !cmd->m_mousedx ) { - float ideal_rotation = std::min( RAD2DEG( std::asinf( 30.f / std::max( speed, FLT_EPSILON ) ) ) * 0.5f, 45.f ); - - if( ( cmd->m_cmd_nr % 2 ) ) - ideal_rotation *= -1; - - cmd->m_sidemove = ( cmd->m_cmd_nr % 2 ) ? 450.f : -450.f; - cmd->m_forwardmove = 0; - - rotate_movement( cmd, ideal_rotation ); - } - else { - cmd->m_sidemove = m_ucmd->m_mousedx < 0.f ? -450.f : 450.f; - } - } - else if( g_settings.misc.auto_strafe == 2 ) { - if( !cmd->m_mousedx ) { - float ideal_rotation = std::min( RAD2DEG( std::asinf( 30.f / std::max( speed, FLT_EPSILON ) ) ) * 0.5f, 45.f ); - - float move_yaw = math::vector_angles( vec3_t( ), vec3_t( cmd->m_forwardmove, cmd->m_sidemove, 0.f ) ).y; - float vel_yaw = math::vector_angles( vec3_t( ), velocity ).y; - - float velocity_delta = std::remainderf( g_csgo.m_engine( )->GetViewAngles( ).y - vel_yaw, 360.f ); - - float move_delta = std::remainderf( move_yaw - velocity_delta, 360.f ); - float ideal_yaw = math::approach_angle( move_yaw, velocity_delta, ideal_rotation ); - - float delta_yaw = std::remainderf( move_yaw - ideal_yaw, 360.f ); - - if( std::abs( delta_yaw ) > ideal_rotation ) - ideal_rotation = 0.f; - else if( ( cmd->m_cmd_nr % 2 ) ) - ideal_rotation *= -1; - - cmd->m_sidemove = ( cmd->m_cmd_nr % 2 ) ? 450.f : -450.f; - cmd->m_forwardmove = 0; - - rotate_movement( cmd, std::remainderf( ideal_yaw + ideal_rotation, 360.f ) ); - } - else { - float move_yaw = math::vector_angles( vec3_t( ), vec3_t( cmd->m_forwardmove, cmd->m_sidemove, 0.f ) ).y; - - float rotation = cmd->m_mousedx < 0.f ? -90.f : 90.f; - - cmd->m_forwardmove = 450.f; - cmd->m_sidemove = 0.f; - - rotate_movement( cmd, move_yaw + rotation ); - } - } - } -} - - -void c_movement::edge_jump( ) { - if ( !g_settings.misc.edge_jump ) - return; - - if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.edge_jump_key( ) ) ) - return; - - //needs key check here so its not always on - //what?? - bool pre_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - bool post_onground = g_cheat.m_prediction.get_predicted_flags( ) & FL_ONGROUND; - - if ( pre_onground && !post_onground ) { - m_ucmd->m_buttons |= IN_JUMP; - } -} - -void c_movement::air_duck( ) { - if( !g_settings.misc.air_duck ) - return; - - if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) - m_ucmd->m_buttons |= IN_DUCK; -} - -void c_movement::auto_jumpbug( ) { - if ( !g_settings.misc.auto_jumpbug( ) ) - return; - - if ( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.auto_jumpbug_key( ) ) ) - return; - - static bool jumped = false; - static bool jump_next = false; - - vec3_t origin = g_ctx.m_local->m_vecOrigin( ); - origin += g_ctx.m_local->m_vecVelocity( ) * TICK_INTERVAL( ); - - Ray_t ray; - ray.Init( origin, origin + vec3_t( 0.f, 0.f, 4.f ) ); - - CTraceFilter f; - f.pSkip = g_ctx.m_local; - - CGameTrace tr; - g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); - - bool unduck = tr.fraction != 1.0f; - - if( unduck ) { - m_ucmd->m_buttons &= ~IN_DUCK; - m_ucmd->m_buttons |= IN_JUMP; - } - else { - m_ucmd->m_buttons |= IN_DUCK; - m_ucmd->m_buttons &= ~IN_JUMP; - } -} - -void c_movement::jump_stats( ) { - if( !g_settings.misc.show_jump_stats ) return; - - static auto sv_airaccelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); - static bool was_onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - static vec3_t last_origin{ }; - static float ground_vel{ }; - static float last_jump_max_speed{ }; - static float last_height{ }; - static float last_dist{ }; - - const float lj_threshold = sv_airaccelerate->get_float( ) < 15.f ? 190.f : 240.f; - - bool on_ground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - bool ducking = g_ctx.m_local->m_fFlags( ) & FL_DUCKING; - - char jump_string[ 250 ] = { }; - - if( on_ground ) { - int vertical = 0; - - if( !was_onground ) { - vec3_t cur_origin = g_ctx.m_local->m_vecOrigin( ); - last_dist = cur_origin.dist_to( last_origin ); - - if( std::abs( cur_origin.z - last_origin.z ) >= ( ducking ? 10.f : 5.f ) ) { - vertical = cur_origin.z > last_origin.z ? 1 : -1; - } - - if( ground_vel > 200.f && last_jump_max_speed > 260.f && std::abs( last_height ) > 20.f ) { - if( vertical ) { - strenc::w_sprintf_s( jump_string, 250, xors( "[\3JUMP STAT\1] pre: %0.2f | max vel: %0.2f | height: %0.2f | duck: %d | \2%s\n" ), - ground_vel, last_jump_max_speed, last_height, ducking, vertical == 1 ? xors( "vertical" ) : xors( "dropjump" ) ); - } - else { - bool is_lj = last_dist > lj_threshold; - strenc::w_sprintf_s( jump_string, 250, xors( "[\3JUMP STAT\1]: pre: %0.2f | max vel: %0.2f | height: %0.2f | duck: %d | dist: %c%0.2f\n" ), - ground_vel, last_jump_max_speed, last_height, ducking, is_lj ? 4 : 1, last_dist ); - } - - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, jump_string ); - } - } - last_origin = g_ctx.m_local->m_vecOrigin( ); - last_jump_max_speed = 0.f; - last_height = 0.f; - ground_vel = g_ctx.m_local->m_vecVelocity( ).length2d( ); - - was_onground = true; - } - else { - was_onground = false; - float vel = g_ctx.m_local->m_vecVelocity( ).length2d( ); - if( vel > last_jump_max_speed ) { - last_jump_max_speed = vel; - } - float delta = g_ctx.m_local->m_vecOrigin( ).z - last_origin.z; - if( std::abs( delta ) > std::abs( last_height ) ) { - last_height = delta; - } - } -} - -//fuck hardcode -const vec3_t mins( -26.f, -26.f, 0 ); -const vec3_t maxs( 26.f, 26.f, 44.f ); - -constexpr int TRACE_STEP_MAX = 45; -bool trace_ideal_step( float step, float speed, vec3_t velocity, vec3_t start_pos ) { - vec3_t direction = math::vector_angles( vec3_t( ), velocity ); - float wish_step = direction.y + step; - - vec3_t origin = start_pos; - - vec3_t start = origin; - vec3_t trace_step = math::angle_vectors( vec3_t( 0, wish_step, 0 ) ) * velocity.length2d( ) * TICK_INTERVAL( ); - - vec3_t pos = start + trace_step; - - CGameTrace tr; - CTraceFilter filter; - filter.pSkip = g_ctx.m_local; - - for( size_t i{ }; i <= 1 / TICK_INTERVAL( ); ++i ) { - start = pos; - trace_step = math::angle_vectors( vec3_t( 0, wish_step += step, 0 ) ) * velocity.length2d( ) * TICK_INTERVAL( ); - pos += trace_step; - - Ray_t ray; - ray.Init( start, pos, mins, maxs ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &tr ); - - if( !tr.DidHit( ) ) { - if( i == TRACE_STEP_MAX ) { - return true; - } - continue; - } - - break; - } - - return false; -} - -float c_movement::get_best_strafe_angle( ) { - vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); - float ideal_step = get_ideal_strafe_step( velocity.length2d( ) ) * 0.8f; - - float step = ideal_step; - vec3_t start = g_ctx.m_local->m_vecOrigin( ); - - for( size_t i{ }; i < 9; ++i ) { - if( trace_ideal_step( step, velocity.length2d( ), velocity, start ) ) { - vec3_t direction = math::vector_angles( vec3_t( ), velocity ); - return direction.y + step; - } - - step -= step * 0.2f; - } - - step = ideal_step; - for( size_t i{ }; i < velocity.length2d( ) * 0.015f; ++i ) { - step += step * 0.2f; - if( trace_ideal_step( step, velocity.length2d( ), velocity, start ) ) { - vec3_t direction = math::vector_angles( vec3_t( ), velocity ); - return direction.y + step; - } - } - - return math::vector_angles( vec3_t( ), velocity ).y; -} - -void c_movement::circle_strafe( ) { - if( g_settings.misc.circle_strafe ) { - if( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) - return; - - static bool can_finish = true; - auto cmd = g_ctx.get_last_cmd( ); - if( g_input.is_key_pressed( g_settings.misc.circle_strafe_key ) || !can_finish ) { - m_ucmd->m_buttons |= IN_JUMP; - cmd->m_forwardmove = 450.f; - - float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); - if( speed > 1.f ) { - can_finish = false; - float angle = get_best_strafe_angle( ); - - float delta = std::remainderf( m_ucmd->m_viewangles.y - angle, 360.f ); - - cmd->m_forwardmove = 5850.f / speed; - cmd->m_sidemove = -450.f; - rotate_movement( cmd, delta ); - - vec3_t current_view; - g_csgo.m_engine( )->GetViewAngles( current_view ); - float view_delta = std::remainderf( current_view.y - angle, 360.f ); - - if( std::fabs( view_delta ) < 10.0f || speed < 250.f ) { - can_finish = true; - } - } - else { - can_finish = true; - } - } - } -} - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/movement.hpp b/internal_rewrite/movement.hpp deleted file mode 100644 index 0c0b1a6..0000000 --- a/internal_rewrite/movement.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -#include "util.hpp" - -//forward declarations -class user_cmd_t; - -NAMESPACE_REGION( features ) - -class c_movement { - user_cmd_t* m_ucmd{ }; - bool m_direction{ }; - - void bhop( ); - void auto_strafer( ); - - void edge_jump( ); - void auto_jumpbug( ); - void jump_stats( ); - - bool get_best_direction( float ideal_step, float left, float right, float weight ); - float get_best_strafe_step( float speed, vec3_t direction ); - float get_best_strafe_angle( ); - void circle_strafe( ); - void air_duck( ); - -public: - void operator()( user_cmd_t* ucmd ) { - m_ucmd = ucmd; - auto_strafer( ); - circle_strafe( ); - bhop( ); - edge_jump( ); - auto_jumpbug( ); - jump_stats( ); - air_duck( ); - } -}; - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/movement_recorder.cpp b/internal_rewrite/movement_recorder.cpp deleted file mode 100644 index 6e9245c..0000000 --- a/internal_rewrite/movement_recorder.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "movement_recorder.hpp" -#include "input_system.hpp" -#include "settings.hpp" -#include "interface.hpp" - -namespace features -{ - void c_move_recorder::operator()( user_cmd_t* cmd ) { - if( !g_settings.misc.recorder_enable ) - return; - - if( g_input.is_key_pressed( g_settings.misc.recording_start_key( ) ) ) - start_recording( ); - - if( g_input.is_key_pressed( g_settings.misc.recording_stop_key( ) ) ) - stop_recording( ); - - if( m_recording ) { - record_cmd( cmd ); - } - - if( m_playing ) { - if( m_move_data.empty( ) ) { - m_playing = false; - } - else if( ++m_record_index >= m_move_data.size( ) ) { - m_playing = false; - } - else { - auto& old_cmd = m_move_data.at( m_record_index ); - - if( g_settings.misc.recording_show_angles == 1 && ( old_cmd.m_buttons & IN_ATTACK ) || - g_settings.misc.recording_show_angles == 2 ) { - g_csgo.m_engine( )->SetViewAngles( old_cmd.m_viewangles ); - } - - cmd->m_buttons = old_cmd.m_buttons; - cmd->m_aimdirection = old_cmd.m_aimdirection; - cmd->m_forwardmove = old_cmd.m_forwardmove; - cmd->m_impulse = old_cmd.m_impulse; - cmd->m_mousedx = old_cmd.m_mousedx; - cmd->m_mousedy = old_cmd.m_mousedy; - cmd->m_sidemove = old_cmd.m_sidemove; - cmd->m_upmove = old_cmd.m_upmove; - cmd->m_viewangles = old_cmd.m_viewangles; - cmd->m_weaponselect = old_cmd.m_weaponselect; - cmd->m_weaponsubtype = old_cmd.m_weaponsubtype; - } - } - else { - m_record_index = 0; - } - } - - void c_move_recorder::record_cmd( user_cmd_t* cmd ) { - m_move_data.push_back( *cmd ); - } - - void c_move_recorder::start_recording( ) { - m_recording = true; - } - - void c_move_recorder::stop_recording( ) { - m_recording = false; - } - - void c_move_recorder::play_back( ) { - m_recording = false; - m_playing = true; - } - - void c_move_recorder::stop_playback( ) { - m_playing = false; - } - - void c_move_recorder::clear_recording( ) { - m_move_data.clear( ); - } -} \ No newline at end of file diff --git a/internal_rewrite/movement_recorder.hpp b/internal_rewrite/movement_recorder.hpp deleted file mode 100644 index 03bcf8c..0000000 --- a/internal_rewrite/movement_recorder.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include "sdk.hpp" -#include "vector.hpp" - -namespace features -{ - class c_move_recorder { - public: - void play_back( ); - void stop_playback( ); - void clear_recording( ); - - bool is_recording( ) const { return m_recording; } - bool is_playing( ) const { return m_playing; } - int get_record_count( ) const { return m_move_data.size( ); } - auto get_current_record( ) const { return m_record_index; } - - void operator()( user_cmd_t* ); - private: - void record_cmd( user_cmd_t* cmd ); - void start_recording( ); - void stop_recording( ); - - bool m_recording = false; - bool m_playing = false; - size_t m_record_index = 0; - std::vector< user_cmd_t > m_move_data; - }; -} \ No newline at end of file diff --git a/internal_rewrite/net_showfragments.cpp b/internal_rewrite/net_showfragments.cpp deleted file mode 100644 index 93e5db0..0000000 --- a/internal_rewrite/net_showfragments.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "hooks.hpp" -#include "mem.hpp" -#include "context.hpp" - -// Index 13 is GetBool, GetInt and GetFloat are inlined by default. -int __fastcall hooks::net_showfragments_get_int( void* ecx_, void* edx_ ) { - static auto old_fn = g_csgo.m_netshowfragments->get_old_function< decltype( &net_showfragments_get_int ) >( 13 ); - - static auto ret_checkreceivinglist = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "FF 50 34 8B 1D ? ? ? ? 85 C0 74 16 FF B6" ), 0x3 ); - static auto ret_readsubchanneldata = pattern::first_code_match( g_csgo.m_engine.dll( ), xors( "FF 50 34 85 C0 74 12 53 FF 75 0C" ), 0x3 ); - - static auto last_fragment = 0; - static auto last_time = 0.f; - - stack_t stack( get_baseptr( ) ); - auto cl = g_csgo.m_global_state->get_client_state( ); - auto nc = cl->m_netchannel; - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - - if ( nci && ( nci->GetLatency( 1 ) > 0.06f ) && g_ctx.m_local ) { - if ( stack.return_address( ) == ret_readsubchanneldata ) { - auto e = ( uint32_t* ) ( nc ); - auto data = &e [ 0x54 ]; - - auto fragment = data [ 0x43 ]; - - if ( fragment == last_fragment ) { - float delta = GetTickCount( ) * 0.001f - last_time; - - if ( delta <= std::max( nci->GetLatency( 1 ), 0.3f ) ) { - ( ( uint32_t* ) data ) [ 0x42 ] = 0; - last_time = GetTickCount( ) * 0.001f; - } - } - } - - if ( stack.return_address( ) == ret_checkreceivinglist ) { - auto e = ( uint32_t* ) ( nc ); - auto data = &e [ 0x54 ]; - - auto fragment = data [ 0x43 ]; - - last_fragment = fragment; - last_time = GetTickCount( ) * 0.001f; - } - } - - return old_fn( ecx_, 0 ); -} \ No newline at end of file diff --git a/internal_rewrite/netvar_proxy.hpp b/internal_rewrite/netvar_proxy.hpp deleted file mode 100644 index 113f212..0000000 --- a/internal_rewrite/netvar_proxy.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#include "Valve/dt_recv.h" - -//dont leave things out of namespaces -namespace hooks -{ - class c_netvar_proxy { - public: - c_netvar_proxy( RecvProp* target_property, RecvVarProxyFn new_proxy ) { - m_target = target_property; - m_original = target_property->m_ProxyFn; - m_target->m_ProxyFn = new_proxy; - } - - c_netvar_proxy( ) = default; - - void init( RecvProp* target, RecvVarProxyFn new_proxy ) { - m_target = target; - m_original = target->m_ProxyFn; - m_target->m_ProxyFn = new_proxy; - } - - ~c_netvar_proxy( ) { - if( !m_target ) return; - m_target->m_ProxyFn = m_original; - } - - RecvVarProxyFn get_old_function( ) const { - return m_original; - } - - private: - RecvProp* m_target; - RecvVarProxyFn m_original; - }; -} \ No newline at end of file diff --git a/internal_rewrite/netvars.cpp b/internal_rewrite/netvars.cpp deleted file mode 100644 index eb2d8fd..0000000 --- a/internal_rewrite/netvars.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "netvars.hpp" -#include "interface.hpp" - -factory::c_netvars g_netvars; - -NAMESPACE_REGION( factory ) - -void c_netvars::init( ) { - for ( auto client_class = g_csgo.m_chl( )->GetAllClasses( ); - !!client_class; - client_class = client_class->m_next - ) { - auto table = client_class->m_rt_table; - m_tables.push_back( table ); - } -} - -RecvTable* c_netvars::get_table( hash_t hash ) const { - if ( m_tables.empty( ) ) return nullptr; - - for ( auto& table : m_tables ) { - if ( !table ) continue; - - if ( hash == hash::fnv1a( table->m_pNetTableName ) ) { - return table; - } - } - - return nullptr; -} - -//iterating this too much results in a stack overflow, so thats cool -RecvProp* c_netvars::get_prop( hash_t data, hash_t name ) const { - RecvProp* prop{ }; - RecvTable* child{ }; - - auto table = get_table( data ); - if( !table ) return nullptr; - - for( int i{ }; i < table->m_nProps; ++i ) { - prop = &table->m_pProps[ i ]; - child = prop->GetDataTable( ); - - if( child && child->m_nProps ) { - auto tmp = get_prop( hash::fnv1a( child->m_pNetTableName ), name ); - if( tmp ) return tmp; - } - - if( name != hash::fnv1a( prop->m_pVarName ) ) - continue; - - return prop; - } - - return nullptr; -} - -std::ptrdiff_t c_netvars::get_entry( hash_t name, RecvTable* table ) const { - std::ptrdiff_t ret{ }; - RecvProp* prop; - RecvTable* child; - - for ( int i{ }; i < table->m_nProps; ++i ) { - prop = &table->m_pProps[ i ]; - child = prop->GetDataTable( ); - - if ( child && child->m_nProps ) { - auto tmp = get_entry( name, child ); - if ( tmp ) ret += prop->GetOffset( ) + tmp; - } - - if ( name != hash::fnv1a( prop->m_pVarName ) ) - continue; - - return prop->GetOffset( ) + ret; - } - - return ret; -} - -std::ptrdiff_t c_netvars::get_netvar( hash_t data, hash_t name ) const { - std::ptrdiff_t ret{ }; - auto table = get_table( data ); - if ( !table ) return 0; - - ret = get_entry( name, table ); -#ifdef DEBUG - printf( "%s:\t\t 0x%05x\n", name.c_str( ), ret ); -#endif - return ret; -} - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/netvars.hpp b/internal_rewrite/netvars.hpp deleted file mode 100644 index ca50ed9..0000000 --- a/internal_rewrite/netvars.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once -#include - -#include "Valve\dt_recv.h" -#include "util.hpp" -#include "fnv.hpp" - -class RecvTable; - -#define NETVAR( funcname, name, table, extra, type ) \ -__forceinline auto& funcname( ) { \ - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ - return get< type >( offset + extra ); \ -} - -#define PNETVAR( funcname, name, table, extra, type ) \ -__forceinline type* funcname( ) { \ - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ - return reinterpret_cast< type* >( uintptr_t( this ) + offset + extra ); \ -} - -#define OFFSET( funcname, offset, type ) \ -__forceinline auto& funcname( ) { \ - return get< type >( offset ); \ -} - -NAMESPACE_REGION( factory ) - -class c_netvars { -public: - void init( ); - //search through the netvar list - std::ptrdiff_t get_netvar( hash_t table, hash_t hash ) const; - RecvProp* get_prop( hash_t table, hash_t name ) const; -public: - std::ptrdiff_t get_entry( hash_t hash, RecvTable* table ) const; - RecvTable* get_table( hash_t hash ) const; -private: - std::vector< RecvTable* > m_tables; -}; - -END_REGION - -extern factory::c_netvars g_netvars; \ No newline at end of file diff --git a/internal_rewrite/on_screen_size_changed.cpp b/internal_rewrite/on_screen_size_changed.cpp deleted file mode 100644 index 731835e..0000000 --- a/internal_rewrite/on_screen_size_changed.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "hooks.hpp" - -void __fastcall hooks::on_screen_size_changed( void* ecx_, void* edx_, int old_w, int old_h ) { - static auto old_fn = on_screen_size_changed_o; - - old_fn( ecx_, nullptr, old_w, old_h ); - - g_fonts.initialize( ); -} \ No newline at end of file diff --git a/internal_rewrite/override_mouse_input.cpp b/internal_rewrite/override_mouse_input.cpp deleted file mode 100644 index 84e3f57..0000000 --- a/internal_rewrite/override_mouse_input.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::override_mouse_input( void* ecx_, void* edx_, float* x, float* y ) { - static auto omi_o = override_mouse_input_o; - omi_o( ecx_, edx_, x, y ); - - if( g_csgo.m_panic ) return; - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { - g_cheat.m_legitbot( x, y ); - } -} \ No newline at end of file diff --git a/internal_rewrite/override_view.cpp b/internal_rewrite/override_view.cpp deleted file mode 100644 index 579f83f..0000000 --- a/internal_rewrite/override_view.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "base_cheat.hpp" -#include "context.hpp" -#include "hooks.hpp" -#include "settings.hpp" -void __fastcall hooks::override_view( void* ecx_, void* edx_, CViewSetup* setup ) { - if( g_csgo.m_panic ) { - return override_view_o( ecx_, nullptr, setup ); - } - - float fov = setup->m_flFov; - if ( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) ) { - if( g_settings.misc.no_zoom ) - setup->m_flFov = g_settings.misc.fov_changer( ); - else - setup->m_flFov = g_settings.misc.fov_changer( ) * ( fov / 90.f ); - } - - g_ctx.m_fov = setup->m_flFov; - - g_cheat.m_extra.thirdperson( ); - - if( g_settings.misc.no_scope && g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) && g_ctx.m_local->m_bIsScoped( ) ) { - int backup = setup->m_iEdgeBlur; - - setup->m_iEdgeBlur = 0; - - override_view_o( ecx_, edx_, setup ); - - setup->m_iEdgeBlur = backup; - - return; - } - - override_view_o( ecx_, nullptr, setup ); -} \ No newline at end of file diff --git a/internal_rewrite/packet_start.cpp b/internal_rewrite/packet_start.cpp deleted file mode 100644 index a5c9db4..0000000 --- a/internal_rewrite/packet_start.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" - -void __fastcall hooks::packet_start( void* ecx, void* edx, int in_seq, int out_ack ) { - if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { - *( int* )( uintptr_t( ecx ) + 0x114 ) = in_seq; - *( int* )( uintptr_t( ecx ) + 0x4cb4 ) = out_ack; - } - - // okay now this is epic - //printf("%08x -> %08x\n", &hooks::packet_start, hooks::packet_start_o); - - for( auto cmd_number = g_ctx.m_cmd_numbers.begin( ); cmd_number != g_ctx.m_cmd_numbers.end( ); ) { - if( *cmd_number == out_ack ) { - auto cl = ( uintptr_t )( ecx ); - - *( int* )( cl + 0x114 ) = in_seq; - *( int* )( cl + 0x4cb4 ) = out_ack; - - g_ctx.m_cmd_numbers.erase( cmd_number ); - return; - } - - cmd_number++; - } -} \ No newline at end of file diff --git a/internal_rewrite/paint_traverse.cpp b/internal_rewrite/paint_traverse.cpp deleted file mode 100644 index 8376cdd..0000000 --- a/internal_rewrite/paint_traverse.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "hooks.hpp" -#include "renderer.hpp" -#include "context.hpp" -#include "console.hpp" -#include "base_cheat.hpp" -#include "math.hpp" -#include "settings.hpp" - -void __fastcall hooks::paint_traverse( void* ecx_, void* edx_, unsigned int panel, bool force_repaint, bool allowforce ) { - if( g_csgo.m_panic ) return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); - if( ecx_ != g_csgo.m_panel.get( ) ) - return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); - - g_csgo.m_main_thread = std::this_thread::get_id( ); - - if( g_settings.legit.enabled ) { - g_settings.rage.enabled( ) = false; - } - - static uint32_t mat_system_top_panel{ }; - if( !mat_system_top_panel ) { - auto panel_name = g_csgo.m_panel( )->GetName( panel ); - auto panel_hash = hash::fnv1a( panel_name ); - if( fnv( "MatSystemTopPanel" ) == panel_hash ) { - mat_system_top_panel = panel; - } - } - - static uint32_t hud_zoom{ }; - if( !hud_zoom ) { - auto panel_name = g_csgo.m_panel( )->GetName( panel ); - auto panel_hash = hash::fnv1a( panel_name ); - if( fnv( "HudZoom" ) == panel_hash ) { - hud_zoom = panel; - } - } - - if( panel && panel == hud_zoom && g_settings.misc.no_scope - && g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - return; - } - - if( panel && panel == mat_system_top_panel ) { - //render your epic 2008 hake esp here - g_renderer.draw_box( 0, 0, 1, 1, clr_t( 0, 0, 0, 1 ) ); - //g_renderer.draw_string( g_fonts.f_12, 100, 200, clr_t( 255, 255, 255, 255 ), "c: %d", g_csgo.m_global_state->get_client_state( )->m_chokedcommands ); - if( !g_settings.misc.hide_from_obs ) - g_cheat.m_visuals( ); - - /*auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - float desired_in_latency = g_settings.misc.net_fakeping_amount * 0.001f; - float latency = nci->GetLatency( 1 ); - - float delta = latency - desired_in_latency; - - g_renderer.draw_string( g_fonts.f_12, 20, 400, clr_t( 255, 255, 255 ), "latency: %f", latency ); - //g_renderer.draw_string( g_fonts.f_12, 20, ) - g_renderer.draw_string( g_fonts.f_12, 20, 410, clr_t( 255, 255, 255 ), "delta: %f", delta ); - }*/ - } - - g_csgo.m_prediction( )->SetLocalViewAngles( g_ctx.m_last_fakeangle ); - return paint_traverse_o( ecx_, 0, panel, force_repaint, allowforce ); -} \ No newline at end of file diff --git a/internal_rewrite/pattern.hpp b/internal_rewrite/pattern.hpp deleted file mode 100644 index 8b4e17e..0000000 --- a/internal_rewrite/pattern.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#pragma warning ( disable : 4018 ) - -namespace pattern -{ - inline bool bin_match( uint8_t* code, uint8_t* pattern, size_t size ) { - for( size_t j = 0; j < size; j++ ) { - if( pattern[ j ] && code[ j ] != pattern[ j ] ) { - return false; - } - } - return true; - } - - template< typename t = uintptr_t > static t first_match( uintptr_t start, std::string sig, size_t len, std::ptrdiff_t offset = 0 ) { - std::istringstream iss( sig ); - std::vector< std::string > tokens{ std::istream_iterator< std::string >{ iss }, std::istream_iterator< std::string >{} }; - std::vector< uint8_t > sig_bytes; - - for( const auto& hex_byte : tokens ) { - sig_bytes.push_back( static_cast< uint8_t >( std::strtoul( hex_byte.c_str( ), nullptr, 16 ) ) ); - } - - if( sig_bytes.empty( ) || sig_bytes.size( ) < 2 ) { - return t{ }; - } - - auto sig_data = sig_bytes.data( ); - auto sig_size = sig_bytes.size( ); - - for( size_t i{ }; i < len; i++ ) { - uint8_t* code_ptr = reinterpret_cast< uint8_t* >( start + i ); - - if( bin_match( code_ptr, sig_data, sig_size ) ) { - return( ( t )( start + i + offset ) ); - } - } - - return t{ }; - } - - //ultimately the function you want to call to sigscan ( ida style ) - template< typename t = uintptr_t > static t first_code_match( HMODULE start, std::string sig, std::ptrdiff_t offset = 0 ) { - auto dos_hdr = reinterpret_cast< PIMAGE_DOS_HEADER >( start ); - - if( !dos_hdr ) return t{ }; - - //DOS header, verifies if module is valid - if( dos_hdr->e_magic != 0x5a4d ) { - return t{ }; - } - - auto nt_hdrs = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< uintptr_t >( dos_hdr ) + dos_hdr->e_lfanew ); - - return first_match< t >( reinterpret_cast< uintptr_t >( dos_hdr ) + nt_hdrs->OptionalHeader.BaseOfCode, sig, nt_hdrs->OptionalHeader.SizeOfCode, offset ); - } -}; \ No newline at end of file diff --git a/internal_rewrite/play_sound.cpp b/internal_rewrite/play_sound.cpp deleted file mode 100644 index 542be24..0000000 --- a/internal_rewrite/play_sound.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -void __fastcall hooks::play_sound( void* ecx_, void*, const char* file ) { -#ifdef HEADER_MODULE - // static auto is_ready = g_header.patterns.is_ready; - static auto is_ready = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 08 56 8B 35 00 00 00 00 57 83 BE" ), 0 ); -#else - static auto is_ready = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 08 56 8B 35 00 00 00 00 57 83 BE" ), 0 ); -#endif - static bool was_played = false; - static float played_tick = 0.f; - - play_sound_o( ecx_, 0, file ); - - if( !g_settings.misc.auto_accept || g_csgo.m_engine( )->IsInGame( ) ) { - was_played = false; - return; - } - - if( strstr( file, xors( "competitive_accept_beep.wav" ) ) && !was_played ) { - was_played = true; - played_tick = GetTickCount( ) * 0.001f + g_settings.misc.auto_accept_delay; - g_cheat.m_extra.server_information( ); - g_cheat.m_visuals.reset_local_dmg( ); - } - - if( was_played && GetTickCount( ) * 0.001f > played_tick ) { - reinterpret_cast< void( __cdecl* )( ) >( is_ready )( ); - was_played = false; - } -} \ No newline at end of file diff --git a/internal_rewrite/player_manager.cpp b/internal_rewrite/player_manager.cpp deleted file mode 100644 index f76b363..0000000 --- a/internal_rewrite/player_manager.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "player_manager.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -namespace features -{ - void c_player_record::update( int ent_index ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - if( !ent ) { clear( ); return; } - - if( ent != m_ent || ent->m_flSimulationTime( ) > g_csgo.m_globals->m_curtime + 1.f ) - clear( ); - - m_ent = ent; - if( !ent->is_valid( ) ) - return; - - update_simtime( ); - update_antiaim( ); - - update_cheater( ); - } - - bool c_player_manager::is_cheater( int ent_index ) { -#ifdef _DEBUG - static con_var< bool > dbg_nocheater{ &data::holder_, fnv( "dbg_nocheater" ) }; - if( dbg_nocheater( ) ) - return true; -#endif - - return m_players[ ent_index ].is_cheater( ); - } - - void c_player_manager::frame_stage_notify( ) { - if( !g_ctx.m_local ) return; - - for( int i{ 1 }; i < 65; ++i ) { - if( i == g_csgo.m_engine( )->GetLocalPlayer( ) ) - continue; - - m_players[ i ].update( i ); - } - } -} \ No newline at end of file diff --git a/internal_rewrite/player_manager.hpp b/internal_rewrite/player_manager.hpp deleted file mode 100644 index 440ddf3..0000000 --- a/internal_rewrite/player_manager.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include "sdk.hpp" - -namespace features -{ - constexpr int CHEATER_SIMTIME_THRESHOLD = 10; - constexpr int CHEATER_AA_THRESHOLD = 50; - constexpr int CHEATER_MAX_DETECTIONS = 200; - - class c_player_record { - float m_last_simtime; - int m_simtime_detections; - int m_aa_detections; - bool m_is_cheater; - - c_base_player* m_ent; - - void clear( ) { - m_last_simtime = { }; - m_simtime_detections = { }; - m_aa_detections = { }; - m_is_cheater = { }; - m_ent = { }; - } - - void update_simtime( ) { - if( !m_ent ) return; - - if( m_ent->m_flSimulationTime( ) == m_last_simtime ) { - m_simtime_detections += 2; - } - else if( m_simtime_detections > 0 ) { - m_simtime_detections--; - } - m_last_simtime = m_ent->m_flSimulationTime( ); - } - - void update_antiaim( ) { - if( !m_ent ) return; - - auto pitch = m_ent->m_angEyeAngles( ).x; - if( pitch > 75.f && m_aa_detections < CHEATER_MAX_DETECTIONS ) { - m_aa_detections++; - } - else if( m_aa_detections > 0 ) { - m_aa_detections--; - } - } - - void update_cheater( ) { - m_is_cheater = ( m_simtime_detections > CHEATER_SIMTIME_THRESHOLD - || m_aa_detections > CHEATER_AA_THRESHOLD ) - && m_simtime_detections; - } - - public: - c_player_record( ) { clear( ); } - bool is_cheater( ) const { return m_is_cheater; } - void update( int ent_index ); - }; - - class c_player_manager { - std::array< c_player_record, 65 > m_players; - public: - void frame_stage_notify( ); - bool is_cheater( int ent_index ); - }; -} \ No newline at end of file diff --git a/internal_rewrite/prediction.cpp b/internal_rewrite/prediction.cpp deleted file mode 100644 index 2f6f606..0000000 --- a/internal_rewrite/prediction.cpp +++ /dev/null @@ -1,627 +0,0 @@ -#include "prediction.hpp" -#include "hooks.hpp" -#include "context.hpp" - -NAMESPACE_REGION( features ) - -void c_prediction::player_data_t::update( int ent_index ) { - auto player = g_csgo.m_entlist( )->GetClientEntity( ent_index ); - if( !player || !player->is_valid( ) || player == g_ctx.m_local ) { - m_valid = false; - return; - } - - float simtime = player->m_flSimulationTime( ); - - if( std::abs( simtime - m_simtime ) ) { - float delta = std::abs( m_simtime - simtime ); - if( !m_valid ) { - m_old_velocity = player->m_vecVelocity( ); - } - else { - m_last_choke = TIME_TO_TICKS( delta ); - m_old_velocity = m_velocity; - m_breaking_lc = player->m_vecOrigin( ).dist_to( m_position ) > 64; - } - - m_velocity = player->get_animdata( ).m_last_velocity; - m_position = player->m_vecOrigin( ); - - m_valid = true; - - if( m_breaking_lc ) - m_records.push_front( { m_velocity, m_last_choke } ); - } - - m_simtime = simtime; - - while( m_records.size( ) > 32 ) - m_records.pop_back( ); -} - -void c_prediction::frame_stage_notify( ) { - for( int i{ 1 }; i < 65; ++i ) { - m_players[ i ].update( i ); - } -} - -int c_prediction::get_predicted_choke( int idx ) { - auto& data = m_players[ idx ]; - - int adaptive_dtc = 0; - int static_dtc = 0; - int min_choke = 16; - int max_choke = 0; - - if( !data.m_records.empty( ) ) { - int prev_choke = data.m_last_choke; - float last_dist = 0.f; - for( auto& it : data.m_records ) { - if( it.m_tick == prev_choke ) - static_dtc++; - - float speed = it.m_velocity.length2d( ); - float dist = speed * it.m_tick * TICK_INTERVAL( ); - - if( dist > 62.f && std::abs( last_dist - dist ) < 12.f ) - adaptive_dtc++; - - prev_choke = it.m_tick; - last_dist = dist; - min_choke = math::min( it.m_tick, min_choke ); - max_choke = math::max( it.m_tick, max_choke ); - } - } - - if( adaptive_dtc > 10 ) { - return TIME_TO_TICKS( 64.f / data.m_velocity.length2d( ) ) + 1; - } - else if( static_dtc > 16 || data.m_records.empty( ) ) { - return data.m_last_choke; - } - - float factor = math::random_number( 0.f, 1.f ); - return ( 1.0f - factor ) * min_choke + factor * max_choke; -} - -vec3_t c_prediction::aimware_extrapolate( c_base_player* ent, vec3_t origin, vec3_t& velocity ) { - static auto sv_jump_impulse = g_csgo.m_cvar( )->FindVar( xors( "sv_jump_impulse" ) ); - static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); - - auto min = ent->m_vecMins( ); - auto max = ent->m_vecMaxs( ); - - auto start = origin; - auto end = start + velocity * TICK_INTERVAL( ); - - CTraceFilter f; - CGameTrace tr; - Ray_t ray; - - ray.Init( start, end, min, max ); - f.pSkip = ent; - - g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); - - if( tr.fraction != 1.f ) { - for( int i{ }; i < 2; ++i ) { - velocity -= tr.plane.normal * velocity.dot( tr.plane.normal ); - - auto dot = velocity.dot( tr.plane.normal ); - if( dot < 0.f ) { - velocity -= dot * tr.plane.normal; - } - - end = tr.endpos + ( velocity * TICK_INTERVAL( ) * ( 1.f - tr.fraction ) ); - ray.Init( tr.endpos, end, min, max ); - g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); - - if( tr.fraction == 1.f ) - break; - } - } - - end = tr.endpos; - end.z -= 2.f; - - ray.Init( tr.endpos, end, min, max ); - g_csgo.m_trace( )->TraceRay( ray, MASK_PLAYERSOLID, &f, &tr ); - - if( tr.fraction != 1.f && tr.plane.normal.z > 0.7f ) { - velocity.z = sv_jump_impulse->get_float( ); - } - else { - velocity.z -= sv_gravity->get_float( ) * TICK_INTERVAL( ); - } - - return tr.endpos; -} - -vec3_t c_prediction::full_walk_move( c_base_player* player, int ticks ) { - auto index = player->ce( )->GetIndex( ); - auto data = get_player_data( index ); - vec3_t origin = data.m_position; - vec3_t velocity = data.m_velocity; - vec3_t old_velocity = data.m_velocity; - vec3_t acceleration; - - bool is_on_ground = player->m_fFlags( ) & FL_ONGROUND; - - m_player = data; - - if( !data.m_valid ) - return origin; - - float velocity_dir = RAD2DEG( atan2( velocity.y, velocity.x ) ); - float angle_dir = velocity_dir - RAD2DEG( atan2( data.m_old_velocity.y, data.m_old_velocity.x ) ); - - angle_dir *= TICKS_TO_TIME( data.m_last_choke ); - - if( velocity_dir <= 180.f ) { - if( velocity_dir < -180.f ) - velocity_dir += 360.f; - } - else { - velocity_dir -= 360.f; - } - - float length = velocity.length2d( ); - - for( int i{ }; i < ticks; ++i ) { - float extrapolated_dir = velocity_dir + angle_dir; - - velocity.x = cos( DEG2RAD( extrapolated_dir ) ) * length; - velocity.y = sin( DEG2RAD( extrapolated_dir ) ) * length; // hey.... fix please In Fucking Correct - - start_gravity( player, origin, velocity ); - - if( is_on_ground ) { - check_jump_button( player, origin, velocity ); // Won't jump all the time - } - - if( is_on_ground ) { - //velocity.z = 0.f; go to hell - friction( player, origin, velocity ); - } - - check_velocity( player, origin, velocity ); - - // fuck walking - if( !is_on_ground ) { - air_move( player, origin, velocity, old_velocity, acceleration ); - } - - try_player_move( player, origin, velocity ); - - is_on_ground = categorize_position( player, origin, velocity ); - - check_velocity( player, origin, velocity ); - - finish_gravity( player, origin, velocity ); - - if( is_on_ground ) { - velocity.z = 0.f; - } - - old_velocity = velocity; - - velocity_dir = extrapolated_dir; - } - - return origin; -} - -void c_prediction::check_jump_button( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { - static auto sv_jump_impulse = g_csgo.m_cvar( )->FindVar( xors( "sv_jump_impulse" ) ); - float ground_factor = 1.f; - vec3_t ground_point = origin; - - ground_point.z -= 2.f; - - CGameTrace pm; - trace_player_bbox( player, origin, ground_point, &pm ); - - if( pm.m_pEnt ) { - auto surface_data = g_csgo.m_phys_props( )->GetSurfaceData( pm.surface.surfaceProps ); - if( surface_data ) { - ground_factor = surface_data->game.jumpfactor; - } - } - - - if( !ground_factor ) { - ground_factor = 1.f; - } - - //if( player->m_fFlags( ) & FL_DUCKING ) { - //velocity.z += ground_factor * sv_jump_impulse->get_float( ); // how they do it in csgo - //} - //else { - velocity.z = ground_factor * sv_jump_impulse->get_float( ); - //} - - finish_gravity( player, origin, velocity ); - -} - -void c_prediction::start_gravity( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { - static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); - - float m_flGravity = player->m_flGravity( ); - - //if( !m_flGravity ) { - m_flGravity = 1.f; - //} - - velocity.z -= ( m_flGravity * sv_gravity->get_float( ) * 0.5f * TICK_INTERVAL( ) ); - - check_velocity( player, origin, velocity ); -} - -void c_prediction::finish_gravity( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { - static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); - - float m_flGravity = player->m_flGravity( ); - //if( !m_flGravity ) { - m_flGravity = 1.f; - //} - - velocity.z -= ( m_flGravity * sv_gravity->get_float( ) * 0.5f * TICK_INTERVAL( ) ); - - check_velocity( player, origin, velocity ); -} - -void c_prediction::friction( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { - static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); - static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); - const float m_surfaceFriction = player->m_surfaceFriction( ); - - float speed = velocity.length( ); - - if( speed < 0.1f ) - return; - - float friction = sv_friction->get_float( ) * m_surfaceFriction; - float control = ( speed < sv_stopspeed->get_float( ) ) ? sv_stopspeed->get_float( ) : speed; - float drop = control * friction * TICK_INTERVAL( ); - - float newspeed = speed - drop; - if( newspeed < 0.f ) - newspeed = 0.f; - - if( newspeed != speed ) { - newspeed /= speed; - velocity *= newspeed; - } -} - -void c_prediction::air_move( c_base_player* player, vec3_t& origin, vec3_t& velocity, vec3_t& old_velocity, vec3_t& acceleration ) { - vec3_t wishvel; - vec3_t wishdir; - float wishspeed; - vec3_t forward, right, up; - - //fmove = m_player.m_movement.x; - //smove = m_player.m_movement.y; - // - //math::angle_vectors( m_player.m_angles, &forward, &right, &up ); - // - //forward.z = right.z = 0.f; - // - //forward.normalize_vector( ); - //right.normalize_vector( ); - // - //for( int i{ }; i < 2; ++i ) { - // wishvel[ i ] = forward[ i ] * fmove + right[ i ] * smove; - //} - - - wishvel = velocity; - - wishvel[ 2 ] = 0.f; - - wishdir = wishvel; - wishdir.normalize_vector( ); - - wishspeed = acceleration.length( ); // probably wrong - - air_accelerate( player, origin, old_velocity, wishdir, wishspeed ); -} - -void c_prediction::air_accelerate( c_base_player* player, vec3_t& origin, vec3_t& velocity, vec3_t& wishdir, float wishspeed ) { - static auto sv_airaccelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_airaccelerate" ) ); - - float wishspd = wishspeed; - - if( wishspd > 30.f ) - wishspd = 30.f; - - float currentspeed = velocity.dot( wishdir ); - - float addspeed = wishspd - currentspeed; - - if( addspeed <= 0 ) - return; - - float accelspeed = sv_airaccelerate->get_float( ) * wishspeed * TICK_INTERVAL( ); - - if( accelspeed > addspeed ) - accelspeed = addspeed; - - for( int i{ }; i < 2; ++i ) { - velocity[ i ] += accelspeed * wishdir[ i ]; - } -} - -void c_prediction::try_player_move( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { - CGameTrace pm; - vec3_t end_pos = origin + velocity * TICK_INTERVAL( ); - - trace_player_bbox( player, origin, end_pos, &pm ); - - if( pm.fraction != 1.f ) { - end_pos = pm.endpos; - } - - origin = end_pos; -} - - - -//there are supposed to be some ladder checks etc here, but we're really only supposed to be doing this when people are breaking lag comp etc -//also ugly code, please fix :( -bool c_prediction::categorize_position( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { - constexpr float NON_JUMP_VELOCITY = 140.f; - vec3_t ground_point = origin; - bool is_moving_up_rapidally = velocity.z > NON_JUMP_VELOCITY; - CGameTrace pm; - - ground_point.z -= 2.f; - - if( is_moving_up_rapidally ) { - return false; - } - else { - trace_player_bbox( player, origin, ground_point, &pm ); - if( !pm.m_pEnt || pm.plane.normal.z < 0.7 ) { - try_touch_ground_in_quadrants( player, origin, ground_point, &pm ); - if( !pm.m_pEnt || pm.plane.normal.z < 0.7 ) { - return false; - } - else { - return true; - } - } - else { - return true; - } - } - - return true; -} - - -void c_prediction::check_velocity( c_base_player* player, vec3_t& origin, vec3_t& velocity ) { - static auto sv_max_velocity = g_csgo.m_cvar( )->FindVar( xors( "sv_maxvelocity" ) ); - const float max_velocity = sv_max_velocity->get_float( ); - - for( int i{ }; i < 3; ++i ) { - if( !std::isfinite( velocity[ i ] ) ) { - velocity[ i ] = 0.f; - } - - if( !std::isfinite( origin[ i ] ) ) { - origin[ i ] = 0.f; - } - - velocity[ i ] = std::clamp( velocity[ i ], -max_velocity, max_velocity ); - } -} - - - -// https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/shared/gamemovement.cpp#L2025 -vec3_t c_prediction::extrapolate_player( c_base_player* player, int ticks ) { - static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); - static auto sv_jump_impulse = g_csgo.m_cvar( )->FindVar( xors( "sv_jump_impulse" ) ); - - auto index = player->ce( )->GetIndex( ); - auto data = get_player_data( index ); - - vec3_t& m_vecBaseVelocity = player->get< vec3_t >( 0x11C ); - - vec3_t predicted( data.m_position ); - vec3_t velocity( data.m_velocity ); - vec3_t acceleration{ }; - - if( !data.m_valid ) - return predicted; - - float velocity_dir = RAD2DEG( atan2( velocity.y, velocity.x ) ); - float angle_dir = velocity_dir - RAD2DEG( atan2( data.m_old_velocity.y, data.m_old_velocity.x ) ); - - angle_dir *= TICKS_TO_TIME( data.m_last_choke ); - - if( velocity_dir <= 180.f ) { - if( velocity_dir < -180.f ) - velocity_dir += 360.f; - } - else { - velocity_dir -= 360.f; - } - - float length = velocity.length2d( ); - - float dir = velocity_dir; - - for( int i = 0; i < ticks; ++i ) { - float extrapolated_dir = velocity_dir + angle_dir; - - velocity.x = cos( DEG2RAD( extrapolated_dir ) ) * length; - velocity.y = sin( DEG2RAD( extrapolated_dir ) ) * length; - - predicted = aimware_extrapolate( player, predicted, velocity ); - - velocity_dir = extrapolated_dir; - } - - return predicted; -} - -void c_prediction::trace_player_bbox( c_base_player* player, const vec3_t& start, const vec3_t& end, CGameTrace* pm ) { - Ray_t ray; - ray.Init( start, end, player->m_vecMins( ), player->m_vecMaxs( ) ); - - CTraceFilter filter; - filter.pSkip = player; - - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, pm ); -} - -void c_prediction::try_touch_ground( c_base_player* player, const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs, CGameTrace* pm ) { - Ray_t ray; - ray.Init( start, end, mins, maxs ); - - CTraceFilter filter; - filter.pSkip = player; - - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, pm ); -} - -void c_prediction::try_touch_ground_in_quadrants( c_base_player* player, const vec3_t& start, const vec3_t& end, CGameTrace* pm ) { - vec3_t mins, maxs; - - vec3_t mins_src = player->m_vecMins( ); - vec3_t maxs_src = player->m_vecMaxs( ); - - float fraction = pm->fraction; - vec3_t end_pos = pm->endpos; - - mins = mins_src; - maxs = vec3_t( std::min( 0.f, maxs_src.x ), std::min( 0.f, maxs_src.y ), maxs_src.z ); - - try_touch_ground( player, start, end, mins, maxs, pm ); - if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { - pm->fraction = fraction; - pm->endpos = end_pos; - return; - } - - mins = vec3_t( std::max( 0.f, mins_src.x ), std::max( 0.f, mins_src.y ), mins_src.z ); - maxs = maxs_src; - - try_touch_ground( player, start, end, mins, maxs, pm ); - if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { - pm->fraction = fraction; - pm->endpos = end_pos; - return; - } - - mins = vec3_t( mins_src.x, std::max( 0.f, mins_src.y ), mins_src.z ); - maxs = vec3_t( std::min( 0.f, maxs_src.x ), maxs_src.y, maxs_src.z ); - - try_touch_ground( player, start, end, mins, maxs, pm ); - if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { - pm->fraction = fraction; - pm->endpos = end_pos; - return; - } - - mins = vec3_t( std::max( 0.f, mins_src.x ), mins_src.y, mins_src.z ); - maxs = vec3_t( maxs_src.x, std::min( 0.f, maxs_src.y ), maxs_src.z ); - - try_touch_ground( player, start, end, mins, maxs, pm ); - if( pm->m_pEnt && pm->plane.normal.z >= 0.7 ) { - pm->fraction = fraction; - pm->endpos = end_pos; - return; - } - - pm->fraction = fraction; - pm->endpos = end_pos; -} - -// This code got nasty after a while, imo. You can clean it up if you care enough. -void c_prediction::run_command( user_cmd_t *ucmd ) { - CMoveData movedata{ }; - - if ( !ucmd || !g_csgo.m_engine( )->IsConnected( ) || !g_csgo.m_engine( )->IsInGame( ) || !g_csgo.m_move_helper.get( ) ) - return; - - int backup_buttons = ucmd->m_buttons; - float backup_forwardmove = ucmd->m_forwardmove; - float backup_sidemove = ucmd->m_sidemove; - - ucmd->m_forwardmove = ucmd->m_sidemove = 0.f; - ucmd->m_buttons &= ~( IN_BACK | IN_FORWARD | IN_MOVELEFT | IN_MOVERIGHT ); - - if( !ucmd || !g_ctx.m_local || !g_ctx.m_local->is_alive( ) ) - return; - - static uintptr_t run_command_address = g_csgo.m_prediction->get_old_function< uintptr_t >( 19 ); - - CMoveData move_data{ }; - IClientEntity* local_ent = g_ctx.m_local->ce( ); - - //backup data - int old_buttons = ucmd->m_buttons; - float old_curtime = g_csgo.m_globals->m_curtime; - float old_frame_time = g_csgo.m_globals->m_frametime; - int old_tickbase = g_ctx.m_local->m_nTickBase( ); - int old_flags = g_ctx.m_local->m_fFlags( ); - MoveType_t old_move_type = g_ctx.m_local->m_nMoveType( ); - vec3_t old_velocity = g_ctx.m_local->m_vecVelocity( ); - - //set globals - g_csgo.m_globals->m_curtime = g_csgo.m_globals->m_interval_per_tick * old_tickbase; - g_csgo.m_globals->m_frametime = g_csgo.m_globals->m_interval_per_tick; - - //random seed is already being calculated and set in createmove - **( uintptr_t** )( run_command_address + 0x3E ) = ucmd->m_random_seed; //prediction seed - **( uintptr_t** )( run_command_address + 0x54 ) = uintptr_t( g_ctx.m_local ); //prediction player - - //start prediction - g_csgo.m_move_helper( )->SetHost( local_ent ); - g_csgo.m_game_movement( )->StartTrackPredictionErrors( local_ent ); - - //run prediction - g_csgo.m_prediction( )->SetupMove( local_ent, ucmd, g_csgo.m_move_helper( ), &move_data ); - g_csgo.m_game_movement( )->ProcessMovement( local_ent, &move_data ); - g_csgo.m_prediction( )->FinishMove( local_ent, ucmd, &move_data ); - - //finish prediction - g_csgo.m_game_movement( )->FinishTrackPredictionErrors( local_ent ); - g_csgo.m_move_helper( )->SetHost( nullptr ); - - **( uintptr_t** )( run_command_address + 0x3E ) = 0xffffffff; - **( uintptr_t*** )( run_command_address + 0x54 ) = nullptr; - - //good to have, can be used for edge jump and such - m_predicted_flags = g_ctx.m_local->m_fFlags( ); - - //restore - ucmd->m_buttons = old_buttons; - g_csgo.m_globals->m_curtime = old_curtime; - g_csgo.m_globals->m_frametime = old_frame_time; - //g_ctx.m_local->m_nTickBase( ) = old_tickbase; - g_ctx.m_local->m_fFlags( ) = old_flags; - g_ctx.m_local->m_nMoveType( ) = old_move_type; - g_ctx.m_local->m_vecVelocity( ) = old_velocity; - - ucmd->m_forwardmove = backup_forwardmove; - ucmd->m_sidemove = backup_sidemove; - ucmd->m_buttons = backup_buttons; - - auto wep = g_ctx.m_local->get_weapon( ); - - if( wep ) { - wep->update_accuracy_penalty( ); - g_ctx.m_weapon_inaccuracy = wep->get_inaccuracy( ); - g_ctx.m_weapon_spread = wep->get_spread( ); - } - else { - g_ctx.m_weapon_inaccuracy = g_ctx.m_weapon_spread = 0.f; - } -} - -END_REGION diff --git a/internal_rewrite/prediction.hpp b/internal_rewrite/prediction.hpp deleted file mode 100644 index d6adb44..0000000 --- a/internal_rewrite/prediction.hpp +++ /dev/null @@ -1,95 +0,0 @@ -#pragma once -#include "vector.hpp" -#include "util.hpp" - -#include -#include - -class user_cmd_t; -class c_base_player; - -NAMESPACE_REGION( features ) - -class c_prediction -{ - user_cmd_t* m_ucmd{ }; - int m_predicted_flags{ }; - - float m_old_time; - float m_old_frametime; - int m_old_tickcount; - - int m_prediction_seed; - int m_prediction_player; - - struct player_data_t { - struct lag_velocity_record_t { - vec3_t m_velocity; - int m_tick; - }; - - void update( int ent_index ); - - float m_simtime{ }; - int m_last_choke{ }; - vec3_t m_angles{ }; - vec3_t m_velocity{ }; - vec3_t m_old_velocity{ }; - vec3_t m_position{ }; - vec3_t m_movement{ }; - bool m_valid{ }; - bool m_breaking_lc{ }; - - std::deque< lag_velocity_record_t > m_records{ }; - }; - - std::array< player_data_t, 65 > m_players; - - void run( user_cmd_t* ucmd ); -public: - // You should be using the un-predicted velocity for fake-walk. - vec3_t m_velocity{ }; - - // void local_pred( user_cmd_t* ); - - void run_command( user_cmd_t *cmd ); - - int get_predicted_flags( ) const { - return m_predicted_flags; - } - - bool is_breaking_lc( int ent ) const { - return m_players[ ent ].m_breaking_lc; - } - - inline player_data_t get_player_data( int ent_index ) { - return m_players[ ent_index ]; - } - - player_data_t m_player; - - //gamemovement functions - vec3_t full_walk_move( c_base_player*, int ); - void check_jump_button( c_base_player*, vec3_t&, vec3_t& ); - void start_gravity( c_base_player*, vec3_t&, vec3_t& ); - void finish_gravity( c_base_player*, vec3_t&, vec3_t& ); - void friction( c_base_player*, vec3_t&, vec3_t& ); - void air_move( c_base_player*, vec3_t&, vec3_t&, vec3_t&, vec3_t& ); - void air_accelerate( c_base_player*, vec3_t&, vec3_t&, vec3_t&, float ); - // void walk_move( c_base_player*, vec3_t&, vec3_t& ); - bool categorize_position( c_base_player*, vec3_t&, vec3_t& ); - void check_velocity( c_base_player*, vec3_t&, vec3_t& ); - void try_player_move( c_base_player*, vec3_t&, vec3_t& ); - - void frame_stage_notify( ); - vec3_t aimware_extrapolate( c_base_player* ent, vec3_t origin, vec3_t& velocity ); - void predict_player( c_base_player* player ); - int get_predicted_choke( int ); - vec3_t extrapolate_player( c_base_player*, int ); - void trace_player_bbox( c_base_player*, const vec3_t& start, const vec3_t& end, CGameTrace* pm ); - void try_touch_ground( c_base_player*, const vec3_t& start, const vec3_t& end, const vec3_t& mins, const vec3_t& maxs, CGameTrace* pm ); - void try_touch_ground_in_quadrants( c_base_player*, const vec3_t& start, const vec3_t& end, CGameTrace* pm ); - -}; - -END_REGION diff --git a/internal_rewrite/proxies.cpp b/internal_rewrite/proxies.cpp deleted file mode 100644 index 287970b..0000000 --- a/internal_rewrite/proxies.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" -#include "base_cheat.hpp" - -void __cdecl hooks::lby_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { - lby_proxy.get_old_function( )( proxy_data_const, entity, output ); - - if( !g_csgo.m_panic ) { - auto player = ( c_base_player* )( entity ); - if( player && player == g_ctx.m_local ) { - g_cheat.m_ragebot.m_antiaim->on_lby_proxy( ); - } - } -} - -void __cdecl hooks::last_shot_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { - last_shot_proxy.get_old_function( )( proxy_data_const, entity, output ); - if( !g_csgo.m_panic && proxy_data_const && g_settings.rage.enabled( ) && g_settings.rage.resolver( ) ) { - auto wep = ( c_base_weapon* )( entity ); - if( wep && !wep->is_knife( ) && !wep->is_grenade( ) ) { - auto owner = g_csgo.m_entlist( )->GetClientEntityFromHandle( wep->m_hOwner( ) ); - if( owner && owner->is_valid( ) && owner != g_ctx.m_local && g_ctx.m_local->is_valid( ) && owner->has_valid_anim( ) ) { - if( owner->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) - return; - - static float last_time = 0.f; - float time = wep->m_fLastShotTime( ); - - if( !time ) - return; - - float anim_time = owner->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - auto record = g_cheat.m_ragebot.m_lagcomp->get_newest_record( owner->ce( )->GetIndex( ) ); - float& last_update = g_cheat.m_ragebot.m_lagcomp->get_last_updated_simtime( owner->ce( )->GetIndex( ) ); - - if( time == anim_time && owner->has_valid_anim( ) && owner->m_flSimulationTime( ) != last_update ) { - last_update = owner->m_flSimulationTime( ); - - vec3_t local_pos = g_ctx.m_local->m_vecOrigin( ); - vec3_t enemy_pos = owner->m_vecOrigin( ); - vec3_t ang = math::vector_angles( enemy_pos, local_pos ); - - owner->m_angEyeAngles( ).y = ang.y; - owner->fix_animations( ); - - features::c_ragebot::lag_record_t record( owner ); - record.m_shot = true; - - g_cheat.m_ragebot.m_lagcomp->store_record( owner->ce( )->GetIndex( ), RECORD_NORMAL, record ); - last_time = time; - } - else if( owner->has_valid_anim( ) && time != last_time ) { - auto lby_records = g_cheat.m_ragebot.m_lagcomp->get_records( owner->ce( )->GetIndex( ), RECORD_LBY ); - auto sim_records = g_cheat.m_ragebot.m_lagcomp->get_records( owner->ce( )->GetIndex( ), RECORD_NORMAL ); - - features::c_ragebot::lag_record_t* prev_record = nullptr; - float min_delta = FLT_MAX; - - if( lby_records->size( ) ) { - for( auto& it : *lby_records ) { - float delta = std::abs( it.m_flSimulationTime - time ); - if( delta > TICKS_TO_TIME( 15 ) ) - break; - - if( delta < g_csgo.m_globals->m_interval_per_tick ) - break; - - if( delta < min_delta ) { - prev_record = ⁢ - min_delta = delta; - } - } - } - - if( sim_records->size( ) ) { - for( auto& it : *sim_records ) { - if( it.m_shot ) - continue; - - float delta = std::abs( it.m_flSimulationTime - time ); - if( delta > TICKS_TO_TIME( 15 ) ) - break; - - if( delta < g_csgo.m_globals->m_interval_per_tick ) - break; - - if( delta < min_delta ) { - prev_record = ⁢ - min_delta = delta; - } - } - } - - if( prev_record && !prev_record->m_shot ) { - owner->m_angEyeAngles( ).x = prev_record->m_vecAngles.x; - } - - last_time = time; - } - } - } - } -} - -void __cdecl hooks::simtime_proxy_fn( const CRecvProxyData* proxy_data_const, void* entity, void* output ) { - auto old_fn = simtime_proxy.get_old_function( ); - - auto ent = ( c_base_player* )( entity ); - if( ent && ent->is_valid( ) && ent->has_valid_anim( ) && ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.rage.friendlies( ) ) && ent != g_ctx.m_local ) { - if( !proxy_data_const->m_Value.m_Int ) { - return; - } - } - - old_fn( proxy_data_const, entity, output ); -} \ No newline at end of file diff --git a/internal_rewrite/ragebot.cpp b/internal_rewrite/ragebot.cpp deleted file mode 100644 index 4a85078..0000000 --- a/internal_rewrite/ragebot.cpp +++ /dev/null @@ -1,1142 +0,0 @@ -#include "ragebot.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "math.hpp" -#include "base_cheat.hpp" -#include "input_system.hpp" - -namespace features -{ - c_ragebot::c_ragebot( ) : - m_antiaim( std::make_shared< c_antiaim >( ) ), - m_lagcomp( std::make_shared< c_lagcomp >( ) ), - m_resolver( std::make_shared< c_resolver >( ) ) { } - - void c_ragebot::operator()( user_cmd_t* cmd ) { - if( !cmd ) return; - m_cmd = cmd; - - m_antiaim->run( cmd ); - run( ); - m_antiaim->fix_movement( ); - } - - vec3_t head_scale( c_base_player* ent, vec3_t pos ) { - - // broke, crashes the hack - //not what it is - //return pos; - - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - CTraceFilterOneEntity filter; - Ray_t ray; - CGameTrace trace; - - filter.ent = ent; - - float height{ }; - float highest_dmg{ }; - float max_height{ }; - - const float max = 6.5f * g_settings.rage.active->m_hitbox_scale; - - for( float i = 0.f; i < max; i += 0.25f ) { - vec3_t end = pos; - end.z += i; - - ray.Init( eye_pos, end ); - g_csgo.m_trace( )->TraceRay( ray, 0x46004003, &filter, &trace ); - - if( trace.m_pEnt == ent->ce( ) ) { - max_height = i; - if( trace.hitgroup == HITGROUP_HEAD && !height ) { - height = i; - } - } - } - - if( height < 0.5f ) { - pos.z += height; - return pos; - } - - pos.z += ( height + max_height ) * 0.5f; - return pos; - } - - int c_ragebot::get_min_dmg( c_base_player* ent ) { - int hp = ent->m_iHealth( ); - int dmg = g_settings.rage.active->m_damage( ); - int scale = g_settings.rage.active->m_damage_scale( ); - return std::min< int >( ( int )( hp * scale * 0.01f ) + dmg, 100 ); - } - - vec3_t c_ragebot::multipoint( c_base_player* ent, int hitbox, float* out_dmg ) { - auto should_multipoint = [ ]( int hitbox, bool moving ) -> bool { - if( !g_settings.rage.multipoint_enable ) - return false; - - auto& setting = g_settings.rage.multipoint; - - switch( hitbox ) { - case HITBOX_HEAD: - return setting.head; - case HITBOX_PELVIS: - case HITBOX_BODY: - return setting.stomach; - //case HITBOX_CHEST: - case HITBOX_UPPER_CHEST: - case HITBOX_THORAX: - return setting.chest; - case HITBOX_RIGHT_THIGH: - case HITBOX_LEFT_THIGH: - if( moving && g_settings.rage.ignore_limbs_moving ) - return false; - - if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) - return false; - - return setting.thighs; - - case HITBOX_LEFT_CALF: - case HITBOX_RIGHT_CALF: - if( moving && g_settings.rage.ignore_limbs_moving ) - return false; - - if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) - return false; - - return setting.calves; - default: - return false; - } - }; - - bool moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ); - - vec3_t pos = ent->get_hitbox_pos( hitbox ); - if( hitbox == HITBOX_HEAD ) - pos = head_scale( ent, pos ); - - float dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, pos ); - if( dmg > get_min_dmg( ent ) ) { - *out_dmg = dmg; - return pos; - } - - if( should_multipoint( hitbox, moving ) ) { - const auto model = ent->ce( )->GetModel( ); - if( !model ) return vec3_t{ }; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - if( !hdr ) return vec3_t{ }; - - matrix3x4 bone_matrix[ 128 ]; - if( !ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) { - return vec3_t{ }; - } - - auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); - if( !set ) return vec3_t{ }; - - //literally 20000 iq, the best multipoint - //im an actual fucking retard jesus christ - auto box = set->pHitbox( hitbox ); - if( !box ) return vec3_t{ }; - - vec3_t center = ( box->bbmax + box->bbmin ) * 0.5f; - - float dist = box->m_flRadius; - - if( box->m_flRadius == -1.f ) - dist = center.dist_to( box->bbmin ) * 0.85f; - vec3_t min_dir = math::angle_vectors( math::vector_angles( center, box->bbmin ) ); - vec3_t min = center + min_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; - - if( box->m_flRadius == -1.f ) - dist = center.dist_to( box->bbmax ) * 0.85f; - vec3_t max_dir = math::angle_vectors( math::vector_angles( center, box->bbmax ) ); - vec3_t max = center + max_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; - - static int point_index[ 65 ][ HITBOX_MAX ]; - - std::vector< vec3_t > points; - - if( g_settings.rage.multipoint_enable( ) == 1 || - hitbox == HITBOX_LEFT_CALF || hitbox == HITBOX_RIGHT_CALF || - hitbox == HITBOX_LEFT_THIGH || hitbox == HITBOX_RIGHT_THIGH ) { - points.push_back( vec3_t{ min.x, min.y, center.z } ); - points.push_back( vec3_t{ max.x, min.y, center.z } ); - points.push_back( vec3_t{ min.x, max.y, center.z } ); - points.push_back( vec3_t{ max.x, max.y, center.z } ); - } - else if( g_settings.rage.multipoint_enable( ) == 2 ) { - points.push_back( vec3_t{ max.x, max.y, max.z } ); - points.push_back( vec3_t{ min.x, max.y, max.z } ); - points.push_back( vec3_t{ max.x, min.y, max.z } ); - points.push_back( vec3_t{ min.x, min.y, max.z } ); - - points.push_back( vec3_t{ max.x, max.y, min.z } ); - points.push_back( vec3_t{ min.x, max.y, min.z } ); - points.push_back( vec3_t{ max.x, min.y, min.z } ); - points.push_back( vec3_t{ min.x, min.y, min.z } ); - } - else if( g_settings.rage.multipoint_enable( ) == 3 ) { - points.push_back( vec3_t{ min.x, min.y, center.z } ); - points.push_back( vec3_t{ max.x, min.y, center.z } ); - points.push_back( vec3_t{ min.x, max.y, center.z } ); - points.push_back( vec3_t{ max.x, max.y, center.z } ); - - points.push_back( vec3_t{ max.x, max.y, max.z } ); - points.push_back( vec3_t{ min.x, max.y, max.z } ); - points.push_back( vec3_t{ max.x, min.y, max.z } ); - points.push_back( vec3_t{ min.x, min.y, max.z } ); - - points.push_back( vec3_t{ max.x, max.y, min.z } ); - points.push_back( vec3_t{ min.x, max.y, min.z } ); - points.push_back( vec3_t{ max.x, min.y, min.z } ); - points.push_back( vec3_t{ min.x, min.y, min.z } ); - } - - float min_dmg = get_min_dmg( ent ); - auto& point_idx = point_index[ ent->ce( )->GetIndex( ) ][ hitbox ]; - - float percentage = g_settings.rage.multipoint_scale( ) * 0.01f; - int mul = ( int )( g_csgo.m_globals->m_frametime / TICK_INTERVAL( ) ); - - int count = math::min< int >( math::max< int >( mul * points.size( ) * percentage, - points.size( ) * percentage, - 1 ), points.size( ) ); - - for( int i{ }; i < count; ++i ) { - point_idx %= points.size( ); - - vec3_t point = points[ point_idx ]; - - vec3_t trans_point = math::vector_transform( point, bone_matrix[ box->bone ] ); - CTraceFilterOneEntity filter; - CGameTrace trace; - Ray_t ray; - - filter.ent = ent; - ray.Init( g_ctx.m_local->get_eye_pos( ), trans_point ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &trace ); - - if( trace.m_pEnt == ent->ce( ) ) { - float dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, trans_point ); - if( dmg > min_dmg ) { - *out_dmg = dmg; - return trans_point; - } - else { - point_idx++; - } - } - else { - point_idx++; - } - } - } - - return ent->get_hitbox_pos( hitbox ); - } - - int c_ragebot::hitscan( c_base_player* ent, bool baim, vec3_t& out_pos, float& out_dmg ) { - auto should_histcan = []( int hitbox, bool moving ) -> bool { - switch ( hitbox ) { - case HITBOX_HEAD: - case HITBOX_NECK: - return g_settings.rage.hitscan.head; - case HITBOX_PELVIS: - case HITBOX_BODY: - return g_settings.rage.hitscan.stomach; - case HITBOX_CHEST: - case HITBOX_UPPER_CHEST: - case HITBOX_THORAX: - return g_settings.rage.hitscan.chest; - case HITBOX_RIGHT_HAND: - case HITBOX_LEFT_HAND: - if( moving && g_settings.rage.ignore_limbs_moving ) - return false; - - if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) - return false; - - return g_settings.rage.hitscan.arms; - case HITBOX_RIGHT_THIGH: - case HITBOX_LEFT_THIGH: - case HITBOX_LEFT_CALF: - case HITBOX_RIGHT_CALF: - if( moving && g_settings.rage.ignore_limbs_moving ) - return false; - - if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) - return false; - - return g_settings.rage.hitscan.legs; - - case HITBOX_RIGHT_FOOT: - case HITBOX_LEFT_FOOT: - if( moving ) - return false; - - if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) - return false; - - return g_settings.rage.hitscan.feet; - default: - return false; - } - }; - - constexpr std::array< std::pair< PlayerHitboxes_t, int >, 15 > hitbox_order = { - std::make_pair( HITBOX_HEAD, 3 ), - - std::make_pair( HITBOX_PELVIS, 3 ), - std::make_pair( HITBOX_BODY, 3 ), - std::make_pair( HITBOX_THORAX, 3 ), - std::make_pair( HITBOX_CHEST, 3 ), - std::make_pair( HITBOX_UPPER_CHEST, 3 ), - - std::make_pair( HITBOX_NECK, 2 ), - - std::make_pair( HITBOX_RIGHT_HAND, 2 ), - std::make_pair( HITBOX_LEFT_HAND, 2 ), - - std::make_pair( HITBOX_RIGHT_THIGH, 2 ), - std::make_pair( HITBOX_LEFT_THIGH, 2 ), - - std::make_pair( HITBOX_RIGHT_CALF, 1 ), - std::make_pair( HITBOX_LEFT_CALF , 1 ), - - std::make_pair( HITBOX_RIGHT_FOOT, 0 ), - std::make_pair( HITBOX_LEFT_FOOT, 0 ), - }; - - bool moving = ent->m_vecVelocity( ).length( ) > 0.1f && !ent->is_fakewalking( ); - float min_dmg = get_min_dmg( ent ); - - if( g_settings.rage.hitbox != -1 ) { - float dmg{ }; - vec3_t pos = multipoint( ent, g_settings.rage.hitbox, &dmg ); - - if( dmg > min_dmg && pos ) { - out_dmg = dmg; - out_pos = pos; - return g_settings.rage.hitbox; - } - - return -1; - } - - struct hitbox_t { - float dmg; - int hitbox; - int priority; - vec3_t position; - }; - - std::vector< hitbox_t > hitboxes; - - for( size_t i{ }; i < hitbox_order.size( ); ++i ) { - auto hitbox = hitbox_order[ i ]; - if( !should_histcan( hitbox.first, moving ) ) { - continue; - } - - float dmg{ }; - vec3_t pos = multipoint( ent, hitbox.first, &dmg ); - - if( pos ) - hitboxes.push_back( { dmg, hitbox.first, hitbox.second, pos } ); - } - - std::sort( hitboxes.begin( ), hitboxes.end( ), [ &ent, &baim ]( hitbox_t& a, hitbox_t& b ) -> bool { - int hp = ent->m_iHealth( ); - - bool a_head = !( a.hitbox == HITBOX_HEAD || a.hitbox == HITBOX_NECK ); - bool b_head = !( b.hitbox == HITBOX_HEAD || b.hitbox == HITBOX_NECK ); - - if( a.dmg != b.dmg ) { - if( a.dmg > ( float )( hp + 10 ) && ( float )( b.dmg > hp + 10 ) ) { - if( a_head != b_head ) { - return a_head > b_head; - } - } - } - - if( a_head != b_head && baim ) - return a_head > b_head; - - if( a.priority != b.priority ) { - return a.priority > b.priority; - } - - if( a.dmg != b.dmg ) { - return a.dmg > b.dmg; - } - - return a.hitbox > b.hitbox; - } ); - - for( auto& it : hitboxes ) { - if( it.dmg > min_dmg ) { - out_dmg = it.dmg; - out_pos = it.position; - - return it.hitbox; - } - } - - return -1; - } - - void c_ragebot::update_settings( ) { - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) return; - int weapon_id = weapon->m_iItemDefinitionIndex( ); - - switch ( weapon_id ) { - case WEAPON_DEAGLE: - case WEAPON_R8REVOLVER: - g_settings.rage.active = &g_settings.rage.heavy_pistols; - break; - case WEAPON_AWP: - case WEAPON_SSG08: - g_settings.rage.active = &g_settings.rage.snipers; - break; - case WEAPON_G3SG1: - case WEAPON_SCAR20: - g_settings.rage.active = &g_settings.rage.auto_snipers; - break; - default: - g_settings.rage.active = &g_settings.rage.general; - break; - } - } - - bool c_ragebot::should_baim_entity( c_base_player* ent, bool backtracked ) { - int index = ent->ce( )->GetIndex( ); - - auto weap = g_ctx.m_local->get_weapon( ); - if( weap->m_iItemDefinitionIndex( ) == WEAPON_TASER ) - return true; - - if( !g_cheat.m_player_mgr.is_cheater( index ) ) - return false; - - int min_hp = g_settings.rage.active->m_baim_health; - int min_shots = g_settings.rage.active->m_baim_shots; - - if( m_resolver->get_shots( index ) >= min_shots ) - return true; - - if( ent->m_iHealth( ) <= min_hp ) - return true; - - if( !( ent->m_fFlags( ) & FL_ONGROUND ) && g_settings.rage.active->m_baim_air ) - return true; - - if( !backtracked && g_settings.rage.active->m_baim_fake ) - return true; - - return false; - } - - void quick_stop( user_cmd_t* cmd ) { - if( g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ) - return; - - if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) - return; - - vec3_t vel = g_ctx.m_local->m_vecVelocity( ); - float speed = vel.length2d( ); - - if( g_settings.rage.active->m_auto_stop == 1 || g_settings.rage.active->m_auto_stop == 4 ) { - auto wep = g_ctx.m_local->get_weapon( ); - auto wep_info = wep->get_wpn_info( ); - - bool scoped = g_ctx.m_local->m_bIsScoped( ); - float max_vel = scoped ? wep_info->max_speed_alt : wep_info->max_speed; - - if( speed < max_vel / 3 ) - return; - } - - if( speed < 0.1f ) { - g_ctx.get_last_cmd( )->m_forwardmove = 0.f; - g_ctx.get_last_cmd( )->m_sidemove = 0.f; - return; - } - - static auto sv_accelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_accelerate" ) ); - float accel = sv_accelerate->get_float( ); - float max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed; - if( g_ctx.m_local->get_weapon( )->is_sniper( ) && g_ctx.m_local->m_bIsScoped( ) ) { - max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed_alt; - } - - // thx ida - max_speed = std::min< float >( max_speed, 250.f ); - - if( g_ctx.m_local->m_fFlags( ) & FL_DUCKING ) { - // max_speed /= 3.f; - // accel /= 3.f; - } - - float surf_friction = 1.f; - float max_accelspeed = accel * g_csgo.m_globals->m_interval_per_tick * max_speed * surf_friction; - - float wishspeed{ }; - - if( speed - max_accelspeed <= -1.f ) { - wishspeed = max_accelspeed / ( speed / ( accel * g_csgo.m_globals->m_interval_per_tick ) ); - } - else { - wishspeed = max_accelspeed; - } - - vec3_t ndir = math::vector_angles( vel * -1.f ); - ndir.y = g_csgo.m_engine( )->GetViewAngles( ).y - ndir.y; - ndir = math::angle_vectors( ndir ); - - g_ctx.get_last_cmd( )->m_forwardmove = ndir.x * wishspeed; - g_ctx.get_last_cmd( )->m_sidemove = ndir.y * wishspeed; - } - - std::array< int, 65 > c_ragebot::get_sorted_targets( ) { - typedef struct { - int index; - float dist; - float fov; - bool moving; - int hp; - float simtime; - } target; - - std::array< target, 65 > targets{ }; - std::array< int, 65 > ret{ }; - - vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); - vec3_t cur_ang, dir_vec; - g_csgo.m_engine( )->GetViewAngles( cur_ang ); - - dir_vec = math::angle_vectors( cur_ang ); - - for( size_t i{ }; i < 65; ++i ) { - auto& cur_target = targets.at( i ); - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - cur_target.index = i; - - if( !ent || ent == g_ctx.m_local || !ent->is_valid( ) ) - continue; - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && - !g_settings.rage.friendlies( ) ) - continue; - - if( !ent->has_valid_anim( ) ) - continue; - - auto pos = ent->m_vecOrigin( ); - pos.z += 30.f; //eh - - auto dir = ( pos - local_pos ); - dir.normalize_vector( ); - - float fov = dir_vec.fov_to( dir ) * M_RADPI; // epic fov fix by friendly.... - - cur_target.fov = fov; - cur_target.dist = pos.dist_to( local_pos ); - cur_target.hp = ent->m_iHealth( ); - cur_target.moving = ent->m_vecVelocity( ).length2d( ) > 0.1f - && !ent->is_fakewalking( ) - && ( ent->m_fFlags( ) & FL_ONGROUND ); - cur_target.simtime = ent->m_flSimulationTime( ); - } - - auto sort_fn = [ ]( const target& a, const target& b ) { - if( g_settings.rage.prefer_low_hp ) { - if( a.hp != b.hp ) - return a.hp < b.hp; - } - - if( g_settings.rage.prefer_moving ) { - if( a.moving != b.moving ) - return a.moving > b.moving; - } - - if( g_settings.rage.selection_type == 0 ) { - if( a.fov != b.fov ) - return a.fov < b.fov; - } - else if( g_settings.rage.selection_type == 1 ) { - if( a.dist != b.dist ) - return a.dist < b.dist; - } - else if( g_settings.rage.selection_type == 2 ) { - if( a.simtime != b.simtime ) - return a.simtime > b.simtime; - } - - return a.index > b.index; - }; - - std::sort( targets.begin( ), targets.end( ), sort_fn ); - for( size_t i{ }; i < 65; ++i ) { - if( targets[ i ].fov < g_settings.rage.fov ) { - ret[ i ] = targets[ i ].index; - } - } - - return ret; - } - - bool c_ragebot::can_hit_without_ping( int entity ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( entity ); - - if( !ent ) - return false; - - int min_dmg = get_min_dmg( ent ); - auto check_records = [ &ent, &min_dmg ]( std::deque< lag_record_t >* records ) { - auto& front = records->front( ); - vec3_t pred_pos = front.m_vecPelvisPos; - - float dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, pred_pos, false ); - if( dmg > min_dmg ) - return true; - - pred_pos = front.m_vecHeadPos; - dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, pred_pos, false ); - if( dmg > min_dmg ) - return true; - - return false; - }; - - auto lby_records = m_lagcomp->get_records( entity, RECORD_LBY ); - auto sim_records = m_lagcomp->get_records( entity, RECORD_NORMAL ); - - if( lby_records->size( ) ) { - if( check_records( lby_records ) ) - return true; - } - - if( sim_records->size( ) ) { - if( check_records( sim_records ) ) - return true; - } - - return false; - } - - int c_ragebot::knifebot( ) { - auto aim_pos = g_ctx.m_local->get_eye_pos( ); - - float dist = FLT_MAX; - int ideal_ent = 0; - int ideal_tick = 0; - int hp = 0; - vec3_t pos; - - for( size_t i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); - - if( !ent || !ent->is_valid( ) || ent == g_ctx.m_local || !ent->has_valid_anim( ) || ent->m_bGunGameImmunity( ) ) - continue; - - auto newest_record = m_lagcomp->get_newest_valid_record( i ); - if( !newest_record ) - continue; - - if( newest_record->m_vecPelvisPos.dist_to( aim_pos ) < dist ) { - hp = ent->m_iHealth( ); - ideal_ent = i; - ideal_tick = newest_record->m_tickcount; - pos = newest_record->m_vecPelvisPos; - - dist = pos.dist_to( aim_pos ); - } - } - - if( ideal_ent && dist < 80.f ) { - int attack = 0; - - if( dist < 65.f ) - attack = IN_ATTACK2; - else if( hp < 35 ) - attack = IN_ATTACK; - else - return -1; - - vec3_t ang = math::vector_angles( aim_pos, pos ); - float fov = ang.dist_to( g_csgo.m_engine( )->GetViewAngles( ) ); - - if( fov < g_settings.rage.fov ) { - m_cmd->m_viewangles = math::vector_angles( aim_pos, pos ); - m_cmd->m_tick_count = ideal_tick; - m_cmd->m_buttons |= attack; - - return ideal_ent; - } - else { - return -1; - } - } - - return -1; - } - - bool c_ragebot::can_hit_target( int it, aim_target_t* ret, bool zeus, bool hitchance ) { - vec3_t aim_ang; - vec3_t aim_pos; - vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); - - auto entity = g_csgo.m_entlist( )->GetClientEntity< >( it ); - if( !entity || !entity->is_valid( ) || entity == g_ctx.m_local ) - return false; - if( entity->m_bGunGameImmunity( ) ) - return false; - if( !entity->has_valid_anim( ) ) - return false; - if( entity->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) - return false; - - bool baim = false; - bool should_baim = true; - bool backtracked = false; - bool restore = false; - float hit_damage = 0.f; - vec3_t extrapolate{ }; - - lag_record_t original_record( entity ); - lag_record_t* backtracked_record{ }; - - int tick_count = m_cmd->m_tick_count; - float lerp = util::get_lerptime( ); - auto record_type = m_lagcomp->can_backtrack_entity( it ); - if( !g_settings.rage.resolver( ) ) { - if( !util::is_tick_valid( entity->m_flSimulationTime( ) + lerp ) ) { - int new_tickcount = m_lagcomp->backtrack_entity( it, - record_type, &backtracked_record ); - - if( new_tickcount != -1 ) { - restore = true; - tick_count = new_tickcount; - } - else if( g_settings.misc.net_fakelag == 4 && can_hit_without_ping( it ) ) { - m_can_fakeping = false; - } - } - } - else { - int new_tickcount = m_lagcomp->backtrack_entity( it, record_type, &backtracked_record ); - if( new_tickcount != -1 ) { - tick_count = new_tickcount; - should_baim = record_type != RECORD_LBY; - backtracked = record_type == RECORD_LBY; - restore = true; - } - else { - if( g_settings.misc.net_fakelag == 4 ) { - //if( can_hit_without_ping( it ) ) - // m_can_fakeping = false; - } - - lag_record_t* last_simtime_record = m_lagcomp->get_newest_valid_record( it ); - if( last_simtime_record ) { - //ENSURE THE MOST ACCURATE DATA - entity->m_vecVelocity( ) = entity->get_animdata( ).m_last_velocity; - - auto velocity = entity->m_vecVelocity( ); - auto min_vel = 64 / TICK_INTERVAL( ) / 14; - - //IS HE A SLOW BOI OR A FAST NIGGER - if( g_settings.rage.fakelag_resolver( ) && velocity.length2d( ) > min_vel - 10.f ) { - auto new_record = *last_simtime_record; - - //FUCK FAKE PINGERS WE IN THIS BITCH - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); //GOD FUCKING KNOWS WHY - float latency = nci->GetLatency( 0 ) + g_csgo.m_globals->m_frametime; - - auto pred_choke = g_cheat.m_prediction.get_predicted_choke( it ); - auto latency_ticks = TIME_TO_TICKS( latency ); - - float time_since_update = g_ctx.pred_time( ) + latency - entity->m_flSimulationTime( ); - - //NIGGA UPDATED ALREADY FUCK ADAPTIVE - if( TIME_TO_TICKS( time_since_update ) > pred_choke && pred_choke > 0 ) { - if( g_settings.rage.fakelag_resolver( ) == 1 ) - return false; - - else if( latency_ticks > 0 ) { - int update_count = TIME_TO_TICKS( time_since_update ) / pred_choke; - - vec3_t extrapolated_origin = g_cheat.m_prediction.full_walk_move( entity, update_count * pred_choke ); - new_record.m_vecRenderOrigin = extrapolated_origin; - new_record.m_tickcount += update_count * pred_choke; - } - } - - //if( !new_record.is_valid( ) ) - // continue; - - int shots = m_resolver->get_shots( it ); - bool recalc = shots != last_simtime_record->m_shots; - - new_record.restore( true, recalc ); - tick_count = new_record.m_tickcount; - backtracked_record = last_simtime_record; - restore = true; - } - else { - int shots = m_resolver->get_shots( it ); - bool recalc = shots != last_simtime_record->m_shots; - - last_simtime_record->restore( recalc, recalc ); - tick_count = last_simtime_record->m_tickcount; - backtracked_record = last_simtime_record; - restore = true; - } - } - else { - //fake ping, just wait for an update - return false; - } - } - } - - baim = should_baim_entity( entity, !should_baim ); - - auto restore_player = [ &original_record, &restore, &entity, this ]( ) { - original_record.restore( true ); - //entity->m_flLastBoneSetupTime( ) = std::numeric_limits< float >::quiet_NaN( ); - }; - - int hitbox = hitscan( entity, baim, aim_pos, hit_damage ); - if( hitbox == -1 ) { - restore_player( ); - return false; - } - - if( aim_pos.dist_to( local_pos ) > 150.f && zeus ) { - restore_player( ); - return false; - } - - aim_ang = math::vector_angles( local_pos, aim_pos ).clamp( ); - - if( g_settings.rage.active->m_auto_stop( ) == 2 ) - quick_stop( m_cmd ); - else if( g_settings.rage.active->m_auto_stop( ) == 3 ) { - m_antiaim->run_fakewalk( ); - } - - if( g_settings.rage.active->m_auto_stop( ) == 5 ) { - m_cmd->m_buttons |= IN_DUCK; - } - - if( hitchance && !util::hitchance( it, aim_ang, - g_settings.rage.active->m_hitchance, hitbox ) ) { - if( g_settings.rage.active->m_auto_stop( ) == 1 || g_settings.rage.active->m_auto_stop( ) == 4 ) - quick_stop( m_cmd ); - - if( g_settings.rage.active->m_auto_stop( ) == 5 ) { - if( g_ctx.m_local->m_flDuckAmount( ) < 1.f ) - quick_stop( m_cmd ); - } - - if( g_settings.rage.active->m_auto_stop( ) == 4 && g_cheat.m_lagmgr.get_choked( ) < 10 && !m_antiaim->is_fakewalking( ) ) - g_cheat.m_lagmgr.set_state( false ); - - if( g_settings.rage.auto_scope( ) && g_ctx.m_local->get_weapon( )->is_sniper( ) ) { - if( !g_ctx.m_local->m_bIsScoped( ) ) { - m_cmd->m_buttons |= IN_ATTACK2; - } - } - - restore_player( ); - return false; - } - - ret->m_ent_index = it; - ret->m_position = aim_pos; - ret->m_tick_count = tick_count; - ret->m_hitbox = hitbox; - ret->m_backtracked = backtracked; - ret->m_min = entity->get_hitbox_mins( hitbox ); - ret->m_max = entity->get_hitbox_maxs( hitbox ); - ret->m_radius = entity->get_hitbox_radius( hitbox ); - - memcpy( m_shot_matrix, entity->m_CachedBoneData( ).GetElements( ), sizeof( matrix3x4 ) * entity->m_CachedBoneData( ).GetSize( ) ); - - m_shot_target = it; - - restore_player( ); - - return true; - } - - c_ragebot::aim_target_t c_ragebot::find_best_target( ) { - aim_target_t ret{ -1, m_cmd->m_tick_count, -1, vec3_t{ }, vec3_t{ }, vec3_t{ }, 0.f, 0 }; - vec3_t aim_angle{ }; - vec3_t aim_pos{ }; - auto weapon_info = g_ctx.m_local->get_weapon( )->get_wpn_info( ); - bool is_zeus = g_ctx.m_local->get_weapon( )->m_iItemDefinitionIndex( ) == WEAPON_TASER; - int damage = weapon_info->damage; - - auto players = get_sorted_targets( ); - auto data = players.data( ); - - for( size_t i{ }; i < players.size( ); ++i ) { - if( can_hit_target( data[ i ], &ret, is_zeus ) ) - break; - } - - return ret; - } - - void c_ragebot::set_angles( const vec3_t& angles ) { - auto weapon = g_ctx.m_local->get_weapon( ); - - // TODO: Implement the get_spread_direction here I guess. - if( g_settings.rage.compensate_spread ) { - int seed = m_cmd->m_random_seed; - - float inaccuracy = g_ctx.m_weapon_inaccuracy; - float spread = g_ctx.m_weapon_spread; - - util::set_random_seed( ( seed & 0xff ) + 1 ); - - float rand_a = util::get_random_float( 0.0f, 1.0f ); - float pi_rand_a = util::get_random_float( 0.f, 2.f * M_PI ); - float rand_b = util::get_random_float( 0.f, 1.0f ); - float pi_rand_b = util::get_random_float( 0.f, 2.f * M_PI ); - - float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); - float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); - - vec3_t forward, right, up; - math::angle_vectors( angles, &forward, &right, &up ); - - vec3_t spread_dir = forward + ( right * -spread_x ) + ( up * -spread_y ); - spread_dir.normalize_vector( ); - - vec3_t comp = math::vector_angles( vec3_t( ), spread_dir ); - - m_cmd->m_viewangles = comp; - } - else { - m_cmd->m_viewangles = angles; - } - - //if( g_settings.rage.silent == 2 ) { - // if( !m_antiaim->is_fakewalking( ) ) - // g_cheat.m_lagmgr.set_state( g_cheat.m_lagmgr.get_choked( ) ); - //} - - if( g_settings.rage.silent == 1 && !m_antiaim->is_fakewalking( ) ) { - //if( weapon->m_iItemDefinitionIndex( ) != WEAPON_R8REVOLVER ) - g_cheat.m_lagmgr.set_state( !g_cheat.m_lagmgr.get_sent( ) ); - } - - if( !g_settings.rage.silent( ) ) { - g_csgo.m_engine( )->SetViewAngles( m_cmd->m_viewangles ); - } - } - - void c_ragebot::aim_at_target( const aim_target_t& target ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( target.m_ent_index ); - if( !ent ) - return; - - if( g_ctx.m_local->get_weapon( )->m_iItemDefinitionIndex( ) != WEAPON_R8REVOLVER ) { - if( g_settings.rage.active->m_delay_type == 2 ) { - static auto time_to_fire = 0.f; - const float delay = float( g_settings.rage.active->m_delay( ) ) * 0.001f; - const float time = g_ctx.pred_time( ); - - float delta = time_to_fire - time; - - if( delta > delay ) { - time_to_fire = time + delay; - } - - if( delta < 0.f ) { - time_to_fire = time + delay; - delta = delay; - } - - if( delta > g_csgo.m_globals->m_interval_per_tick ) { - return; - } - } - if( g_settings.rage.active->m_delay_type == 3 ) { - static float time_to_fire = 0.f; - const float time = g_ctx.pred_time( ); - - float delta = time_to_fire - time; - - vec3_t velocity = ent->m_vecVelocity( ); - float speed = velocity.length2d( ); - if( speed > g_ctx.m_local->m_vecVelocity( ).length2d( ) && speed > 100.f ) { - vec3_t head_pos = ent->get_hitbox_pos( 0 ); - vec3_t origin = ent->m_vecOrigin( ); - origin.z = head_pos.z = 0.f; - - float dist = origin.dist_to( head_pos ); //1 / 64 - auto delay = dist / speed + 0.015625f; - - if( delta > delay ) - time_to_fire = time + delay; - - if( delta < 0.f ) { - time_to_fire = time + delay; - delta = delay; - } - - if( delta > g_csgo.m_globals->m_interval_per_tick ) - return; - } - } - } - - if( g_settings.rage.active->m_auto_stop && !m_antiaim->is_fakewalking( ) && !g_settings.rage.compensate_spread ) - m_cmd->m_forwardmove = m_cmd->m_sidemove = 0.f; - - m_cmd->m_buttons |= IN_ATTACK; - m_cmd->m_buttons &= ~IN_USE; - - vec3_t position = target.m_position; - m_cmd->m_tick_count = target.m_tick_count; - - auto angle = math::vector_angles( - g_ctx.m_local->get_eye_pos( ), - target.m_position ); - - static auto weapon_recoil_scale = g_csgo.m_cvar( )->FindVar( xors( "weapon_recoil_scale" ) ); - angle -= g_ctx.m_local->m_aimPunchAngle( ) * weapon_recoil_scale->get_float( ); - - g_cheat.m_visuals.store_shot( target.m_position ); - - if( !target.m_backtracked && g_cheat.m_player_mgr.is_cheater( target.m_ent_index ) ) { - m_resolver->aimbot( - target.m_ent_index, - target.m_hitbox, angle, - target.m_position, - target.m_min, - target.m_max, - target.m_radius ); - } - else { - context::shot_data_t new_shot{ }; - new_shot.m_angle = angle; - new_shot.m_enemy_index = target.m_ent_index; - - new_shot.m_hitbox.max = target.m_min; - new_shot.m_hitbox.min = target.m_max; - new_shot.m_hitbox.radius = target.m_radius; - new_shot.m_hitgroup = target.m_hitbox; - - new_shot.m_enemy_pos = target.m_position; - - g_ctx.m_last_shot++; - g_ctx.m_last_shot %= 128; - - g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; - g_ctx.m_has_incremented_shots = true; - } - - memcpy( g_ctx.m_shot_data[ g_ctx.m_last_shot ].m_matrix, - m_shot_matrix, - sizeof( matrix3x4 ) * ent->m_CachedBoneData( ).GetSize( ) ); - - set_angles( angle.clamp( ) ); - - if( g_settings.rage.active->m_auto_stop && !g_settings.rage.compensate_spread( ) ) - quick_stop( m_cmd ); - } - - void c_ragebot::run( ) { - if( !g_settings.rage.enabled( ) || !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) { - m_target = -1; - return; - } - - update_settings( ); - - if( m_send_next ) { - if( !g_cheat.m_lagmgr.get_sent( ) && !m_antiaim->is_fakewalking( ) ) - g_cheat.m_lagmgr.set_state( true ); - - m_send_next = false; - } - - auto wep = g_ctx.m_local->get_weapon( ); - if( !wep ) { - m_target = -1; - return; - } - - bool is_revolver = wep->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER; - - bool in_attack = false; - - m_can_fakeping = true; - - if ( g_settings.rage.activation_type == 0 ) in_attack = true; - else in_attack = g_input.is_key_pressed( - ( VirtualKeys_t )g_settings.rage.aimkey( ) ); - - if( !in_attack ) { - m_target = -1; - return; - } - - if( wep->is_knife( ) ) { - m_target = knifebot( ); - return; - } - - if( !wep->m_iClip1( ) || wep->is_grenade( ) ) { - m_target = -1; - return; - } - - if( !g_ctx.m_local->can_attack( ) ) { - aim_target_t t{ }; - bool is_zeus = wep->m_iItemDefinitionIndex( ) == WEAPON_TASER; - - if( m_target != -1 && !m_antiaim->is_fakewalking( ) ) { - bool can_hit = can_hit_target( m_target, &t, is_zeus, false ); - - if( !can_hit ) - m_target = -1; - - else if( g_settings.rage.active->m_auto_stop == 3 && can_hit ) { - m_antiaim->run_fakewalk( ); - //if( !g_cheat.m_lagmgr.get_choked( ) || g_cheat.m_lagmgr.get_state( ) ) - m_cmd->m_viewangles.y = m_antiaim->get_yaw( ); - } - } - return; - } - - // do not - if( g_settings.rage.silent == 2 && !g_cheat.m_lagmgr.get_choked( ) && !is_revolver ) { - if( !m_antiaim->is_fakewalking( ) ) - g_cheat.m_lagmgr.set_state( false ); - return; - } - - auto target = find_best_target( ); - if ( target.m_ent_index != -1 ) { - aim_at_target( target ); - } - - m_target = target.m_ent_index; - } -} \ No newline at end of file diff --git a/internal_rewrite/ragebot.hpp b/internal_rewrite/ragebot.hpp deleted file mode 100644 index 7bc6c24..0000000 --- a/internal_rewrite/ragebot.hpp +++ /dev/null @@ -1,349 +0,0 @@ -#pragma once -#include -#include - -#include "sdk.hpp" -#include "console.hpp" - -struct CCSGOPlayerAnimState; - -enum RecordType_t { - RECORD_NONE, - RECORD_LBY, - RECORD_NORMAL, -}; - -enum HitscanTypes_t { - HITSCAN_OFF, - HITSCAN_HEAD_BODY, - HITSCAN_HEAD_BODY_ARMS, - HITSCAN_LIMBS, -}; - -enum BreakerState_t { - BS_OFF, - BS_MOVING, - BS_WAS_MOVING, - BS_BREAKING, -}; - -struct lby_update_t { - int m_tickbase; - BreakerState_t m_state; -}; - -namespace features -{ - class c_ragebot { - public: - c_ragebot( ); - - class c_lagcomp; - struct lag_record_t; - struct render_record_t; - class c_antiaim; - class c_lby_breaker; - class c_resolver; - - std::shared_ptr< c_resolver > m_resolver; - std::shared_ptr< c_lagcomp > m_lagcomp; - std::shared_ptr< c_antiaim > m_antiaim; - private: - struct aim_target_t { - int m_ent_index; - int m_tick_count; - int m_hitbox; - vec3_t m_position; - vec3_t m_min; - vec3_t m_max; - float m_radius; - bool m_backtracked; - }; - user_cmd_t* m_cmd; - int m_target; - bool m_send_next; - matrix3x4 m_shot_matrix[ 128 ]; - int m_shot_target; - bool m_can_fakeping; - - void run( ); - - std::array< int, 65 > get_sorted_targets( ); - aim_target_t find_best_target( ); - bool can_hit_target( int, aim_target_t* target, bool zeus, bool hitchance = true ); - int hitscan( c_base_player* ent, bool baim, vec3_t& out_pos, float& out_dmg ); - void set_angles( const vec3_t& viewangles ); - bool should_baim_entity( c_base_player* ent, bool backtracked = false ); - void aim_at_target( const aim_target_t& target ); - bool can_hit_without_ping( int entity ); - vec3_t multipoint( c_base_player* ent, int hitbox, float* out_dmg ); - int knifebot( ); - - void update_settings( ); - public: - int get_min_dmg( c_base_player* ent ); - bool can_fakeping( ) const { return m_can_fakeping; } - auto get_shot_target( ) const { return m_shot_target; } - auto get_shot_matrix( ) const { return m_shot_matrix; } - int get_target( ) const { return m_target; } - void operator()( user_cmd_t* cmd ); - }; - - class c_ragebot::c_lby_breaker { - friend class c_antiaim; - private: - std::array< lby_update_t, 64 > m_lby_updates; - void update_animstate( ); - - float m_next_update{ }; - public: - int get_next_update( ) const; - void on_lby_proxy( ); - void override_angles( float* angle, float original, float offset, bool freestanding = false ); - }; - - class c_ragebot::c_antiaim { - private: - c_lby_breaker m_breaker; - user_cmd_t* m_cmd; - bool m_is_edging{ }; - bool m_is_fakewalking{ }; - bool m_direction{ }; - - void run( ); - - float get_yaw( bool fake, float original, bool no_jitter = false ); - float get_pitch( ); - - bool run_freestanding( int player = -1 ); - bool run_edge_dtc( ); - - - public: - bool is_fakewalking( ) const { return m_is_fakewalking; } - void run_fakewalk( ); - - bool is_edging( ) const { return m_is_edging; } - float get_yaw( bool no_jitter = false ); - - void on_runcommand( ) { - m_breaker.update_animstate( ); - } - void on_lby_proxy( ) { - m_breaker.on_lby_proxy( ); - } - auto get_next_update( ) { - return m_breaker.get_next_update( ); - } - - - void fix_movement( ); - void run( user_cmd_t* cmd ) { - m_cmd = cmd; - run( ); - } - }; - - struct c_ragebot::lag_record_t { - c_base_player* m_ent{ }; - - int m_tickcount{ }; - float m_flSimulationTime{ }; - float m_flOldSimulationTime{ }; - bool m_balanceadjust{ }; - bool m_shot{ }; - int m_choked{ }; - - float m_flCycle{ }; - float m_flLowerBodyYawTarget{ }; - float m_flDuckAmount{ }; - float m_flDuckSpeed{ }; - float m_animDuck{ }; - int m_fFlags{ }; - int m_animFlags{ }; - float m_lastAnimTime; - - vec3_t m_animVelocity{ }; - vec3_t m_prevVelocity{ }; - - bool m_sim_record{ }; - int m_shots{ }; - - C_AnimationLayer m_AnimLayers[ 13 ]{ }; - float m_PoseParameters[ 24 ]{ }; - - vec3_t m_vecOrigin{ }, m_vecAngles{ }; - vec3_t m_vecRenderOrigin{ }, m_vecRenderAngles{ }; - - vec3_t m_vecMins{ }, m_vecMaxs{ }; - vec3_t m_vecHeadPos{ }; - vec3_t m_vecPelvisPos{ }; - - CCSGOPlayerAnimState m_state{ }; - matrix3x4 m_matrix[ 128 ]{ }; - - bool is_valid( ); - - lag_record_t( ) : m_tickcount( -1 ), m_valid( false ) { } - lag_record_t( c_base_player* ent ); - - bool restore( bool recalculate = false, bool reanimate = false ); - - bool m_valid{ }; - }; - - struct c_ragebot::render_record_t { - matrix3x4 m_matrix[ 128 ]{ }; - vec3_t m_origin{ }; - float m_simtime{ }; - float m_globaltime{ }; - float m_validtime{ }; - }; - - class c_ragebot::c_lagcomp { - public: - using lag_deque_t = std::deque< lag_record_t >; - using anim_array_t = C_AnimationLayer[ 13 ]; - using render_deque_t = std::deque< render_record_t >; - - - lag_record_t* find_best_record( int ent_index ); - vec3_t get_backtracked_position( int ent_index ); - lag_deque_t* get_records( int ent_index, RecordType_t type ) { - switch( type ) { - case RECORD_LBY: - return &m_data_lby[ ent_index ]; - case RECORD_NORMAL: - return &m_data_normal[ ent_index ]; - } - - return nullptr; - } - - void store_record( int ent_index, RecordType_t type, const lag_record_t& record ) { - auto records = get_records( ent_index, type ); - if( records ) { - records->push_front( record ); - } - } - - void fsn_net_update_start( ); - void fsn_render_start( ); - void restore_animations( ); - void store_visuals( ); - void invalidate_bone_caches( ); - - lag_record_t* get_newest_record( int ent_index ); - lag_record_t* get_newest_valid_record( int ent_index ); - - bool get_render_record( int ent_index, matrix3x4* out ); - - void operator()( user_cmd_t* cmd ); - - int backtrack_entity( int ent_index, RecordType_t type, lag_record_t** out_record = nullptr ); - RecordType_t can_backtrack_entity( int ent_index ); - float get_flick_time( int ent_index ) { - return m_flick_time[ ent_index ]; - } - - float& get_last_updated_simtime( int ent_index ) { - return m_last_simtime[ ent_index ]; - } - - private: - float m_last_simtime[ 65 ]{ }; - float m_flick_time[ 65 ]{ }; - bool m_first_update[ 65 ]{ }; - lag_deque_t m_data_lby[ 65 ]; - lag_deque_t m_data_normal[ 65 ]; - render_deque_t m_data_render[ 65 ]; - user_cmd_t* m_cmd; - }; - - enum ResolverState_t { - R_NONE, - R_NORMAL, - R_FREESTANDING, - R_LAST, - }; - - enum OverrideDir_t { - OVERRIDE_NONE, - OVERRIDE_CENTER, - OVERRIDE_LEFT, - OVERRIDE_RIGHT, - OVERRIDE_LAST - }; - - class c_ragebot::c_resolver { - public: - void aimbot( int ent_index, int hitbox, vec3_t angle, vec3_t position, vec3_t min, vec3_t max, float radius ); - void listener( int ent_index, int shots ); - void frame_stage_notify( ); - std::vector< float > get_shot_vec( int ent ); - float get_shot_yaw( int shots, int ent ); - - void force_yaw( c_base_player*, float ); - - void brute_force( c_base_player* ); - int manual_override( c_base_player* ); - void force_lby( c_base_player* ); - void on_missed_spread( int ent_index, int shots ); - - int try_freestanding( c_base_player* ); - void update_player( int i ); - - void increment_shots( int ent_index ); - - __forceinline int get_shots( int ent_index ) { - auto& data = m_data[ ent_index ]; - - return data.m_missed_shots; - } - - __forceinline bool& yaw_change( int ent_index ) { - return m_data[ ent_index ].m_angle_change; - } - - __forceinline int get_state( int ent_index ) { - return m_data[ ent_index ].m_state; - } - - __forceinline int& get_resolver_shots( int ent_index ) { - auto& data = m_data[ ent_index ]; - - return data.m_shots[ data.m_state ]; - } - - protected: - - struct resolve_log_t { - //todo: deque to log hits etc - void update( int ent_index ); - void reset( ); - - bool m_logged[ R_LAST ]{ }; - float m_logged_lby{ }; - int m_state{ }; - float m_last_lby{ }; - float m_last_moving_lby{ }; - float m_last_update{ }; - int m_shots[ R_LAST ]{ }; - bool m_was_invalid{ }; - bool m_has_valid_lby{ }; - int m_last_freestanding{ }; - int m_overriding{ }; - int m_missed_shots{ }; - int m_logged_shots[ R_LAST ]{ }; - bool m_angle_change{ }; - vec3_t m_last_pos{ }; - }; - - struct resolve_data_t : public resolve_log_t { - std::array< resolve_log_t, 150 > m_snapshot; - }; - - std::array< resolve_data_t, 65 > m_data; - }; - -} \ No newline at end of file diff --git a/internal_rewrite/ragebot_antiaim.cpp b/internal_rewrite/ragebot_antiaim.cpp deleted file mode 100644 index beff445..0000000 --- a/internal_rewrite/ragebot_antiaim.cpp +++ /dev/null @@ -1,889 +0,0 @@ -#include "ragebot.hpp" -#include "base_cheat.hpp" -#include "context.hpp" -#include "math.hpp" -#include "input_system.hpp" - -namespace features -{ - //don't ask - /*vec3_t func( vec3_t a1, float a3, float a4, float a5, float a6, float a7, float a8, float a9 ) { - int v8; // ebp@0 - float v9; // xmm6@1 - float v10; // xmm7_4@1 - float v11; // xmm2@1 - float v12; // xmm5@1 - float v13; // xmm4_4@1 - float v14 = 0.f; // xmm3_4@1 - float v15; // xmm1_4@2 - vec3_t v16; // xmm0@2 - float v17; // eax@2 - vec3_t v18; // ecx@2 - float v20; // xmm1_4@4 - float v21 = 0.f; // eax@4 - vec3_t v22; // ecx@4 - float v23; // eax@5 - float v24; // [sp-10h] [bp-1Ch]@1 - vec3_t v25; - int v28; // [sp+0h] [bp-Ch]@1 - int v29; // [sp+4h] [bp-8h]@1 - - v12 = a4; - v9 = a3; - v11 = a5; - v10 = a7; - v11 = a5 - a8; - v12 = a4 - a7; - - v13 = a6 - a9; - v24 = a6 - a9; - - v14 = sqrt( v12 * v12 + v11 * v11 + v13 * v13 ); - - if( v14 <= v9 ) { - if( -v9 <= v14 ) { - a1.x = a4; - a1.y = a5; - a1.z = a6; - return a1; - } - else { - vec3_t v25 = { v11, v12, v24 }; - v20 = 1.0f / ( v12 * v12 + v11 * v11 + v13 * v13 + FLT_EPSILON ); - - a7 = v10 - v20 * v12 * v9; - a8 = a8 - v25.y * v20 * v9; - - a9 = a9 - v25.z * v20 * v9; - v12 = a9; - - v22.x = a7; - v22.y = a8; - v22.z = a9; - - return v22; - } - } - else { - vec3_t v25 = { v11, v12, v24 }; - - v15 = 1.0f / ( v12 * v12 + v11 * v11 + v13 * v13 + FLT_EPSILON ); - - a7 = v15 * v12 * v9 + v10; - a8 = v12 * v15 * v9 + a8; - - v16.x = a7; - v16.y = a8; - - a9 = v25.z * v15 * v9 + a9; - - v18.x = a7; - v18.y = a8; - v18.z = a9; - - return v18; - } - }*/ - - - void c_ragebot::c_lby_breaker::update_animstate( ) { - if( !g_settings.rage.anti_aim( ) ) - return; - - if( !g_ctx.m_local->get_animstate( ) ) - return; - - auto cl = g_csgo.m_global_state->get_client_state( ); - if( !cl ) - return; - - if( g_cheat.m_lagmgr.get_choked( ) != 1 ) - return; - - float backup_curtime = g_csgo.m_globals->m_curtime; - float backup_frametime = g_csgo.m_globals->m_frametime; - - g_csgo.m_globals->m_curtime = g_ctx.pred_time( ); - g_csgo.m_globals->m_frametime = TICK_INTERVAL( ); - - vec3_t real_angle = g_ctx.m_thirdperson_angle; - - float pitch; - if( g_ctx.m_local->get_animstate( )->m_bInHitGroundAnimation && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - bool dist = g_settings.rage.enabled( ) && g_settings.rage.selection_type( ) == 1; - int target = util::get_closest_player( dist ); - - if( target != -1 ) { - auto t = g_csgo.m_entlist( )->GetClientEntity( target ); - - pitch = math::vector_angles( g_ctx.m_local->get_eye_pos( ), t->get_hitbox_pos( 0 ) ).x; - } - else - pitch = 0.f; - - real_angle.x = pitch; - } - - g_ctx.m_local->get_animstate( )->m_iLastClientSideAnimationUpdateFramecount -= 1; - g_ctx.m_local->get_animstate( )->update( real_angle.y, real_angle.x ); - g_ctx.m_local->cache_anim_data( false ); - - g_csgo.m_globals->m_curtime = backup_curtime; - g_csgo.m_globals->m_frametime = backup_frametime; - - if( g_ctx.m_local->get_animstate( )->m_velocity < 0.1f ) - g_ctx.m_local->get_animstate( )->m_velocity = 0.f; - - bool moving = g_ctx.m_local->get_animstate( )->m_velocity > 0.1f; - bool onground = g_ctx.m_local->get_animstate( )->m_bOnGround; - - float time = g_ctx.pred_time( ); - - if( onground ) { - if( moving ) { - m_next_update = time + 0.22f; - } else if( time > m_next_update ) { - m_next_update = time + 1.1f; - } - } - - if( g_ctx.m_tickbase > 0 ) { - //auto& cur_update = m_lby_updates[ g_ctx.m_tickbase % 64 ]; - //cur_update.m_tickbase = g_ctx.m_tickbase; - //cur_update.m_state = m_state; - } - } - - void c_ragebot::c_lby_breaker::on_lby_proxy( ) { - float oldsimtime_1tickfuture = g_ctx.m_local->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - int oldsimtime_ticks = TIME_TO_TICKS( oldsimtime_1tickfuture ); - - float latency = g_csgo.m_engine( )->GetNetChannelInfo( )->GetLatency( 0 ) + g_csgo.m_globals->m_interval_per_tick; - for( auto& it : m_lby_updates ) { - if( it.m_tickbase == oldsimtime_ticks ) { - //if( it.m_state == BS_BREAKING ) - //m_next_update = oldsimtime_1tickfuture + 1.1f - latency; - break; - - } - } - } - - int c_ragebot::c_lby_breaker::get_next_update( ) const { - auto current_tick = TIME_TO_TICKS( g_ctx.pred_time( ) ); - auto update_tick = TIME_TO_TICKS( m_next_update ); - - return update_tick - current_tick; - } - - void c_ragebot::c_lby_breaker::override_angles( float* angles, float original, float offset, bool freestanding ) { - static bool was_breaking = false; - static float last_angle = 0.f; - const float angle = original; - int update_ticks = get_next_update( ); - - if( g_cheat.m_lagmgr.get_state( ) ) - return; - - if( g_cheat.m_lagmgr.get_choked( ) ) - return; - - //yep - if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) - return; - - bool breaking = g_ctx.m_local->get_animstate( )->m_velocity < 0.1f; - float break_angle = angle + offset; - - float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); - float real = angle; - float delta = std::remainderf( lby - real, 360.f ); - - if( std::abs( delta ) < 37.f && breaking ) { - if( update_ticks < -TIME_TO_TICKS( 1.f ) ) { - *angles = break_angle; - return; - } - } - - if( freestanding && g_settings.rage.lby_avoid_updates && was_breaking ) { - if( std::abs( std::remainderf( original - last_angle, 360.f ) ) > 50.f - && update_ticks < 1 ) { - break_angle = last_angle; - offset = std::remainderf( original - last_angle, 360.f ); - } - } - - if( std::abs( offset ) < 105 ) { - int min_tick = g_cheat.m_ragebot.m_antiaim->is_fakewalking( ) ? g_settings.rage.fakewalk_ticks( ) + 2 : 4; - if( update_ticks < min_tick && update_ticks >= 1 ) { - *angles = break_angle + ( offset < 0 ? 105 : -105 ); - return; - } - } - - if( breaking && update_ticks < 1 ) { - *angles = break_angle; - if( !freestanding ) { - last_angle = break_angle; - was_breaking = true; - } - } - - //g_ctx.m_thirdperson_angle.y = *angles; - } - - void c_ragebot::c_antiaim::fix_movement( ) { - if( !g_settings.rage.anti_aim && !g_settings.rage.enabled ) - return; - - float pitch = std::remainderf( m_cmd->m_viewangles.x, 360.f ); - bool fix_forward_move = ( pitch < -90.f || pitch > 90.f ); - - auto last_cmd = g_ctx.get_last_cmd( ); - auto old_yaw = last_cmd->m_viewangles.y; - auto cur_yaw = m_cmd->m_viewangles.y; - - float yaw_delta = cur_yaw - old_yaw; - - float f1 = old_yaw < 0.f ? old_yaw + 360.f : old_yaw; - float f2 = cur_yaw < 0.f ? cur_yaw + 360.f : cur_yaw; - - if( f2 < f1 ) - yaw_delta = abs( f2 - f1 ); - else - yaw_delta = 360.f - abs( f1 - f2 ); - yaw_delta = 360.f - yaw_delta; - - m_cmd->m_forwardmove = cos( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + cos( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; - m_cmd->m_sidemove = sin( yaw_delta * M_PIRAD ) * last_cmd->m_forwardmove + sin( ( yaw_delta + 90.f ) * M_PIRAD ) * last_cmd->m_sidemove; - - if( fix_forward_move ) - m_cmd->m_forwardmove *= -1.f; - - if( g_ctx.m_local->m_nMoveType( ) != MOVETYPE_LADDER && g_settings.rage.fix_legs( ) ) { - if( m_cmd->m_forwardmove ) { - m_cmd->m_buttons &= ~( m_cmd->m_forwardmove < 0 ? IN_FORWARD : IN_BACK ); - m_cmd->m_buttons |= ( m_cmd->m_forwardmove > 0 ? IN_FORWARD : IN_BACK ); - } - if( m_cmd->m_sidemove ) { - m_cmd->m_buttons &= ~( m_cmd->m_sidemove < 0 ? IN_MOVERIGHT : IN_MOVELEFT ); - m_cmd->m_buttons |= ( m_cmd->m_sidemove > 0 ? IN_MOVERIGHT : IN_MOVELEFT ); - } - } - } - - bool c_ragebot::c_antiaim::run_edge_dtc( ) { - if( !g_settings.rage.edge_dtc_normal ) - return false; - - if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) - return false; - - if( g_settings.rage.edge_dtc_normal == 1 ) { - float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); - if( speed < 30.f ) return false; - } - - bool peeking = g_ctx.m_local->m_vecVelocity( ).length( ) > 30.f; - if( is_fakewalking( ) ) peeking = false; - CTraceFilterWorldAndPropsOnly filter; - - float max_dist = peeking ? g_settings.rage.edge_dtc_moving : g_settings.rage.edge_dtc_standing; - float min_dist = 64.f; - float edge_yaw = 0.f; - float final_yaw = 0.f; - bool detected = false; - - const float step = 45.f; - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - - for( float rot = -180.f; rot < 180.f; rot += step ) { - float rot_left = rot - 90.f; - float rot_right = rot + 90.f; - - vec3_t pos_left = math::get_rotated_pos( eye_pos, rot_left, 30.f ); - vec3_t pos_right = math::get_rotated_pos( eye_pos, rot_right, 30.f ); - - vec3_t forward = math::angle_vectors( vec3_t( 0.f, rot, 0.f ) ); - forward *= 4000.f; - - CGameTrace trace_left, trace_right; - Ray_t ray_left, ray_right; - - ray_left.Init( pos_left, pos_left + forward ); - ray_right.Init( pos_right, pos_right + forward ); - - g_csgo.m_trace( )->TraceRay( ray_left, MASK_SHOT_HULL, &filter, &trace_left ); - g_csgo.m_trace( )->TraceRay( ray_right, MASK_SHOT_HULL, &filter, &trace_right ); - - float dist_left = ( pos_left - trace_left.endpos ).length( ); - float dist_right = ( pos_right - trace_right.endpos ).length( ); - - if( dist_right > dist_left ) { - if( dist_right > max_dist && dist_left < min_dist ) { - max_dist = dist_right; - edge_yaw = rot_left; - detected = true; - } - } - else { - if( dist_left > max_dist && dist_right < min_dist ) { - max_dist = dist_left; - edge_yaw = rot_right; - detected = true; - } - } - } - - if( !detected ) - return false; - - final_yaw = edge_yaw; - if( g_cheat.m_lagmgr.get_state( ) ) { - final_yaw = edge_yaw + 180.f; - } - - m_cmd->m_viewangles.y = final_yaw; - return true; - } - - float get_damage( const vec3_t& start, const vec3_t& end, c_base_player* a, c_base_player* b ) { - static weapon_info_t wpn_data{ }; - wpn_data.damage = 200; - wpn_data.range_modifier = 1.0f; - wpn_data.penetration = 3.0f; - wpn_data.armor_ratio = 0.5f; - wpn_data.range = 8192.f; - - fire_bullet_data_t data{ }; - data.src = start; - data.filter.pSkip = a; - - data.travel_range = ( end - data.src ).length( ); - data.traveled = 0.f; - data.to_travel = data.travel_range; - - vec3_t angle = math::vector_angles( start, end ); - data.direction = math::angle_vectors( angle ); - - data.direction.normalize_vector( ); - - if( g_cheat.m_autowall.fire_bullet( a, b, &wpn_data, data, false, false ) ) { - return data.current_damage; - } - - return -1.f; - } - - vec3_t trace_ent_pos( vec3_t start, vec3_t end, c_base_player* ent ) { - Ray_t ray; - CGameTrace tr; - CTraceFilter filter; - - const vec3_t min( -2.f, -2.f, -2.f ); - const vec3_t max( 2.f, 2.f, 2.f ); - - ray.Init( start, end, min, max ); - filter.pSkip = ent; - - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); - - return tr.endpos; - } - - float get_min_dist( vec3_t origin ) { - const float max_dist = 150.f; - float dist = 0.f; - float ret = FLT_MAX; - - CTraceFilterWorldAndPropsOnly filter; - CGameTrace tr; - Ray_t ray; - - for( size_t f = 0.f; f < 360.f; f += 45.f ) { - vec3_t rotated = math::get_rotated_pos( origin, f, max_dist ); - - ray.Init( origin, rotated ); - - g_csgo.m_trace( )->TraceRay( ray, MASK_SOLID, &filter, &tr ); - dist = tr.endpos.dist_to( origin ); - - if( dist <= 75.f ) - return 75.f; - - if( dist < ret ) - ret = dist; - } - - return ret; - } - - bool c_ragebot::c_antiaim::run_freestanding( int player ) { - if( !g_settings.rage.edge_detection ) - return false; - - if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) - return false; - - bool is_fake = g_cheat.m_lagmgr.get_state( ); - vec3_t enemy_pos; - vec3_t local_pos; - - vec3_t aim_angle; - - float cur_damage{ 30.f }; - bool direction{ false }; - int enemy_index; - - enemy_index = player == -1 ? util::get_closest_player( ) : player; - - if( enemy_index == -1 ) - return false; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( enemy_index ); - - if( !ent || !ent->is_valid( ) ) - return false; - - enemy_pos = ent->m_vecOrigin( ); - enemy_pos.z = ent->get_hitbox_pos( 0 ).z; - - local_pos = g_ctx.m_local->get_eye_pos( ); - aim_angle = math::vector_angles( enemy_pos, local_pos ); - - float local_dist = get_min_dist( local_pos ); - float enemy_dist = get_min_dist( enemy_pos ); - - float start_dmg = get_damage( enemy_pos, local_pos, ent, g_ctx.m_local ); - - auto test_dmg = [ & ]( float dist, float enemy_dist, float delta = 50.f ) { - vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y - 90.f, enemy_dist ); - vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_dist ); - - enemy_left = trace_ent_pos( enemy_pos, enemy_left, ent ); - enemy_right = trace_ent_pos( enemy_pos, enemy_right, ent ); - - vec3_t local_left = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, dist ); - vec3_t local_right = math::get_rotated_pos( local_pos, aim_angle.y - 90.f, dist ); - - local_left = trace_ent_pos( local_pos, local_left, g_ctx.m_local ); - local_right = trace_ent_pos( local_pos, local_right, g_ctx.m_local ); - - float dmg_left = get_damage( enemy_left, local_left, ent, g_ctx.m_local ) - + get_damage( enemy_right, local_left, ent, g_ctx.m_local ); - - float dmg_right = get_damage( enemy_left, local_right, ent, g_ctx.m_local ) - + get_damage( enemy_right, local_right, ent, g_ctx.m_local ); - - if( std::abs( dmg_left - dmg_right ) < delta ) - return false; - - float max_dmg = math::max( dmg_left, dmg_right ); - direction = dmg_left > dmg_right; - - cur_damage = max_dmg; - return max_dmg > delta; - }; - - float radius = std::floorf( ( g_ctx.m_local->get_hitbox_pos( 0 ) - g_ctx.m_local->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); - radius = radius >= 15.f ? 20.f : 10.f; - - float enemy_radius = std::floorf( ( ent->get_hitbox_pos( 0 ) - ent->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); - enemy_radius = enemy_radius >= 15.f ? 20.f : 10.f; - - if( !test_dmg( radius + 1.f, enemy_radius + 1.f, 25.f ) ) { - if( cur_damage < start_dmg * 2.f ) - return false; - } - - bool found = false; - - for( size_t i = 5; i > 0; --i ) { - float cur_dist = local_dist / i; - float cur_enemy_dist = enemy_dist / i; - - if( cur_dist < radius ) - continue; - - if( cur_enemy_dist < enemy_radius ) - continue; - - if( test_dmg( cur_dist, cur_enemy_dist, 125.f / i ) ) { - found = true; - break; - } - else if( cur_damage > 125.f / i ) - break; - } - - if( !found ) - return false; - - m_direction = direction; - aim_angle.y += direction ? -90.f : 90.f; - - if( g_settings.rage.angle_step ) { - aim_angle.y = math::find_closest_step( aim_angle.y, g_settings.rage.angle_step_degrees ); - } - - if( g_settings.rage.pitch == 3 && g_settings.rage.break_lby_edge && m_breaker.get_next_update( ) < 2 && g_ctx.m_local->get_animstate( )->m_velocity < 0.1f ) { - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - vec3_t rotated_pos = math::get_rotated_pos( eye_pos, aim_angle.y - 180.f, 25.f ); - - vec3_t velocity = g_ctx.m_local->m_vecVelocity( ); - - vec3_t middle_pos = eye_pos + velocity * TICK_INTERVAL( ) * 2.f; - middle_pos.z += 10.f; - - int dmg_rot = get_damage( enemy_pos, rotated_pos, ent, g_ctx.m_local ); - int dmg_mid = get_damage( enemy_pos, middle_pos, ent, g_ctx.m_local ); - - if( dmg_mid < dmg_rot ) - m_cmd->m_viewangles.x = 0.f; - } - - if( is_fake ) { - int jitter = g_settings.rage.edge_dtc_jitter; - if( jitter ) { - aim_angle.y += math::random_number< float >( -jitter, jitter ); - } - aim_angle.y -= 180.f; - } - else { - int jitter = g_settings.rage.edge_dtc_real_jitter; - if (jitter) { - aim_angle.y += math::random_number< float >(-jitter, jitter); - } - } - - m_cmd->m_viewangles.y = aim_angle.clamp( ).y; - return true; - } - - void c_ragebot::c_antiaim::run_fakewalk( ) { - m_is_fakewalking = false; - if( !g_ctx.m_local->get_weapon( ) ) - return; - - bool in_move = ( m_cmd->m_buttons & IN_FORWARD ) || ( m_cmd->m_buttons & IN_BACK ) || ( m_cmd->m_buttons & IN_LEFT ) || ( m_cmd->m_buttons & IN_RIGHT ); - - if( !m_cmd->m_sidemove && !m_cmd->m_forwardmove && !g_ctx.m_local->m_vecVelocity( ) && !in_move ) - return; - - if( !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) - return; - - if( m_cmd->m_buttons & IN_WALK ) { - m_cmd->m_buttons &= ~IN_WALK; - } - - if( m_cmd->m_buttons & IN_SPEED ) { - m_cmd->m_buttons &= ~IN_SPEED; - } - - m_is_fakewalking = true; - - auto velocity = g_ctx.m_local->m_vecVelocity( ); - - static auto predict_velocity = [ ]( vec3_t* velocity ) { - static auto sv_friction = g_csgo.m_cvar( )->FindVar( xors( "sv_friction" ) ); - static auto sv_stopspeed = g_csgo.m_cvar( )->FindVar( xors( "sv_stopspeed" ) ); - - float speed = velocity->length( ); - if( speed >= 0.1f ) { - //if it works, it works - float friction = sv_friction->get_float( ) * 1.12f; - float stop_speed = std::max< float >( speed, sv_stopspeed->get_float( ) ); - float time = std::max< float >( g_csgo.m_globals->m_interval_per_tick, g_csgo.m_globals->m_frametime ); - *velocity *= std::max< float >( 0.f, speed - friction * stop_speed * time / speed ); - } - }; - - static auto quick_stop = [ & ]( ) { - vec3_t vel = g_ctx.m_local->m_vecVelocity( ); - float speed = vel.length2d( ); - - if( speed < 0.1f ) { - g_ctx.get_last_cmd( )->m_forwardmove = 0.f; - g_ctx.get_last_cmd( )->m_sidemove = 0.f; - return; - } - - static auto sv_accelerate = g_csgo.m_cvar( )->FindVar( xors( "sv_accelerate" ) ); - float accel = sv_accelerate->get_float( ); - float max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed; - if( g_ctx.m_local->get_weapon( )->is_sniper( ) && g_ctx.m_local->m_bIsScoped( ) ) { - max_speed = g_ctx.m_local->get_weapon( )->get_wpn_info( )->max_speed_alt; - } - - if( g_ctx.m_local->m_fFlags( ) & FL_DUCKING ) { - max_speed /= 3.f; - accel /= 3.f; - } - - float surf_friction = 1.f; - float max_accelspeed = accel * g_csgo.m_globals->m_interval_per_tick * max_speed * surf_friction; - - float wishspeed{ }; - - if( speed - max_accelspeed <= -1.f ) { - wishspeed = max_accelspeed / ( speed / ( accel * g_csgo.m_globals->m_interval_per_tick ) ); - } - else { - wishspeed = max_accelspeed; - } - - vec3_t ndir = math::vector_angles( vel * -1.f ); - ndir.y = g_csgo.m_engine( )->GetViewAngles( ).y - ndir.y; - ndir = math::angle_vectors( ndir ); - - g_ctx.get_last_cmd( )->m_forwardmove = ndir.x * wishspeed; - g_ctx.get_last_cmd( )->m_sidemove = ndir.y * wishspeed; - }; - - int ticks_to_stop; - for( ticks_to_stop = 0; ticks_to_stop < 15; ++ticks_to_stop ) { - if( velocity.length2d( ) < 0.1f ) - break; - - predict_velocity( &velocity ); - } - - int update_ticks = m_breaker.get_next_update( ) - 1; - - const int max_ticks = math::min< int >( g_settings.rage.fakewalk_ticks, update_ticks ); - const int choked = g_cheat.m_lagmgr.get_choked( ); - int ticks_left = max_ticks - choked; - - if( choked < max_ticks || ticks_to_stop ) { - g_cheat.m_lagmgr.set_state( false ); - } - - if( ticks_left <= ticks_to_stop || !choked ) { - quick_stop( ); - } - } - - float c_ragebot::c_antiaim::get_pitch( ) { - switch( g_settings.rage.pitch( ) ) { - case 1: //custom - return float( g_settings.rage.pitch_offset( ) ); - case 2: //flip - return g_cheat.m_lagmgr.get_state( ) ? 75.f : 89.f; - case 3: - return 89.f; - case 4: - return 1080.f + g_settings.rage.pitch_offset( ); - case 5: - return -1080.f + g_settings.rage.pitch_offset( ); - case 6: - return m_cmd->m_cmd_nr % 2 ? 1080.f : -1080.f; - case 7: //random - return math::random_number( -89.f, 89.f ); - } - - return 0.f; - } - - float c_ragebot::c_antiaim::get_yaw( bool fake, float original, bool no_jitter ) { - constexpr static double rate = 360.0 / 1.618033988749895; - constexpr static int switch_rate = 10; - static float last_onground = 0.f; - static int ticks = 0; - static bool side_switch = false; - bool on_ground = false; - - int setting = fake ? g_settings.rage.fake_yaw : g_settings.rage.real_yaw; - int jitter = fake ? g_settings.rage.fake_yaw_jitter : g_settings.rage.real_yaw_jitter; - int add = fake ? g_settings.rage.fake_yaw_add : g_settings.rage.real_yaw_add; - if( !g_ctx.m_local->get_animstate( )->m_bOnGround ) { - if( !fake && g_settings.rage.air_yaw( ) ) { - setting = g_settings.rage.air_yaw; - jitter = g_settings.rage.air_yaw_jitter; - add = g_settings.rage.air_yaw_add; - } - } - else if( g_ctx.m_local->m_vecVelocity( ).length( ) > 0.1f && !is_fakewalking( ) ) { - if( !fake && g_settings.rage.real_yaw_moving( ) ) { - setting = g_settings.rage.real_yaw_moving( ); - jitter = g_settings.rage.real_moving_jitter( ); - add = g_settings.rage.real_yaw_moving_add( ); - } - } - - on_ground = g_ctx.m_local->get_animstate( )->m_bOnGround; - - if( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) { - last_onground = g_ctx.pred_time( ); - } - - ticks++; - if( ticks > switch_rate ) { - side_switch ^= 1; - ticks = 0; - } - - float rand = 0.f; - if( setting && jitter && !no_jitter ) { - rand = math::random_number( -float( jitter ), float( jitter ) ); - } - - if( setting && add ) { - original += add; - } - - switch( setting ) { - case 0: - return g_csgo.m_engine( )->GetViewAngles( ).y; - case 1: //back - return original - 180.f + rand; - case 2: {//back spin - float time = on_ground ? g_csgo.m_globals->m_curtime * 0.5f : ( g_csgo.m_globals->m_curtime - last_onground ); - float range = on_ground ? jitter : jitter * 2.f; - return original - 180.f - range * 0.5f + ( no_jitter ? range : std::fmod( time * rate, range + 1.f ) ); - } - case 3: //sideways - return rand + ( fake ? ( side_switch ? original + 90.f : original - 90.f ) : - ( side_switch ? original - 90.f : original + 90.f ) ); - case 4: //slowpin lol - return rand + std::fmod( g_csgo.m_globals->m_curtime * rate, 360.f ); - case 5: //random - return math::random_number( -180.f, 180.f ); - case 6: //direction - return rand + ( fake ? ( m_direction ? original - 90.f : original + 90.f ) : - ( m_direction ? original + 90.f : original - 90.f ) ); - case 7: - return original - 180.f + ( no_jitter ? 0 : ( side_switch ? -jitter : jitter ) ); - } - - return original; - } - - float c_ragebot::c_antiaim::get_yaw( bool no_jitter ) { - const auto is_fake = g_cheat.m_lagmgr.get_state( ); - auto original = g_ctx.get_last_cmd( )->m_viewangles.y; - - if( g_settings.rage.at_players ) { - auto closest_ent = util::get_closest_player( ); - if( closest_ent != -1 ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( closest_ent ); - if( ent ) { - vec3_t ang = math::vector_angles( g_ctx.m_local->m_vecOrigin( ), - ent->m_vecOrigin( ) ); - - original = ang.y; - } - } - } - - if( is_fake && !g_settings.rage.fake_yaw( ) ) - return original; - if( !is_fake && !g_settings.rage.real_yaw( ) ) - return original; - - if( g_settings.rage.angle_step( ) && g_settings.rage.angle_step_degrees( ) ) { - float step = float( g_settings.rage.angle_step_degrees( ) ); - original = math::find_closest_step( original, step ); - } - return get_yaw( is_fake, original, no_jitter ); - } - - void c_ragebot::c_antiaim::run( ) { - m_is_edging = false; - if( !g_settings.rage.anti_aim( ) ) - return; - - auto is_everyone_dormant = [ ]( ) { - for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - if( ent && ent->is_valid( ) && - ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) - || g_settings.rage.friendlies ) ) { - return false; - } - } - - return true; - }; - - if( ( m_cmd->m_forwardmove || m_cmd->m_sidemove ) && - ( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || - g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) ) - return; - - if( g_ctx.m_local->m_fFlags( ) & FL_FROZEN ) - return; - - if( is_everyone_dormant( ) && g_settings.rage.dormant_check ) - return; - - if( g_settings.rage.fakewalk( ) && g_input.is_key_pressed( g_settings.rage.fakewalk_key( ) ) ) { - run_fakewalk( ); - } - else { - m_is_fakewalking = false; - } - - if( ( m_cmd->m_buttons & IN_ATTACK ) && g_ctx.m_local->can_attack( ) ) - return; - - if( *( bool* )( c_base_player::get_game_rules( ) + 0x20 ) ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( weapon && weapon->is_grenade( ) ) { - if( weapon->m_fThrowTime( ) > g_csgo.m_globals->m_interval_per_tick ) { - return; - } - } - - if( ( m_cmd->m_buttons & IN_ATTACK2 ) && weapon->is_knife( ) && g_ctx.m_local->can_attack( ) ) - return; - - if( m_cmd->m_buttons & IN_USE ) - return; - - if( g_settings.rage.real_yaw( ) || - g_settings.rage.fake_yaw( ) ) { - m_cmd->m_viewangles.y = get_yaw( ); - } - - if( g_settings.rage.pitch( ) ) { - m_cmd->m_viewangles.x = get_pitch( ); - } - - bool edge_detected = false; - bool freestanding = false; - - if( !g_settings.rage.edge_dtc_priority ) { - freestanding = run_freestanding( ); - if( !freestanding ) - edge_detected = run_edge_dtc( ); - } - else { - edge_detected = run_edge_dtc( ); - if( !edge_detected ) - freestanding = run_freestanding( ); - } - - m_is_edging = freestanding || edge_detected; - - if( g_settings.rage.break_lby( ) && ( !m_is_edging || g_settings.rage.break_lby_edge ) ) { - float yaw = m_is_edging ? m_cmd->m_viewangles.y : get_yaw( true ); - - m_breaker.override_angles( &m_cmd->m_viewangles.y, - yaw, - std::remainderf( 180.f - float( g_settings.rage.lby_delta ), 360.f ), - freestanding ); - } - - if( g_cheat.m_lagmgr.get_state( ) && !g_settings.rage.fake_yaw( ) ) - m_cmd->m_viewangles.y = g_csgo.m_engine( )->GetViewAngles( ).y; - - //since we're going to have fake pitches most likely - //make sure to clamp yaw anyway just in case some retard - //decides to enable untrusted shit in an mm server or w/e - m_cmd->m_viewangles.y = std::remainderf( m_cmd->m_viewangles.y, 360.f ); - } -} \ No newline at end of file diff --git a/internal_rewrite/ragebot_lagcomp.cpp b/internal_rewrite/ragebot_lagcomp.cpp deleted file mode 100644 index 5014143..0000000 --- a/internal_rewrite/ragebot_lagcomp.cpp +++ /dev/null @@ -1,657 +0,0 @@ -#include "ragebot.hpp" -#include "interface.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "mem.hpp" -#include "hooks.hpp" - -namespace features -{ - c_ragebot::lag_record_t::lag_record_t( c_base_player* ent ) : m_ent( ent ) { - if( !m_ent || !m_ent->is_valid( ) ) return; - m_valid = true; - - m_flSimulationTime = m_ent->m_flSimulationTime( ); - m_flOldSimulationTime = m_ent->m_flOldSimulationTime( ); - m_lastAnimTime = m_ent->get_animdata( ).m_last_animtime; - m_tickcount = TIME_TO_TICKS( m_flSimulationTime + util::get_lerptime( ) ); - m_choked = m_ent->get_choked_ticks( ); - - m_flLowerBodyYawTarget = m_ent->m_flLowerBodyYawTarget( ); - m_flCycle = m_ent->m_flCycle( ); - m_fFlags = m_ent->m_fFlags( ); - m_animDuck = m_ent->get_animdata( ).m_last_duck; - m_animVelocity = m_ent->get_animdata( ).m_anim_velocity; - m_prevVelocity = m_ent->get_animdata( ).m_last_velocity; - m_flDuckSpeed = m_ent->m_flDuckSpeed( ); - m_flDuckAmount = m_ent->m_flDuckAmount( ); - m_animFlags = m_ent->get_animdata( ).m_anim_flags; - - m_vecHeadPos = ent->get_hitbox_pos( 0 ); - m_vecPelvisPos = ent->get_hitbox_pos( HITBOX_PELVIS ); - - //we need mins/maxs because traces check them before checking if it hit a player - m_vecMins = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ); - m_vecMaxs = *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ); - - m_vecOrigin = m_ent->m_vecOrigin( ); - m_vecAngles = m_ent->m_angEyeAngles( ); - m_vecRenderAngles = m_ent->ce( )->GetRenderAngles( ); - m_vecRenderOrigin = m_ent->ce( )->GetRenderOrigin( ); - - memcpy( &m_state, - m_ent->get_animstate( ), - sizeof( CCSGOPlayerAnimState ) ); - - memcpy( m_PoseParameters, - m_ent->m_flPoseParameter( ), - sizeof( float ) * 24 ); - - memcpy( m_AnimLayers, - m_ent->m_AnimOverlay( ).GetElements( ), - sizeof( C_AnimationLayer ) * 13 ); - - for( int i{ }; i < 13; ++i ) - m_ent->m_AnimOverlay( ).GetElements( )[ i ].m_player = ent; - - m_valid = m_ent->ce( )->SetupBones( m_matrix, 128, BONE_USED_BY_HITBOX, m_flSimulationTime ); - } - - bool c_ragebot::lag_record_t::restore( bool recalculate, bool reanimate ) { - if( !m_ent || !m_ent->is_valid( ) ) return false; - - *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x8 ) = m_vecMins; - *( vec3_t* )( uintptr_t( m_ent ) + 0x318 + 0x14 ) = m_vecMaxs; - - memcpy( ( void* )( m_ent->m_CachedBoneData( ).GetElements( ) ), - m_matrix, - sizeof( matrix3x4 ) * m_ent->m_CachedBoneData( ).GetSize( ) ); - - if( !recalculate ) { - return true; - } - - m_ent->set_abs_angles( m_vecRenderAngles ); - - //m_ent->m_flDuckAmount( ) = m_flDuckAmount; - m_ent->m_flLowerBodyYawTarget( ) = m_flLowerBodyYawTarget; - m_ent->m_fFlags( ) = m_fFlags; - m_ent->m_flSimulationTime( ) = m_flSimulationTime; - - memcpy( m_ent->m_flPoseParameter( ), - m_PoseParameters, - sizeof( float ) * 24 ); - - memcpy( m_ent->m_AnimOverlay( ).GetElements( ), - m_AnimLayers, - sizeof( C_AnimationLayer ) * 13 ); - - //why? - //why not? - if( reanimate ) { - vec3_t velocity = m_ent->m_vecVelocity( ); - int backup_eflags = m_ent->get< int >( 0xe4 ); - int backup_byte = m_ent->get< byte >( 0x35f8 ); - - m_ent->m_vecVelocity( ) = m_animVelocity; - m_ent->get< vec3_t >( 0x94 ) = m_animVelocity; - m_ent->get< byte >( 0x35f8 ) = 1; - m_ent->get< int >( 0xe4 ) &= ~0x1000; - - m_state.m_flFeetYawRate = 0.f; - - float backup_curtime = g_csgo.m_globals->m_curtime; - float backup_frametime = g_csgo.m_globals->m_frametime; - - g_csgo.m_globals->m_curtime = m_flOldSimulationTime + TICK_INTERVAL( ); - g_csgo.m_globals->m_frametime = TICK_INTERVAL( ); - - m_state.m_iLastClientSideAnimationUpdateFramecount -= 1; - - g_cheat.m_ragebot.m_resolver->brute_force( m_ent ); - - float lby_delta = m_flLowerBodyYawTarget - m_ent->m_angEyeAngles( ).y; - lby_delta = std::remainderf( lby_delta, 360.f ); - lby_delta = std::clamp( lby_delta, -60.f, 60.f ); - - float feet_yaw = std::remainderf( m_ent->m_angEyeAngles( ).y + lby_delta, 360.f ); - if( feet_yaw < 0.f ) - feet_yaw += 360.f; - - m_state.m_flGoalFeetYaw = m_state.m_flCurrentFeetYaw = feet_yaw; - - float backup_duck = m_ent->m_flDuckAmount( ); - float backup_duckspeed = m_ent->m_flDuckSpeed( ); - - m_ent->m_flDuckSpeed( ) = m_flDuckSpeed; - m_ent->m_flDuckAmount( ) = m_animDuck; - - m_ent->m_fFlags( ) = m_animFlags; - - m_state.m_flLastClientSideAnimationUpdateTime = m_lastAnimTime; - m_state.update( m_ent->m_angEyeAngles( ).y, m_ent->m_angEyeAngles( ).x ); - - m_ent->m_fFlags( ) = m_fFlags; - - m_ent->m_flDuckAmount( ) = backup_duck; - m_ent->m_flDuckSpeed( ) = backup_duckspeed; - - g_csgo.m_globals->m_curtime = backup_curtime; - g_csgo.m_globals->m_frametime = backup_frametime; - - m_ent->m_vecVelocity( ) = velocity; - m_ent->get< vec3_t >( 0x94 ) = velocity; - m_ent->get< byte >( 0x35f8 ) = backup_byte; - m_ent->get< int >( 0xe4 ) = backup_eflags; - } - - m_ent->set_abs_origin( m_vecRenderOrigin ); - - byte backup = m_ent->get< byte >( 0x270 ); - - m_ent->get< byte >( 0x270 ) = 0; - m_ent->invalidate_bone_cache( ); - bool ret = m_ent->ce( )->SetupBones( m_matrix, 128, BONE_USED_BY_HITBOX, m_flSimulationTime + TICK_INTERVAL( ) ); - - m_ent->get< byte >( 0x270 ) = backup; - - return ret; - } - - bool c_ragebot::lag_record_t::is_valid( ) { - if( !m_valid ) return false; - - return util::is_tick_valid( m_tickcount ); - } - - void c_ragebot::c_lagcomp::restore_animations( ) { - if( g_csgo.m_engine( )->IsInGame( ) ) { - if( g_ctx.m_local ) { - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( ent && ent->is_player( ) ) { - ent->set_needs_interpolate( true ); - ent->invalidate_bone_cache( ); - ent->ce( )->SetupBones( nullptr, -1, BONE_USED_BY_ANYTHING, 0.f ); - - ent->m_bClientSideAnimation( ) = true; - } - } - } - } - } - - void c_ragebot::c_lagcomp::store_visuals( ) { - if( g_csgo.m_engine( )->IsInGame( ) ) { - static float last_simtime[ 65 ]{ }; - - if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - for( int i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - auto& data = m_data_render[ i ]; - - if( ent == g_ctx.m_local ) - continue; - - if( !ent || !ent->is_valid( ) || ent->m_bGunGameImmunity( ) ) { - data.clear( ); - continue; - } - - if( std::abs( last_simtime[ i ] - ent->m_flSimulationTime( ) ) && ent->has_valid_anim( ) ) { - render_record_t new_record; - new_record.m_simtime = ent->m_flSimulationTime( ) + util::get_lerptime( ); - new_record.m_origin = ent->m_vecOrigin( ); - - float delta = ent->m_flSimulationTime( ) - ent->m_flOldSimulationTime( ); - new_record.m_globaltime = g_csgo.m_globals->m_curtime; - - if( g_settings.legit.enabled( ) ) - new_record.m_globaltime -= TICK_INTERVAL( ); - - new_record.m_validtime = 0.f; - - if( ent->ce( )->SetupBones( new_record.m_matrix, 128, BONE_USED_BY_ANYTHING, 0.f ) ) { - data.push_front( new_record ); - } - - last_simtime[ i ] = ent->m_flSimulationTime( ); - } - - while( !data.empty( ) && - data.size( ) > TIME_TO_TICKS( 1.f ) ) { - data.pop_back( ); - } - } - } - } - } - - bool c_ragebot::c_lagcomp::get_render_record( int ent_index, matrix3x4* out ) { - if( !g_ctx.m_local || !g_ctx.m_local->is_valid( ) ) - return false; - - auto& data = m_data_render[ ent_index ]; - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - - auto is_time_valid = [ & ]( float time ) -> bool { - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( !nci ) return false; - - float latency = util::get_total_latency( ); - float correct = std::clamp( latency + util::get_lerptime( ), 0.f, 1.f ); - float delta = correct - ( g_csgo.m_globals->m_curtime - time ); - - return std::abs( delta ) <= 0.2f; - }; - - for( auto it = data.rbegin( ); it != data.rend( ); it++ ) { - if( ( it + 1 ) == data.rend( ) || is_time_valid( it->m_simtime ) || ( it + 1 )->m_simtime == ent->m_flSimulationTime( ) + util::get_lerptime( ) ) { - if( it->m_origin.dist_to( ent->m_vecOrigin( ) ) < 1.f ) - return false; - - if( ent->is_breaking_lc( ) ) - return false; - - auto next_record = ( it + 1 ); - - if( std::abs( it->m_simtime - ent->m_flSimulationTime( ) ) > TIME_TO_TICKS( 16 ) ) - break; - - if( !it->m_validtime ) - it->m_validtime = g_csgo.m_globals->m_curtime; - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - float latency = util::get_total_latency( ); - float correct = latency + util::get_lerptime( ); - - float choke = ent->m_flSimulationTime( ) - ent->m_flOldSimulationTime( ); - float lerptime = next_record == data.rend( ) ? choke : next_record->m_simtime - it->m_simtime; - - lerptime = std::max( lerptime, TICK_INTERVAL( ) ); - - float curtime = g_csgo.m_globals->m_curtime; - - float delta = ( curtime - it->m_validtime ) / lerptime; - - vec3_t next = ( it + 1 ) == data.rend( ) ? ent->m_vecOrigin( ) : ( it + 1 )->m_origin; - vec3_t lerp = math::lerp( it->m_origin, next, std::clamp( delta, 0.f, 1.f ) ); - - matrix3x4 ret[ 128 ]; - - util::memcpy( ret, - it->m_matrix, - sizeof( ret ) ); - - for( size_t i{ }; i < 128; ++i ) { - vec3_t matrix_delta = math::get_matrix_position( it->m_matrix[ i ] ) - it->m_origin; - math::set_matrix_position( matrix_delta + lerp, ret[ i ] ); - } - - util::memcpy( out, - ret, - sizeof( ret ) ); - - return true; - } - } - - return false; - } - - void c_ragebot::c_lagcomp::fsn_net_update_start( ) { - static bool restored = true; - - if( !g_settings.rage.enabled( ) ) { - if( !restored ) { - restore_animations( ); - restored = true; - } - - return; - } - - restored = false; - if( g_csgo.m_engine( )->IsInGame( ) ) { - if( g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { - ent->set_needs_interpolate( false ); - } - } - } - } - } - - void c_ragebot::c_lagcomp::fsn_render_start( ) { - if( !g_settings.rage.enabled( ) ) - return; - - if( !g_ctx.m_local ) - return; - - static bool invalidated = true; - if( !g_ctx.m_local->is_valid( ) ) { - if( !invalidated ) - restore_animations( ); - - invalidated = true; - return; - } - - invalidated = false; - - static float stored_lby[ 65 ]; - static bool was_dormant[ 65 ]; - - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_player( ) ) { - //invalidate_animstate( i ); - m_first_update[ i ] = true; - continue; - } - - if( ent == g_ctx.m_local ) { - if( g_ctx.m_stage == FRAME_RENDER_START ) { - //printf( "ya\n" ); - //hooks::update_clientside_animation( ent, 0 ); - } - continue; - } - - if( !ent->is_alive( ) ) { - ent->m_bClientSideAnimation( ) = true; - was_dormant[ i ] = true; - m_first_update[ i ] = true; - continue; - } - - if( ent->ce( )->IsDormant( ) ) { - ent->m_bClientSideAnimation( ) = true; - m_first_update[ i ] = true; - was_dormant[ i ] = true; - continue; - } - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) - && !g_settings.rage.friendlies ) { - ent->m_bClientSideAnimation( ) = true; - continue; - } - - ent->restore_anim_data( false ); - if( was_dormant[ i ] ) { - g_cheat.m_ragebot.m_resolver->update_player( i ); - ent->calc_anim_velocity( true ); - ent->fix_animations( true ); - ent->do_ent_interpolation( true ); - stored_lby[ i ] = ent->m_flLowerBodyYawTarget( ); - m_last_simtime[ i ] = ent->m_flSimulationTime( ); - m_flick_time[ i ] = FLT_MAX; - } - else if( g_ctx.m_stage == FRAME_RENDER_START ) { - ent->m_bClientSideAnimation( ) = false; - ent->do_ent_interpolation( was_dormant[ i ] ); - continue; - } - - was_dormant[ i ] = false; - - if( m_data_lby[ i ].size( ) && - m_data_lby[ i ].front( ).m_ent != ent ) { - m_data_lby[ i ].clear( ); - } - - if( m_data_normal[ i ].size( ) && - m_data_normal[ i ].front( ).m_ent != ent ) { - m_data_normal[ i ].clear( ); - } - - auto update_anims = [ this, &ent ]( int e ) { - ent->fix_animations( ); - }; - - - - float lby = ent->m_flLowerBodyYawTarget( ); - - float last_simtime = m_last_simtime[ i ]; - float simtime = ent->m_flSimulationTime( ); - - if( !!std::abs( simtime - last_simtime ) ) { - g_cheat.m_ragebot.m_resolver->update_player( i ); - bool yaw_change = g_cheat.m_ragebot.m_resolver->yaw_change( i ); - - ent->calc_anim_velocity( was_dormant[ i ] ); - - bool is_moving = ent->get_anim_velocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) - && ( ent->m_fFlags( ) & FL_ONGROUND ); - - if( ent->m_bGunGameImmunity( ) ) { - update_anims( i ); - } - - else if( is_moving && !was_dormant[ i ] && g_settings.rage.resolver ) { - m_first_update[ i ] = false; - ent->m_angEyeAngles( ).y = lby; - - update_anims( i ); - lag_record_t new_record( ent ); - - m_data_lby[ i ].push_front( new_record ); - stored_lby[ i ] = lby; - } - - else if( ( lby != stored_lby[ i ] ) && !was_dormant[ i ] && g_settings.rage.resolver ) { - stored_lby[ i ] = lby; - ent->m_angEyeAngles( ).y = lby; - - update_anims( i ); - lag_record_t new_record( ent ); - - if( !m_first_update[ i ] ) { - m_data_lby[ i ].push_front( new_record ); - m_flick_time[ i ] = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - } - - m_first_update[ i ] = false; - } - else { - bool has_updated = false; - if( g_settings.rage.resolver( ) ) { - float anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - - if( anim_time - m_flick_time[ i ] > 1.1f && !m_first_update[ i ] ) { - has_updated = true; - - ent->m_angEyeAngles( ).y = lby; - m_flick_time[ i ] = anim_time; - update_anims( i ); - lag_record_t new_record( ent ); - new_record.m_balanceadjust = true; - m_data_lby[ i ].push_front( new_record ); - } - } - - if( !has_updated ) { - ent->fix_animations( false, yaw_change ); - - lag_record_t new_record( ent ); - new_record.m_sim_record = true; - - new_record.m_shots = g_cheat.m_ragebot.m_resolver->get_shots( i ); - - m_data_normal[ i ].push_front( new_record ); - } - } - - - g_cheat.m_ragebot.m_resolver->yaw_change( i ) = false; - } - - ent->do_ent_interpolation( false ); - m_last_simtime[ i ] = simtime; - - while( !m_data_lby[ i ].empty( ) && - m_data_lby[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { - m_data_lby[ i ].pop_back( ); - } - - while( !m_data_normal[ i ].empty( ) && - m_data_normal[ i ].size( ) > TIME_TO_TICKS( 1.0f ) ) { - m_data_normal[ i ].pop_back( ); - } - } - } - - RecordType_t c_ragebot::c_lagcomp::can_backtrack_entity( int ent_index ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - if( ent->is_breaking_lc( ) ) { - return RECORD_NONE; - } - - auto data_lby = &m_data_lby[ ent_index ]; - auto data_normal = &m_data_normal[ ent_index ]; - - if( !data_lby->empty( ) ) { - for( auto& it : *data_lby ) { - if( it.is_valid( ) ) return RECORD_LBY; - } - } - - if( !data_normal->empty( ) ) { - for( auto& it : *data_normal ) { - if( it.is_valid( ) ) return RECORD_NORMAL; - } - } - - return RECORD_NONE; - } - - void c_ragebot::c_lagcomp::invalidate_bone_caches( ) { - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); - if( !ent || !ent->is_player( ) ) - continue; - - ent->m_iMostRecentModelBoneCounter( ) -= 1; - ent->m_flLastBoneSetupTime( ) = -FLT_MAX; - } - } - - c_ragebot::lag_record_t* c_ragebot::c_lagcomp::get_newest_record( int ent_index ) { - lag_record_t* newest_record{ }; - if( get_records( ent_index, RECORD_LBY )->size( ) ) - newest_record = &get_records( ent_index, RECORD_LBY )->front( ); - - if( get_records( ent_index, RECORD_NORMAL )->size( ) ) { - auto& newest_rec = get_records( ent_index, RECORD_NORMAL )->front( ); - if( ( newest_record && newest_rec.m_flSimulationTime > newest_record->m_flSimulationTime ) || - !newest_record ) { - newest_record = &newest_rec; - } - } - - return newest_record; - } - - c_ragebot::lag_record_t* c_ragebot::c_lagcomp::get_newest_valid_record( int ent_index ) { - lag_record_t* last_simtime_record{ }; - for( auto& it : *get_records( ent_index, RECORD_LBY ) ) { - if( !it.is_valid( ) ) continue; - last_simtime_record = ⁢ - break; - } - - for( auto& it : *get_records( ent_index, RECORD_NORMAL ) ) { - if( !it.is_valid( ) ) continue; - if( !last_simtime_record || ( last_simtime_record && it.m_flSimulationTime > last_simtime_record->m_flSimulationTime ) ) { - last_simtime_record = ⁢ - } - break; - } - - return last_simtime_record; - } - - int c_ragebot::c_lagcomp::backtrack_entity( int ent_index, RecordType_t type, lag_record_t** out_record ) { - if( type == RECORD_NONE ) return -1; - - auto& data = *get_records( ent_index, type ); - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - - auto check_record = [ &ent, &out_record, &ent_index ]( lag_record_t* record, bool check_pelvis ) { - if( record->m_balanceadjust && record->m_shot ) return -1; - - vec3_t head_pos = record->m_vecHeadPos; - vec3_t pelvis_pos = record->m_vecPelvisPos; - - float damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, head_pos, false ) * 4.f; - float min_damage = std::min< float >( ent->m_iHealth( ), - g_settings.rage.active->m_damage ); - - //g_con->log( xors( "record: %d damage: %f" ), counter++, damage ); - - int shots = g_cheat.m_ragebot.m_resolver->get_shots( ent_index ); - bool recalc = shots != record->m_shots && record->m_sim_record; - - - if( damage > min_damage ) { - if( !record->restore( recalc, recalc ) ) - return -1; - - if( out_record ) { - *out_record = record; - } - return record->m_tickcount; - } - - if( check_pelvis ) { - float pelvis_damage = g_cheat.m_autowall.run( g_ctx.m_local, ent, pelvis_pos, false ); - if( pelvis_damage > min_damage ) { - if( !record->restore( recalc, recalc ) ) - return -1; - - if( out_record ) { - *out_record = record; - } - return record->m_tickcount; - } - } - - return -1; - }; - - if( data.empty( ) ) - return -1; - - auto* back = &data.back( ); - auto* front = &data.front( ); - - for( auto& it : data ) { - if( !it.is_valid( ) ) continue; - front = ⁢ - break; - } - - for( auto& it : util::reverse_iterator( data ) ) { - if( !it.is_valid( ) ) continue; - back = ⁢ - break; - } - - int front_result = check_record( front, true ); - if( front_result != -1 ) return front_result; - - int back_result = check_record( back, true ); - if( back_result != -1 ) return back_result; - - return -1; - } -} \ No newline at end of file diff --git a/internal_rewrite/ragebot_resolver.cpp b/internal_rewrite/ragebot_resolver.cpp deleted file mode 100644 index 1b29305..0000000 --- a/internal_rewrite/ragebot_resolver.cpp +++ /dev/null @@ -1,626 +0,0 @@ -#include "ragebot.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "math.hpp" -#include "input_system.hpp" - -namespace features -{ - constexpr float FLT_ANG_LBY = 360.f; - constexpr float FLT_ANG_MOVING_LBY_UP = -360.f; - constexpr float FLT_ANG_180 = 720.f; - constexpr float FLT_ANG_FREESTANDING = -720.f; - constexpr float FLT_ANG_90 = 480.f; - constexpr float FLT_ANG_MINUS_90 = -480.f; - constexpr float FLT_ANG_MINUS_135 = -700.f; - constexpr float FLT_ANG_135 = 700.f; - constexpr float FLT_ANG_PITCH_UP = 1080.f; - - static const std::vector< float > possible_angles_none = { - FLT_ANG_MOVING_LBY_UP, - FLT_ANG_180, - FLT_ANG_90, - FLT_ANG_MINUS_90, - FLT_ANG_MINUS_135, - FLT_ANG_135, - }; - - static const std::vector< float > possible_angles_normal = { - FLT_ANG_MOVING_LBY_UP, - FLT_ANG_180, - FLT_ANG_135, - FLT_ANG_MINUS_135 - }; - - static const std::vector< float > possible_angles_freestanding = { - 0.f, - 45.f, - 90.f, - 135.f, - 180.f, - }; - - bool dbg_resolver( ) { - static con_var< bool > var{ &data::holder_, fnv( "dbg_resolver" ), false }; - return var( ); - } - - int c_ragebot::c_resolver::try_freestanding( c_base_player* ent ) { - if( !( ent->m_fFlags( ) & FL_ONGROUND ) || ( ent->get_anim_velocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) ) ) - return -1; - - int ret_dir = -1; - float cur_damage = 0.f; - - vec3_t enemy_pos = ent->m_vecOrigin( ); - enemy_pos.z = ent->get_hitbox_pos( 0 ).z; - - vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); - local_pos -= g_ctx.m_local->m_vecOrigin( ); - local_pos += g_ctx.m_last_origin; - - vec3_t aim_angle = math::vector_angles( - enemy_pos, - local_pos - ); - - auto get_damage = [ & ]( const vec3_t& start, const vec3_t& end, c_base_player* a, c_base_player* b ) { - static weapon_info_t wpn_data{ }; - wpn_data.damage = 200; - wpn_data.range_modifier = 1.0f; - wpn_data.penetration = 3.0f; - wpn_data.armor_ratio = 0.5f; - wpn_data.range = 8192.f; - - fire_bullet_data_t data{ }; - data.src = start; - data.travel_range = ( end - data.src ).length( ); - data.traveled = 0.f; - data.to_travel = data.travel_range; - - vec3_t angle = math::vector_angles( start, end ); - data.direction = math::angle_vectors( angle ); - - data.direction.normalize_vector( ); - - if( g_cheat.m_autowall.fire_bullet( a, b, &wpn_data, data, false, false ) ) { - return data.current_damage; - } - - return -1.f; - }; - - auto trace_ent_pos = [ & ]( vec3_t start, vec3_t end, c_base_player* ent ) { - Ray_t ray; - CGameTrace tr; - CTraceFilter filter; - - const vec3_t min( -2.f, -2.f, -2.f ); - const vec3_t max( 2.f, 2.f, 2.f ); - - ray.Init( start, end, min, max ); - filter.pSkip = ent; - - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr ); - - return tr.endpos; - }; - - float local_dist = 75.f; - float enemy_dist = 75.f; - - float start_dmg = get_damage( enemy_pos, local_pos, g_ctx.m_local, ent ); - - auto test_dmg = [ & ]( float dist, float enemy_dist, float delta = 50.f ) { - vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y - 90.f, enemy_dist ); - vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_dist ); - - enemy_left = trace_ent_pos( enemy_pos, enemy_left, ent ); - enemy_right = trace_ent_pos( enemy_pos, enemy_right, ent ); - - vec3_t local_left = math::get_rotated_pos( local_pos, aim_angle.y + 90.f, dist ); - vec3_t local_right = math::get_rotated_pos( local_pos, aim_angle.y - 90.f, dist ); - - local_left = trace_ent_pos( local_pos, local_left, g_ctx.m_local ); - local_right = trace_ent_pos( local_pos, local_right, g_ctx.m_local ); - - float dmg_left = get_damage( local_left, enemy_left, g_ctx.m_local, ent ) - + get_damage( local_right, enemy_left, g_ctx.m_local, ent ); - - float dmg_right = get_damage( local_left, enemy_right, g_ctx.m_local, ent ) - + get_damage( local_right, enemy_right, g_ctx.m_local, ent ); - - if( std::abs( dmg_left - dmg_right ) < delta ) - return false; - - float max_dmg = math::max( dmg_left, dmg_right ); - ret_dir = dmg_left > dmg_right; - - cur_damage = max_dmg; - return max_dmg > delta; - }; - - float radius = std::floorf( ( g_ctx.m_local->get_hitbox_pos( 0 ) - g_ctx.m_local->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); - radius = radius >= 15.f ? 20.f : 10.f; - - float enemy_radius = std::floorf( ( ent->get_hitbox_pos( 0 ) - ent->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) ); - enemy_radius = enemy_radius >= 15.f ? 20.f : 10.f; - - if( !test_dmg( enemy_radius + 1.f, radius + 1.f, 25.f ) ) { - if( cur_damage < start_dmg * 2.f ) - return -1; - } - - bool found = false; - - for( size_t i = 5; i > 0; --i ) { - float cur_dist = local_dist / i; - float cur_enemy_dist = enemy_dist / i; - - if( cur_dist < radius ) - continue; - - if( cur_enemy_dist < enemy_radius ) - continue; - - if( test_dmg( cur_enemy_dist, cur_dist, 125.f / i ) ) { - found = true; - break; - } else if( cur_damage > 125.f / i ) - break; - } - - if( !found ) - return -1; - - return ret_dir; - } - - void c_ragebot::c_resolver::resolve_log_t::update( int ent_index ) { - static C_AnimationLayer last_layer[ 65 ]{ }; - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - - if( !ent || ent == g_ctx.m_local || !ent->is_player( ) || !ent->is_alive( ) || ent->ce( )->IsDormant( ) || !ent->has_valid_anim( ) ) { - m_was_invalid = true; - m_has_valid_lby = false; - return; - } - - if( m_was_invalid && m_last_pos.dist_to( ent->m_vecOrigin( ) ) > 4.f ) - reset( ); - - if( !( ent->m_fFlags( ) & FL_ONGROUND ) ) { - m_state = R_NONE; - return; - } - - if( ent->get_anim_velocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ) ) { - m_state = R_NONE; - m_has_valid_lby = true; - m_last_moving_lby = ent->m_flLowerBodyYawTarget( ); - return; - } - - m_last_pos = ent->m_vecOrigin( ); - - m_was_invalid = false; - - int freestanding = g_cheat.m_ragebot.m_resolver->try_freestanding( ent ); - - if( freestanding != -1 ) { - m_state = R_FREESTANDING; - } - else - m_state = R_NORMAL; - - if( m_last_freestanding != freestanding ) - m_angle_change = true; - - m_last_freestanding = freestanding; - m_has_valid_lby = true; - } - - void c_ragebot::c_resolver::resolve_log_t::reset( ) { - //assuming theyre STILL not moving this shouldnt change - //however if they are, it will be reset to none anyway - m_state = R_NONE; - m_last_update = 0.f; - m_last_lby = 0.f; - m_missed_shots = 0; - memset( m_shots, 0, sizeof( m_shots ) ); - memset( m_logged, 0, sizeof( m_logged ) ); - memset( m_logged_shots, 0, sizeof( m_logged ) ); - } - - std::vector< float > c_ragebot::c_resolver::get_shot_vec( int ent ) { - auto& data = m_data[ ent ]; - - if( data.m_state == R_NORMAL ) - return possible_angles_normal; - if( data.m_state == R_FREESTANDING ) - return possible_angles_freestanding; - - return possible_angles_none; - } - - float c_ragebot::c_resolver::get_shot_yaw( int shots, int ent_index ) { - auto& data = m_data[ ent_index ]; - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - - auto vec = get_shot_vec( ent_index ); - - float new_ang = vec.at( shots % vec.size( ) ); - float new_yaw = 0.f; - - float ang = math::vector_angles( ent->m_vecOrigin( ), g_ctx.m_last_origin ).y; - - if( data.m_state == R_FREESTANDING ) { - ang += ( data.m_last_freestanding == 1 ? 90.f : -90.f ); - - float sign = data.m_last_freestanding == 1 ? 1.f : -1.f; - - return ang + new_ang * sign; - } - - if( new_ang == FLT_ANG_LBY ) - new_yaw = ent->m_flLowerBodyYawTarget( ); - else if( new_ang == FLT_ANG_MOVING_LBY_UP ) { - if( !data.m_has_valid_lby && !g_settings.rage.pitch_resolver ) { - return get_shot_yaw( ++get_resolver_shots( ent_index ), ent_index ); - } - - auto delta = std::remainderf( data.m_last_moving_lby - data.m_last_lby, 360.f ); - bool breaking_lby = std::abs( delta ) > 35.f; - - new_yaw = breaking_lby ? data.m_last_moving_lby : data.m_last_lby; - } - else if( new_ang == FLT_ANG_180 ) { - new_yaw = ang - 180.f; - } - else if( new_ang == FLT_ANG_MINUS_90 ) { - new_yaw = ang - 90.f; - } - else if( new_ang == FLT_ANG_90 ) { - new_yaw = ang + 90.f; - } - else if( new_ang == FLT_ANG_135 ) - new_yaw = ang + 135.f; - else if( new_ang == FLT_ANG_MINUS_135 ) - new_yaw = ang - 135.f; - else - new_yaw = std::remainderf( ent->m_flLowerBodyYawTarget( ) + new_ang, 360.f ); - - return new_yaw; - } - - void c_ragebot::c_resolver::aimbot( int ent_index, int hitbox, vec3_t angle, vec3_t position, vec3_t min, vec3_t max, float radius ) { - if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) - return; - - auto& data = m_data[ ent_index ]; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( ent_index ); - bool moving = ent->get_anim_velocity( ).length2d( ) > 0.1f && ( ent->m_fFlags( ) & FL_ONGROUND ); - - if( moving && !ent->is_fakewalking( ) ) { - return; - } - - if( !data.m_state ) { - increment_shots( ent_index ); - return; - } - - auto model = ent->ce( )->GetModel( ); - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); - - if( hitbox == HITBOX_HEAD ) { - auto box = set->pHitbox( 0 ); - if( box ) { - auto dist = box->bbmin.dist_to( box->bbmax ); - - context::shot_data_t new_shot{ }; - new_shot.m_angle = angle; - new_shot.m_enemy_pos = position; - new_shot.m_enemy_index = ent_index; - new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); - new_shot.m_resolver_shots = get_resolver_shots( ent_index ); - new_shot.m_resolver_state = true; - new_shot.m_hitbox.min = min; - new_shot.m_hitbox.min = max; - new_shot.m_hitbox.radius = radius; - new_shot.m_missed = true; - new_shot.m_hitgroup = HITGROUP_HEAD; - - g_ctx.m_last_shot++; - g_ctx.m_last_shot %= 128; - g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; - - g_ctx.m_has_incremented_shots = true; - - - data.m_snapshot[ g_ctx.m_last_shot ] = data; - - if( data.m_logged[ data.m_state ] ) { - if( !--data.m_logged_shots[ data.m_state ] ) { - data.m_logged[ data.m_state ] = false; - } - } - else { - int shots = get_resolver_shots( ent_index ); - - increment_shots( ent_index ); - -#if _DEBUG - if( dbg_resolver( ) ) { - char str[ 128 ]; - sprintf_s< 128 >( str, "[\3moneybot\1] incrementing shots from %d to %d" - "[\3moneybot\1] resolver state: %d\n", shots, get_resolver_shots( ent_index ), data.m_state ); - - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, str ); - } -#endif - } - } - } - else { - matrix3x4 bone_matrix[ 128 ]; - if( model && hdr && set && ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) { - auto box = set->pHitbox( hitbox ); - if( !box ) return; - - auto origin = ent->m_vecOrigin( ); - - vec3_t shot_pos = position; - vec3_t rotated_center; - - vec3_t offset = position - origin; - float radius = offset.length2d( ); - float cosine = offset.x / radius; - - float deg = RAD2DEG( acos( cosine ) ); - if( offset.y < 0 ) deg += 360.f; - - float rot = ( deg - 180.f ) * ( M_PI / 180.f ); - rotated_center.x = origin.x + cos( rot ) * radius; - rotated_center.y = origin.y + sin( rot ) * radius; - rotated_center.z = position.z; - - Ray_t ray; - CTraceFilterOneEntity filter; - CGameTrace tr_center; - CGameTrace tr_rot; - - filter.ent = ent; - - ray.Init( g_ctx.m_local->get_eye_pos( ), position ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_center ); - - ray.Init( g_ctx.m_local->get_eye_pos( ), rotated_center ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_rot ); - - bool is_within = tr_center.hitbox == tr_rot.hitbox; - - if( !is_within ) { - auto dist = box->bbmin.dist_to( box->bbmax ); - - context::shot_data_t new_shot{ }; - new_shot.m_angle = angle; - new_shot.m_enemy_pos = position; - new_shot.m_enemy_index = ent_index; - new_shot.m_local_pos = g_ctx.m_local->get_eye_pos( ); - new_shot.m_resolver_shots = get_resolver_shots( ent_index ); - new_shot.m_resolver_state = true; - new_shot.m_hitbox.min = min; - new_shot.m_hitbox.min = max; - new_shot.m_hitbox.radius = radius; - new_shot.m_missed = true; - new_shot.m_hitgroup = util::hitbox_to_hitgroup( hitbox ); - - g_ctx.m_last_shot++; - g_ctx.m_last_shot %= 128; - g_ctx.m_shot_data[ g_ctx.m_last_shot ] = new_shot; - - g_ctx.m_has_incremented_shots = true; - - data.m_snapshot[ g_ctx.m_last_shot ] = data; - - if( data.m_logged[ data.m_state ] ) { - if( !--data.m_logged_shots[ data.m_state ] ) { - data.m_logged[ data.m_state ] = false; - } - } - else { - int shots = get_resolver_shots( ent_index ); - increment_shots( ent_index ); - -#if _DEBUG - if( dbg_resolver( ) ) { - char str[ 128 ]; - sprintf_s< 128 >( str, "[\3moneybot\1] incrementing shots from %d to %d" - "[\3moneybot\1] resolver state: %d\n", shots, get_resolver_shots( ent_index ), data.m_state ); - - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, str ); - } -#endif - } - } - } - } - - //printf( "resolver: logging aimbot shot %d missed: %d state: %d time: %f\n", - // data.m_shots, data.m_missed_shots[ data.m_breaking ], data.m_breaking, g_Interfaces.Globals->curtime ); - } - - void c_ragebot::c_resolver::increment_shots( int ent_index ) { - get_resolver_shots( ent_index )++; - m_data[ ent_index ].m_missed_shots++; - m_data[ ent_index ].m_angle_change = true; - } - - void c_ragebot::c_resolver::on_missed_spread( int ent_index, int shots ) { - if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) - return; - - auto& data = m_data[ ent_index ]; - auto& snapshot = data.m_snapshot[ shots % 150 ]; - - data.m_shots[ snapshot.m_state ] = snapshot.m_shots[ snapshot.m_state ]; - - if( snapshot.m_logged[ snapshot.m_state ] ) { - data.m_logged[ snapshot.m_state ] = true; - data.m_logged_shots[ snapshot.m_state ] = snapshot.m_logged_shots[ snapshot.m_state ]; - } - } - - void c_ragebot::c_resolver::listener( int ent_index, int shots ) { - if( !g_cheat.m_player_mgr.is_cheater( ent_index ) ) - return; - - auto& data = m_data[ ent_index ]; - auto& snapshot = data.m_snapshot[ shots ]; - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( !nci ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) - return; - - auto rate = weapon->get_wpn_info( )->cycle_time; - - data.m_shots[ snapshot.m_state ] = snapshot.m_shots[ snapshot.m_state ]; - data.m_logged[ snapshot.m_state ] = true; - - int latency_shots = ( nci->GetLatency( 0 ) + g_csgo.m_globals->m_frametime ) / rate + 1; - - data.m_logged_shots[ snapshot.m_state ] = latency_shots; - -#if _DEBUG - if( dbg_resolver( ) ) { - char str[ 128 ]; - sprintf_s< 128 >( str, "[\3moneybot\1] resolver: logging %d shots for %d with %d", data.m_logged_shots[ data.m_state ], ent_index, get_resolver_shots( ent_index ) ); - - g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, str ); - } -#endif - } - - void c_ragebot::c_resolver::update_player( int i ) { - if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) - return; - - if( !g_cheat.m_player_mgr.is_cheater( i ) ) - return; - - auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); - bool was_invalid = m_data[ i ].m_was_invalid; - - m_data[ i ].update( i ); - if( g_settings.rage.resolver_override( ) ) { - if( g_input.is_key_pressed( g_settings.rage.resolver_override_key( ) ) ) { - int dir = manual_override( ent ); - if( dir ) { - if( dir != m_data[ i ].m_overriding ) - m_data[ i ].m_angle_change = true; - - //to be finished - m_data[ i ].m_overriding = dir; - return; - } - } - } - - m_data[ i ].m_overriding = 0; - brute_force( ent ); - } - - void c_ragebot::c_resolver::frame_stage_notify( ) { - if( !g_settings.rage.enabled( ) || !g_settings.rage.resolver( ) ) - return; - - if( !g_ctx.run_frame( ) || !g_ctx.m_local->is_valid( ) ) - return; - - for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || ent == g_ctx.m_local || ent->ce( )->IsDormant( ) || !ent->is_player( ) - || !ent->is_alive( ) || !g_cheat.m_player_mgr.is_cheater( i ) ) { - m_data[ i ].m_was_invalid = true; - m_data[ i ].m_has_valid_lby = false; - continue; - } - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) - continue; - - //update_player( i ); - } - } - - void c_ragebot::c_resolver::force_yaw( c_base_player* ent, float yaw ) { - ent->m_angEyeAngles( ).y = yaw;// + 180.f; - } - - int c_ragebot::c_resolver::manual_override( c_base_player* ent ) { - if( ent->get_animdata( ).m_anim_velocity.length2d( ) > 0.1f && !ent->is_fakewalking( ) ) { //no point in overriding moving targets, it will also fuck up backtrack records otherwise - return OVERRIDE_NONE; - } - - vec3_t pos; - vec3_t angle; - vec3_t local_angle; - vec3_t local_pos; - float delta; - float dist; - - - local_pos = g_ctx.m_local->m_vecOrigin( ); - g_csgo.m_engine( )->GetViewAngles( local_angle ); - pos = ent->get_hitbox_pos( 0 ); - - angle = math::vector_angles( local_pos, pos ); - dist = pos.dist_to( local_pos ); - delta = ( angle - local_angle ).clamp( ).y; - float yaw_delta = sin( DEG2RAD( ( angle - local_angle ).clamp( ).y ) ) * dist; - - if( std::abs( yaw_delta ) < 25.f ) { - force_yaw( ent, angle.y ); - return OVERRIDE_CENTER; - } - else { - force_yaw( ent, angle.y + ( ( delta < 0.f ) ? 90.f : -90.f ) ); - return delta > 0.f ? OVERRIDE_LEFT : OVERRIDE_RIGHT; - } - } - - void c_ragebot::c_resolver::force_lby( c_base_player* ent ) { - force_yaw( ent, ent->m_flLowerBodyYawTarget( ) ); - } - - void c_ragebot::c_resolver::brute_force( c_base_player* ent ) { - if( ent->m_flSimulationTime( ) == g_cheat.m_ragebot.m_lagcomp->get_last_updated_simtime( ent->ce( )->GetIndex( ) ) ) - return; - - if( ent->get_anim_velocity( ).length( ) > 0.1f && ( ent->m_fFlags( ) & FL_ONGROUND ) && !ent->is_fakewalking( ) ) { - m_data[ ent->ce( )->GetIndex( ) ].m_last_moving_lby = ent->m_flLowerBodyYawTarget( ); - m_data[ ent->ce( )->GetIndex( ) ].m_has_valid_lby = true; - force_lby( ent ); - return; - } - - int i = ent->ce( )->GetIndex( ); - int s = get_resolver_shots( i ); - auto vec = get_shot_vec( i ); - - if( vec.at( s % vec.size( ) ) == FLT_ANG_MOVING_LBY_UP && g_settings.rage.pitch_resolver ) - ent->m_angEyeAngles( ).x = -89.f; - - float new_yaw = get_shot_yaw( get_resolver_shots( i ), i ); - - force_yaw( ent, new_yaw ); - } -} \ No newline at end of file diff --git a/internal_rewrite/renderer.cpp b/internal_rewrite/renderer.cpp deleted file mode 100644 index 3d22805..0000000 --- a/internal_rewrite/renderer.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "renderer.hpp" -#include "interface.hpp" - -#undef CreateFont - - -drawings::c_fonts g_fonts; -drawings::c_drawings g_renderer; - -NAMESPACE_REGION( drawings ) - -c_fonts::font_t::font_t( std::string name, int size, - int weight, ulong_t flags ) : - m_name( name ), m_size( size ), - m_weight( weight ), m_flags( flags ) { - g_fonts.m_container.push_back( this ); -}; - -void c_fonts::font_t::initialize( ) { - m_font = g_csgo.m_surface( )->CreateFont( ); - g_csgo.m_surface( )->SetFontGlyphSet( - m_font, m_name.c_str( ), m_size, - m_weight, 0, 0, - m_flags - ); -} - -void c_fonts::initialize( ) { - for( auto& it : m_container ) { - it->initialize( ); - } -} - -void c_drawings::draw_string( const wchar_t* text, HFont font, int x, int y, const clr_t& color ) { - g_csgo.m_surface( )->DrawSetTextPos( x, y ); - g_csgo.m_surface( )->DrawSetTextFont( font ); - g_csgo.m_surface( )->DrawSetTextColor( color ); - g_csgo.m_surface( )->DrawPrintText( text, wcslen( text ) ); -} - -void c_drawings::draw_rect( int x, int y, int w, int h, const clr_t& color ) { - g_csgo.m_surface( )->DrawSetColor( color ); - g_csgo.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); -} - -void c_drawings::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { - g_csgo.m_surface( )->DrawSetColor( clr ); - g_csgo.m_surface( )->DrawLine( x, y, x1, y1 ); -} - -void c_drawings::draw_box( int x, int y, int w, int h, const clr_t& clr ) { - draw_line( x, y, x + w, y, clr ); - draw_line( x + w, y, x + w, y + h, clr ); - draw_line( x, y + h, x + w + 1, y + h, clr ); - draw_line( x, y, x, y + h, clr ); -} - -void c_drawings::draw_circle( int x, int y, int r, const clr_t& col, int res ) { - g_csgo.m_surface( )->DrawSetColor( col ); - g_csgo.m_surface( )->DrawOutlinedCircle( x, y, r, res ); -} - -void c_drawings::draw_filled_circle( int x, int y, int r, const clr_t& col, int res ) { - vertex_t* v = ( vertex_t* )( _alloca( res * sizeof( vertex_t ) ) ); - const float step = M_PI * 2.0f / res; - - for( size_t i{ }; i < res; ++i ) { - float theta = i * step; - float x_off = r * cos( theta ); - float y_off = r * sin( theta ); - v[ i ].init( x + x_off, y + y_off ); - } - - draw_polygon( res, v, col ); -} - -void c_drawings::draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& clr ) { - draw_line( ( int )begin.x, ( int )begin.y, ( int )end.x, ( int )end.y, clr ); -} - -void c_drawings::draw_polygon( int count, vertex_t* vertices, const clr_t& col ) { - static int texture = g_csgo.m_surface( )->CreateNewTextureID( true ); - - clr_t buf( 255, 255, 255 ); - - g_csgo.m_surface( )->DrawSetTextureRGBA( texture, ( byte* )( &buf ), 1, 1 ); - g_csgo.m_surface( )->DrawSetColor( col ); - g_csgo.m_surface( )->DrawSetTexture( texture ); - - g_csgo.m_surface( )->DrawTexturedPolygon( count, vertices ); -} - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/renderer.hpp b/internal_rewrite/renderer.hpp deleted file mode 100644 index 59e4dd1..0000000 --- a/internal_rewrite/renderer.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#pragma once -#include -#include -#include - -#include "util.hpp" -#include "sdk.hpp" - -enum e_font_style : size_t { - -}; - -enum FontAlign_t : size_t { - ALIGN_CENTER, - ALIGN_LEFT, - ALIGN_RIGHT -}; - -NAMESPACE_REGION( drawings ) - - -class c_fonts { -protected: - struct font_t { - friend class c_fonts; - font_t( std::string name, int size, - int weight, ulong_t flags ); - - operator HFont( ) { - return m_font; - } - - private: - void initialize( ); - - HFont m_font; - std::string m_name; - int m_size; - int m_weight; - ulong_t m_flags; - }; - - std::vector< font_t* > m_container; - friend struct c_fonts::font_t; -public: - void initialize( ); - - font_t f_esp_small{ xors( "Tahoma" ), 11, 500, FONTFLAG_DROPSHADOW }; - font_t f_bold{ xors( "Verdana" ), 24, 700, FONTFLAG_ANTIALIAS }; - font_t f_12{ -#ifndef COMIC_SANS - xors( "Tahoma" ) -#else - xors( "Comic Sans" ) -#endif - , 12, 0, FONTFLAG_DROPSHADOW }; - font_t f_14{ xors( "Verdana" ), 14, 700, 128 }; - font_t f_16{ xors( "Verdana" ), 16, 700, 128 }; - font_t f_18{ xors( "Verdana" ), 18, 700, 128 }; -}; - - - -//im going to fill ur triangles -class c_drawings { -private: - //dumb hacky fix for template functions - void draw_string( const wchar_t* msg, HFont font, int x, int y, const clr_t& color ); - -public: - void draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& color ); - void draw_line( int x, int y, int x1, int y2, const clr_t& color ); - void draw_rect( int x, int y, int w, int h, const clr_t& color ); - void draw_box( int x, int y, int w, int h, const clr_t& color ); //thicc - void draw_polygon( int count, vertex_t* vertices, const clr_t& col ); - void draw_circle( int x, int y, int r, const clr_t& col, int res = 48 ); - void draw_filled_circle( int x, int y, int r, const clr_t& col, int res = 48 ); - - template < FontAlign_t align = ALIGN_LEFT > //fuck ur sprintf nigga varargs nigga - void draw_string( HFont font, int x, int y, const clr_t& color, const wchar_t* msg, ... ) { - wchar_t* buffer = ( wchar_t* )_alloca( 2048 ); - va_list list{ }; - int wide, tall; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vswprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - g_csgo.m_surface( )->GetTextSize( - font, buffer, wide, tall ); - - switch( align ) { - case ALIGN_CENTER: - x -= wide / 2; - break; - case ALIGN_RIGHT: - x -= wide; - break; - default: break; - } - - draw_string( buffer, font, x, y, color ); - } - - template < FontAlign_t align = ALIGN_LEFT > //debatable whether it should be center or not - void draw_string( HFont font, int x, int y, const clr_t& color, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - auto wide_str = util::ascii_to_unicode( buffer ); - draw_string< align >( font, x, y, color, wide_str.c_str( ) ); - } -}; - -END_REGION - -extern drawings::c_fonts g_fonts; -extern drawings::c_drawings g_renderer; \ No newline at end of file diff --git a/internal_rewrite/run_command.cpp b/internal_rewrite/run_command.cpp deleted file mode 100644 index d8df083..0000000 --- a/internal_rewrite/run_command.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::run_command( void* ecx_, void* edx_, IClientEntity* entity, user_cmd_t* ucmd, IMoveHelper* move_helper ) { - if( !g_csgo.m_panic && g_settings.rage.anti_aim( ) && entity == g_ctx.m_local->ce( ) ) { - - } - - run_command_o( ecx_, edx_, entity, ucmd, move_helper ); -} \ No newline at end of file diff --git a/internal_rewrite/scene_end.cpp b/internal_rewrite/scene_end.cpp deleted file mode 100644 index 997ed21..0000000 --- a/internal_rewrite/scene_end.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "hooks.hpp" -#include "settings.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::scene_end( void* ecx_, void* edx_ ) { - scene_end_o( edx_, 0 ); - - if( !g_csgo.m_panic && g_ctx.m_local && g_settings.visuals.chams.enabled( ) && g_settings.visuals.chams.ignore_z( ) && g_settings.visuals.chams.clear_occlusion && !g_settings.misc.hide_from_obs ) { - g_ctx.m_drawing_screneend = true; - for( int i = 1; i < g_csgo.m_globals->m_maxclients; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( ent && ent->is_valid( ) && !ent->m_bGunGameImmunity( ) ) { - if( ent == g_ctx.m_local && ent->m_bIsScoped( ) ) { - continue; - } - - int team = ent->m_iTeamNum( ); - bool enemy = team != g_ctx.m_local->m_iTeamNum( ); - - if( enemy || g_settings.visuals.chams.friendlies( ) ) { - IMaterial* mat = g_settings.visuals.chams.flat ? g_cheat.m_chams.m_materials.m_chams_flat : g_cheat.m_chams.m_materials.m_chams; - fclr_t clr_vis = enemy ? g_settings.visuals.chams.color_visible_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_visible_friendly( ).to_fclr( ); - fclr_t clr_hid = enemy ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); - g_cheat.m_chams.m_materials.force_material( mat, clr_hid ); - ent->ce( )->DrawModel( 0x1, 255 ); - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - g_cheat.m_chams.m_materials.force_material( mat, clr_vis ); - ent->ce( )->DrawModel( 0x1, 255 ); - - g_csgo.m_model_render( )->ForcedMaterialOverride( nullptr ); - } - } - } - - g_ctx.m_drawing_screneend = false; - } -} \ No newline at end of file diff --git a/internal_rewrite/sdk.hpp b/internal_rewrite/sdk.hpp deleted file mode 100644 index 91f9bba..0000000 --- a/internal_rewrite/sdk.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include "vector.hpp" - -#include "IClientMode.hpp" -#include "CHLClient.hpp" -#include "ISurface.hpp" -#include "IPanel.hpp" -#include "IVEngineClient.hpp" -#include "IClientEntityList.hpp" -#include "GlobalVars_t.hpp" -#include "IPrediction.hpp" -#include "ICvar.hpp" -#include "IVModelInfoClient.hpp" -#include "IMaterialSystem.hpp" -#include "IEngineTrace.hpp" -#include "IVRenderView.hpp" -#include "IPhysicsSurfaceProps.hpp" -#include "CUtlVector.hpp" -#include "IMemAlloc.hpp" -#include "IGameEventManager.hpp" -#include "KeyValues.hpp" -#include "CInput.hpp" -#include "bf_write.hpp" -#include "match_framework.h" - - -#include "c_base_player.hpp" -#include "ISteamClient.hpp" \ No newline at end of file diff --git a/internal_rewrite/send_datagram.cpp b/internal_rewrite/send_datagram.cpp deleted file mode 100644 index 7a86842..0000000 --- a/internal_rewrite/send_datagram.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "mem.hpp" -#include "base_cheat.hpp" -#include "context.hpp" -#include "hooks.hpp" - -uintptr_t cl_sendmove = 0; - -int __fastcall hooks::send_datagram( INetChannel* channel, void* edx_, void* datagram ) { - if( g_csgo.m_panic || !g_settings.misc.net_fakelag || datagram ) { - return send_datagram_o( channel, 0, datagram ); - } - - auto cl = g_csgo.m_global_state->get_client_state( ); - if( !cl || cl->m_delta_tick <= 0 ) { - return send_datagram_o( channel, 0, datagram ); - } - - // There is no need to restore the reliable state sequence since - // we are not fucking with reliable state with 'proper' fake latency. - - int backup_sequence = channel->m_nInSequenceNr; - - g_cheat.m_extra.add_latency( channel ); - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - - int ret = send_datagram_o( channel, 0, datagram ); - - channel->m_nInSequenceNr = backup_sequence; - - return ret; -} \ No newline at end of file diff --git a/internal_rewrite/settings.hpp b/internal_rewrite/settings.hpp deleted file mode 100644 index 6880bff..0000000 --- a/internal_rewrite/settings.hpp +++ /dev/null @@ -1,460 +0,0 @@ -#pragma once -#include "simple_settings.hpp" -#include "strings.hpp" -#include "color.hpp" -#include -//later i will implement a way to load all config files - -namespace data -{ - - - extern SettingHolder holder_; - - struct skin_data { - - skin_data( int id_input = 0, int paintkit_input = 0, const char* name_input = nullptr, float wear_input = 0.0f, int seed_input = 0 ) { - id = id_input; - name = name_input; - paintkit = paintkit_input; - seed = seed_input; - wear = wear_input; - } - - int id = 0; - int paintkit = 0; - int seed = 0; - float wear = 0.0f; - const char* name = nullptr; - }; - - - class legitbot_settings : SettingHolder { - public: - using SettingHolder::SettingHolder; - - con_var< float > m_fov{ this, fnv( "fov" ), 5.f }; - con_var< float > m_speed{ this, fnv( "speed" ), 10.f }; - con_var< float > m_rcs{ this, fnv( "rcs" ), 25.f }; - con_var< float > m_assist_strength{ this, fnv( "assist_strength" ), 0.f }; - con_var< int > m_hitbox{ this, fnv( "hitbox" ), 0 }; - }; - - class ragebot_settings : SettingHolder { - public: - using SettingHolder::SettingHolder; - - con_var< int > m_damage{ this, fnv( "damage" ), 0 }; - con_var< int > m_damage_scale{ this, fnv( "damage_scale" ), 0 }; - con_var< int > m_hitchance{ this, fnv( "hitchance" ), 0 }; - con_var< bool > m_baim_air{ this, fnv( "baim_air" ), 0 }; - con_var< bool > m_baim_fake{ this, fnv( "baim_fake" ), 0 }; - con_var< int > m_baim_shots{ this, fnv( "baim_shots" ), 5 }; - con_var< int > m_baim_health{ this, fnv( "baim_health" ), 50 }; - con_var< int > m_delay{ this, fnv( "delay" ), 0 }; - con_var< int > m_delay_type{ this, fnv( "delay_type" ), 0 }; - con_var< bool > m_spread_limit{ this, fnv( "spread_limit" ), 0 }; - con_var< int > m_spread_limit_min{ this, fnv( "spread_limit_min" ), 100 }; - con_var< int > m_auto_stop{ this, fnv( "auto_stop" ), false }; - con_var< float > m_hitbox_scale{ this, fnv( "point_scale" ), 0.5f }; - }; - - class c_settings { - public: - c_settings( ) { - memset( this->misc.skins.skins( ).data( ), -1, sizeof( this->misc.skins.skins( ) ) ); - } - - __declspec( noinline ) void load( ) { - switch( menu.cur_setting ) { - case 0: - holder_.load( "", xors( "money_legit.cfg" ) ); - break; - case 1: - holder_.load( "", xors( "money_closet.cfg" ) ); - break; - case 2: - holder_.load( "", xors( "money_rage1.cfg" ) ); - break; - case 3: - holder_.load( "", xors( "money_rage2.cfg" ) ); - break; - case 4: - holder_.load( "", xors( "money_test.cfg" ) ); - break; - } - - menu.anti_untrusted = true; - misc.skins.current_skin = -1; - } - - __declspec( noinline ) void save( ) { - switch( menu.cur_setting ) { - case 0: - holder_.save( "", xors( "money_legit.cfg" ) ); - break; - case 1: - holder_.save( "", xors( "money_closet.cfg" ) ); - break; - case 2: - holder_.save( "", xors( "money_rage1.cfg" ) ); - break; - case 3: - holder_.save( "", xors( "money_rage2.cfg" ) ); - break; - case 4: - holder_.save( "", xors( "money_test.cfg" ) ); - break; - } - } - - __declspec( noinline ) void reset( ) { - holder_.reset( ); - } - - void copy_to_clipboard( ) { - holder_.save( "", xors( "./csgo/cfg/money_temp.cfg" ) ); - std::vector< uint8_t > file_data; - FILE* f = fopen( xors( "./csgo/cfg/money_temp.cfg" ), "r" ); - size_t size = 0; - fseek( f, 0, SEEK_END ); - size = ftell( f ); - - char* buf = ( char* )malloc( size ); - fread( buf, 1, size, f ); - fclose( f ); - for( size_t i{ }; i < size; ++i ) { - file_data.push_back( buf[ i ] ); - } - - free( buf ); - - EmptyClipboard( ); - OpenClipboard( nullptr ); - - auto g = GlobalAlloc( GMEM_FIXED, size ); - memcpy( g, file_data.data( ), size ); - - SetClipboardData( CF_TEXT, g ); - CloseClipboard( ); - //DeleteFileA( xors( "./csgo/cfg/money_temp.cfg" ) ); - } - - void load_from_clipboard( ) { - FILE* f = fopen( xors( "./csgo/cfg/money_temp.cfg" ), "wb" ); - auto data = GetClipboardData( CF_TEXT ); - - auto size = GlobalSize( data ); - fwrite( data, 1, size, f ); - fclose( f ); - - holder_.load( "", xors( "./csgo/cfg/money_temp.cfg" ) ); - - CloseClipboard( ); - //DeleteFileA( xors( "./csgo/cfg/money_temp.cfg" ) ); - } - - struct { - con_var< bool > enabled{ &holder_, fnv( "legit_active" ), false }; - con_var< size_t > sample_size{ &holder_, fnv( "legit_sample_size" ), 12 }; - con_var< float > smooth_factor{ &holder_, fnv( "legit_smooth_factor" ), 1.0f }; - con_var< bool > dynamic_smoothing{ &holder_, fnv( "legit_dynamic_smoothing" ), false }; - con_var< bool > awp_baim{ &holder_, fnv( "legit_awp_baim" ), false }; - con_var< bool > assist{ &holder_, fnv( "legit_assist" ), false }; - con_var< bool > friendlies{ &holder_, fnv( "legit_friendlies" ), false }; - con_var< int > activation_type{ &holder_, fnv( "legit_activation_type" ), 1 }; - con_var< int > key{ &holder_, fnv( "legit_key" ), 0 }; - con_var< bool > backtracking{ &holder_, fnv( "legit_backtracking" ), 0 }; - con_var< float > backtracking_time{ &holder_, fnv( "legit_bt_time" ), 0.2f }; - con_var< float > backtracking_fov{ &holder_, fnv( "legit_bt_fov" ), 5.0f }; - con_var< bool > backtracking_target{ &holder_, fnv( "legit_bt_target" ), false }; - con_var< bool > backtracking_visualize{ &holder_, fnv( "legit_bt_visualize" ), 0 }; - con_var< clr_t > backtracking_col{ &holder_, fnv( "legit_bt_col" ), clr_t( 255, 255, 255, 120 ) }; - con_var< bool > triggerbot{ &holder_, fnv( "legit_triggerbot" ), false }; - con_var< int > trigger_key{ &holder_, fnv( "legit_triggerkey" ), 0 }; - con_var< float > trigger_delay{ &holder_, fnv( "legit_triggerdelay" ), 0.f }; - con_var< bool > trigger_magnet{ &holder_, fnv( "legit_trigger_magnet" ) }; - legitbot_settings pistols{ &holder_, "legit_pistols" }; - legitbot_settings rifles{ &holder_, "legit_rifles" }; - legitbot_settings snipers{ &holder_, "legit_snipers" }; - legitbot_settings general{ &holder_, "legit_general" }; - legitbot_settings* active = &general; - } legit; - - struct { - con_var< bool > enabled{ &holder_, fnv( "rage_enabled" ), false }; - con_var< int > activation_type{ &holder_, fnv( "rage_activation_type" ), 0 }; - con_var< float > fov{ &holder_, fnv( "rage_fov" ), 0.f }; - con_var< bool > friendlies{ &holder_, fnv( "rage_friendlies" ), false }; - con_var< int > hitbox{ &holder_, fnv( "rage_hitbox" ), false }; - struct { - con_var< bool > head{ &holder_, fnv( "rage_hitscan_head" ), true }; - con_var< bool > stomach{ &holder_, fnv( "rage_hitscan_stomach" ), true }; - con_var< bool > arms{ &holder_, fnv( "rage_hitscan_arms" ), false }; - con_var< bool > legs{ &holder_, fnv( "rage_hitscan_legs" ), false }; - con_var< bool > feet{ &holder_, fnv( "rage_hitscan_feet" ), false }; - con_var< bool > chest{ &holder_, fnv( "rage_hitscan_chest" ), false }; - } hitscan; - - con_var< int > multipoint_enable{ &holder_, fnv( "rage_multipoint" ), false }; - con_var< int > multipoint_scale{ &holder_, fnv( "rage_multipoint_scale" ), 10 }; - - struct { - con_var< bool > head{ &holder_, fnv( "rage_multipoint_head" ), true }; - con_var< bool > stomach{ &holder_, fnv( "rage_multipoint_stomach" ), true }; - con_var< bool > chest{ &holder_, fnv( "rage_multipoint_chest" ), false }; - con_var< bool > thighs{ &holder_, fnv( "rage_multipoint_thighs" ), false }; - con_var< bool > calves{ &holder_, fnv( "rage_multipoint_calves" ), false }; - } multipoint; - - - con_var< bool > ignore_limbs_moving{ &holder_, fnv( "rage_ignore_limbs_moving" ), false }; - con_var< int > silent{ &holder_, fnv( "rage_silent" ), false }; - con_var< int > aimkey{ &holder_, fnv( "rage_key" ), 0 }; - con_var< bool > auto_scope{ &holder_, fnv( "rage_auto_scope" ), false }; - con_var< bool > resolver{ &holder_, fnv( "rage_resolver" ), false }; - con_var< bool > resolver_override{ &holder_, fnv( "rage_resolver_override" ), false }; - con_var< bool > pitch_resolver{ &holder_, fnv( "rage_pitch_resolver" ) }; - con_var< int > resolver_override_key{ &holder_, fnv( "override_key" ), 0 }; - con_var< bool > bt_visualize{ &holder_, fnv( "rage_visualize_records" ), false }; - con_var< clr_t > bt_col{ &holder_, fnv( "rage_bt_color" ), clr_t( 150, 150, 150, 20 ) }; - con_var< int > fakelag_resolver{ &holder_, fnv( "rage_fakelag_resolver" ) }; - con_var< bool > preserve_fps{ &holder_, fnv( "rage_preserve_fps" ), false }; - con_var< bool > compensate_spread{ &holder_, fnv( "rage_compensate_spread" ) }; - - con_var< int > selection_type{ &holder_, fnv( "rage_selection_type" ) }; - con_var< bool > prefer_moving{ &holder_, fnv( "rage_prefer_moving" ) }; - con_var< bool > prefer_low_hp{ &holder_, fnv( "rage_low_hp" ) }; - - ragebot_settings general{ &holder_, "rage_general" }; - ragebot_settings heavy_pistols{ &holder_, "rage_pistols" }; - ragebot_settings snipers{ &holder_, "rage_snipers" }; - ragebot_settings auto_snipers{ &holder_, "rage_auto" }; - ragebot_settings* active = &general; - - struct { - con_var< int > mode{ &holder_, fnv( "fakelag_mode" ), 0 }; - con_var< int > ticks{ &holder_, fnv( "fakelag_ticks" ), 0 }; - con_var< int > fluctuate{ &holder_, fnv( "fakelag_fluctuate" ), 0 }; - con_var< bool > in_air{ &holder_, fnv( "fakelag_in_air" ), false }; - con_var< bool > on_peek{ &holder_, fnv( "fakelag_on_peek" ), false }; - con_var< bool > on_select{ &holder_, fnv( "fakelag_on_select" ), false }; - con_var< bool > in_move{ &holder_, fnv( "fakelag_in_move" ), false }; - con_var< bool > in_attack{ &holder_, fnv( "fakelag_in_attack" ), false }; - con_var< bool > avoid_ground{ &holder_, fnv( "fakelag_avoid_ground" ), false }; - con_var< bool > jump_reset{ &holder_, fnv( "fakelag_jump_reset" ), false }; - con_var< bool > on_duck{ &holder_, fnv( "fakelag_on_duck" ), false }; - } fakelag; - - con_var< bool > anti_aim{ &holder_, fnv( "rage_anti_aim" ), false }; - con_var< bool > dormant_check{ &holder_, fnv( "rage_dormant_check" ), false }; - con_var< bool > at_players{ &holder_, fnv( "rage_at_players" ), false }; - con_var< int > pitch{ &holder_, fnv( "rage_pitch" ), 0 }; - con_var< int > pitch_offset{ &holder_, fnv( "rage_pitch_offset" ), 0 }; - - con_var< int > real_yaw{ &holder_, fnv( "rage_real_yaw" ), 0 }; - con_var< int > real_yaw_add{ &holder_, fnv( "rage_real_yaw_add" ), 0 }; - con_var< int > real_yaw_jitter{ &holder_, fnv( "rage_real_jitter" ), 0 }; - - con_var< int > air_yaw{ &holder_, fnv( "rage_air_yaw" ), 0 }; - con_var< int > air_yaw_add{ &holder_, fnv( "rage_air_yaw_add" ), 0 }; - con_var< int > air_yaw_jitter{ &holder_, fnv( "rage_air_yaw_jitter" ), 0 }; - - con_var< int > fake_yaw{ &holder_, fnv( "rage_fake_yaw" ), 0 }; - con_var< int > fake_yaw_add{ &holder_, fnv( "rage_fake_yaw_add" ), 0 }; - con_var< int > fake_yaw_jitter{ &holder_, fnv( "rage_fake_jitter" ), 0 }; - - con_var< int > real_yaw_moving{ &holder_, fnv( "rage_real_yaw_moving" ), 0 }; - con_var< int > real_yaw_moving_add{ &holder_, fnv( "rage_real_yaw_moving_add" ), 0 }; - con_var< int > real_moving_jitter{ &holder_, fnv( "rage_real_moving_jitter" ), 0 }; - - con_var< bool > edge_detection{ &holder_, fnv( "rage_edge_dtc" ), 0 }; - con_var< int > edge_dtc_jitter{ &holder_, fnv( "rage_edge_dtc_jitter" ), 0 }; - con_var< int > edge_dtc_real_jitter{ &holder_, fnv("rage_edge_dtc_real_jitter"), 0 }; - - con_var< bool > break_lby_edge{ &holder_, fnv( "rage_break_lby_edge" ) }; - con_var< int > edge_dtc_normal{ &holder_, fnv( "rage_edge_dtc_normal" ), 0 }; - con_var< int > edge_dtc_standing{ &holder_, fnv( "rage_edge_dtc_standing" ), 100 }; - con_var< int > edge_dtc_moving{ &holder_, fnv( "rage_edge_dtc_moving" ), 100 }; - con_var< int > edge_dtc_priority{ &holder_, fnv( "rage_edge_dtc_priority" ), 0 }; - con_var< bool > edge_break_lby{ &holder_, fnv( "rage_edge_break_lby" ) }; - con_var< bool > fix_legs{ &holder_, true }; - - con_var< bool > break_lby{ &holder_, fnv( "rage_break_lby" ), 0 }; - con_var< int > lby_delta{ &holder_, fnv( "rage_lby_delta" ), 180 }; - con_var< bool > lby_avoid_updates{ &holder_, fnv( "rage_lby_avoid_updates" ) }; - - con_var< bool > fakewalk{ &holder_, fnv( "rage_fakewalk" ), 0 }; - con_var< int > fakewalk_key{ &holder_, fnv( "rage_fakewalk_key" ), 0 }; - con_var< int > fakewalk_ticks{ &holder_, fnv( "rage_fakewalk_ticks" ), 7 }; - - con_var< bool > angle_step{ &holder_, fnv( "rage_angle_step" ), false }; - con_var< int > angle_step_degrees{ &holder_, fnv( "range_angle_step_degrees" ), false }; - } rage; - - struct { - struct { - con_var< bool > enabled{ &holder_, fnv( "visuals_chams_enabled" ), 0 }; - con_var< bool > flat{ &holder_, fnv( "visuals_chams_flat" ), 0 }; - con_var< bool > ignore_z{ &holder_, fnv( "visuals_chams_ignore_z" ), 0 }; - con_var< float > reflectivity{ &holder_, fnv( "visuals_chams_reflectivity" ), 1.0f }; - con_var< float > shine{ &holder_, fnv( "visuals_chams_shine" ), 1.0f }; - con_var< bool > friendlies{ &holder_, fnv( "visuals_chams_friendlies" ), 0 }; - con_var< clr_t > color_visible_friendly{ &holder_, fnv( "visuals_chams_color_friendly" ), clr_t( 0, 255, 255 ) }; - con_var< clr_t > color_visible_enemy{ &holder_, fnv( "visuals_chams_color_enemy" ), clr_t( 255, 255, 0 ) }; - con_var< clr_t > color_hidden_friendly{ &holder_, fnv( "visuals_chams_color_h_friendly" ), clr_t( 0, 0, 255 ) }; - con_var< clr_t > color_hidden_enemy{ &holder_, fnv( "visuals_chams_color_h_enemy" ), clr_t( 255, 0, 0 ) }; - con_var< bool > clear_occlusion{ &holder_, fnv( "visuals_chams_clear_occlusion" ) }; - con_var< float > luminance{ &holder_, fnv( "visuals_chams_luminance" ), 1.f }; - } chams; - - con_var< int > activation_type{ &holder_, fnv( "visuals_activation" ), false }; - con_var< bool > box{ &holder_, fnv( "visuals_box" ), false }; - con_var< bool > dormant{ &holder_, fnv( "visuals_dormant" ), false }; - con_var< bool > health{ &holder_, fnv( "visuals_health" ), false }; - con_var< bool > weapon{ &holder_, fnv( "visuals_weapon" ), false }; - con_var< bool > name{ &holder_, fnv( "visuals_name" ), false }; - con_var< bool > out_of_pov{ &holder_, fnv( "visuals_out_of_pov" ), false }; - con_var< float > out_of_pov_radius{ &holder_, fnv( "visuals_out_of_pov_radius" ), 0.75f }; - con_var< int > out_of_pov_size{ &holder_, fnv( "visuals_out_of_pov_size" ), 25 }; - con_var< bool > friendlies{ &holder_, fnv( "visuals_friendlies" ), false }; - con_var< bool > skeleton{ &holder_, fnv( "visuals_skeleton" ) }; - con_var< bool > glow{ &holder_, fnv( "visuals_glow" ), false }; - con_var< bool > flags{ &holder_, fnv( "visuals_flags" ), false }; - con_var< bool > resolver_indicator{ &holder_, fnv( "visuals_resolver_indicator" ), false }; - con_var< bool > ammo{ &holder_, fnv( "visuals_ammo" ), false }; - con_var< bool > money{ &holder_, fnv( "visuals_money" ) }; - con_var< bool > ping{ &holder_, fnv( "visuals_ping" ) }; - con_var< bool > floating_ragdolls{ &holder_, fnv( "visuals_floating_ragdolls" ) }; - con_var< bool > sound{ &holder_, fnv( "visuals_sound" ), false }; - con_var< clr_t > box_enemy{ &holder_, fnv( "visuals_clr_enemy" ), clr_t( 0, 255, 255 ) }; - con_var< clr_t > box_friendly{ &holder_, fnv( "visuals_clr_friendly" ), clr_t( 255, 0, 255 ) }; - - con_var< bool > hits{ &holder_, fnv( "visuals_hits" ), false }; - - con_var< clr_t > glow_enemy{ &holder_, fnv( "visuals_glow_enemy" ), clr_t( 255, 0, 255, 150 ) }; - con_var< clr_t > glow_friendly{ &holder_, fnv( "visuals_glow_friendly" ), clr_t( 255, 120, 0, 150 ) }; - con_var< clr_t > skeleton_enemy{ &holder_, fnv( "visuals_skeleton_enemy" ), clr_t( 255, 255, 255 ) }; - con_var< clr_t > skeleton_friendly{ &holder_, fnv( "visuals_skeleton_friendly" ), clr_t( 255, 255, 255 ) }; - - con_var< clr_t > name_enemy{ &holder_, fnv( "visuals_name_enemy" ), clr_t( 255, 255, 255 ) }; - con_var< clr_t > name_friendly{ &holder_, fnv( "visuals_name_friendly" ), clr_t( 255, 255, 255 ) }; - - con_var< clr_t > ammo_bar_clr{ &holder_, fnv( "visuals_ammo_bar_clr" ), clr_t( 84, 173, 247 ) }; - con_var< clr_t > lby_bar_clr{ &holder_, fnv( "visuals_lby_bar_clr" ), clr_t( 0xf4, 0x7c, 0xa8 ) }; - - con_var< int > bullet_tracers{ &holder_, fnv( "visuals_bullet_tracers" ), 0 }; - con_var< bool > target{ &holder_, fnv( "visuals_target" ) }; - con_var< int > target_time{ &holder_, fnv( "visuals_target_time" ) }; - con_var< int > sound_range{ &holder_, fnv( "visuals_sound_range" ), 360 }; - - con_var< int > key{ &holder_, fnv( "visuals_key" ), 0 }; - con_var< bool > hitmarkers{ &holder_, fnv( "visuals_hitmarkers" ), false }; - bool active = true; - - con_var< bool > world_modulate{ &holder_, fnv( "visuals_world_modulate" ), false }; - con_var< bool > night_mode{ &holder_, fnv( "visuals_night_mode" ), false }; - con_var< bool > transparent_props{ &holder_, fnv( "visuals_transparent_props" ), false }; - con_var< bool > no_cascade_shadows{ &holder_, fnv( "visuals_no_cascade_shadows" ), false }; - - con_var< bool > recoil_crosshair{ &holder_, fnv( "misc_recoil_crosshair" ), false }; - con_var< bool > autowall_crosshair{ &holder_, fnv( "visual_recoil_crosshair" ), false }; - con_var< bool > draw_spread{ &holder_, fnv( "visual_draw_spread" ), false }; - con_var< bool > snipers_crosshair{ &holder_, fnv( "visuals_sniper_crosshair" ), false }; - con_var< bool > grenade_prediction{ &holder_, fnv( "visuals_grenade_prediction" ), false }; - con_var< clr_t > grenade_pred_clr{ &holder_, fnv( "visuals_grenade_pred_clr" ), clr_t( 84, 173, 247 ) }; - - con_var< int > weapon_esp{ &holder_, fnv( "visuals_weapon_esp" ), 0 }; - con_var< int > grenade_esp{ &holder_, fnv( "visuals_grenade_esp" ), 0 }; - con_var< bool > grenade_owner{ &holder_, fnv( "visuals_grenade_owner" ), false }; - - con_var< clr_t > weapon_esp_clr{ &holder_, fnv( "visuals_weapon_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; - con_var< clr_t > grenade_esp_clr{ &holder_, fnv( "visuals_grenade_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; - - con_var< bool > spec_list{ &holder_, fnv( "visuals_spec_list" ), false }; - con_var< bool > radar{ &holder_, fnv( "visuals_radar" ), false }; - con_var< bool > fullbright{ &holder_, fnv( "visuals_fullbright" ), false }; - con_var< bool > bomb_info{ &holder_, fnv( "visuals_bomb_information" ), false }; - } visuals; - - struct { - con_var< bool > watermark{ &holder_, fnv( "misc_watermark" ), false }; - con_var< bool > bunny_hop{ &holder_, fnv( "misc_bhop" ), false }; - con_var< int > auto_strafe{ &holder_, fnv( "misc_autostrafe" ), false }; - con_var< bool > circle_strafe{ &holder_, fnv( "misc_circlestrafe" ), false }; - con_var< int > circle_strafe_key{ &holder_, fnv( "misc_circle_key" ), 0 }; - con_var< bool > edge_jump{ &holder_, fnv( "misc_edgejump" ), false }; - con_var< int > edge_jump_key{ &holder_, fnv( "misc_edge_jump_key" ), false }; - con_var< bool > auto_jumpbug{ &holder_, fnv( "misc_auto_jumpbug" ), false }; - con_var< int > auto_jumpbug_key{ &holder_, fnv( "misc_auto_jumpbug_key" ), 0 }; - con_var< bool > show_jump_stats{ &holder_, fnv( "misc_show_jump_stats" ), 0 }; - con_var< int > viewmodel_fov{ &holder_, fnv( "misc_viewmodel_fov" ), 0 }; - con_var< int > fov_changer{ &holder_, fnv( "fov_changer" ), 90 }; - con_var< bool > clantag_changer{ &holder_, fnv( "misc_clantag" ), false }; - con_var< bool > log_hits{ &holder_, fnv( "misc_log_hits" ) }; - con_var< int > name_changer{ &holder_, fnv( "misc_namechanger" ), 0 }; - con_var< bool > thirdperson{ &holder_, fnv( "misc_thirdperson" ), false }; - con_var< int > thirdperson_key{ &holder_, fnv( "misc_tp_key" ), 0 }; - con_var< bool > auto_accept{ &holder_, fnv( "misc_autoaccept" ), false }; - con_var< int > auto_accept_delay{ &holder_, fnv( "misc_autoaccept_delay" ), 0 }; - con_var< bool > net_fakelag{ &holder_, fnv( "misc_net_fakelag" ), false }; - con_var< bool > air_duck{ &holder_, fnv( "air_duck" ) }; - bool net_fakeping_active = false; - - struct { - con_var< int > main_weapon{ &holder_, fnv( "misc_autobuy_main_weapon" ), 0 }; - con_var< int > secondary_weapon{ &holder_, fnv( "misc_autobuy_secondary_weapon" ), 0 }; - con_var< bool > zeus{ &holder_, fnv( "misc_autobuy_zeus" ), false }; - con_var< bool > armor{ &holder_, fnv( "misc_autobuy_armor" ), false }; - con_var< bool > defuser{ &holder_, fnv( "misc_autobuy_defuse" ), false }; - con_var< bool > molly{ &holder_, fnv( "misc_autobuy_molly" ), false }; - con_var< bool > grenade{ &holder_, fnv( "misc_autobuy_nade" ), false }; - con_var< bool > smoke{ &holder_, fnv( "misc_autobuy_smoke" ), false }; - con_var< bool > flash{ &holder_, fnv( "misc_autobuy_flash" ), false }; - con_var< bool > decoy{ &holder_, fnv( "misc_autobuy_decoy" ), false }; - } autobuy; - - con_var< bool > team_dmg{ &holder_, fnv( "misc_teamdmg" ), false }; - con_var< bool > server_information{ &holder_, fnv( "misc_server_info" ), false }; - con_var< bool > rich_presence{ &holder_, fnv( "misc_rich_presence" ), false }; - con_var< bool > no_sound{ &holder_, fnv( "misc_no_sound" ), false }; - con_var< bool > rank_reveal{ &holder_, fnv( "misc_rank_reveal" ), 0 }; - con_var< bool > unlock_inventory{ &holder_, fnv( "misc_unlock_inventory" ), 0 }; - con_var< bool > auto_revolver{ &holder_, fnv( "misc_auto_revolver" ), 0 }; - con_var< bool > no_scope{ &holder_, fnv( "misc_no_scope" ), false }; - con_var< bool > no_zoom{ &holder_, fnv( "misc_no_zoom" ), false }; - con_var< bool > no_recoil{ &holder_, fnv( "misc_no_recoil" ), false }; - con_var< bool > no_smoke{ &holder_, fnv( "misc_no_smoke" ), false }; - con_var< bool > no_flash{ &holder_, fnv( "misc_no_flash" ), false }; - con_var< bool > transparent_vm{ &holder_, fnv( "misc_transparent_vm" ), false }; - con_var< bool > hide_from_obs{ &holder_, fnv( "misc_hide_from_obs" ), false }; - con_var< bool > disable_post_process{ &holder_, fnv( "misc_disable_post_process" ), false }; - con_var< int > recording_start_key{ &holder_, fnv( "recording_start_key" ), 0 }; - con_var< int > recording_stop_key{ &holder_, fnv( "recording_stop_key" ), 0 }; - con_var< int > recording_show_angles{ &holder_, fnv( "recording_show_angles" ), 0 }; - con_var< bool > no_crouch_cooldown{ &holder_, fnv("no_crouch_cooldown") }; - con_var< bool > money_talk { &holder_, fnv( "misc_money_talk" ), false }; - - struct { - con_var< int > knife{ &holder_, fnv( "misc_skins_knife" ), 0 }; - con_var< int > glove{ &holder_, fnv( "misc_skins_glove" ), 0 }; - con_var< int > glove_skin{ &holder_, fnv( "misc_skins_glove_skin" ) }; - int current_skin; - con_var< std::array< int, 65 > > skins{ &holder_, fnv( "misc_skins_data" ) }; - } skins; - - bool recorder_enable = false; - } misc; - - struct { - con_var< clr_t > menu_color{ &holder_, fnv( "menu_color" ), clr_t( 231, 105, 105 ) }; - - bool anti_untrusted = true; - bool open = false; - bool logs_enable = false; - int cur_setting = 0; - } menu; - }; -} - -extern data::c_settings g_settings; \ No newline at end of file diff --git a/internal_rewrite/shut_down.cpp b/internal_rewrite/shut_down.cpp deleted file mode 100644 index c3d2a95..0000000 --- a/internal_rewrite/shut_down.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "hooks.hpp" -#include "chams.hpp" -#include "base_cheat.hpp" -#include "detours.h" - -void __fastcall hooks::shut_down( void* ecx_, void* edx_ ) { - static auto original_fn = shut_down_o; - - g_csgo.m_engine( )->ClientCmd_Unrestricted( xors( "host_writeconfig" ) ); - //fuck you - - memory::detours.restore( ); - - g_con->destroy( ); - - abort( ); - - g_cheat.m_chams.m_materials.destroy_materials( ); - return original_fn( ecx_, edx_ ); -} \ No newline at end of file diff --git a/internal_rewrite/simple_settings.cpp b/internal_rewrite/simple_settings.cpp deleted file mode 100644 index b6b3281..0000000 --- a/internal_rewrite/simple_settings.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "settings.hpp" - -SettingHolder data::holder_{ "iloveyou" }; -data::c_settings g_settings; - -#pragma warning(disable: 4996) - -void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ) { - auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); - auto data = reinterpret_cast< const uint8_t* >( src ); - - for ( size_t i = 0; i < size; i++ ) - sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); - - WritePrivateProfileStringA( path, name, buffer, filename ); -} - -void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ) { - auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); - auto data = reinterpret_cast< uint8_t* >( dest ); - - GetPrivateProfileStringA( path, name, "", buffer, size * 2 + 1, filename ); - - if ( *buffer == 0 ) - return; - - for ( size_t i = 0; i < size; i++ ) { - unsigned temp; - sscanf( &buffer[ 2 * i ], "%02X", &temp ); - data[ i ] = temp; - } -} \ No newline at end of file diff --git a/internal_rewrite/simple_settings.hpp b/internal_rewrite/simple_settings.hpp deleted file mode 100644 index e3187ba..0000000 --- a/internal_rewrite/simple_settings.hpp +++ /dev/null @@ -1,283 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include - -#include "util.hpp" -#include "fnv.hpp" - -#pragma comment( lib, "Shlwapi.lib" ) - -//nama stuff -extern void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ); -extern void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ); - -class ISettingNode { -public: - virtual ~ISettingNode( ) = default; - - virtual void load( const char* path, const char* file ) = 0; - virtual void save( const char* path, const char* file ) const = 0; - virtual void reset( ) const = 0; - virtual void register_( ISettingNode* node_ptr ) = 0; - virtual bool has_nodes( ) { return false; } - virtual hash_t get_hash( ) { return 0; } -}; - -class SettingHolder : public ISettingNode { -public: - __forceinline SettingHolder( const char* name ) : name_( name ) {} - __forceinline SettingHolder( SettingHolder* holder_ptr, const char* name ) : name_( name ) { holder_ptr->register_( this ); } - - void register_( ISettingNode* node_ptr ) override { - setting_nodes_.push_back( node_ptr ); - } - - __declspec( noinline ) void load( const char* path, const char* file ) override - { - static char full_path[1024]; - memset( full_path, 0, 1024 ); - - strcpy_s( full_path, path ); - strcat_s( full_path, "_" ); - strcat_s( full_path, name_.c_str( ) ); - - for( auto x : setting_nodes_ ) { - if( !x ) - continue; - - x->load( full_path, file ); - } - } - - __declspec( noinline ) void save( const char* path, const char* file ) const override - { - static char full_path[1024]; - memset( full_path, 0, 1024 ); - - strcpy_s( full_path, path ); - strcat_s( full_path, "_" ); - strcat_s( full_path, name_.c_str( ) ); - for ( auto x : setting_nodes_ ) - x->save( full_path, file ); - } - - __declspec( noinline ) void reset( ) const override { - for( auto x : setting_nodes_ ) - x->reset( ); - } - - auto& get_nodes( ) { - return setting_nodes_; - } - - virtual bool has_nodes( ) { - return true; - } - -private: - std::string name_; - bool has_nodes_; - std::vector setting_nodes_; -}; - -class ISetting : public ISettingNode { - void register_( ISettingNode* node_ptr ) override {} -public: - virtual void set( float value ) = 0; - virtual void set( int value ) = 0; - virtual void set( ulong_t value ) = 0; - virtual std::string get_string( ) = 0; - virtual hash_t get_hash( ) = 0; - virtual std::string get_data_string( ) = 0; - virtual void load_from_string( const std::string& ) = 0; -}; - -template < size_t L > -class SettingString : ISetting { -public: - __forceinline SettingString( SettingHolder* holder_ptr, hash_t hash ) : - m_name( name ), m_value( "" ) { - holder_ptr->register_( this ); - }; - - __declspec( noinline ) void load( const char* path, const char* file ) override { - static char str[ MAX_PATH ]; - - GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); - PathRemoveFileSpecA( str ); - strcat_s< MAX_PATH >( str, path ); - strcat_s< MAX_PATH >( str, "\\" ); - - GetPrivateProfileStringA( path, std::to_string( m_name ).c_str( ), "", m_value, L, file ); - } - - __declspec( noinline ) void save( const char* path, const char* file ) const override { - static char str[ MAX_PATH ]; - - GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); - PathRemoveFileSpecA( str ); - strcat_s< MAX_PATH >( str, path ); - strcat_s< MAX_PATH >( str, "\\" ); - - WritePrivateProfileStringA( path, std::to_string( m_name ).c_str( ), m_value, file ); - } - - - char* get( ) { - return m_value; - } - -private: - char m_value[ L ]; - hash_t m_name; -}; - -template < typename T > -class con_var : public ISetting { -public: - __declspec( noinline ) con_var( SettingHolder* holder_ptr, hash_t name ) : - name_( name ), - original_{ }, - is_float_( std::is_floating_point_v< T > ), - is_integral_( std::is_integral_v< T > ) { - holder_ptr->register_( this ); - } - __declspec( noinline ) con_var( SettingHolder* holder_ptr, hash_t name, const T& rhs ) : - value_( rhs ), - name_( name ), - original_( value_ ), - is_float_( std::is_floating_point_v< T > ), - is_integral_( std::is_integral_v< T > ) { - holder_ptr->register_( this ); - } - - __declspec( noinline ) void load( const char* path, const char* file ) override { - static char str[ MAX_PATH ]; - static char full_path[ MAX_PATH ]; - static bool taken = false; - - if( !taken ) { - GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); - PathRemoveFileSpecA( str ); - strcat_s< MAX_PATH >( str, "\\csgo\\cfg\\" ); - - taken = true; - } - - memset( full_path, 0, MAX_PATH ); - memcpy( full_path, str, MAX_PATH ); - strcat_s< MAX_PATH >( full_path, file ); - - simple_load( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), full_path ); - } - - __declspec( noinline ) void save( const char* path, const char* file ) const override { - static char str[ MAX_PATH ]; - static char full_path[ MAX_PATH ]; - static bool taken = false; - - if( !taken ) { - GetModuleFileNameA( nullptr, str, MAX_PATH - 1 ); - PathRemoveFileSpecA( str ); - strcat_s< MAX_PATH >( str, "\\csgo\\cfg\\" ); - - taken = true; - } - - memset( full_path, 0, MAX_PATH ); - memcpy( full_path, str, MAX_PATH ); - strcat_s< MAX_PATH >( full_path, file ); - - simple_save( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), full_path ); - } - - __declspec( noinline ) void reset( ) const override { - // now this is really epic. - memcpy( ( void* )&value_, ( void* )&original_, sizeof( original_ ) ); - } - - __forceinline operator T&( ) { return value_; } - __forceinline T* operator &( ) { return &value_; } - - __forceinline T& operator ()( ) { return value_; } - - virtual std::string get_string( ) { - if constexpr( std::is_arithmetic_v< T > ) { - return std::to_string( value_ ); - } - else { - return util::to_hex_str( *( ulong_t* )( &value_ ) ); - } - } - - virtual void set( float value ) { - if constexpr( std::is_arithmetic_v< T > ) { - value_ = ( T )( value ); - } - } - - virtual void set( int value ) { - if constexpr( std::is_arithmetic_v< T > ) { - value_ = ( T )( value ); - } - else { - value_ = *( T* )( &value ); - } - } - - virtual void set( ulong_t value ) { - if constexpr( sizeof( T ) == sizeof( ulong_t ) ) { - *( ulong_t* )( &value_ ) = value; - return; - } - - memcpy( &value_, &value, sizeof( value_ ) ); - } - - virtual hash_t get_hash( ) { - return name_; - } - - __forceinline bool is_floating_point( ) { - return is_float_; - } - - __forceinline bool is_integral( ) { - return is_integral_; - } - - virtual std::string get_data_string( ) override { - auto buffer = reinterpret_cast< char* >( _alloca( sizeof( T ) * 2 + 1 ) ); - auto data = reinterpret_cast< const uint8_t* >( &value_ ); - - for( size_t i = 0; i < sizeof( T ); i++ ) - sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); - - return buffer; - } - - virtual void load_from_string( const std::string& str ) override { - auto data = reinterpret_cast< uint8_t* >( &value_ ); - auto buffer = str.data( ); - - if( *buffer == 0 ) - return; - - for( size_t i = 0; i < sizeof( T ); i++ ) { - unsigned temp; - sscanf( &buffer[ 2 * i ], "%02X", &temp ); - data[ i ] = temp; - } - } - - -private: - hash_t name_; - bool is_float_; - bool is_integral_; - T value_; - T original_; -}; \ No newline at end of file diff --git a/internal_rewrite/simulate.cpp b/internal_rewrite/simulate.cpp deleted file mode 100644 index 28ec687..0000000 --- a/internal_rewrite/simulate.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include - -#include "hooks.hpp" -#include "base_cheat.hpp" -#include "context.hpp" - -void __fastcall hooks::simulate( void* ecx, void* edx ) { - static auto ret_addr = pattern::first_code_match< void* >( g_csgo.m_engine.dll( ), "8B CE 6A FF 8B 06", -0x81 ); - - if( _ReturnAddress( ) == (void*)ret_addr ) { - g_ctx.run_frame( ); - - g_ctx.m_stage = FRAME_RENDER_START; - g_cheat.m_visuals.world_modulate( ); - - //g_con->game_console_print( "render start\n" ); - g_cheat.m_extra.disable_post_processing( ); - g_cheat.m_extra.no_flash( ); - g_cheat.m_extra.no_recoil( false ); - util::disable_pvs( ); - g_cheat.m_ragebot.m_lagcomp->fsn_render_start( ); - //g_cheat.m_ragebot.m_lagcomp->invalidate_bone_caches( ); - if( g_csgo.m_input( )->m_fCameraInThirdPerson ) { - bool real_yaw = g_settings.rage.anti_aim( ); - if( g_ctx.get_last_cmd( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) ) { - //g_ctx.m_local->m_vecThirdpersonAngles( ) = ( real_yaw ? g_ctx.m_thirdperson_angle : g_ctx.get_last_cmd( )->m_viewangles ); - } - } - - g_cheat.m_extra.no_smoke( ); - if( g_settings.misc.no_smoke ) { -#ifdef HEADER_MODULE - static auto smoke_count = g_header.patterns.smoke_count; -#else - static auto smoke_count = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "55 8B EC 83 EC 08 8B 15 ? ? ? ? 0F 57 C0" ) ); -#endif - **reinterpret_cast< int** >( smoke_count + 0x8 ) = 0; - } - - simulate_o( ecx, edx ); - } - else { - simulate_o( ecx, edx ); - } -} \ No newline at end of file diff --git a/internal_rewrite/skins.cpp b/internal_rewrite/skins.cpp deleted file mode 100644 index 4abef06..0000000 --- a/internal_rewrite/skins.cpp +++ /dev/null @@ -1,271 +0,0 @@ -#include "skins.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "interface.hpp" - -namespace features -{ - int c_skins::get_knife_index( ) { - switch( g_settings.misc.skins.knife( ) ) { - case 0: - return 0; - case 1: - return 500; - case 2: - return 505; - case 3: - return 506; - case 4: - return 507; - case 5: - return 508; - case 6: - return 509; - } - - return 0; - } - - const char* c_skins::get_model_str( ) { - switch( g_settings.misc.skins.knife( ) ) { - case 0: - return 0; - case 1: - return xors( "models/weapons/v_knife_bayonet.mdl" ); - case 2: - return xors( "models/weapons/v_knife_flip.mdl" ); - case 3: - return xors( "models/weapons/v_knife_gut.mdl" ); - case 4: - return xors( "models/weapons/v_knife_karam.mdl" ); - case 5: - return xors( "models/weapons/v_knife_m9_bay.mdl" ); - case 6: - return xors( "models/weapons/v_knife_tactical.mdl" ); - } - - return nullptr; - } - - const char* c_skins::get_glove_model( ) { - switch( g_settings.misc.skins.glove ) { - case 5027: - return xors( "models/weapons/v_models/arms/glove_bloodhound/v_glove_bloodhound.mdl" ); - case 5030: - return xors( "models/weapons/v_models/arms/glove_sporty/v_glove_sporty.mdl" ); - case 5031: - return xors( "models/weapons/v_models/arms/glove_slick/v_glove_slick.mdl" ); - case 5032: - return xors( "models/weapons/v_models/arms/glove_handwrap_leathery/v_glove_handwrap_leathery.mdl" ); - case 5033: - return xors( "models/weapons/v_models/arms/glove_motorcycle/v_glove_motorcycle.mdl" ); - case 5034: - return xors( "models/weapons/v_models/arms/glove_specialist/v_glove_specialist.mdl" ); - } - - return nullptr; - } - - const char* c_skins::get_killicon_str( ) { - switch( g_settings.misc.skins.knife( ) ) { - case 0: - return 0; - case 1: - return xors( "bayonet" ); - case 2: - return xors( "knife_flip" ); - case 3: - return xors( "knife_gut" ); - case 4: - return xors( "knife_karambit" ); - case 5: - return xors( "knife_m9_bayonet" ); - case 6: - return xors( "knife_tactical" ); - } - - return nullptr; - } - - int c_skins::get_current_weapon_id( ) { - if( !g_ctx.m_local || !g_ctx.m_local->is_valid( ) ) - return WEAPON_KNIFE; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) - return WEAPON_KNIFE; - - return get_weapon_id( weapon ); - } - - int c_skins::get_weapon_id( c_base_weapon* weapon ) { - if( weapon->is_knife( ) || weapon->is_grenade( ) ) - return WEAPON_KNIFE; - - if( weapon->m_iItemDefinitionIndex( ) == WEAPON_TASER ) - return WEAPON_KNIFE; - - return std::clamp< int >( weapon->m_iItemDefinitionIndex( ), 0, 64 ); - } - - // This is nasty. - void c_skins::replace_deaths( IGameEvent* event ) { - if( !strcmp( event->GetName( ), xors( "player_death" ) ) && g_csgo.m_engine( )->GetPlayerForUserID( event->GetInt( xors( "attacker" ) ) ) == g_csgo.m_engine( )->GetLocalPlayer( ) ) { - if( ( !strcmp( event->GetString( xors( "weapon" ) ), xors( "knife_default_ct" ) ) || !strcmp( event->GetString( xors( "weapon" ) ), xors( "knife_t" ) ) ) ) { - if( get_killicon_str( ) ) - event->SetString( xors( "weapon" ), get_killicon_str( ) ); - } - } - } - - //stop this - void c_skins::override_weapon( c_base_weapon* wep ) { - auto aw = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hActiveWeapon( ) ); - auto vm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hViewModel( ) ); - auto wm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->get_weapon( )->m_hWeaponWorldModel( ) ); - - auto info = g_ctx.m_local->get_info( ); - int index = get_knife_index( ); - - if( wep->is_knife( ) && index ) { - int model = g_csgo.m_model_info( )->GetModelIndex( get_model_str( ) ); - - wep->m_iItemDefinitionIndex( ) = index; - wep->m_nModelIndex( ) = model; - wep->m_iWorldDroppedModelIndex( ) = model + 2; - wep->m_iWorldModelIndex( ) = model + 1; - wep->m_iViewModelIndex( ) = model; - wep->m_iItemIDHigh( ) = -1; - wep->m_iEntityQuality( ) = 3; - - if( aw->m_iItemDefinitionIndex( ) == wep->m_iItemDefinitionIndex( ) ) - vm->m_nModelIndex( ) = model; - - if( wm && wep == aw ) { - wm->m_nModelIndex( ) = model + 1; - } - } - - if( m_last_index != g_settings.misc.skins.current_skin ) { - g_settings.misc.skins.skins( )[ get_current_weapon_id( ) ] = g_settings.misc.skins.current_skin; - - if( g_csgo.m_global_state->get_client_state( )->m_delta_tick != -1 ) { - g_csgo.m_global_state->get_client_state( )->m_delta_tick = -1; // fullupdate happens - } - - - m_last_index = g_settings.misc.skins.current_skin; - g_ctx.run_frame( ); - } - - if( ( wep->m_hOwner( ) & 0xfff ) == g_ctx.m_local->ce( )->GetIndex( ) ) { - if( g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ] <= 0 ) - return; - - if( g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ] != wep->m_nFallbackPaintKit( ) ) { - wep->m_iItemIDHigh( ) = -1; - wep->m_iAccountID( ) = info.m_xuidlow; - } - - wep->m_nFallbackPaintKit( ) = g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ]; - wep->m_nFallbackStatTrak( ) = -1; - wep->m_nFallbackSeed( ) = math::random_number( 0, 1000 ); - - wep->m_flFallbackWear( ) = 0.0000001f; - } - } - - void c_skins::override_gloves( ) { - static int last_glove = 0; - static int last_skin = 0; - static ulong_t glove_handle = 0; - auto wearables = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2EF4 ); - - auto glove = ( c_base_weapon* )( g_csgo.m_entlist( )->GetClientEntityFromHandle( wearables[ 0 ] ) ); - - if( !glove ) { - auto last_glove = ( c_base_weapon* )( g_csgo.m_entlist( )->GetClientEntityFromHandle( glove_handle ) ); - - if( last_glove ) { - wearables[ 0 ] = glove_handle; - glove = last_glove; - } - } - - if( !g_ctx.m_local->is_alive( ) || !g_settings.misc.skins.glove ) { - if( glove ) { - glove->ce( )->GetClientNetworkable( )->SetDestroyedOnRecreateEntities( ); - glove->ce( )->GetClientNetworkable( )->Release( ); - } - - return; - } - - if( !g_settings.misc.skins.glove || !g_settings.misc.skins.glove_skin ) - return; - - bool update = false; - if( last_glove != g_settings.misc.skins.glove || last_skin != g_settings.misc.skins.glove_skin ) { - g_csgo.m_global_state->get_client_state( )->m_delta_tick = -1; - update = true; - } - - last_glove = g_settings.misc.skins.glove; - last_skin = g_settings.misc.skins.glove_skin; - - if( !glove ) { - for( auto cc = g_csgo.m_chl( )->GetAllClasses( ); !!cc; cc = cc->m_next ) { - if( cc->m_class_id != CEconWearable ) - continue; - - int entry = g_csgo.m_entlist( )->GetHighestEntityIndex( ) + 1; - int serial = math::random_number( 0, 4095 ); - - cc->m_create_fn( entry, serial ); - - glove = g_csgo.m_entlist( )->GetClientEntity< c_base_weapon >( entry ); - wearables[ 0 ] = entry | serial << 16; - glove_handle = wearables[ 0 ]; - update = true; - - break; - } - } - - if( glove ) { - auto desired_glove = g_settings.misc.skins.glove; - if( !desired_glove ) - return; - - glove->m_iItemDefinitionIndex( ) = desired_glove; - glove->m_nFallbackPaintKit( ) = g_settings.misc.skins.glove_skin; - glove->m_iEntityQuality( ) = 4; - glove->m_nFallbackSeed( ) = math::random_number( 0, 600 ); - glove->m_iItemIDHigh( ) = -1; - glove->m_iAccountID( ) = g_ctx.m_local->get_info( ).m_xuidlow; - - if( update ) { - int model_index = g_csgo.m_model_info( )->GetModelIndex( get_glove_model( ) ); - glove->set_glove_model( desired_glove ); - glove->ce( )->GetClientNetworkable( )->PreDataUpdate( 0 ); - } - } - } - - - void c_skins::operator()( ) { - if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.run_frame( ) && g_ctx.m_local->is_player( ) ) { - override_gloves( ); - - if( g_ctx.m_local->m_iHealth( ) > 0 && g_ctx.m_local->get_weapon( ) ) { - auto weapons = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2DE8 ); - for( int i{ }; weapons[ i ]; ++i ) { - auto wep = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weapons[ i ] ); - if( wep && wep->m_OriginalOwnerXuidLow( ) == g_ctx.m_local->get_info( ).m_xuidlow && !wep->is_grenade( ) && wep->m_iItemDefinitionIndex( ) != WEAPON_TASER ) { - override_weapon( wep ); - } - } - } - } - } -} \ No newline at end of file diff --git a/internal_rewrite/skins.hpp b/internal_rewrite/skins.hpp deleted file mode 100644 index f60deef..0000000 --- a/internal_rewrite/skins.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include - -class c_base_weapon; -class IGameEvent; -namespace features -{ - class c_skins { - private: - int m_last_index{ 0 }; - bool m_needs_update{ }; - - int get_knife_index( ); - const char* get_model_str( ); - - const char* get_glove_model( ); - - const char* get_killicon_str( ); - - //void override_knife( ); - void override_gloves( ); - void override_weapon( c_base_weapon* wep ); - //void update_active_skin( ); - int get_current_weapon_id( ); - int get_weapon_id( c_base_weapon* ); - - - public: - void operator()( ); - void replace_deaths( IGameEvent* event ); - }; -} \ No newline at end of file diff --git a/internal_rewrite/strings.hpp b/internal_rewrite/strings.hpp deleted file mode 100644 index f34c082..0000000 --- a/internal_rewrite/strings.hpp +++ /dev/null @@ -1,162 +0,0 @@ -//-------------------------------------------------------------------------------- -//-- XorCompileTime.hpp -// -// Author: frk -// Date: 12.12.2015 -// -//-------------------------------------------------------------------------------- - -#pragma once -#include -#include -#include - -#define BEGIN_NAMESPACE( x ) namespace x { -#define END_NAMESPACE } - -BEGIN_NAMESPACE( strenc ) - -constexpr auto time = __TIME__; -constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; - -// 1988, Stephen Park and Keith Miller -// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" -// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: -// with 32-bit math and without division - -template < int N > -struct RandomGenerator { -private: - static constexpr unsigned a = 16807; // 7^5 - static constexpr unsigned m = 2147483647; // 2^31 - 1 - - static constexpr unsigned s = RandomGenerator< N - 1 >::value; - static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 - static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 - static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits - static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi - static constexpr unsigned lo3 = lo2 + hi; - -public: - static constexpr unsigned max = m; - static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; -}; - -template <> -struct RandomGenerator< 0 > { - static constexpr unsigned value = seed; -}; - -template < int N, int M > -struct RandomInt { - static constexpr auto value = RandomGenerator< N + 1 >::value % M; -}; - -template < int N > -struct RandomChar { - static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); -}; - -template < size_t N, int K > -struct XorString { -private: - const char _key; - std::array< char, N + 1 > _encrypted; - bool decrypted = false; - - constexpr char enc( char c ) const { - return c ^ _key; - } - - char dec( char c ) const { - return c ^ _key; - } - -public: - template < size_t... Is > - constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { - } - - __forceinline const char* decrypt( void ) { - if( !decrypted ) { - for( size_t i = 0; i < N; ++i ) { - _encrypted[ i ] = dec( _encrypted[ i ] ); - } - _encrypted[ N ] = '\0'; - decrypted = true; - } - printf( "N: %u K: %d str: %s address: %08x\n", N, K, _encrypted.data( ), _encrypted.data( ) ); - - return _encrypted.data( ); - } -}; - -//-------------------------------------------------------------------------------- -//-- Note: XorStr will __NOT__ work directly with functions like printf. -// To work with them you need a wrapper function that takes a const char* -// as parameter and passes it to printf and alike. -// -// The Microsoft Compiler/Linker is not working correctly with variadic -// templates! -// -// Use the functions below or use std::cout (and similar)! -//-------------------------------------------------------------------------------- - -static auto w_printf = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_printf_s = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf( buf, fmt, args ); - va_end( args ); -}; - -static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf_s( buf, buf_size, fmt, args ); - va_end( args ); -}; - -//for compatibility with debug mode -struct debug_ret { -private: - const char* ret; - -public: - debug_ret( const char* str ) : ret( str ) { }; - - auto decrypt( ) { - return ret; - } -}; - -constexpr size_t strlen_ct( const char* const str ) { - size_t out = 1; - - for( ; str[ out ] != '\0'; ++out ); - - return out; -} - -#if 0 -#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) -#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) -#else -#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) -#define xors( s ) ( s ) -#endif - -END_NAMESPACE \ No newline at end of file diff --git a/internal_rewrite/suppress_lists.cpp b/internal_rewrite/suppress_lists.cpp deleted file mode 100644 index 01036ea..0000000 --- a/internal_rewrite/suppress_lists.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include - -#include "hooks.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "base_cheat.hpp" - -void __fastcall hooks::suppress_lists( void* ecx, void* edx, int list_mask, bool suppress ) { -#ifdef HEADER_MODULE - static auto net_update_ret = g_header.patterns.net_update_retaddr; -#else - static auto net_update_ret = pattern::first_code_match< void* >( g_csgo.m_chl.dll( ), "5F 5E 5D C2 04 00 83 3D ? ? ? ? ?" ); -#endif - - if( _ReturnAddress( ) == (void*)net_update_ret ) { - g_ctx.m_stage = FRAME_NET_UPDATE_START; - g_cheat.m_visuals.world_modulate( ); - // FRAME_NET_UPDATE_START - //g_con->game_console_print( "net start\n" ); - - static bool rich_presence_active = false; - - g_ctx.run_frame( ); - g_cheat.m_ragebot.m_lagcomp->fsn_net_update_start( ); - - if( g_settings.misc.rich_presence( ) ) { - g_cheat.m_extra.rich_presence_flex( ); - rich_presence_active = true; - } - else if( rich_presence_active ) { - if( !g_settings.misc.rich_presence( ) ) - g_cheat.m_extra.remove_rich_presence_flex( ); - - rich_presence_active = false; - } - g_cheat.m_visuals.draw_sound( ); - g_cheat.m_visuals.draw_tracers( ); - - } - - suppress_lists_o( ecx, edx, list_mask, suppress ); - -} \ No newline at end of file diff --git a/internal_rewrite/table32.h b/internal_rewrite/table32.h deleted file mode 100644 index 2bd19d8..0000000 --- a/internal_rewrite/table32.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -* Hacker Disassembler Engine 32 C -* Copyright (c) 2008-2009, Vyacheslav Patkov. -* All rights reserved. -* -*/ - -#define C_NONE 0x00 -#define C_MODRM 0x01 -#define C_IMM8 0x02 -#define C_IMM16 0x04 -#define C_IMM_P66 0x10 -#define C_REL8 0x20 -#define C_REL32 0x40 -#define C_GROUP 0x80 -#define C_ERROR 0xff - -#define PRE_ANY 0x00 -#define PRE_NONE 0x01 -#define PRE_F2 0x02 -#define PRE_F3 0x04 -#define PRE_66 0x08 -#define PRE_67 0x10 -#define PRE_LOCK 0x20 -#define PRE_SEG 0x40 -#define PRE_ALL 0xff - -#define DELTA_OPCODES 0x4a -#define DELTA_FPU_REG 0xf1 -#define DELTA_FPU_MODRM 0xf8 -#define DELTA_PREFIXES 0x130 -#define DELTA_OP_LOCK_OK 0x1a1 -#define DELTA_OP2_LOCK_OK 0x1b9 -#define DELTA_OP_ONLY_MEM 0x1cb -#define DELTA_OP2_ONLY_MEM 0x1da - -static unsigned char hde32_table[] = { - 0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3, - 0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xac,0xaa,0xb2,0xaa,0x9f,0x9f, - 0x9f,0x9f,0xb5,0xa3,0xa3,0xa4,0xaa,0xaa,0xba,0xaa,0x96,0xaa,0xa8,0xaa,0xc3, - 0xc3,0x96,0x96,0xb7,0xae,0xd6,0xbd,0xa3,0xc5,0xa3,0xa3,0x9f,0xc3,0x9c,0xaa, - 0xaa,0xac,0xaa,0xbf,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0x90, - 0x82,0x7d,0x97,0x59,0x59,0x59,0x59,0x59,0x7f,0x59,0x59,0x60,0x7d,0x7f,0x7f, - 0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x9a,0x88,0x7d, - 0x59,0x50,0x50,0x50,0x50,0x59,0x59,0x59,0x59,0x61,0x94,0x61,0x9e,0x59,0x59, - 0x85,0x59,0x92,0xa3,0x60,0x60,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59, - 0x59,0x59,0x9f,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xcc,0x01,0xbc,0x03,0xf0, - 0x10,0x10,0x10,0x10,0x50,0x50,0x50,0x50,0x14,0x20,0x20,0x20,0x20,0x01,0x01, - 0x01,0x01,0xc4,0x02,0x10,0x00,0x00,0x00,0x00,0x01,0x01,0xc0,0xc2,0x10,0x11, - 0x02,0x03,0x11,0x03,0x03,0x04,0x00,0x00,0x14,0x00,0x02,0x00,0x00,0xc6,0xc8, - 0x02,0x02,0x02,0x02,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xca, - 0x01,0x01,0x01,0x00,0x06,0x00,0x04,0x00,0xc0,0xc2,0x01,0x01,0x03,0x01,0xff, - 0xff,0x01,0x00,0x03,0xc4,0xc4,0xc6,0x03,0x01,0x01,0x01,0xff,0x03,0x03,0x03, - 0xc8,0x40,0x00,0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00, - 0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00, - 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0xff,0xff,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x7f,0x00,0x00,0xff,0x4a,0x4a,0x4a,0x4a,0x4b,0x52,0x4a,0x4a,0x4a,0x4a,0x4f, - 0x4c,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x55,0x45,0x40,0x4a,0x4a,0x4a, - 0x45,0x59,0x4d,0x46,0x4a,0x5d,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a, - 0x4a,0x4a,0x4a,0x4a,0x4a,0x61,0x63,0x67,0x4e,0x4a,0x4a,0x6b,0x6d,0x4a,0x4a, - 0x45,0x6d,0x4a,0x4a,0x44,0x45,0x4a,0x4a,0x00,0x00,0x00,0x02,0x0d,0x06,0x06, - 0x06,0x06,0x0e,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x06,0x06,0x02,0x06, - 0x00,0x0a,0x0a,0x07,0x07,0x06,0x02,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04, - 0x04,0x04,0x00,0x00,0x00,0x0e,0x05,0x06,0x06,0x06,0x01,0x06,0x00,0x00,0x08, - 0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01, - 0x86,0x00,0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba, - 0xf8,0xbb,0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00, - 0xc4,0xff,0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00, - 0x13,0x09,0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07, - 0xb2,0xff,0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf, - 0xe7,0x08,0x00,0xf0,0x02,0x00 -}; \ No newline at end of file diff --git a/internal_rewrite/ui.h b/internal_rewrite/ui.h deleted file mode 100644 index 968a969..0000000 --- a/internal_rewrite/ui.h +++ /dev/null @@ -1,885 +0,0 @@ -#pragma once -#include "ui_base_item.h" -#include "ui_menu.h" -#include "ui_form.h" -#include "ui_render.h" -#include "ui_checkbox.h" -#include "ui_tab_manager.h" -#include "ui_slider.h" -#include "ui_dropdown.h" -#include "ui_key_picker.h" -#include "ui_button.h" -#include "ui_color_picker.h" -#include "ui_label.h" -#include "ui_itemlist.h" -#include "ui_itemlist_def.h" - -#include "settings.hpp" -#include "base_cheat.hpp" - -#include "modules.hpp" - -namespace ui -{ - int current_category = 0; - - static std::string date_str = __DATE__; - auto menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "quebot" ), - "" ); - - static void render( ) { - static bool was_setup = false; - if ( !was_setup ) { - std::transform( date_str.begin( ), date_str.end( ), date_str.begin( ), - [ ]( char c ) { return ::tolower( c ); } - ); - - menu.reset( ); - -#ifndef _DEBUG - date_str = g_header.username; - - - menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "automated currency" ), - //don't ask - date_str.c_str( ) ); -#else - menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "dmt hook" ), - date_str.c_str( ) ); -#endif - - auto tab_sheet = std::make_shared< ui::c_tab_manager >( ); - - //todo: replace with icons? - auto tab_legit = std::make_shared< ui::c_tab_sheet >( xors( "legit" ), &icons::sprite_legit ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_main = std::make_shared< ui::c_tab_sheet >( xors( "main" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.enabled ) ); - auto activation_dropdown = std::make_shared< ui::c_dropdown< > >( - 0, 0, 120, xors( "activation type" ), - &g_settings.legit.activation_type, - &ui::dropdowns::activation_types_aimbot ); - activation_dropdown->add_item( std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.key ) )->set_cond( - [ ]( ) { return g_settings.legit.activation_type == 1; } ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.legit.friendlies ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "aim assist" ), &g_settings.legit.assist ) ); - - main_form->add_item( activation_dropdown ); - } - - auto smooth_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "smoothing" ) ); { - smooth_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dynamic smoothing" ), &g_settings.legit.dynamic_smoothing ) ); - smooth_form->add_item( std::make_shared< ui::c_slider< size_t > >( 0, 0, 120, 2, 28, xors( "sample size" ), &g_settings.legit.sample_size ) ); - smooth_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.1f, 2.0f, xors( "multiplier" ), &g_settings.legit.smooth_factor ) ); - } - - auto backtracking_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "backtracking" ) ); { - backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.backtracking ) ); - backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "target" ), &g_settings.legit.backtracking_target ) ); - auto visualize_checkbox = backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "visualize" ), &g_settings.legit.backtracking_visualize ) ); - visualize_checkbox->add_item( std::make_shared< ui::c_color_picker >( 175, 2, 15, &g_settings.legit.backtracking_col ) ); - visualize_checkbox->set_cond( [ ] { return !g_settings.misc.hide_from_obs( ); } ); - - backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 50.f, xors( "max fov" ), &g_settings.legit.backtracking_fov ) ); - backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "max time" ), &g_settings.legit.backtracking_time, "s" ) ); - } - - auto triggerbot_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "triggerbot" ) ); { - triggerbot_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.triggerbot ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.trigger_key ) ); - - triggerbot_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "magnet" ), &g_settings.legit.trigger_magnet ) ); - - triggerbot_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "trigger delay" ), &g_settings.legit.trigger_delay, "s" ) - )->set_cond( [] { return g_settings.legit.triggerbot( ); } ); - } - - left_column->add_item( main_form ); - left_column->add_item( smooth_form ); - - right_column->add_item( backtracking_form ); - right_column->add_item( triggerbot_form ); - - subtab_main->add_item( left_column ); - subtab_main->add_item( right_column ); - } - - //make a subtab for each weapon type? - auto subtab_weapons = std::make_shared< ui::c_tab_sheet >( xors( "weapons" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto general_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "general" ) ); { - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.general.m_fov ) ); - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.general.m_speed ) ); - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.general.m_rcs ) ); - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.general.m_assist_strength ) ); - } - - auto snipers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "snipers" ) ); { - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.snipers.m_fov ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.snipers.m_speed ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.snipers.m_rcs ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.snipers.m_assist_strength ) ); - snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "awp body aim" ), &g_settings.legit.awp_baim ) ); - } - - auto rifles_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "rifles" ) ); { - rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.rifles.m_fov ) ); - rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.rifles.m_speed ) ); - rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.rifles.m_rcs ) ); - rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.rifles.m_assist_strength ) ); - } - - auto pistols_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "pistols" ) ); { - pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.pistols.m_fov ) ); - pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.pistols.m_speed ) ); - pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 100.f, xors( "rcs" ), &g_settings.legit.pistols.m_rcs ) ); - pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.pistols.m_assist_strength ) ); - } - - left_column->add_item( general_form ); - left_column->add_item( snipers_form ); - right_column->add_item( rifles_form ); - right_column->add_item( pistols_form ); - - subtab_weapons->add_item( left_column ); - subtab_weapons->add_item( right_column ); - } - - subtab_sheet->add_item( subtab_weapons ); - subtab_sheet->add_item( subtab_main ); - - tab_legit->add_item( subtab_sheet ); - } - - - auto tab_rage = std::make_shared< ui::c_tab_sheet >( xors( "rage" ), &icons::sprite_rage ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_aimbot = std::make_shared< ui::c_tab_sheet >( xors( "aimbot" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 235, xors( "main" ), 235 ); { - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.enabled ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.rage.friendlies ) ); - main_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 180.f, xors( "max fov" ), &g_settings.rage.fov ) ); - - - main_form->add_item( std::make_shared< ui::c_dropdown< int > >( - 0, 0, 120, xors( "activation type" ), - &g_settings.rage.activation_type, - &dropdowns::activation_types_aimbot ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.aimkey ) )->set_cond( - [ ]( ) { return g_settings.rage.activation_type == 1; } ); - - main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "silent" ), - &g_settings.rage.silent, &dropdowns::silent_aimbot_types ) ); - - - main_form->add_item( std::make_shared< ui::c_dropdown< int > >( 0, 0, 120, xors( "hitbox" ), - &g_settings.rage.hitbox, &dropdowns::hitboxes ) ); - - auto hitscan_form = main_form->add_item( std::make_shared< ui::c_form >( 0, 5, 119, 0, xors( "hitscan" ), 0, true ) ); - hitscan_form->set_cond( [ ]( ) { return g_settings.rage.hitbox == -1; } ); - - hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "head" ), &g_settings.rage.hitscan.head ) ); - hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "chest" ), &g_settings.rage.hitscan.chest ) ); - hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "stomach" ), &g_settings.rage.hitscan.stomach ) ); - hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "arms" ), &g_settings.rage.hitscan.arms ) ); - hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "legs" ), &g_settings.rage.hitscan.legs ) ); - hitscan_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "feet" ), &g_settings.rage.hitscan.feet ) ); - - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ignore limbs when moving" ), &g_settings.rage.ignore_limbs_moving ) - )->set_cond( [ ]( ) { return g_settings.rage.hitbox == -1; } ); - main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "multipoint" ), &g_settings.rage.multipoint_enable, &dropdowns::multipoint_types ) ); - main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 10, 100, &g_settings.rage.multipoint_scale( ) ) ); - auto multipoint_form = main_form->add_item( std::make_shared< ui::c_form >( 0, 5, 119, 0, xors( "multipoint" ), 0, true ) ); - multipoint_form->set_cond( [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); - - multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "head" ), &g_settings.rage.multipoint.head ) ); - multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "chest" ), &g_settings.rage.multipoint.chest ) ); - multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "stomach" ), &g_settings.rage.multipoint.stomach ) ); - multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thighs" ), &g_settings.rage.multipoint.thighs ) ); - multipoint_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "calves" ), &g_settings.rage.multipoint.calves ) ); - - - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "preserve fps" ), &g_settings.rage.preserve_fps ) ); - } - - auto accuracy_form = std::make_shared< ui::c_form >( 0, 0, 215, 157, xors( "accuracy" ), 157 ); { - accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto scope" ), &g_settings.rage.auto_scope ) ); - accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "anti-aim correction" ), &g_settings.rage.resolver ) ); - accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "pitch correction" ), &g_settings.rage.pitch_resolver ) - )->set_cond( [ ]( ) { return g_settings.rage.resolver; } ); - accuracy_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "fake lag correction" ), &g_settings.rage.fakelag_resolver, &dropdowns::fakelag_fix_types ) - )->set_cond( [ ]( ) { return g_settings.rage.resolver; } ); - - auto override_checkbox = accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "resolver override" ), &g_settings.rage.resolver_override ) ); - override_checkbox->add_item( std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.resolver_override_key ) ); - override_checkbox->set_cond( [ ]( ) { return g_settings.rage.resolver; } ); - auto visualize_checkbox = accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "visualize lag compensation" ), &g_settings.rage.bt_visualize ) ); - visualize_checkbox->set_cond( [ ]( ) { return g_settings.rage.resolver( ) && !g_settings.misc.hide_from_obs( );; } ); - visualize_checkbox->add_item( std::make_shared< ui::c_color_picker >( 175, 2, 15, &g_settings.rage.bt_col ) ); - - accuracy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "compensate spread" ), &g_settings.rage.compensate_spread ) ); - } - - auto selection_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "selection" ) ); { - selection_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "type" ), &g_settings.rage.selection_type, &dropdowns::selection_type ) ); - selection_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "prefer moving" ), &g_settings.rage.prefer_moving ) ); - selection_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "prefer low hp" ), &g_settings.rage.prefer_low_hp ) ); - } - - - - auto general_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { - general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); - - general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.general.m_auto_stop, &dropdowns::auto_stop ) ); - general_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.general.m_spread_limit ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - - general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.general.m_spread_limit_min ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.general.m_spread_limit; } ); - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.general.m_hitbox_scale ) )->set_cond( - [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); - - general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.general.m_hitchance ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.general.m_damage ) ); - general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.general.m_damage_scale, xors( "%%hp" ) ) ); - general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.general.m_delay_type, &dropdowns::delay_type ) ); - general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.general.m_delay, xors( "ms" ) ) - )->set_cond( [ ]( ) { return g_settings.rage.general.m_delay_type == 2; } ); - - general_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.general.m_baim_air ) ); - general_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.general.m_baim_fake ) ); - general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.general.m_baim_shots, xors( "shots" ) ) ); - general_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.general.m_baim_health, xors( "hp" ) ) ); - } - - general_form->set_cond( [ ]( ) { return current_category == 0; } ); - - auto pistols_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { - pistols_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); - - pistols_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.heavy_pistols.m_auto_stop, &dropdowns::auto_stop ) ); - pistols_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.heavy_pistols.m_spread_limit ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - - pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.heavy_pistols.m_spread_limit_min ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.heavy_pistols.m_spread_limit; } ); - pistols_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.heavy_pistols.m_hitbox_scale ) )->set_cond( - [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); - pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.heavy_pistols.m_hitchance ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.heavy_pistols.m_damage ) ); - pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.heavy_pistols.m_damage_scale, xors( "%%hp" ) ) ); - pistols_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.heavy_pistols.m_delay_type, &dropdowns::delay_type ) ); - pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.heavy_pistols.m_delay, xors( "ms" ) ) - )->set_cond( [ ]( ) { return g_settings.rage.heavy_pistols.m_delay_type == 2; } ); - - pistols_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.heavy_pistols.m_baim_air ) ); - pistols_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.heavy_pistols.m_baim_fake ) ); - pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.heavy_pistols.m_baim_shots, xors( "shots" ) ) ); - pistols_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.heavy_pistols.m_baim_health, xors( "hp" ) ) ); - } - - pistols_form->set_cond( [ ]( ) { return current_category == 1; } ); - - auto snipers_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { - snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); - - snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.snipers.m_auto_stop, &dropdowns::auto_stop ) ); - snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.snipers.m_spread_limit ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - - snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.snipers.m_spread_limit_min ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.snipers.m_spread_limit; } ); - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.snipers.m_hitbox_scale ) )->set_cond( - [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); - snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.snipers.m_hitchance ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.snipers.m_damage ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.snipers.m_damage_scale, xors( "%%hp" ) ) ); - snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.snipers.m_delay_type, &dropdowns::delay_type ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.snipers.m_delay, xors( "ms" ) ) - )->set_cond( [ ]( ) { return g_settings.rage.snipers.m_delay_type == 2; } ); - - snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.snipers.m_baim_air ) ); - snipers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.snipers.m_baim_fake ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.snipers.m_baim_shots, xors( "shots" ) ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.snipers.m_baim_health, xors( "hp" ) ) ); - } - - snipers_form->set_cond( [ ]( ) { return current_category == 2; } ); - - auto auto_form = std::make_shared< ui::c_form >( 0, 0, 215, 306, xors( "weapon specific" ), 306 ); { - auto_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "category" ), ¤t_category, &dropdowns::weapon_configs ) ); - - auto_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto stop" ), &g_settings.rage.auto_snipers.m_auto_stop, &dropdowns::auto_stop ) ); - auto_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spread limit" ), &g_settings.rage.auto_snipers.m_spread_limit ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - - auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.auto_snipers.m_spread_limit_min ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread && g_settings.rage.auto_snipers.m_spread_limit; } ); - auto_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "hitbox scale" ), &g_settings.rage.auto_snipers.m_hitbox_scale ) )->set_cond( - [ ]( ) { return g_settings.rage.multipoint_enable( ); } ); - auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "hitchance" ), &g_settings.rage.auto_snipers.m_hitchance ) - )->set_cond( [ ]( ) { return !g_settings.rage.compensate_spread; } ); - auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "min damage" ), &g_settings.rage.auto_snipers.m_damage ) ); - auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, &g_settings.rage.auto_snipers.m_damage_scale, xors( "%%hp" ) ) ); - auto_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "delay shot" ), &g_settings.rage.auto_snipers.m_delay_type, &dropdowns::delay_type ) ); - auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 300, &g_settings.rage.auto_snipers.m_delay, xors( "ms" ) ) - )->set_cond( [ ]( ) { return g_settings.rage.auto_snipers.m_delay_type == 2; } ); - - auto_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head in air" ), &g_settings.rage.auto_snipers.m_baim_air ) ); - auto_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid head on fake angles" ), &g_settings.rage.auto_snipers.m_baim_fake ) ); - auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 20, xors( "body aim after" ), &g_settings.rage.auto_snipers.m_baim_shots, xors( "shots" ) ) ); - auto_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 100, xors( "body aim under" ), &g_settings.rage.auto_snipers.m_baim_health, xors( "hp" ) ) ); - } - - auto_form->set_cond( [ ]( ) { return current_category == 3; } ); - - left_column->add_item( main_form ); - left_column->add_item( accuracy_form ); - right_column->add_item( selection_form ); - right_column->add_item( general_form ); - right_column->add_item( pistols_form ); - right_column->add_item( snipers_form ); - right_column->add_item( auto_form ); - - - subtab_aimbot->add_item( left_column ); - subtab_aimbot->add_item( right_column ); - } - - auto subtab_antiaim = std::make_shared< ui::c_tab_sheet >( xors( "antiaim" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 131, xors( "main" ), 131 ); { - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.anti_aim ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "at players" ), &g_settings.rage.at_players ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant check" ), &g_settings.rage.dormant_check ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "angle step" ), &g_settings.rage.angle_step ) ); - main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, &g_settings.rage.angle_step_degrees ) )->set_cond( - [ ]( ) { return g_settings.rage.angle_step( ); } ); - - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fix leg movement" ), &g_settings.rage.fix_legs ) ); - } - - auto pitch_form = std::make_shared< ui::c_form >( 0, 0, 215, 60, xors( "pitch" ) ); { - pitch_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "pitch" ), &g_settings.rage.pitch, &dropdowns::antiaim_pitch ) ); - pitch_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -89, 89, &g_settings.rage.pitch_offset ) )->set_cond( - [ ]( ) { return g_settings.rage.pitch == 1 || g_settings.rage.pitch == 4 || g_settings.rage.pitch == 5; } ); - } - - auto yaw_form = std::make_shared< ui::c_form >( 0, 0, 215, 190, xors( "yaw" ), 190 ); { - yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw" ), &g_settings.rage.real_yaw, &dropdowns::antiaim_yaw ) ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.real_yaw_add( ) ) )->set_cond( - [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw jitter" ), &g_settings.rage.real_yaw_jitter ) )->set_cond( - [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw moving" ), &g_settings.rage.real_yaw_moving, &dropdowns::antiaim_yaw ) )->set_cond( - [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.real_yaw_moving_add( ) ) )->set_cond( - [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "real yaw moving jitter" ), &g_settings.rage.real_moving_jitter ) )->set_cond( - [ ]( ) { return !!g_settings.rage.real_yaw_moving( ) && !!g_settings.rage.real_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "in-air yaw" ), &g_settings.rage.air_yaw, &dropdowns::antiaim_yaw ) )->set_cond( - [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.air_yaw_add( ) ) )->set_cond( - [ ]( ) { return !!g_settings.rage.air_yaw( ) && !!g_settings.rage.real_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "in-air yaw jitter" ), &g_settings.rage.air_yaw_jitter ) )->set_cond( - [ ]( ) { return !!g_settings.rage.air_yaw( ) && !!g_settings.rage.real_yaw( ); } ); - - - yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "fake yaw" ), &g_settings.rage.fake_yaw, &dropdowns::antiaim_yaw ) ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.fake_yaw_add( ) ) )->set_cond( - [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); - yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake yaw jitter" ), &g_settings.rage.fake_yaw_jitter ) )->set_cond( - [ ]( ) { return !!g_settings.rage.fake_yaw( ); } ); - } - - auto edge_form = std::make_shared< ui::c_form >( 0, 0, 215, 110, xors( "edge detection" ), 110 ); { - edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "edge" ), &g_settings.rage.edge_dtc_normal, - &dropdowns::antiaim_edge ) ); - - edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_standing ) )->set_cond( - [ ]( ) { return g_settings.rage.edge_dtc_normal( ) == 2; } ); - - edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 70, 300, &g_settings.rage.edge_dtc_moving ) )->set_cond( - [ ]( ) { return !!g_settings.rage.edge_dtc_normal( ); } ); - - edge_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "freestanding" ), - &g_settings.rage.edge_detection ) ); - - edge_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "priority" ), - &g_settings.rage.edge_dtc_priority, &dropdowns::edge_priority ) - )->set_cond( [ ]( ) { return g_settings.rage.edge_dtc_normal( ) && g_settings.rage.edge_detection( ); } ); - - edge_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "break lby when edging" ), &g_settings.rage.break_lby_edge( ) ) - )->set_cond( [ ]( ) { return g_settings.rage.break_lby; } ); - - edge_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 90, xors( "fake jitter" ), &g_settings.rage.edge_dtc_jitter ) ); - edge_form->add_item(std::make_shared< ui::c_slider< int > >(0, 0, 140, 0, 90, xors("real jitter"), &g_settings.rage.edge_dtc_real_jitter)); - } - - auto lby_form = std::make_shared< ui::c_form >( 0, 0, 215, 106, xors( "lby breaker" ), 106 ); { - lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "break lby" ), &g_settings.rage.break_lby ) ); - lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -120, 120, &g_settings.rage.lby_delta ) )->set_cond( - [ ]( ) { return g_settings.rage.break_lby( ); } ); - - lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid updates" ), &g_settings.rage.lby_avoid_updates ) ); - - lby_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fakewalk" ), &g_settings.rage.fakewalk ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.rage.fakewalk_key ) - ); - - lby_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 7, 16 - , &g_settings.rage.fakewalk_ticks ) )->set_cond( - [ ]( ) { return g_settings.rage.fakewalk; } ); - } - - auto fakelag_form = std::make_shared< ui::c_form >( 0, 0, 215, 165, xors( "fakelag" ), 165 ); { - fakelag_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "mode" ), &g_settings.rage.fakelag.mode, &dropdowns::fakelag_types ) ); - fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 2, 16, &g_settings.rage.fakelag.ticks ) ); - fakelag_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 50, xors( "variance" ), &g_settings.rage.fakelag.fluctuate ) ); - - auto flags_form = fakelag_form->add_item( std::make_shared< ui::c_form >( 0, 5, 139, 0, xors( "flags" ), 0, true ) ); - - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "in air" ), &g_settings.rage.fakelag.in_air ) ); - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on move" ), &g_settings.rage.fakelag.in_move ) ); - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on peek" ), &g_settings.rage.fakelag.on_peek ) ); - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on duck" ), &g_settings.rage.fakelag.on_duck ) ); - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "on weapon select" ), &g_settings.rage.fakelag.on_select ) ); - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "while shooting" ), &g_settings.rage.fakelag.in_attack ) ); - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "avoid ground" ), &g_settings.rage.fakelag.avoid_ground ) ); - flags_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "reset on jump" ), &g_settings.rage.fakelag.jump_reset ) ); - } - - left_column->add_item( main_form ); - left_column->add_item( pitch_form ); - left_column->add_item( yaw_form ); - - right_column->add_item( edge_form ); - right_column->add_item( lby_form ); - right_column->add_item( fakelag_form ); - - subtab_antiaim->add_item( left_column ); - subtab_antiaim->add_item( right_column ); - } - - subtab_sheet->add_item( subtab_antiaim ); - subtab_sheet->add_item( subtab_aimbot ); - - tab_rage->add_item( subtab_sheet ); - } - - - auto tab_visuals = std::make_shared< ui::c_tab_sheet >( xors( "visuals" ), &icons::sprite_visuals ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_players = std::make_shared< ui::c_tab_sheet >( xors( "players" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "activation type" ), &g_settings.visuals.activation_type, &dropdowns::activation_type_visuals ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.visuals.key ) )->set_cond( [ ]( ) { return g_settings.visuals.activation_type > 1; } ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.friendlies ) ); - } - - auto player_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "players" ) ); { - auto box_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "box" ), &g_settings.visuals.box ) ); - box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.box_enemy( ) ) ); - box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.visuals.box_friendly( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.friendlies; } ); - - auto glow_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "glow" ), &g_settings.visuals.glow ) ); - glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.glow_enemy ) ); - glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.glow_friendly ) )->set_cond( - [ ]( ) { return g_settings.visuals.friendlies || g_settings.visuals.chams.friendlies; } ); - glow_checkbox->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); - - auto skeleton_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "skeleton" ), &g_settings.visuals.skeleton ) ); - skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.skeleton_enemy ) ); - skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.skeleton_friendly ) )->set_cond( - [ ]( ) { return g_settings.visuals.friendlies; } ); - - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant" ), &g_settings.visuals.dormant ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "health" ), &g_settings.visuals.health ) ); - auto name_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "name" ), &g_settings.visuals.name ) ); - name_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.name_enemy( ) ) ); - name_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.visuals.name_friendly( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.friendlies; } ); - - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "weapon" ), &g_settings.visuals.weapon ) ); - - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ammo" ), &g_settings.visuals.ammo ) )->add_item( - std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.ammo_bar_clr( ) ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flags" ), &g_settings.visuals.flags ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "money" ), &g_settings.visuals.money ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "high ping warning" ), &g_settings.visuals.ping ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "resolver indicator" ), &g_settings.visuals.resolver_indicator ) )->add_item( - std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.lby_bar_clr( ) ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "sound" ), &g_settings.visuals.sound ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); - player_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 220, 500, &g_settings.visuals.sound_range ) )->set_cond( [ ]( ) { return g_settings.visuals.sound && !g_settings.misc.hide_from_obs; } ); - } - - auto hud_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "hud" ) ); { - hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "out of pov" ), &g_settings.visuals.out_of_pov ) ); - hud_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.25f, 1.f, &g_settings.visuals.out_of_pov_radius ) - )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); - - hud_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 15, 40, &g_settings.visuals.out_of_pov_size, xors( "px" ) ) - )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); - hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hitmarkers" ), &g_settings.visuals.hitmarkers ) ); - hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spectator list" ), &g_settings.visuals.spec_list ) ); - hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "radar" ), &g_settings.visuals.radar ) ); - } - - auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ), 100 ); { - other_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bullet tracers" ), &g_settings.visuals.bullet_tracers, &dropdowns::tracer_type ) ); - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "floating ragdolls" ), &g_settings.visuals.floating_ragdolls ) ); - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "rank revealer" ), &g_settings.misc.rank_reveal ) ); - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hit ghost" ), &g_settings.visuals.hits ) ); - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "target" ), &g_settings.visuals.target ) ); - - other_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 1, 7, &g_settings.visuals.target_time, "s" ) - )->set_cond( [ ]( ) { return g_settings.visuals.target || g_settings.visuals.hits; } ); - } - - auto chams_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "chams" ), 165 ); { - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.visuals.chams.enabled( ) ) ); - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "through walls" ), &g_settings.visuals.chams.ignore_z( ) ) ); - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "clear occlusion" ), &g_settings.visuals.chams.clear_occlusion ) ); - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.chams.friendlies( ) ) ); - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flat" ), &g_settings.visuals.chams.flat( ) ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); - chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "reflectivity" ), &g_settings.visuals.chams.reflectivity ) - )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); - - chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "luminance" ), &g_settings.visuals.chams.luminance ) - )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); - - chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "shine" ), &g_settings.visuals.chams.shine ) - )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat; } ); - - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies visible" ), &g_settings.visuals.chams.color_visible_friendly( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.chams.friendlies( ); } ); - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies hidden" ), &g_settings.visuals.chams.color_hidden_friendly( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.chams.friendlies( ) && g_settings.visuals.chams.ignore_z( ); } ); - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies visible" ), &g_settings.visuals.chams.color_visible_enemy( ) ) ); - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies hidden" ), &g_settings.visuals.chams.color_hidden_enemy( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.chams.ignore_z( ); } ); - } - - chams_form->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); - - left_column->add_item( main_form ); - left_column->add_item( player_form ); - - right_column->add_item( hud_form ); - right_column->add_item( other_form ); - right_column->add_item( chams_form ); - - subtab_players->add_item( left_column ); - subtab_players->add_item( right_column ); - } - - auto subtab_other = std::make_shared< ui::c_tab_sheet >( xors( "other" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto world_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "world" ) ); { - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "world modulate" ), &g_settings.visuals.world_modulate ) - )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "night mode" ), &g_settings.visuals.night_mode ) - )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent props" ), &g_settings.visuals.transparent_props ) - )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); - - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fullbright" ), &g_settings.visuals.fullbright ) ); - world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "dropped weapons" ), &g_settings.visuals.weapon_esp, &dropdowns::world_esp_type ) - )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.weapon_esp_clr( ) ) ); - - world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "grenades" ), &g_settings.visuals.grenade_esp, &dropdowns::world_esp_type ) - )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.grenade_esp_clr( ) ) ); - - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "grenade owner" ), &g_settings.visuals.grenade_owner ) - )->set_cond( [ ]( ) { return g_settings.visuals.grenade_esp == 1 || g_settings.visuals.grenade_esp == 3; } ); - - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bomb information" ), &g_settings.visuals.bomb_info ) ); - } - - auto local_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "local player" ) ); { - local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "recoil crosshair" ), &g_settings.visuals.recoil_crosshair( ) ) ); - local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "draw spread" ), &g_settings.visuals.draw_spread ) ); - local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "autowall crosshair" ), &g_settings.visuals.autowall_crosshair( ) ) ); - local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "grenade prediction" ), &g_settings.visuals.grenade_prediction( ) ) )->add_item( - std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.grenade_pred_clr ) - ); - - local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "snipers crosshair" ), &g_settings.visuals.snipers_crosshair( ) ) ); - } - - auto view_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "view" ) ); { - view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "watermark" ), &g_settings.misc.watermark ) ); - view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thirdperson" ), &g_settings.misc.thirdperson( ) ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.thirdperson_key ) - ); - view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 40, xors( "viewmodel fov" ), &g_settings.misc.viewmodel_fov( ) ) ); - view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 90, 130, xors( "view fov" ), &g_settings.misc.fov_changer( ) ) ); - } - - auto removals_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "removals" ) ); { - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no scope" ), &g_settings.misc.no_scope ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no zoom" ), &g_settings.misc.no_zoom ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no recoil" ), &g_settings.misc.no_recoil ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no flash" ), &g_settings.misc.no_flash ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no smoke" ), &g_settings.misc.no_smoke ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent viewmodel" ), &g_settings.misc.transparent_vm ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no post processing" ), &g_settings.misc.disable_post_process ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no cascade shadows" ), &g_settings.visuals.no_cascade_shadows ) ); - } - - left_column->add_item( world_form ); - left_column->add_item( local_form ); - - right_column->add_item( view_form ); - right_column->add_item( removals_form ); - - subtab_other->add_item( left_column ); - subtab_other->add_item( right_column ); - } - - subtab_sheet->add_item( subtab_other ); - subtab_sheet->add_item( subtab_players ); - - tab_visuals->add_item( subtab_sheet ); - } - - - auto tab_misc = std::make_shared< ui::c_tab_sheet >( xors( "miscellaneous" ), &icons::sprite_misc ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_general = std::make_shared< ui::c_tab_sheet >( xors( "general" ) ); { - auto column_left = subtab_general->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 0 ) ); - auto column_right = subtab_general->add_item( std::make_shared< ui::base_item >( 220, -5, 0, 0 ) ); - - auto movement_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "movement" ), 145 ); { - movement_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "auto strafe" ), &g_settings.misc.auto_strafe, &dropdowns::autostrafe_types ) ); - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bhop" ), &g_settings.misc.bunny_hop( ) ) ); - auto circle_box = movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "circle strafe" ), &g_settings.misc.circle_strafe ) ); - circle_box->add_item( std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.circle_strafe_key ) ); - circle_box->set_cond( [ ]( ) { return g_settings.misc.bunny_hop && g_settings.misc.auto_strafe; } ); - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no duck cooldown" ), &g_settings.misc.no_crouch_cooldown ) ); - - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "air duck" ), &g_settings.misc.air_duck ) ); - - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "edge jump" ), &g_settings.misc.edge_jump( ) ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.edge_jump_key( ) ) - ); - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto jumpbug" ), &g_settings.misc.auto_jumpbug( ) ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 1, &g_settings.misc.auto_jumpbug_key( ) ) - ); - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "show jump stats" ), &g_settings.misc.show_jump_stats ) ); - } - - auto identity_form = std::make_shared< ui::c_form >( 0, 1, 215, 0, xors( "identity" ), 95 ); { - identity_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "clantag changer" ), &g_settings.misc.clantag_changer( ) ) ); - identity_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "name changer" ), &g_settings.misc.name_changer, - &dropdowns::name_changers ) ); - identity_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "rich presence" ), &g_settings.misc.rich_presence( ) ) ); - identity_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "money talk" ), &g_settings.misc.money_talk ) ); - } - - auto fake_ping = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "fake latency" ) ); { - static auto sv_maxunlag = g_csgo.m_cvar( )->FindVar( "sv_maxunlag" ); - - fake_ping->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "extended backtracking" ), &g_settings.misc.net_fakelag ) ); - } - - auto helpers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "helpers" ) ); { - helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto revolver" ), &g_settings.misc.auto_revolver ) ); - helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto match accept" ), &g_settings.misc.auto_accept ) ); - helpers_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 10, xors( "accept delay" ), &g_settings.misc.auto_accept_delay ) - )->set_cond( [ ]( ) { return g_settings.misc.auto_accept( ); } ); - helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "server information" ), &g_settings.misc.server_information ) ); - helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "unlock inventory" ), &g_settings.misc.unlock_inventory ) ); - helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "log hits" ), &g_settings.misc.log_hits ) ); - helpers_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "show team damage" ), &g_settings.misc.team_dmg ) ); - } - - auto autobuy_form = std::make_shared< ui::c_form>( 0, 0, 215, 0, xors( "autobuy" ), 165 ); { - autobuy_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "primary" ), &g_settings.misc.autobuy.main_weapon, - &dropdowns::autobuy_main_wep ) ); - autobuy_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "secondary" ), &g_settings.misc.autobuy.secondary_weapon, - &dropdowns::autobuy_second_wep ) ); - autobuy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "armor" ), &g_settings.misc.autobuy.armor ) ); - autobuy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "defuser" ), &g_settings.misc.autobuy.defuser ) ); - autobuy_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "zeus" ), &g_settings.misc.autobuy.zeus ) ); - - auto grenades_form = autobuy_form->add_item( std::make_shared< ui::c_form >( 0, 5, 139, 0, xors( "grenades" ), 0, true ) ); - - grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "molotov/incendiary" ), &g_settings.misc.autobuy.molly ) ); - grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "grenade" ), &g_settings.misc.autobuy.grenade ) ); - grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "smoke" ), &g_settings.misc.autobuy.smoke ) ); - grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flash" ), &g_settings.misc.autobuy.flash ) ); - grenades_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "decoy" ), &g_settings.misc.autobuy.decoy ) ); - } - - auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ) ); { - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "remove gun sounds" ), &g_settings.misc.no_sound ) ); - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hide from obs" ), &g_settings.misc.hide_from_obs ) ); - other_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "unlock hidden cvars" ), []( ) { g_cheat.m_extra.unlock_hidden_cvars( ); } ) ); - } - - column_left->add_item( movement_form ); - column_left->add_item( identity_form ); - column_left->add_item( fake_ping ); - column_left->add_item( other_form ); - - column_right->add_item( helpers_form ); - column_right->add_item( autobuy_form ); - } - - auto subtab_skins = std::make_shared< ui::c_tab_sheet >( xors( "money compensator" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto knife_form = left_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "knife" ) ) ); { - knife_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "override knife" ), &g_settings.misc.skins.knife, &dropdowns::skin_knives ) ); - } - - auto skin_form = left_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "skin" ), 325 ) ); { - skin_form->add_item( std::make_shared< ui::c_itemlist< int, 20 > >( 0, 0, 180, xors( "override skin" ), &dropdowns::skins, &g_settings.misc.skins.current_skin ) ); - } - - auto gloves_form = right_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "glove" ) ) ); { - gloves_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "override glove" ), &g_settings.misc.skins.glove, &dropdowns::gloves ) ); - } - - auto gloves_skin_form = right_column->add_item( std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "glove skin" ), 325 ) ); { - gloves_skin_form->add_item( std::make_shared< ui::c_itemlist< int, 20 > >( 0, 0, 180, xors( "override skin" ), &dropdowns::glove_skins, &g_settings.misc.skins.glove_skin ) ); - } - - subtab_skins->add_item( left_column ); - subtab_skins->add_item( right_column ); - } - - auto subtab_movement_recorder = std::make_shared< ui::c_tab_sheet >( xors( "movement recorder" ) ); { - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "idle" ) ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.misc.recorder_enable ) ); - main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "show angles" ), &g_settings.misc.recording_show_angles, &dropdowns::recorder_angles ) ); - main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording start key" ) ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_start_key ) - ); - main_form->add_item( std::make_shared< ui::c_label >( 0, 0, xors( "recording stop key" ) ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.recording_stop_key ) - ); - - main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "play" ), [ ]( ) { g_cheat.m_move_rec.play_back( ); } ) ); - main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "stop playing" ), [ ]( ) { g_cheat.m_move_rec.stop_playback( ); } ) ); - main_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "clear recording" ), [ ]( ) { g_cheat.m_move_rec.clear_recording( ); } ) ); - } - - subtab_movement_recorder->add_item( main_form ); - } - - subtab_sheet->add_item( subtab_movement_recorder ); - subtab_sheet->add_item( subtab_skins ); - subtab_sheet->add_item( subtab_general ); - - tab_misc->add_item( subtab_sheet ); - } - - - auto tab_config = std::make_shared< ui::c_tab_sheet >( xors( "config" ), &icons::sprite_config ); { - auto cfg_form = std::make_shared< ui::c_form >( 0, 10, 200, 134, xors( "config" ) ); - cfg_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 180, xors( "setting" ), &g_settings.menu.cur_setting, &dropdowns::configs ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 0, 0, 85, 20, xors( "save" ), []( ) { g_settings.save( ); } ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 95, -25, 85, 20, xors( "load" ), []( ) { g_settings.load( ); } ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 0, -25, 85, 20, xors( "reset" ), []( ) { g_settings.reset( ); g_settings.save( ); } ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 95, -50, 85, 20, xors( "unload" ), []( ) { g_settings.reset( ); } ) ); - //cfg_form->add_item( std::make_shared< ui::c_button >( 0, -25, 85, 20, xors( "to clipboard" ), [ ]( ) { g_settings.copy_to_clipboard( ); } ) ); - //cfg_form->add_item( std::make_shared< ui::c_button >( 95, -50, 85, 20, xors( "from clipboard" ), [ ]( ) { g_settings.load_from_clipboard( ); } ) ); - auto label = cfg_form->add_item( std::make_shared< ui::c_label >( 0, -50, xors( "menu color" ) ) ); - label->add_item( std::make_shared< ui::c_color_picker >( 165, 4, 15, &g_settings.menu.menu_color ) ); - - cfg_form->add_item( std::make_shared< ui::c_checkbox >( 0, -50, xors( "anti-untrusted" ), &g_settings.menu.anti_untrusted ) ); - - tab_config->add_item( cfg_form ); - } - - tab_sheet->add_item( tab_config ); - tab_sheet->add_item( tab_misc ); - tab_sheet->add_item( tab_visuals ); - tab_sheet->add_item( tab_rage ); - tab_sheet->add_item( tab_legit ); - - menu->add_item( tab_sheet ); - - was_setup = true; - } - else { - static auto movement_state = menu->find_item( - xors( "movement recorder" ) )->find_item( - xors( "main" ) )->find_item( - xors( "idle" ) - ); - - if( !g_settings.misc.recorder_enable ) - movement_state->set_text( xors( "idle" ) ); - else if( g_cheat.m_move_rec.is_playing( ) ) { - movement_state->set_text( xors( "playing" ) ); - } - else if( g_cheat.m_move_rec.is_recording( ) ) { - movement_state->set_text( xors( "recording" ) ); - } - else { - movement_state->set_text( xors( "idle" ) ); - } - - static auto jitter_real = menu->find_item( xors( "real yaw jitter" ) ); - jitter_real->set_text( g_settings.rage.real_yaw == 2 ? xors( "spin range" ) : xors( "real yaw jitter" ) ); - - static auto jitter_real_moving = menu->find_item( xors( "real yaw moving jitter" ) ); - jitter_real_moving->set_text( g_settings.rage.real_yaw_moving == 2 ? xors( "spin range" ) : xors( "real yaw moving jitter" ) ); - - static auto jitter_fake = menu->find_item( xors( "fake yaw jitter" ) ); - jitter_fake->set_text( g_settings.rage.fake_yaw == 2 ? xors( "spin range" ) : xors( "fake yaw jitter" ) ); - - static auto jitter_air = menu->find_item( xors( "in-air yaw jitter" ) ); - jitter_air->set_text( g_settings.rage.air_yaw == 2 ? xors( "spin range" ) : xors( "in-air yaw jitter" ) ); - - static auto fakeping_form = menu->find_item( xors( "fake latency" ) ); - - auto game_rules = c_base_player::get_game_rules( ); - if( game_rules ) { - fakeping_form->set_visible( !*( bool* )( game_rules + 0x75 ) ); - } - - render_item( menu.get( ) ); - - // This was annoying me so I decided to remove it in Release mode. -#ifdef _DEBUG - //reset the menu if home is pressed for debugging purposes - if ( g_input.is_key_pressed( KEYS_END ) ) { - menu.reset( ); - menu = std::make_shared< c_menu >( 10, 10, 580, 470, xors( "golden cheat" ) ); - was_setup = false; - } -#endif - } - } -} \ No newline at end of file diff --git a/internal_rewrite/ui_base_item.h b/internal_rewrite/ui_base_item.h deleted file mode 100644 index 482481a..0000000 --- a/internal_rewrite/ui_base_item.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include -#include -#include - -#include "ui_draw.h" - -namespace ui -{ - //the offset between each item - constexpr int ITEM_OFFSET = 5; - - class base_item : public std::enable_shared_from_this< base_item > { - public: - base_item( ) { } - base_item( int x, int y, int w, int h, const char* name = nullptr ) : - m_x( x ), m_y( y ), m_width( w ), m_height( h ) { - if( name ) { - strcpy( m_text, name ); - } - } - - virtual void render( ) { }; - virtual bool is_hovered( ) { return false; } - virtual bool is_form( ) const { return false; } - - virtual void reset( ) { - m_y_offset = 0; - } - - virtual int get_total_height( ) const { - return m_height; - } - - void set_y_offset( int offset ) { - m_y_offset = offset; - } - - int get_y_offset( ) const { - return m_y_offset; - } - - auto add_item( std::shared_ptr< base_item > item ) { - item.get( )->m_parent = shared_from_this( ); - m_items.emplace( m_items.begin( ), item ); - - return item; - } - - auto& get_items( ) { return m_items; } - auto get_parent( ) { return m_parent; } - - virtual int x( ) const { return m_x; } - virtual int y( ) const { return m_y; } - virtual int w( ) const { return m_width; } - virtual int h( ) const { return m_height; } - - void set_x( int x ) { m_x = x; } - void set_y( int y ) { m_y = y; } - - void set_width( int w ) { m_width = w; } - void set_height( int h ) { m_height = h; } - - bool get_visible( ) const { - if( m_cond && !m_cond( ) ) { - return false; - } - - return m_visible; - } - - void set_cond( std::function< bool( ) > func ) { - m_cond = func; - } - - void set_visible( bool vis ) { m_visible = vis; } - void set_text( const char* text ) { - strcpy( m_text, text ); - } - auto get_text( ) const { - return m_text; - } - - std::shared_ptr< base_item > find_item( const char* name ) { - if( !m_items.empty( ) ) { - for( auto& it : m_items ) { - if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { - return it; - } - - auto it_find = it->find_item( name ); - if( it_find != it ) return it_find; - } - } - - return shared_from_this( ); - } - - auto get_top_parent( ) { - for( auto parent = m_parent; ; - parent = parent->get_parent( ) ) { - if( !parent->get_parent( ) ) { - return parent; - } - } - - return shared_from_this( ); - } - - int get_relative_x( ) { - int x = m_x; - for( auto parent = get_parent( ); !!parent; - parent = parent->get_parent( ) ) { - x += parent->x( ); - } - - return x; - } - - int get_relative_y( ) { - int y = m_y + get_y_offset( ); - for( auto parent = get_parent( ); !!parent; - parent = parent->get_parent( ) ) { - y += parent->y( ) + parent->get_y_offset( ); - } - - return y; - } - - void set_disabled( bool disabled ) { - m_disabled = disabled; - - for( auto& it : m_items ) { - it->set_disabled( disabled ); - } - } - - void set_disabled_callbacks( bool disabled ) { - auto top = get_top_parent( ); - - top->set_disabled( disabled ); - - m_disabled = false; - } - - protected: - int m_x{ }; - int m_y{ }; - - int m_width{ }; - int m_height{ }; - - //current y position for rendering - int m_y_offset{ }; - - bool m_visible = true; - bool m_disabled = false; - char m_text[ 256 ]{ }; - - std::shared_ptr< base_item > m_parent; - std::vector< std::shared_ptr< base_item > > m_items; - std::function< bool( ) > m_cond; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_button.h b/internal_rewrite/ui_button.h deleted file mode 100644 index 0472360..0000000 --- a/internal_rewrite/ui_button.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include - -#include "ui_base_item.h" - -namespace ui -{ - class c_button : public base_item { - public: - c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : - base_item( x, y, w, h, name ), m_fn( fn ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ); - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); - if ( !m_mouse_held ) { - m_fn( ); - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - - ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); - } - - protected: - std::function< void( ) > m_fn; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_checkbox.h b/internal_rewrite/ui_checkbox.h deleted file mode 100644 index 3b0c251..0000000 --- a/internal_rewrite/ui_checkbox.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_checkbox : public base_item { - public: - c_checkbox( int x, int y, const char* txt, bool* setting ) : - base_item( x, y, 16, 16, txt ), m_setting( setting ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int rel_x = get_relative_x( ); - int rel_y = get_relative_y( ); - - return mouse_x >= rel_x && mouse_x <= rel_x + m_width - && mouse_y >= rel_y && mouse_y <= rel_y + m_height; - } - - inline void render_checkbox( const int& x, const int& y ) { - clr_t col = ui_get_bg_col( ); - if ( is_hovered( ) ) { - col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; - } - else if ( *m_setting ) { - col = ui_get_accent_col( ); - } - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); - - //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); - } - - inline void input( ) { - bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); - - if ( is_hovered( ) && mouse_presesed ) { - if ( !m_mouse_held ) { - *m_setting = !*m_setting; - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - render_checkbox( x, y ); - input( ); - - - ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); - } - - protected: - bool* m_setting; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_color_picker.h b/internal_rewrite/ui_color_picker.h deleted file mode 100644 index 8404e19..0000000 --- a/internal_rewrite/ui_color_picker.h +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once - -#include "ui_base_item.h" -#include "d3d.hpp" - -namespace ui -{ - class c_color_picker : public base_item { - static constexpr int BOX_WIDTH = 106; - static constexpr int BOX_HEIGHT = 125; - public: - c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : - base_item( x, y, w, 4, name ), m_setting( setting ), - m_has_text( true ) { } - - c_color_picker( int x, int y, int w, clr_t* setting ) : - base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), - m_has_text( false ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ); - - int cursor_x, cursor_y; - ui_get_cursor_pos( cursor_x, cursor_y ); - - if ( m_has_text ) y += 12; - - if ( !m_active ) { - return cursor_x >= x && cursor_x <= x + m_width - && cursor_y >= y && cursor_y <= y + m_height; - } - - return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 - && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; - } - - virtual int get_total_height( ) const override { - return m_has_text ? ( m_height + 12 ) : m_height; - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_active ) { - m_mouse_held = true; - } - - m_active = true; - } - else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_active = false; - } - else { - m_mouse_held = false; - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - - m_hue = m_setting->hue( ); - if ( m_hue > 1.0f ) { - m_hue -= 359.f; - } - - m_saturation = m_setting->saturation( ); - m_brightness = m_setting->brightness( ) / 255.f; - m_alpha = m_setting->a( ); - } - - void output( ) { - *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); - m_setting->a( ) = m_alpha; - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - if ( m_has_text ) { - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - y += 12; - } - - input( ); - - if ( m_active ) { - RECT old_rect; - g_d3d.get_device( )->GetScissorRect( &old_rect ); - - RECT new_rect{ - x - 1, y - 1, - x + BOX_WIDTH + 22, - y + BOX_HEIGHT + 2 - }; - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - clr_t bg_col( 0, 0, 0, 90 ); - ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); - ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); - - for ( int i{ }; i < 100; i += 3 ) { - for ( int i2{ }; i2 < 100; i2 += 3 ) { - ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, - clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); - } - } - - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held - && mouse_x > x && mouse_x <= x + 100 - && mouse_y > y && mouse_y <= y + 100 ) { - - int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); - int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); - - int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); - int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); - - m_saturation = float( delta_y ) * 0.01f; - m_brightness = float( delta_x ) * 0.01f; - } - - auto is_hue_slider_hovered = [&]( ) -> bool { - return mouse_x > x + 110 && mouse_x < x + 122 - && mouse_y > y && mouse_y < y + 100; - }; - - auto draw_slider_hue = [&]( ) { - for ( int i{ }; i < 100; ++i ) { - auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); - - ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); - } - - ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, - is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); - }; - - auto is_alpha_slider_hovered = [&]( ) -> bool { - return mouse_x > x + 0 && mouse_x < x + 122 - && mouse_y > y + 110 && mouse_y < y + 124; - }; - - auto draw_slider_alpha = [&]( ) { - for ( int i{ 121 }; i >= 0; --i ) { - auto col = *m_setting; - col.a( ) = ( int )( float( i ) * 255.f / 121.f ); - - ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); - } - - int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); - ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, - is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); - }; - - draw_slider_hue( ); - if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - int delta = std::clamp( mouse_y - y, 0, 100 ); - m_hue = float( delta ) * 0.01f; - } - - draw_slider_alpha( ); - if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - int delta = std::clamp( mouse_x - x, -1, 122 ); - m_alpha = ( int )( float( delta ) * 255.f / 121.f ); - } - - output( ); - - g_d3d.get_device( )->SetScissorRect( &old_rect ); - } - else { - if ( is_hovered( ) ) { - ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); - } - ui_draw_rect( x, y, m_width, m_height, *m_setting ); - } - } - - protected: - clr_t* m_setting = nullptr; - bool m_active = false; - bool m_mouse_held = false; - float m_saturation = 1.0f; - float m_brightness = 1.0f; - float m_hue = 0.f; - uint8_t m_alpha = 255; - bool m_has_text = false; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_draw.h b/internal_rewrite/ui_draw.h deleted file mode 100644 index d95b1c2..0000000 --- a/internal_rewrite/ui_draw.h +++ /dev/null @@ -1,161 +0,0 @@ -#pragma once -#include "color.hpp" -#include "d3d.hpp" -#include "icons.hpp" -#include "d3d_sprite.hpp" -#include "input_system.hpp" - -namespace ui -{ - extern float get_csgo_frametime( ); - /*__forceinline auto ui_get_background_texture( ) { - static auto buffer = std::make_shared< byte[ 512 ] >( ); - static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); - static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); - static IDirect3DTexture9* texture; - - if ( !texture ) { - for ( int i = 0; i < 512; i += 4 ) { - *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; - } - - D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); - } - - return texture; - }*/ - - extern float anim_time; - - __forceinline void set_animtime( float animtime ) { - anim_time = animtime; - } - - __forceinline void setup_sprites( IDirect3DDevice9* device ) { - //fuck msvc - icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); - icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); - icons::sprite_visuals.init( device, icons::raw::visuals, icons::visuals_size, 66, 66 ); - icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); - icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); - } - - __forceinline clr_t ui_get_accent_col( ) { - clr_t col_start = g_settings.menu.menu_color; - - float brightness = col_start.brightness( ) / 255.f; - float saturation = col_start.saturation( ); - - float new_brightness = brightness > .5f ? brightness - 0.2f : brightness + 0.2f; - float new_saturation = saturation > .5f ? saturation - 0.2f : saturation + 0.2f; - - clr_t col_end = clr_t::from_hsb( col_start.hue( ), new_saturation, new_brightness ); - col_end.a( ) = col_start.a( ); - - clr_t col = clr_t::blend( col_start, col_end, anim_time ); - return col; - } - - __forceinline clr_t& ui_get_disabled_col( ) { - static clr_t col = clr_t( 61, 61, 61, 255 ); - return col; - } - - __forceinline clr_t& ui_get_bg_col( ) { - static clr_t col = clr_t( 24, 25, 27, 255 ); - return col; - } - - __forceinline clr_t& ui_get_text_col( ) { - static clr_t col = clr_t( 221, 221, 221, 255 ); - return col; - } - - __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, - clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { - - g_d3d.draw_gradient( start, end, x, y, w, h, type ); - } - - __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { - g_d3d.draw_line( color, x, y, x1, y1 ); - } - - __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { - g_d3d.draw_filled_rect( color, x, y, w, h ); - } - - __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { - g_d3d.draw_rect( color, x, y, w, h ); - } - - __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { - g_d3d.draw_circle( color, x, y, r, res ); - } - - __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { - g_d3d.draw_filled_circle( color, x, y, r, res ); - } - - __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { - char buf[ 2048 ]{ }; - va_list list{ }; - - __crt_va_start( list, str ); - vsprintf_s( buf, 2048, str, list ); - __crt_va_end( list ); - - g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, - center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); - } - - __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { - char* buf = ( char* )_alloca( 2048 ); - va_list list{ }; - - __crt_va_start( list, text ); - vsprintf_s( buf, 2048, text, list ); - __crt_va_end( list ); - - w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); - h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); - } - - __forceinline void ui_get_cursor_pos( int& x, int& y ) { - g_input.get_cursor_pos( x, y ); - } - - __forceinline float ui_get_frametime( ) { - return get_csgo_frametime( ); - } - - __forceinline void ui_draw_cursor( ) { - const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); - int x, y; - ui_get_cursor_pos( x, y ); - - - for ( int i{ }; i <= 9; ++i ) { - ui_draw_line( x, y, x + i, y + 11, accent ); - } - - for ( int i{ }; i <= 7; ++i ) { - ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); - } - - for ( int i{ }; i <= 3; ++i ) { - ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); - } - - ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); - ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); - - ui_draw_line( x, y, x, y + 17, black ); - ui_draw_line( x, y + 17, x + 3, y + 14, black ); - ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); - ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); - ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); - ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); - ui_draw_line( x + 11, y + 12, x, y, black ); - } -} \ No newline at end of file diff --git a/internal_rewrite/ui_dropdown.h b/internal_rewrite/ui_dropdown.h deleted file mode 100644 index 12a9e98..0000000 --- a/internal_rewrite/ui_dropdown.h +++ /dev/null @@ -1,219 +0,0 @@ -#pragma once -#include "ui_dropdown_item.h" - -namespace ui -{ - template < typename t = int > - class c_dropdown : public base_item { - public: - c_dropdown( int x, int y, int w, const char* name, t* setting, - std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : - base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), - m_max_items( max_items ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - inline bool is_any_item_hovered( ) { - if ( m_disabled || !m_active ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + m_height + 12; - int h = m_height * ( std::min< size_t >( - m_dropdown_items->size( ), m_max_items ) ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - virtual int get_total_height( ) const override { - return m_height + 13; - } - - void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { - ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); - ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); - - ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); - } - - void update_value( ) { - for ( auto& it : *m_dropdown_items ) { - if ( it.m_value == *m_setting ) { - m_selected_item = ⁢ - } - } - } - - void draw_items( const int& x, const int& y ) { - auto& items = *m_dropdown_items; - auto it = &items.front( ); - int offset = m_height + 1; - int hovered = 0; - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - auto is_hovered = [ & ] ( int y_offset ) { - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; - }; - - - for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; - i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); - ++i, offset += m_height + 1 - ) { - it = &items.at( i ); - - draw_box( x, y + offset, it->m_name ); - - if ( is_hovered( offset ) ) { - hovered = offset; - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_selected_item = it; - *m_setting = it->m_value; - m_active = false; - m_has_clicked_item = true; - } - } - } - - if ( hovered ) { - ui_draw_outlined_rect( x - 1, y - 1 + hovered, - m_width + 1, m_height + 1, ui_get_text_col( ) ); - } - } - - void input( ) { - static float enable_time{ }; - static bool needs_reenable{ }; - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = !m_active; - } - m_mouse_held = true; - } - else if ( !is_any_item_hovered( ) ) { - m_mouse_held = false; - } - - if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { - m_active = false; - } - - if ( GetTickCount( ) * 0.001f > enable_time && needs_reenable) { - set_disabled_callbacks( false ); - needs_reenable = false; - } - - - active_changed = m_active != active_backup; - //disable input on all items - if ( active_changed || m_has_clicked_item ) { - if ( !m_active ) { - enable_time = GetTickCount( ) * 0.001f + 0.220f; - needs_reenable = true; - } - else { - set_disabled_callbacks( true ); - } - - m_has_clicked_item = false; - } - - if ( m_selected_item ) { - *m_setting = m_selected_item->m_value; - } - - if ( m_active && m_dropdown_items->size( ) > m_max_items ) { - int scroll_input = g_input.get_scroll_state( ); - - if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max - m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it - - if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) - m_curr_scroll = m_dropdown_items->size( ) - m_max_items; - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - bool restore = false; - RECT prev_rect{ }; - - if ( m_active ) { - restore = true; - g_d3d.get_device( )->GetScissorRect( &prev_rect ); - - RECT new_rect{ - prev_rect.left, - prev_rect.top, - g_d3d.m_width, - g_d3d.m_height, - }; - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - draw_items( x, y + 11 ); - - - //draw scrollbar - size_t total_items = m_dropdown_items->size( ); - if ( total_items > m_max_items ) { - const size_t height = ( m_height + 1 ) * m_max_items; - const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); - - size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); - ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); - } - } - - update_value( ); - input( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, - is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - if ( m_selected_item ) { - ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); - } - - if( restore ) { - g_d3d.get_device( )->SetScissorRect( &prev_rect ); - } - } - - protected: - std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; - dropdowns::dropdown_item_t< t >* m_selected_item{ }; - bool m_active = false; - bool m_mouse_held = false; - bool m_has_clicked_item = true; - t* m_setting{ }; - size_t m_max_items{ }; - size_t m_curr_scroll{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_dropdown_item.h b/internal_rewrite/ui_dropdown_item.h deleted file mode 100644 index 2774013..0000000 --- a/internal_rewrite/ui_dropdown_item.h +++ /dev/null @@ -1,861 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - namespace dropdowns - { - template < typename t = int > - struct dropdown_item_t { - const char* m_name; - t m_value; - }; - - static std::vector< dropdown_item_t< > > activation_types_aimbot = { - { xors( "always" ), 0 }, - { xors( "on key" ), 1 }, - }; - - static std::vector< dropdown_item_t< > > silent_aimbot_types = { - { xors( "none" ), 0 }, - { xors( "client-side" ), 1 }, - { xors( "server-side" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > hitboxes = { - { xors( "hitscan" ), -1 }, - { xors( "head" ), 0 }, - { xors( "neck" ), 1 }, - { xors( "pelvis" ), 3 }, - { xors( "chest" ), 6 }, - { xors( "thorax" ), 5 }, - }; - - static std::vector< dropdown_item_t< > > antiaim_yaw = { - { xors( "normal" ), 0 }, - { xors( "backwards" ), 1 }, - { xors( "backwards spin" ), 2 }, - { xors( "direction" ), 6 }, - { xors( "switch" ), 7 }, - { xors( "sideways" ), 3 }, - { xors( "golden spin" ), 4 }, - { xors( "random" ), 5 }, - }; - - static std::vector< dropdown_item_t< > > delay_type = { - { xors( "none" ), 0 }, - { xors( "time" ), 2 }, - { xors( "velocity" ), 3 }, - }; - - static std::vector< dropdown_item_t< > > antiaim_pitch = { - { xors( "normal" ), 0 }, - { xors( "custom" ), 1 }, - { xors( "flip" ), 2 }, - { xors( "minimal" ), 3 }, - { xors( "fake down" ), 4 }, - { xors( "fake up" ), 5 }, - { xors( "fake flip" ), 6 }, - { xors( "random" ), 7 } - }; - - static std::vector< dropdown_item_t< > > antiaim_freestanding = { - { xors( "disabled" ), 0 }, - { xors( "static" ), 1 }, - { xors( "narrow angle" ), 2 }, - { xors( "wide angle" ), 3 }, - }; - - static std::vector< dropdown_item_t< > > auto_stop = { - { xors( "none" ), 0 }, - { xors( "hitchance" ), 1 }, - { xors( "hitchance + lag" ), 4 }, - { xors( "duck" ), 5 }, - { xors( "slide" ), 3 }, - { xors( "full" ), 2 } - }; - - static std::vector< dropdown_item_t< > > antiaim_edge = { - { xors( "off" ), 0 }, - { xors( "peek" ), 1 }, - { xors( "full" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > autostrafe_types = { - { xors( "none" ), 0 }, - { xors( "view" ), 1 }, - { xors( "view + movement" ), 2 } - }; - - static std::vector< dropdown_item_t< > > antiaim_edge_type = { - { xors( "static" ), 0 }, - { xors( "narrow angle" ), 1 }, - { xors( "wide angle" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > fakelag_types = { - { xors( "disabled" ), 0 }, - { xors( "adaptive" ), 1 }, - { xors( "fluctuate" ), 2 }, - { xors( "static" ), 3 }, - }; - - static std::vector< dropdown_item_t< > > fakelag_fix_types = { - { xors( "disabled" ), 0 }, - { xors( "wait" ), 1 }, - { xors( "predict" ), 2 } - }; - - static std::vector< dropdown_item_t< > > activation_type_visuals = { - { xors( "never" ), 0 }, - { xors( "always" ), 1 }, - { xors( "on hold" ), 2 }, - { xors( "toggle" ), 3 }, - }; - - static std::vector< dropdown_item_t< > > configs = { - { xors( "legit" ), 0 }, - { xors( "closet" ), 1 }, - { xors( "rage 1" ), 2 }, - { xors( "rage 2" ), 3 }, -#if _DEBUG - { xors( "test" ), 4 }, -#endif - }; - - static std::vector< dropdown_item_t< > > recorder_angles = { - { xors( "none" ), 0 }, - { xors( "shot" ), 1 }, - { xors( "all" ), 2 } - }; - - static std::vector< dropdown_item_t< > > baim_types = { - { xors( "off" ), 0 }, - { xors( "basic" ), 1 }, - { xors( "smart" ), 2 }, - { xors( "aggressive" ), 3 }, - { xors( "force" ), 4 }, - }; - - static std::vector< dropdown_item_t< > > name_changers = { - { xors( "off" ), 0 }, - { xors( "dollar" ), 1 }, - { xors( "moneybot.cc" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > weapon_esp_types = { - { xors( "none" ), 0 }, - { xors( "icon" ), 1 }, - { xors( "name" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > fake_ping_activation = { - { xors( "off" ), 0 }, - { xors( "on hold" ), 1 }, - { xors( "toggle" ), 2 }, - { xors( "always" ), 3 }, -#ifdef _DEBUG - { xors( "auto" ), 4 } -#endif - }; - - static std::vector< dropdown_item_t< > > world_esp_type = { - { xors( "off" ), 0 }, - { xors( "name" ), 1 }, - { xors( "glow" ), 2 }, - { xors( "both" ), 3 } - }; - - static std::vector< dropdown_item_t< > > multipoint_types = { - { xors( "off" ), 0 }, - { xors( "center" ), 1 }, - { xors( "edges" ), 2 }, - { xors( "full" ), 3 } - }; - - static std::vector< dropdown_item_t< > > edge_priority = { - { xors( "freestanding" ), 0 }, - { xors( "edge" ), 1 } - }; - - static std::vector< dropdown_item_t< > > selection_type = { - { xors( "fov" ), 0 }, - { xors( "distance" ), 1 }, - { xors( "simulation time" ), 2 } - }; - - static std::vector< dropdown_item_t< > > autobuy_main_wep = { - { xors( "none" ), 0 }, - { xors( "autosniper" ), 1 }, - { xors( "scout" ), 2 }, - { xors( "sniper" ), 3 }, - { xors( "ak/m4" ), 4 }, - { xors( "aug/sg" ), 5 }, - { xors( "mac10/mp9" ), 6 }, - }; - - static std::vector< dropdown_item_t< > > autobuy_second_wep = { - { xors( "none" ), 0 }, - { xors( "deagle/r8" ), 1 }, - { xors( "dualies" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > skin_knives = { - { xors( "none" ), 0 }, - { xors( "bayonet" ), 1 }, - { xors( "flip knife" ), 2 }, - { xors( "gut knife" ), 3 }, - { xors( "karambit" ), 4 }, - { xors( "m9 bayonet" ), 5 }, - { xors( "huntsman" ), 6 }, - }; - - static std::vector< dropdown_item_t< > > weapon_configs = { - { xors( "general" ), 0 }, - { xors( "heavy pistols" ), 1 }, - { xors( "snipers" ), 2 }, - { xors( "auto snipers" ), 3 } - }; - - static std::vector< dropdown_item_t< > > tracer_type = { - { xors( "none" ), 0 }, - { xors( "line" ), 1 }, - { xors( "beam" ), 2 } - }; - - static std::vector< dropdown_item_t< > > gloves = { - { xors( "none" ), 0 }, - { xors( "bloodhound" ), 5027 }, - { xors( "sporty" ), 5030 }, - { xors( "slick" ), 5031 }, - { xors( "handwrap" ), 5032 }, - { xors( "motorcycle" ), 5033 }, - { xors( "specialist" ), 5034 } - }; - - static std::vector< dropdown_item_t< > > glove_skins = { - { xors( "charred" ), 10006 }, - { xors( "snakebite" ), 10007 }, - { xors( "bronzed" ), 10008 }, - { xors( "leather" ), 10009 }, - { xors( "spruce ddpat" ), 10010 }, - { xors( "lunar weave" ), 10013 }, - { xors( "convoy" ), 10015 }, - { xors( "crimson weave" ), 10016 }, - { xors( "superconductor" ), 10018 }, - { xors( "arid" ), 10019 }, - { xors( "slaughter" ), 10021 }, - { xors( "eclipse" ), 10024 }, - { xors( "spearmint" ), 10026 }, - { xors( "boom!" ), 10027 }, - { xors( "cool mint" ), 10028 }, - { xors( "forest ddpat" ), 10030 }, - { xors( "crimson kimono" ), 10033 }, - { xors( "emerald web" ), 10034 }, - { xors( "foundation" ), 10035 }, - { xors( "badlands" ), 10036 }, - { xors( "pandora's box" ), 10037 }, - { xors( "hedge maze" ), 10038 }, - { xors( "guerrilla" ), 10039 }, - { xors( "diamondback" ), 10040 }, - { xors( "king snake" ), 10041 }, - { xors( "imperial plaid" ), 10042 }, - { xors( "overtake" ), 10043 }, - { xors( "racing green" ), 10044 }, - { xors( "amphibious" ), 10045 }, - { xors( "bronze morph" ), 10046 }, - { xors( "omega" ), 10047 }, - { xors( "vice" ), 10048 }, - { xors( "pow!" ), 10049 }, - { xors( "turtle" ), 10050 }, - { xors( "transport" ), 10051 }, - { xors( "polygon" ), 10052 }, - { xors( "cobalt skulls" ), 10053 }, - { xors( "overprint" ), 10054 }, - { xors( "duct tape" ), 10055 }, - { xors( "arboreal" ), 10056 }, - { xors( "emerald" ), 10057 }, - { xors( "mangrove" ), 10058 }, - { xors( "rattler" ), 10059 }, - { xors( "case hardened" ), 10060 }, - { xors( "crimson web" ), 10061 }, - { xors( "buckshot" ), 10062 }, - { xors( "fade" ), 10063 }, - { xors( "mogul" ), 10064 }, - }; - - static std::vector< dropdown_item_t< > > skins = { - { xors( "none" ), -1 }, - { xors( "groundwater" ), 2 }, - { xors( "candy apple" ), 3 }, - { xors( "forest ddpat" ), 5 }, - { xors( "arctic camo" ), 6 }, - { xors( "desert storm" ), 8 }, - { xors( "bengal tiger" ), 9 }, - { xors( "copperhead" ), 10 }, - { xors( "skulls" ), 11 }, - { xors( "crimson web" ), 12 }, - { xors( "blue streak" ), 13 }, - { xors( "red laminate" ), 14 }, - { xors( "gunsmoke" ), 15 }, - { xors( "jungle tiger" ), 16 }, - { xors( "urban ddpat" ), 17 }, - { xors( "virus" ), 20 }, - { xors( "granite marbleized" ), 21 }, - { xors( "contrast spray" ), 22 }, - { xors( "forest leaves" ), 25 }, - { xors( "lichen dashed" ), 26 }, - { xors( "bone mask" ), 27 }, - { xors( "anodized navy" ), 28 }, - { xors( "snake camo" ), 30 }, - { xors( "silver" ), 32 }, - { xors( "hot rod" ), 33 }, - { xors( "metallic ddpat" ), 34 }, - { xors( "ossified" ), 36 }, - { xors( "blaze" ), 37 }, - { xors( "fade" ), 38 }, - { xors( "bulldozer" ), 39 }, - { xors( "night" ), 40 }, - { xors( "copper" ), 41 }, - { xors( "blue steel" ), 42 }, - { xors( "stained" ), 43 }, - { xors( "case hardened" ), 44 }, - { xors( "contractor" ), 46 }, - { xors( "colony" ), 47 }, - { xors( "dragon tattoo" ), 48 }, - { xors( "lightning strike" ), 51 }, - { xors( "slaughter" ), 59 }, - { xors( "dark water" ), 60 }, - { xors( "hypnotic" ), 61 }, - { xors( "bloomstick" ), 62 }, - { xors( "cold blooded" ), 67 }, - { xors( "carbon fiber" ), 70 }, - { xors( "scorpion" ), 71 }, - { xors( "safari mesh" ), 72 }, - { xors( "wings" ), 73 }, - { xors( "polar camo" ), 74 }, - { xors( "blizzard marbleized" ), 75 }, - { xors( "winter forest" ), 76 }, - { xors( "boreal forest" ), 77 }, - { xors( "forest night" ), 78 }, - { xors( "orange ddpat" ), 83 }, - { xors( "pink ddpat" ), 84 }, - { xors( "mudder" ), 90 }, - { xors( "cyanospatter" ), 92 }, - { xors( "caramel" ), 93 }, - { xors( "grassland" ), 95 }, - { xors( "blue spruce" ), 96 }, - { xors( "ultraviolet" ), 98 }, - { xors( "sand dune" ), 99 }, - { xors( "storm" ), 100 }, - { xors( "tornado" ), 101 }, - { xors( "whiteout" ), 102 }, - { xors( "grassland leaves" ), 104 }, - { xors( "polar mesh" ), 107 }, - { xors( "condemned" ), 110 }, - { xors( "glacier mesh" ), 111 }, - { xors( "sand mesh" ), 116 }, - { xors( "sage spray" ), 119 }, - { xors( "jungle spray" ), 122 }, - { xors( "sand spray" ), 124 }, - { xors( "urban perforated" ), 135 }, - { xors( "waves perforated" ), 136 }, - { xors( "orange peel" ), 141 }, - { xors( "urban masked" ), 143 }, - { xors( "jungle dashed" ), 147 }, - { xors( "sand dashed" ), 148 }, - { xors( "urban dashed" ), 149 }, - { xors( "jungle" ), 151 }, - { xors( "demolition" ), 153 }, - { xors( "afterimage" ), 154 }, - { xors( "bullet rain" ), 155 }, - { xors( "death by kitty" ), 156 }, - { xors( "palm" ), 157 }, - { xors( "walnut" ), 158 }, - { xors( "brass" ), 159 }, - { xors( "splash" ), 162 }, - { xors( "modern hunter" ), 164 }, - { xors( "splash jam" ), 165 }, - { xors( "blaze orange" ), 166 }, - { xors( "radiation hazard" ), 167 }, - { xors( "nuclear threat" ), 168 }, - { xors( "fallout warning" ), 169 }, - { xors( "predator" ), 170 }, - { xors( "irradiated alert" ), 171 }, - { xors( "black laminate" ), 172 }, - { xors( "boom" ), 174 }, - { xors( "scorched" ), 175 }, - { xors( "faded zebra" ), 176 }, - { xors( "memento" ), 177 }, - { xors( "doomkitty" ), 178 }, - { xors( "nuclear threat" ), 179 }, - { xors( "fire serpent" ), 180 }, - { xors( "corticera" ), 181 }, - { xors( "emerald dragon" ), 182 }, - { xors( "overgrowth" ), 183 }, - { xors( "corticera" ), 184 }, - { xors( "golden koi" ), 185 }, - { xors( "wave spray" ), 186 }, - { xors( "zirka" ), 187 }, - { xors( "graven" ), 188 }, - { xors( "bright water" ), 189 }, - { xors( "black limba" ), 190 }, - { xors( "tempest" ), 191 }, - { xors( "shattered" ), 192 }, - { xors( "bone pile" ), 193 }, - { xors( "spitfire" ), 194 }, - { xors( "demeter" ), 195 }, - { xors( "emerald" ), 196 }, - { xors( "anodized navy" ), 197 }, - { xors( "hazard" ), 198 }, - { xors( "dry season" ), 199 }, - { xors( "mayan dreams" ), 200 }, - { xors( "palm" ), 201 }, - { xors( "jungle ddpat" ), 202 }, - { xors( "rust coat" ), 203 }, - { xors( "mosaico" ), 204 }, - { xors( "jungle" ), 205 }, - { xors( "tornado" ), 206 }, - { xors( "facets" ), 207 }, - { xors( "sand dune" ), 208 }, - { xors( "groundwater" ), 209 }, - { xors( "anodized gunmetal" ), 210 }, - { xors( "ocean foam" ), 211 }, - { xors( "graphite" ), 212 }, - { xors( "ocean foam" ), 213 }, - { xors( "graphite" ), 214 }, - { xors( "x-ray" ), 215 }, - { xors( "blue titanium" ), 216 }, - { xors( "blood tiger" ), 217 }, - { xors( "hexane" ), 218 }, - { xors( "hive" ), 219 }, - { xors( "hemoglobin" ), 220 }, - { xors( "serum" ), 221 }, - { xors( "blood in the water" ), 222 }, - { xors( "nightshade" ), 223 }, - { xors( "water sigil" ), 224 }, - { xors( "ghost camo" ), 225 }, - { xors( "blue laminate" ), 226 }, - { xors( "electric hive" ), 227 }, - { xors( "blind spot" ), 228 }, - { xors( "azure zebra" ), 229 }, - { xors( "steel disruption" ), 230 }, - { xors( "cobalt disruption" ), 231 }, - { xors( "crimson web" ), 232 }, - { xors( "tropical storm" ), 233 }, - { xors( "ash wood" ), 234 }, - { xors( "varicamo" ), 235 }, - { xors( "night ops" ), 236 }, - { xors( "urban rubble" ), 237 }, - { xors( "varicamo blue" ), 238 }, - { xors( "calicamo" ), 240 }, - { xors( "hunting blind" ), 241 }, - { xors( "army mesh" ), 242 }, - { xors( "gator mesh" ), 243 }, - { xors( "teardown" ), 244 }, - { xors( "army recon" ), 245 }, - { xors( "amber fade" ), 246 }, - { xors( "damascus steel" ), 247 }, - { xors( "red quartz" ), 248 }, - { xors( "cobalt quartz" ), 249 }, - { xors( "full stop" ), 250 }, - { xors( "pit viper" ), 251 }, - { xors( "silver quartz" ), 252 }, - { xors( "acid fade" ), 253 }, - { xors( "nitro" ), 254 }, - { xors( "asiimov" ), 255 }, - { xors( "the kraken" ), 256 }, - { xors( "guardian" ), 257 }, - { xors( "mehndi" ), 258 }, - { xors( "redline" ), 259 }, - { xors( "pulse" ), 260 }, - { xors( "marina" ), 261 }, - { xors( "rose iron" ), 262 }, - { xors( "rising skull" ), 263 }, - { xors( "sandstorm" ), 264 }, - { xors( "kami" ), 265 }, - { xors( "magma" ), 266 }, - { xors( "cobalt halftone" ), 267 }, - { xors( "tread plate" ), 268 }, - { xors( "the fuschia is now" ), 269 }, - { xors( "victoria" ), 270 }, - { xors( "undertow" ), 271 }, - { xors( "titanium bit" ), 272 }, - { xors( "heirloom" ), 273 }, - { xors( "copper galaxy" ), 274 }, - { xors( "red fragcam" ), 275 }, - { xors( "panther" ), 276 }, - { xors( "stainless" ), 277 }, - { xors( "blue fissure" ), 278 }, - { xors( "asiimov" ), 279 }, - { xors( "chameleon" ), 280 }, - { xors( "corporal" ), 281 }, - { xors( "redline" ), 282 }, - { xors( "trigon" ), 283 }, - { xors( "heat" ), 284 }, - { xors( "terrain" ), 285 }, - { xors( "antique" ), 286 }, - { xors( "pulse" ), 287 }, - { xors( "sergeant" ), 288 }, - { xors( "sandstorm" ), 289 }, - { xors( "guardian" ), 290 }, - { xors( "heaven guard" ), 291 }, - { xors( "death rattle" ), 293 }, - { xors( "green apple" ), 294 }, - { xors( "franklin" ), 295 }, - { xors( "meteorite" ), 296 }, - { xors( "tuxedo" ), 297 }, - { xors( "army sheen" ), 298 }, - { xors( "caged steel" ), 299 }, - { xors( "emerald pinstripe" ), 300 }, - { xors( "atomic alloy" ), 301 }, - { xors( "vulcan" ), 302 }, - { xors( "isaac" ), 303 }, - { xors( "slashed" ), 304 }, - { xors( "torque" ), 305 }, - { xors( "antique" ), 306 }, - { xors( "retribution" ), 307 }, - { xors( "kami" ), 308 }, - { xors( "howl" ), 309 }, - { xors( "curse" ), 310 }, - { xors( "desert warfare" ), 311 }, - { xors( "cyrex" ), 312 }, - { xors( "orion" ), 313 }, - { xors( "heaven guard" ), 314 }, - { xors( "poison dart" ), 315 }, - { xors( "jaguar" ), 316 }, - { xors( "bratatat" ), 317 }, - { xors( "road rash" ), 318 }, - { xors( "detour" ), 319 }, - { xors( "red python" ), 320 }, - { xors( "master piece" ), 321 }, - { xors( "nitro" ), 322 }, - { xors( "rust coat" ), 323 }, - { xors( "chalice" ), 325 }, - { xors( "knight" ), 326 }, - { xors( "chainmail" ), 327 }, - { xors( "hand cannon" ), 328 }, - { xors( "dark age" ), 329 }, - { xors( "briar" ), 330 }, - { xors( "royal blue" ), 332 }, - { xors( "indigo" ), 333 }, - { xors( "twist" ), 334 }, - { xors( "module" ), 335 }, - { xors( "desert-strike" ), 336 }, - { xors( "tatter" ), 337 }, - { xors( "pulse" ), 338 }, - { xors( "caiman" ), 339 }, - { xors( "jet set" ), 340 }, - { xors( "first class" ), 341 }, - { xors( "leather" ), 342 }, - { xors( "commuter" ), 343 }, - { xors( "dragon lore" ), 344 }, - { xors( "first class" ), 345 }, - { xors( "coach class" ), 346 }, - { xors( "pilot" ), 347 }, - { xors( "red leather" ), 348 }, - { xors( "osiris" ), 349 }, - { xors( "tigris" ), 350 }, - { xors( "conspiracy" ), 351 }, - { xors( "fowl play" ), 352 }, - { xors( "water elemental" ), 353 }, - { xors( "urban hazard" ), 354 }, - { xors( "desert-strike" ), 355 }, - { xors( "koi" ), 356 }, - { xors( "ivory" ), 357 }, - { xors( "supernova" ), 358 }, - { xors( "asiimov" ), 359 }, - { xors( "cyrex" ), 360 }, - { xors( "abyss" ), 361 }, - { xors( "labyrinth" ), 362 }, - { xors( "traveler" ), 363 }, - { xors( "business class" ), 364 }, - { xors( "olive plaid" ), 365 }, - { xors( "green plaid" ), 366 }, - { xors( "reactor" ), 367 }, - { xors( "setting sun" ), 368 }, - { xors( "nuclear waste" ), 369 }, - { xors( "bone machine" ), 370 }, - { xors( "styx" ), 371 }, - { xors( "nuclear garden" ), 372 }, - { xors( "contamination" ), 373 }, - { xors( "toxic" ), 374 }, - { xors( "radiation hazard" ), 375 }, - { xors( "chemical green" ), 376 }, - { xors( "hot shot" ), 377 }, - { xors( "fallout warning" ), 378 }, - { xors( "cerberus" ), 379 }, - { xors( "wasteland rebel" ), 380 }, - { xors( "grinder" ), 381 }, - { xors( "murky" ), 382 }, - { xors( "basilisk" ), 383 }, - { xors( "griffin" ), 384 }, - { xors( "firestarter" ), 385 }, - { xors( "dart" ), 386 }, - { xors( "urban hazard" ), 387 }, - { xors( "cartel" ), 388 }, - { xors( "fire elemental" ), 389 }, - { xors( "highwayman" ), 390 }, - { xors( "cardiac" ), 391 }, - { xors( "delusion" ), 392 }, - { xors( "tranquility" ), 393 }, - { xors( "cartel" ), 394 }, - { xors( "man-o'-war" ), 395 }, - { xors( "urban shock" ), 396 }, - { xors( "naga" ), 397 }, - { xors( "chatterbox" ), 398 }, - { xors( "catacombs" ), 399 }, - { xors( "dragon king" ), 400 }, - { xors( "system lock" ), 401 }, - { xors( "malachite" ), 402 }, - { xors( "deadly poison" ), 403 }, - { xors( "muertos" ), 404 }, - { xors( "serenity" ), 405 }, - { xors( "grotto" ), 406 }, - { xors( "quicksilver" ), 407 }, - { xors( "tiger tooth" ), 409 }, - { xors( "damascus steel" ), 410 }, - { xors( "damascus steel" ), 411 }, - { xors( "marble fade" ), 413 }, - { xors( "rust coat" ), 414 }, - { xors( "doppler" ), 415 }, - { xors( "doppler" ), 416 }, - { xors( "doppler" ), 417 }, - { xors( "doppler" ), 418 }, - { xors( "doppler" ), 419 }, - { xors( "doppler" ), 420 }, - { xors( "doppler" ), 421 }, - { xors( "elite build" ), 422 }, - { xors( "armor core" ), 423 }, - { xors( "worm god" ), 424 }, - { xors( "bronze deco" ), 425 }, - { xors( "valence" ), 426 }, - { xors( "monkey business" ), 427 }, - { xors( "eco" ), 428 }, - { xors( "djinn" ), 429 }, - { xors( "hyper beast" ), 430 }, - { xors( "heat" ), 431 }, - { xors( "man-o'-war" ), 432 }, - { xors( "neon rider" ), 433 }, - { xors( "origami" ), 434 }, - { xors( "pole position" ), 435 }, - { xors( "grand prix" ), 436 }, - { xors( "twilight galaxy" ), 437 }, - { xors( "chronos" ), 438 }, - { xors( "hades" ), 439 }, - { xors( "icarus fell" ), 440 }, - { xors( "minotaur's labyrinth" ), 441 }, - { xors( "asterion" ), 442 }, - { xors( "pathfinder" ), 443 }, - { xors( "daedalus" ), 444 }, - { xors( "hot rod" ), 445 }, - { xors( "medusa" ), 446 }, - { xors( "duelist" ), 447 }, - { xors( "pandora's box" ), 448 }, - { xors( "poseidon" ), 449 }, - { xors( "moon in libra" ), 450 }, - { xors( "sun in leo" ), 451 }, - { xors( "shipping forecast" ), 452 }, - { xors( "emerald" ), 453 }, - { xors( "para green" ), 454 }, - { xors( "akihabara accept" ), 455 }, - { xors( "hydroponic" ), 456 }, - { xors( "bamboo print" ), 457 }, - { xors( "bamboo shadow" ), 458 }, - { xors( "bamboo forest" ), 459 }, - { xors( "aqua terrace" ), 460 }, - { xors( "counter terrace" ), 462 }, - { xors( "terrace" ), 463 }, - { xors( "neon kimono" ), 464 }, - { xors( "orange kimono" ), 465 }, - { xors( "crimson kimono" ), 466 }, - { xors( "mint kimono" ), 467 }, - { xors( "midnight storm" ), 468 }, - { xors( "sunset storm" ), 469 }, - { xors( "sunset storm" ), 470 }, - { xors( "daybreak" ), 471 }, - { xors( "impact drill" ), 472 }, - { xors( "seabird" ), 473 }, - { xors( "aquamarine revenge" ), 474 }, - { xors( "hyper beast" ), 475 }, - { xors( "yellow jacket" ), 476 }, - { xors( "neural net" ), 477 }, - { xors( "rocket pop" ), 478 }, - { xors( "bunsen burner" ), 479 }, - { xors( "evil daimyo" ), 480 }, - { xors( "nemesis" ), 481 }, - { xors( "ruby poison dart" ), 482 }, - { xors( "loudmouth" ), 483 }, - { xors( "ranger" ), 484 }, - { xors( "handgun" ), 485 }, - { xors( "elite build" ), 486 }, - { xors( "cyrex" ), 487 }, - { xors( "riot" ), 488 }, - { xors( "torque" ), 489 }, - { xors( "frontside misty" ), 490 }, - { xors( "dualing dragons" ), 491 }, - { xors( "survivor z" ), 492 }, - { xors( "flux" ), 493 }, - { xors( "stone cold" ), 494 }, - { xors( "wraiths" ), 495 }, - { xors( "nebula crusader" ), 496 }, - { xors( "golden coil" ), 497 }, - { xors( "rangeen" ), 498 }, - { xors( "cobalt core" ), 499 }, - { xors( "special delivery" ), 500 }, - { xors( "wingshot" ), 501 }, - { xors( "green marine" ), 502 }, - { xors( "big iron" ), 503 }, - { xors( "kill confirmed" ), 504 }, - { xors( "scumbria" ), 505 }, - { xors( "point disarray" ), 506 }, - { xors( "ricochet" ), 507 }, - { xors( "fuel rod" ), 508 }, - { xors( "corinthian" ), 509 }, - { xors( "retrobution" ), 510 }, - { xors( "the executioner" ), 511 }, - { xors( "royal paladin" ), 512 }, - { xors( "power loader" ), 514 }, - { xors( "imperial" ), 515 }, - { xors( "shapewood" ), 516 }, - { xors( "yorick" ), 517 }, - { xors( "outbreak" ), 518 }, - { xors( "tiger moth" ), 519 }, - { xors( "avalanche" ), 520 }, - { xors( "teclu burner" ), 521 }, - { xors( "fade" ), 522 }, - { xors( "amber fade" ), 523 }, - { xors( "fuel injector" ), 524 }, - { xors( "elite build" ), 525 }, - { xors( "photic zone" ), 526 }, - { xors( "kumicho dragon" ), 527 }, - { xors( "cartel" ), 528 }, - { xors( "valence" ), 529 }, - { xors( "triumvirate" ), 530 }, - { xors( "royal legion" ), 532 }, - { xors( "the battlestar" ), 533 }, - { xors( "lapis gator" ), 534 }, - { xors( "praetorian" ), 535 }, - { xors( "impire" ), 536 }, - { xors( "hyper beast" ), 537 }, - { xors( "necropos" ), 538 }, - { xors( "jambiya" ), 539 }, - { xors( "lead conduit" ), 540 }, - { xors( "fleet flock" ), 541 }, - { xors( "judgement of anubis" ), 542 }, - { xors( "red astor" ), 543 }, - { xors( "ventilators" ), 544 }, - { xors( "orange crash" ), 545 }, - { xors( "firefight" ), 546 }, - { xors( "spectre" ), 547 }, - { xors( "chantico's fire" ), 548 }, - { xors( "bioleak" ), 549 }, - { xors( "oceanic" ), 550 }, - { xors( "asiimov" ), 551 }, - { xors( "fubar" ), 552 }, - { xors( "atlas" ), 553 }, - { xors( "ghost crusader" ), 554 }, - { xors( "re-entry" ), 555 }, - { xors( "primal saber" ), 556 }, - { xors( "black tie" ), 557 }, - { xors( "lore" ), 558 }, - { xors( "lore" ), 559 }, - { xors( "lore" ), 560 }, - { xors( "lore" ), 561 }, - { xors( "lore" ), 562 }, - { xors( "black laminate" ), 563 }, - { xors( "black laminate" ), 564 }, - { xors( "black laminate" ), 565 }, - { xors( "black laminate" ), 566 }, - { xors( "black laminate" ), 567 }, - { xors( "gamma doppler" ), 568 }, - { xors( "gamma doppler" ), 569 }, - { xors( "gamma doppler" ), 570 }, - { xors( "gamma doppler" ), 571 }, - { xors( "gamma doppler" ), 572 }, - { xors( "autotronic" ), 573 }, - { xors( "autotronic" ), 574 }, - { xors( "autotronic" ), 575 }, - { xors( "autotronic" ), 576 }, - { xors( "autotronic" ), 577 }, - { xors( "bright water" ), 578 }, - { xors( "bright water" ), 579 }, - { xors( "freehand" ), 580 }, - { xors( "freehand" ), 581 }, - { xors( "freehand" ), 582 }, - { xors( "aristocrat" ), 583 }, - { xors( "phobos" ), 584 }, - { xors( "violent daimyo" ), 585 }, - { xors( "wasteland rebel" ), 586 }, - { xors( "mecha industries" ), 587 }, - { xors( "desolate space" ), 588 }, - { xors( "carnivore" ), 589 }, - { xors( "exo" ), 590 }, - { xors( "imperial dragon" ), 591 }, - { xors( "iron clad" ), 592 }, - { xors( "chopper" ), 593 }, - { xors( "harvester" ), 594 }, - { xors( "reboot" ), 595 }, - { xors( "limelight" ), 596 }, - { xors( "bloodsport" ), 597 }, - { xors( "aerial" ), 598 }, - { xors( "ice cap" ), 599 }, - { xors( "neon revolution" ), 600 }, - { xors( "syd mead" ), 601 }, - { xors( "imprint" ), 602 }, - { xors( "directive" ), 603 }, - { xors( "roll cage" ), 604 }, - { xors( "scumbria" ), 605 }, - { xors( "ventilator" ), 606 }, - { xors( "weasel" ), 607 }, - { xors( "petroglyph" ), 608 }, - { xors( "airlock" ), 609 }, - { xors( "dazzle" ), 610 }, - { xors( "grim" ), 611 }, - { xors( "powercore" ), 612 }, - { xors( "triarch" ), 613 }, - { xors( "fuel injector" ), 614 }, - { xors( "briefing" ), 615 }, - { xors( "slipstream" ), 616 }, - { xors( "doppler" ), 617 }, - { xors( "doppler" ), 618 }, - { xors( "doppler" ), 619 }, - { xors( "ultraviolet" ), 620 }, - { xors( "ultraviolet" ), 621 }, - { xors( "polymer" ), 622 }, - { xors( "ironwork" ), 623 }, - { xors( "dragonfire" ), 624 }, - { xors( "royal consorts" ), 625 }, - { xors( "mecha industries" ), 626 }, - { xors( "cirrus" ), 627 }, - { xors( "stinger" ), 628 }, - { xors( "black sand" ), 629 }, - { xors( "sand scale" ), 630 }, - { xors( "flashback" ), 631 }, - { xors( "buzz kill" ), 632 }, - { xors( "sonar" ), 633 }, - { xors( "gila" ), 634 }, - { xors( "turf" ), 635 }, - { xors( "shallow grave" ), 636 }, - { xors( "cyrex" ), 637 }, - { xors( "wasteland princess" ), 638 }, - { xors( "bloodsport" ), 639 }, - { xors( "fever dream" ), 640 }, - { xors( "jungle slipstream" ), 641 }, - { xors( "blueprint" ), 642 }, - { xors( "xiangliu" ), 643 }, - { xors( "decimator" ), 644 }, - { xors( "oxide blaze" ), 645 }, - { xors( "capillary" ), 646 }, - { xors( "crimson tsunami" ), 647 }, - { xors( "emerald poison dart" ), 648 }, - { xors( "akoben" ), 649 }, - { xors( "ripple" ), 650 }, - { xors( "last dive" ), 651 }, - { xors( "scaffold" ), 652 }, - { xors( "neo-noir" ), 653 }, - { xors( "seasons" ), 654 }, - }; - } -} \ No newline at end of file diff --git a/internal_rewrite/ui_form.h b/internal_rewrite/ui_form.h deleted file mode 100644 index 9dbe68e..0000000 --- a/internal_rewrite/ui_form.h +++ /dev/null @@ -1,187 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_form : public base_item { - public: - c_form( int x, int y, int w, int h, const char* name, int max_h = 0, bool collapse = false, bool default_collapsed = false ) : - base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ), m_collapse( collapse ), m_open( !default_collapsed ) { }; - - virtual int x( ) const override { - return m_x + 10; - } - - virtual int y( ) const override { - return m_y + m_scroll_offset + 9; - } - - virtual bool is_form( ) const override { - return true; - } - - virtual bool is_hovered( ) override { - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int x = get_relative_x( ); - int y = get_relative_y( ); - - return mouse_x > x && mouse_x < x + w( ) - && mouse_y > y && mouse_y < y + h( ); - } - - bool is_collapse_hovered( ) { - if( !m_collapse ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int x = get_relative_x( ) + m_width - 8; - int y = get_relative_y( ) + 2; - - return mouse_x >= x && mouse_x <= x + 5 - && mouse_y >= y && mouse_y <= y + 7; - } - - bool is_collapsed( ) { - return ( m_collapse && !m_open ); - } - - inline void update_size( ) { - if ( !m_dynamic ) return; - - int total_height{ ITEM_OFFSET * 2 }; - for ( auto& it : m_items ) { - if ( it->get_visible( ) ) { - auto item_height = it->get_total_height( ) + ITEM_OFFSET; - if( m_max_height && total_height + item_height > m_max_height ) { - total_height = m_max_height; - break; - } - total_height += it->get_total_height( ) + ITEM_OFFSET; - } - } - - m_height = total_height; - } - - virtual int get_total_height( ) const override { - if( !m_open && m_collapse ) return 18; - return m_height + 5; - } - - int get_total_item_height( ) { - int total_height{ ITEM_OFFSET * 2 }; - for( auto& it : m_items ) { - if( it->get_visible( ) ) { - auto item_height = it->get_total_height( ) + ITEM_OFFSET; - total_height += it->get_total_height( ) + ITEM_OFFSET; - } - } - - return total_height; - } - - void input( ) { - if( m_collapse ) { - bool hovered = is_collapse_hovered( ); - bool clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - if( hovered && clicked ) { - if( !m_was_pressed ) { - m_open ^= 1; - } - m_was_pressed = true; - } - else { - m_was_pressed = false; - } - } - - if( m_max_height && get_total_item_height( ) > m_max_height ) { - if( !m_disabled && is_hovered( ) ) { - auto scroll_state = g_input.get_scroll_state( ); - if( !!scroll_state && m_was_hovered ) { - scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; - } - } - m_scroll_offset = std::min< int >( std::max< int >( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ) ), 0 ); - } - else { - m_scroll_offset = 0; - } - } - - virtual void render( ) override { - update_size( ); - input( ); - int x = get_relative_x( ); - int y = get_relative_y( ); - - int text_w, text_h; - ui_get_text_size( text_w, text_h, m_text ); - - if( m_collapse ) { - if( !m_open && m_collapse ) { - ui_draw_outlined_rect( x, y, m_width, 14, ui_get_accent_col( ) ); - ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); - ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); - - int button_x = x + m_width - 6; - int button_y = y + 2; - - ui_draw_string( button_x, button_y, true, - is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "+" ); - return; - } - } - - for( int i{ }; i < 8; ++i ) { - clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); - ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); - } - - ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); - - if( m_max_height && get_total_item_height( ) > m_height ) { - const size_t height = get_total_height( ) - 20; - const float delta = ( float )( get_total_item_height( ) - height + 1 ); - const float slider_step = ( ( float )( height ) / delta ); - const float slider_height = slider_step * 13.f; - - size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); - ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); - ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); - } - - if( is_hovered( ) != m_was_hovered ) { - bool backup = m_disabled; - if( !backup ) { - set_disabled( !is_hovered( ) ); - } - m_disabled = backup; - } - - ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); - ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); - if( m_collapse ) { - int button_x = x + m_width - 6; - int button_y = y + 2; - - ui_draw_string( button_x, button_y, true, - is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "-" ); - } - - m_was_hovered = is_hovered( ); - } - - protected: - bool m_dynamic{ }; - bool m_was_hovered{ }; - int m_max_height{ }; - int m_scroll_offset{ }; - bool m_was_pressed{ }; - bool m_collapse{ }; - bool m_open{ true }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_itemlist.h b/internal_rewrite/ui_itemlist.h deleted file mode 100644 index e692746..0000000 --- a/internal_rewrite/ui_itemlist.h +++ /dev/null @@ -1,127 +0,0 @@ -#pragma once -#include "ui_base_item.h" -#include "ui_dropdown_item.h" - -#include - -namespace ui -{ - template < typename t, size_t size > - class c_itemlist : public base_item { - public: - static constexpr size_t ITEM_SIZE = 18; - - c_itemlist( int x, int y, int width, const char* name, std::vector< dropdowns::dropdown_item_t< t > >* dropdowns, t* setting ) - : base_item( x, y, width, 20, name ), m_items( dropdowns ), m_setting( setting ) { } - - void text_input( ); - bool is_textbox_hovered( ) { - if( m_disabled ) - return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - - int mx, my; - ui_get_cursor_pos( mx, my ); - - return mx >= x && my >= y - && mx <= x + m_width && my <= y + ITEM_SIZE; - } - - void input( ) { - text_input( ); - } - - virtual int get_total_height( ) const override { - size_t total_items = 0; - - if( strlen( m_search_text ) ) { - for( size_t i{ }; i < m_items->size( ); ++i ) { - if( !strstr( m_items->at( i ).m_name, m_search_text ) ) - continue; - - ++total_items; - } - } - else - total_items = m_items->size( ); - - return 12 + 20 + total_items * 20; - } - - bool is_item_hovered( int x, int y ) { - if( m_disabled ) - return false; - - int mx, my; - ui_get_cursor_pos( mx, my ); - - return mx >= x && mx <= x + m_width - && my >= y && my <= y + ITEM_SIZE; - } - - void draw_items( int x, int y ) { - int max_y = INT_MAX; - - auto parent = get_parent( ); - if( parent->is_form( ) ) { - max_y = parent->get_relative_y( ) + parent->get_total_height( ) + ITEM_SIZE; - } - - std::string search_str( m_search_text ); - std::transform( search_str.begin( ), search_str.end( ), search_str.begin( ), [ ]( char c ) { return tolower( c ); } ); - - int text_len = strlen( m_search_text ); - for( size_t i{ }; i < m_items->size( ); ++i ) { - if( y > max_y ) - break; - - auto& item = m_items->at( i ); - - if( !strstr( item.m_name, m_search_text ) ) - continue; - - ui_draw_rect( x - 1, y - 1, m_width + 2, ITEM_SIZE + 2, - is_item_hovered( x, y ) || *m_setting == item.m_value - ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - ui_draw_rect( x, y, m_width, ITEM_SIZE, ui_get_disabled_col( ) ); - - ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), item.m_name ); - - if( g_input.is_key_pressed( KEYS_MOUSE1 ) && is_item_hovered( x, y ) ) - *m_setting = item.m_value; - - y += ITEM_SIZE + 2; - } - } - - virtual void render( ) override { - input( ); - - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - - ui_draw_rect( x - 1, y + 12, m_width + 2, ITEM_SIZE + 2, is_textbox_hovered( ) || m_box_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); - if( is_textbox_hovered( ) ) { - ui_draw_rect( x, y + 13, m_width, ITEM_SIZE, ui_get_text_col( ) ); - } - ui_draw_rect( x + 1, y + 14, m_width - 2, ITEM_SIZE - 2, ui_get_disabled_col( ) ); - ui_draw_string( x + 3, y + 17, false, ui_get_text_col( ), m_box_active ? "%s_" : "%s", m_search_text ); - - draw_items( x, y + 14 + ITEM_SIZE ); - } - - private: - std::vector< dropdowns::dropdown_item_t< t > >* m_items; - bool m_box_active{ }; - bool m_was_held{ }; - char m_search_text[ size ]{ }; - float m_last_key_input[ KEYS_LAST ]{ }; - uint8_t m_key_states[ 256 ]{ }; - t* m_setting{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_itemlist_def.h b/internal_rewrite/ui_itemlist_def.h deleted file mode 100644 index fd64f12..0000000 --- a/internal_rewrite/ui_itemlist_def.h +++ /dev/null @@ -1,61 +0,0 @@ -#include "ui_itemlist.h" -#include - -namespace ui -{ - template < typename t, size_t size > - void c_itemlist< t, size >::text_input( ) { - if( is_textbox_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if( !m_was_held ) { - m_box_active ^= 1; - } - m_was_held = true; - } - else { - m_was_held = false; - } - - if( m_box_active ) { - if( !is_textbox_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_box_active = false; - } - - float current_time = GetTickCount( ) * 0.001f; - size_t length = strlen( m_search_text ); - - for( size_t i{ }; i < 0xfe; ++i ) { - if( g_input.is_key_pressed( i ) ) { - float delta_time = current_time - m_last_key_input[ i ]; - if( fabs( delta_time ) > 0.2f ) { - if( i == KEYS_BACK ) { - m_search_text[ length - 1 ] = 0; - m_last_key_input[ i ] = current_time; - continue; - } - - m_key_states[ i ] = 0xf0; - wchar_t pressed_char; - const auto scan = MapVirtualKeyA( i, 2 ); - auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); - - if( ret == 1 ) { - if( length < size ) { - m_search_text[ length ] = ( char )( pressed_char ); - m_search_text[ length + 1 ] = 0; - } - } - m_last_key_input[ i ] = current_time; - } - } - else { - m_last_key_input[ i ] = 0.f; - m_key_states[ i ] = 0; - } - } - - if( g_input.is_key_pressed( KEYS_RETURN ) ) { - m_box_active = false; - } - } - } -} \ No newline at end of file diff --git a/internal_rewrite/ui_key_picker.h b/internal_rewrite/ui_key_picker.h deleted file mode 100644 index dea681c..0000000 --- a/internal_rewrite/ui_key_picker.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_key_picker : public base_item { - public: - c_key_picker( int x, int y, int w, const char* name, int* setting ) : - base_item( x, y, w, 16, name ), m_setting( setting ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - virtual int get_total_height( ) const override { - return m_height + 12; - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = true; - } - m_mouse_held = true; - } - - if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { - m_active = false; - *m_setting = KEYS_NONE; - } - - if ( m_active && !m_mouse_held ) { - int key = g_input.is_any_key_pressed( ); - if ( key != KEYS_NONE ) { - *m_setting = key; - m_active = false; - } - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - input( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, - is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), - g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); - } - - protected: - int* m_setting{ }; - bool m_active{ }; - bool m_mouse_held{ }; - }; - - //skEeT PiCkErS - class c_key_picker_small : public base_item { - public: - c_key_picker_small( int x, int y, int* setting ) : - base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } - - virtual int get_total_height( ) const override { - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int w, h; - ui_get_text_size( w, h, name ); - - return h; - } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int x = get_relative_x( ); - int y = get_relative_y( ); - int mouse_x, mouse_y; - int w, h; - - ui_get_text_size( w, h, "[%s]", name ); - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= x - w && mouse_x <= x - && mouse_y >= y && mouse_y <= y + h; - } - - void input( ) { - - bool active_backup = m_active; - bool active_changed = false; - - if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { - m_active = false; - *m_setting = KEYS_NONE; - } - - if ( m_active && !m_mouse_held ) { - int key = g_input.is_any_key_pressed( ); - if ( key != KEYS_NONE ) { - *m_setting = key; - m_active = false; - } - } - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = true; - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - } - - virtual void render( ) override { - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int x = get_relative_x( ); - int y = get_relative_y( ); - - int w, h; - ui_get_text_size( w, h, "[%s]", name ); - - input( ); - - ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? - ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); - } - - protected: - int* m_setting; - bool m_active{ }; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_label.h b/internal_rewrite/ui_label.h deleted file mode 100644 index 712b547..0000000 --- a/internal_rewrite/ui_label.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_label : public base_item { - public: - c_label( int x, int y, const char* text ) : - base_item( x, y, 0, 16, text ) { } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); - } - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_menu.h b/internal_rewrite/ui_menu.h deleted file mode 100644 index 37b16f9..0000000 --- a/internal_rewrite/ui_menu.h +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_menu : public base_item { - public: - c_menu( int start_x, int start_y, int width, - int height, const char* name, const char* right_text = nullptr ) : - base_item( start_x, start_y, width, height, name ), - m_right_text( right_text ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= m_x && mouse_x <= m_x + w( ) - && mouse_y >= m_y && mouse_y <= m_y + 19; - } - - virtual int y( ) const override { - return m_y + 19; - } - - inline void input( ) { - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - - if ( is_hovered( ) ) { - m_mouse_held = true; - } - - if ( !mouse_clicked ) { - m_mouse_held = is_hovered( ); - } - - if ( m_mouse_held && !mouse_clicked ) { - m_drag_offset_y = mouse_y - m_y; - m_drag_offset_x = mouse_x - m_x; - } - - if ( m_mouse_held && mouse_clicked ) { - m_x = mouse_x - m_drag_offset_x; - m_y = mouse_y - m_drag_offset_y; - } - } - - virtual void render( ) override { - constexpr auto top_height = 19; - - input( ); - - //draw a c00l shadow - ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); - - ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); - if( is_hovered( ) ) { - ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); - } - - for( int i{ }; i < 8; ++i ) { - clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); - ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); - } - ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); - - if( m_right_text ) { - ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); - - int width, height; - ui_get_text_size( width, height, m_right_text ); - - ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); - } - else { - ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); - } - } - - protected: - int m_drag_offset_x{ }; - int m_drag_offset_y{ }; - bool m_mouse_held{ }; - const char* m_right_text{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_render.h b/internal_rewrite/ui_render.h deleted file mode 100644 index 1f10223..0000000 --- a/internal_rewrite/ui_render.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - //recursively render all items - static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { - if( !item->get_visible( ) ) return; - - item->reset( ); - item->render( ); - bool reset = false; - RECT original; - - if( allow_rect && item->is_form( ) ) { - auto device = g_d3d.get_device( ); - device->GetScissorRect( &original ); - - auto x = item->get_relative_x( ); - auto y = item->get_relative_y( ); - - RECT new_rect{ - x, - y + 4, - x + item->w( ), - y + item->get_total_height( ) - 7 - }; - - device->SetScissorRect( &new_rect ); - reset = true; - } - - bool draw = true; - if( item->is_form( ) ) { - auto form_cast = static_cast< c_form* >( item ); - draw = !form_cast->is_collapsed( ); - } - - if( item->get_items( ).size( ) && draw ) { - //madr0fl - int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); - int cur_offset = 0; - for( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { - auto& cur_item = item->get_items( )[ i ]; - height_offset[ i ] = cur_offset; - cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; - } - - int i{ }; - for( auto& it : item->get_items( ) ) { - item->set_y_offset( height_offset[ i ] ); - render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); - ++i; - } - } - - if( reset ) { - auto device = g_d3d.get_device( ); - device->SetScissorRect( &original ); - } - } -} \ No newline at end of file diff --git a/internal_rewrite/ui_slider.h b/internal_rewrite/ui_slider.h deleted file mode 100644 index 8f54b3c..0000000 --- a/internal_rewrite/ui_slider.h +++ /dev/null @@ -1,175 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - template < typename t > - class c_slider : public base_item { - public: - c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : - base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; - - c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : - base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; - - c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : - base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - if( !m_has_text ) { - x += 4; - return mouse_x >= x && mouse_x <= x + m_width - 8 - && mouse_y >= y && mouse_y <= y + m_height + 2; - } - - return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 - && mouse_y >= y && mouse_y <= y + m_height + 2; - } - - void input( ) { - bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - bool hovered = is_hovered( ); - float progress = 0.f; - int x = get_relative_x( ); - int y = get_relative_y( ) + 2; - int mouse_x, mouse_y; - - *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); - ui_get_cursor_pos( mouse_x, mouse_y ); - - if ( hovered && mouse_clicked ) { - - float progress{ }; - - if( m_has_text ) { - progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); - } - else { - progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); - } - - *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); - } - - if( !m_has_text ) { - bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; - - bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; - bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; - - if( mouse_clicked ) { - if( !m_mouse_held ) { - if( !std::is_floating_point< t >::value ) { - if( minus_hovered ) *m_setting -= ( t )1; - if( plus_hovered ) *m_setting += ( t )1; - } - else if( m_max - m_min <= 2.0f ) { - if( minus_hovered ) *m_setting -= ( t )0.1f; - if( plus_hovered ) *m_setting += ( t )0.1f; - } - } - - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - } - }; - - void draw_slider( int x, int y ) { - float val = float( *m_setting ); - float progress = ( val - m_min ) / ( m_max - m_min ); - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - - ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); - ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); - } - - void draw_slider_small( int x, int y ) { - float val = float( *m_setting ); - float progress = ( val - m_min ) / ( m_max - m_min ); - x -= 1; //i couldnt be fucked - - ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); - - ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); - ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); - - ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); - ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); - - char val_str[ 12 ]; - if( m_suffix ) - sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); - else - sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); - - int text_h, text_w; - ui_get_text_size( text_w, text_h, val_str ); - ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ), y + 2, false, ui_get_text_col( ), val_str ); - } - - virtual int get_total_height( ) const override { - return m_height + ( m_has_text ? 12 : 6 ); - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - int text_w, text_h; - char val[ 12 ]; - - input( ); - - //weird hacky fix for floating point vars - if ( m_suffix ) - sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); - else - sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); - - if( m_has_text ) { - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_get_text_size( text_w, text_h, val ); - ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); - draw_slider( x, y + 12 ); - } - else { - draw_slider_small( x, y + 2 ); - } - } - - void set_min( float min ) { - m_min = min; - } - - void set_max( float max ) { - m_max = max; - } - - - protected: - t* m_setting; - t m_full; - float m_min; - float m_max; - bool m_has_text = true; - const char* m_suffix; - bool m_mouse_held = false; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_tab_manager.h b/internal_rewrite/ui_tab_manager.h deleted file mode 100644 index 293d48b..0000000 --- a/internal_rewrite/ui_tab_manager.h +++ /dev/null @@ -1,227 +0,0 @@ -#pragma once -#include "ui_base_item.h" - - - -namespace ui -{ - namespace { - constexpr int BUTTON_WIDTH = 120; - constexpr int BUTTON_HEIGHT = 80; - - constexpr int SUBTAB_HEIGHT = 25; - } - - class c_tab_sheet : public base_item { - public: - c_tab_sheet( const char* tab_name ) : - base_item( 0, 0, 0, 0, tab_name ), - m_fade_progress( 0 ) { }; - - c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : - base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), - m_fade_progress( 0.f ) { }; - - virtual void render( ) override { }; - virtual bool is_hovered( ) override { - return false; - }; - - public: - float m_fade_progress{ }; - d3d::c_sprite* m_sprite{ }; - }; - - - class c_tab_manager : public base_item { - public: - c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, - xors( "TAB_MANAGER" ) ) { }; - - virtual bool is_hovered( ) override { - return false; - } - - inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { - if ( hovered ) { - constexpr float frequency = 1.f / 0.3f; - const float step = ui_get_frametime( ) * frequency; - - item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); - } - else { - item->m_fade_progress = 0.f; - } - } - - auto get_selected_tab( ) { - return m_selected_tab; - } - - void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { - auto item = ( c_tab_sheet* )button.get( ); - auto text = item->get_text( ); - auto parent_x = m_parent->x( ) + 5; - auto parent_y = m_parent->y( ) + 5; - int item_height = BUTTON_HEIGHT; - - scale_button_fade( item, hovered ); - - ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, - item_height + 1, ui_get_bg_col( ) ); - - ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, - parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, - ui_get_disabled_col( ) ); - - if( hovered ) { - ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, - parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, - ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); - } - - if( item->m_sprite ) { - auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); - item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, - parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); - } - else { - g_con->log( "sprite is null" ); - } - } - - inline bool is_button_hovered( int start ) { - auto item_x = m_parent->x( ) + 5; - auto item_y = m_parent->y( ) + 5 + start; - int item_height = BUTTON_HEIGHT; - int mouse_x, mouse_y; - - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 - && mouse_y >= item_y && mouse_y <= item_y + item_height; - } - - virtual void render( ) override { - if ( !m_items.empty( ) ) { - int cur_y{ 10 }; - for ( auto& it : m_items ) { - it->set_visible( false ); - bool hovered = is_button_hovered( cur_y ); - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { - //fix items that disable input mess it up when changing tabs - set_disabled_callbacks( false ); - m_selected_tab = it; - } - - draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); - cur_y += BUTTON_HEIGHT + 4; - } - } - - if ( !m_selected_tab ) { - m_selected_tab = m_items.front( ); - } - - m_selected_tab->set_visible( true ); - } - - protected: - decltype( m_parent ) m_selected_tab{ }; - }; - - - class c_subtab_manager : public base_item { - public: - c_subtab_manager( ) : base_item( 0, 35, 0, 5, - xors( "SUBTAB_MANAGER" ) ) { } - - virtual bool is_hovered( ) override { return false; } - - int get_button_width( ) { - int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; - - if ( !m_items.empty( ) ) - return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); - - return width; - } - - inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { - if ( hovered ) { - constexpr float frequency = 1.f / 0.3f; - const float step = ui_get_frametime( ) * frequency; - - item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); - } - else { - item->m_fade_progress = 0.f; - } - } - - auto get_selected_tab( ) { - return m_selected_tab; - } - - void render_button( decltype( m_parent )& button, int start, bool hovered ) { - auto item = ( c_tab_sheet* )button.get( ); - auto item_x = get_relative_x( ) + start - 2; - auto item_y = get_relative_y( ) + 3 - m_y; - auto width = get_button_width( ); - - scale_button_fade( item, hovered ); - clr_t tab_clr = ui_get_disabled_col( ); - - //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); - ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); - if ( hovered ) { - clr_t col = ui_get_accent_col( ); - col.a( ) *= item->m_fade_progress; - ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); - } - - ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); - } - - bool is_button_hovered( decltype( m_parent )& button, int start ) { - int item_x = get_relative_x( ) + start - 2; - int item_y = get_relative_y( ) + 3 - m_y - 3; - int item_w = get_button_width( ); - int mouse_x, mouse_y; - - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= item_x && mouse_x <= item_x + item_w && - mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; - } - - virtual void render( ) override { - if ( !m_items.empty( ) ) { - int start = 2; - int width = get_button_width( ); - - for ( auto& it : m_items ) { - it->set_visible( false ); - bool hovered = is_button_hovered( it, start ); - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { - //fix items that disable input mess it up when changing tabs - set_disabled_callbacks( false ); - m_selected_tab = it; - } - - render_button( it, start, hovered || it == m_selected_tab ); - start += width; - } - - if ( !m_selected_tab ) { - m_selected_tab = m_items.front( ); - } - - m_selected_tab->set_visible( true ); - } - } - - protected: - decltype( m_parent ) m_selected_tab; - }; -} \ No newline at end of file diff --git a/internal_rewrite/ui_text_input.cpp b/internal_rewrite/ui_text_input.cpp deleted file mode 100644 index f2c3530..0000000 --- a/internal_rewrite/ui_text_input.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "ui_text_input.h" -#include - -void ui::c_text_input::render( ) { - if( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if( !m_was_held ) { - m_active ^= 1; - } - m_was_held = true; - } - else { - m_was_held = false; - } - - if( m_active ) { - if( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_active = false; - } - - float current_time = GetTickCount( ) * 0.001f; - size_t length = strlen( m_text_ptr ); - - for( size_t i{ }; i < 0xfe; ++i ) { - if( g_input.is_key_pressed( i ) ) { - float delta_time = current_time - m_last_key_input[ i ]; - if( fabs( delta_time ) > 0.2f ) { - if( i == KEYS_BACK ) { - m_text_ptr[ length - 1 ] = 0; - m_last_key_input[ i ] = current_time; - continue; - } - - if( i == KEYS_RETURN ) { - m_active = false; - break; - } - - m_key_states[ i ] = 0xf0; - wchar_t pressed_char; - const auto scan = MapVirtualKeyA( i, 2 ); - auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); - - if( ret == 1 ) { - if( length < m_text_len ) { - m_text_ptr[ length ] = ( char )( pressed_char ); - m_text_ptr[ length + 1 ] = 0; - } - } - m_last_key_input[ i ] = current_time; - } - } - else { - m_last_key_input[ i ] = 0.f; - m_key_states[ i ] = 0; - } - } - - if( g_input.is_key_pressed( KEYS_RETURN ) ) { - m_active = false; - } - } - - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - y += 12; - - ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, - ( is_hovered( ) || m_active ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - - if( !m_hidden ) - ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), m_active ? "%s_" : "%s", m_text_ptr ); - else { - std::string str; - str.append( "*", strlen( m_text_ptr ) ); - if( m_active ) - str += '_'; - - ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), str.c_str( ) ); - } -} \ No newline at end of file diff --git a/internal_rewrite/ui_text_input.h b/internal_rewrite/ui_text_input.h deleted file mode 100644 index 243c40b..0000000 --- a/internal_rewrite/ui_text_input.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_text_input : public base_item { - public: - c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str, bool hidden = false ) : - base_item( x, y, w, 16, name ), m_text_len( max_chars ), m_text_ptr( str ), m_hidden( hidden ) { - } - - virtual bool is_hovered( ) override { - int cursor_x, cursor_y; - ui_get_cursor_pos( cursor_x, cursor_y ); - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - - return cursor_x >= x && cursor_x <= x + m_width - && cursor_y >= y && cursor_y <= y + m_height; - } - - virtual int get_total_height( ) const override { - return m_height + 12; - } - - virtual void render( ) override; - - protected: - bool m_was_held{ }; - char* m_text_ptr{ }; - size_t m_text_len{ }; - bool m_active{ }; - float m_last_key_input[ KEYS_LAST ]{ }; - uint8_t m_key_states[ 256 ]{ }; - bool m_hidden{ }; - }; -} \ No newline at end of file diff --git a/internal_rewrite/update_clientside_animation.cpp b/internal_rewrite/update_clientside_animation.cpp deleted file mode 100644 index 201d100..0000000 --- a/internal_rewrite/update_clientside_animation.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "hooks.hpp" -#include "context.hpp" -#include "base_cheat.hpp" - -void __fastcall hooks::update_clientside_animation( void* ecx_, void* edx_ ) { - static bool first_update = true; - - auto old_func = update_clientside_animation_o; - - if( ecx_ != g_ctx.m_local ) - return old_func( ecx_, 0 ); - - auto ent = ( c_base_player* )( ecx_ ); - - static float last_update; - static float last_spawntime = 0.f; - - // Arbitrary number much. - if( !g_settings.rage.anti_aim || !g_ctx.m_local->is_valid( ) || std::abs( last_update - g_csgo.m_globals->m_curtime ) > TICKS_TO_TIME( 20 ) || last_spawntime != ent->m_flSpawnTime( ) ) { - last_update = g_csgo.m_globals->m_curtime; - first_update = true; - - if( last_spawntime != ent->m_flSpawnTime( ) ) - last_spawntime = ent->m_flSpawnTime( ); - - return old_func( ecx_, edx_ ); - } - - last_update = g_csgo.m_globals->m_curtime; - - ent->get_animstate( )->m_iLastClientSideAnimationUpdateFramecount = g_csgo.m_globals->m_framecount; - old_func( ecx_, edx_ ); - - if( !first_update ) { - g_ctx.m_local->restore_anim_data( true ); - - ent->set_abs_angles( vec3_t( 0, g_ctx.m_absyaw, 0 ) ); - bool backup = ent->get_animstate( )->m_bOnGround; - ent->get_animstate( )->m_bOnGround = false; - - ent->invalidate_bone_cache( ); - ent->ce( )->SetupBones( nullptr, 128, BONE_USED_BY_ANYTHING, 0.f ); - - ent->get_animstate( )->m_bOnGround = backup; - } - - first_update = false; -} \ No newline at end of file diff --git a/internal_rewrite/util.cpp b/internal_rewrite/util.cpp deleted file mode 100644 index 1d19f9a..0000000 --- a/internal_rewrite/util.cpp +++ /dev/null @@ -1,575 +0,0 @@ -#include "util.hpp" - -#include "interface.hpp" -#include "c_base_player.hpp" -#include "pattern.hpp" -#include "context.hpp" -#include "settings.hpp" -#include "math.hpp" -#include "base_cheat.hpp" - -float TICK_INTERVAL( ) { - return g_csgo.m_globals->m_interval_per_tick; -} - -int TIME_TO_TICKS( float dt ) { - return static_cast< int >( 0.5f + dt / TICK_INTERVAL( ) ); -} - -float TICKS_TO_TIME( int tick ) { - return tick * TICK_INTERVAL( ); -} - -bool util::is_low_fps( ) { - return g_csgo.m_globals->m_frametime > g_csgo.m_globals->m_interval_per_tick; -} - -int util::get_closest_player( bool dist ) { - float cur_fov = FLT_MAX; - int ret{ -1 }; - vec3_t viewangles{ }; - vec3_t local_pos{ }; - - bool friendlies = g_settings.rage.active ? - g_settings.rage.friendlies : g_settings.legit.friendlies; - - local_pos = g_ctx.m_local->get_eye_pos( ); - g_csgo.m_engine( )->GetViewAngles( viewangles ); - - for( int i{ 1 }; i < g_csgo.m_globals->m_maxclients; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent ) continue; - if( ent == g_ctx.m_local ) continue; - if( !ent->is_valid( ) ) continue; - int team = ent->m_iTeamNum( ); - if( team == g_ctx.m_local->m_iTeamNum( ) && !friendlies ) { - continue; - } - - float distance = 0.f; - if( dist ) { - distance = g_ctx.m_local->m_vecOrigin( ).dist_to( ent->m_vecOrigin( ) ); - } - else { - auto ang = math::vector_angles( local_pos, ent->get_hitbox_pos( 0 ) ); - ang.clamp( ); - distance = ( viewangles - ang ).clamp( ).length2d( ); - } - - if( distance < cur_fov ) { - ret = i; - cur_fov = distance; - } - } - - return ret; -} - -void util::clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, - unsigned mask, CTraceFilter* filter, CGameTrace* tr ) { - CGameTrace player_trace; - Ray_t ray; - float smallest_fraction = tr->fraction; - - ray.Init( src, end ); - - if ( !filter->ShouldHitEntity( player, mask ) ) { - return; - } - - g_csgo.m_trace( )->ClipRayToEntity( ray, mask | CONTENTS_HITBOX, player, &player_trace ); - - if ( player_trace.fraction < smallest_fraction ) { - *tr = player_trace; - smallest_fraction = player_trace.fraction; - } -} - -std::string util::hitgroup_to_string( int hitgroup ) { - switch( hitgroup ) { - case HITGROUP_CHEST: - return xors( "chest" ); - case HITGROUP_HEAD: - return xors( "head" ); - case HITGROUP_LEFTARM: - return xors( "left arm" ); - case HITGROUP_LEFTLEG: - return xors( "left leg" ); - case HITGROUP_RIGHTARM: - return xors( "right arm" ); - case HITGROUP_RIGHTLEG: - return xors( "right leg" ); - case HITGROUP_STOMACH: - return xors( "stomach" ); - default: - return xors( "generic" ); - } -} - -bool util::trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ) { - CGameTrace tr; - Ray_t ray; - CTraceFilter filter; - - filter.pSkip = a; - - ray.Init( start, end ); - - g_csgo.m_trace( )->TraceRay( ray, 0x46004003 | CONTENTS_HITBOX, &filter, &tr ); - clip_trace_to_player( b, start, end, ( unsigned )0x46004003, &filter, &tr ); - - return tr.m_pEnt == b || tr.fraction > 0.98f; -} - -void util::set_random_seed( int seed ) { - using fn = int( __cdecl* )( int ); - fn fn_ptr = ( fn )( GetProcAddress( - GetModuleHandleA( xors( "vstdlib.dll" ) ), - xors( "RandomSeed" ) ) ); - - fn_ptr( seed ); -} - -float util::get_random_float( float min, float max ) { - using fn = float( *)( float, float ); - fn fn_ptr = ( fn )( GetProcAddress( - GetModuleHandleA( xors( "vstdlib.dll" ) ), - xors( "RandomFloat" ) ) ); - - return fn_ptr( min, max ); -} - -std::array< util::hitchance_data_t, 256 > hitchance_data; -void util::calculate_spread_runtime( ) { - constexpr float pi_2 = 2.0f * ( float ) M_PI; - - for ( size_t n { }; n < 256; ++n ) { - set_random_seed( n ); - - const float rand_a = get_random_float( 0.0f, 1.0f ); - const float rand_pi_a = get_random_float( 0.0f, pi_2 ); - const float rand_b = get_random_float( 0.0f, 1.0f ); - const float rand_pi_b = get_random_float( 0.0f, pi_2 ); - - hitchance_data [ n ] = { - { rand_a, rand_b }, - { std::cos( rand_pi_a ), std::sin( rand_pi_a ) }, - { std::cos( rand_pi_b ), std::sin( rand_pi_b ) } - }; - } -} - -// This is gay, I didn't want to fuck up the project. -vec3_t util::get_spread_dir( void *weapon, float inaccuracy, float spread, vec3_t angles, int seed ) { - const int rnsd = ( seed & 0xFF ); - const auto *data = &hitchance_data [ rnsd ]; - auto *wpn = ( c_base_weapon * ) weapon; - - if ( !wpn ) - return vec3_t{ }; - - float rand_a = data->m_random[ 0 ]; - float rand_b = data->m_random[ 1 ]; - - const uint16_t item_def = wpn->m_iItemDefinitionIndex( ); - - // Because fuck you. - if ( item_def == WEAPON_NEGEV ) { - const int recoil_seed = wpn->get_wpn_info( )->recoil_seed; - - if ( recoil_seed < 3 ) { - // Shoutouts to toast for the epic simplified math :^) - rand_a = 1.0f - std::powf( rand_a, ( 3 - recoil_seed ) + 1 ); - rand_b = 1.0f - std::powf( rand_b, ( 3 - recoil_seed ) + 1 ); - } - } - - // Calculate spread. - const float rand_inacc = rand_a * g_ctx.m_weapon_inaccuracy; - const float rand_spread = rand_b * g_ctx.m_weapon_spread; - - const float spread_x = data->m_inaccuracy [ 0 ] * rand_inacc + data->m_spread [ 0 ] * rand_spread; - const float spread_y = data->m_inaccuracy [ 1 ] * rand_inacc + data->m_spread [ 1 ] * rand_spread; - - // Transform angle to direction. - vec3_t forward, right, up; - math::angle_vectors( angles, &forward, &right, &up ); - - return forward + right * spread_x + up * spread_y; -} - -bool __vectorcall util::intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ) { - auto dist = math::dist_segment_to_segment( eye_pos, end_pos, min, max ); - - return ( dist < radius ); -} - -// Note: abuse this as much as you can to achieve the full potential it offers. -bool util::hitchance( int target, const vec3_t& angles, int percentage, int hitbox ) { - if( g_settings.rage.compensate_spread ) - return true; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( target ); - - if ( !ent ) return false; - if ( percentage <= 1 ) return true; - - int hits_needed = percentage * 256 / 100; - int hits = 0; - - auto wep = g_ctx.m_local->get_weapon( ); - if ( !wep ) return false; - - vec3_t eye_pos = g_ctx.m_local->get_eye_pos( ); - auto wpn_info = wep->get_wpn_info( ); - if( !wpn_info ) return false; - - float length = wpn_info->range; - - float inaccuracy = g_ctx.m_weapon_inaccuracy; - float spread = g_ctx.m_weapon_spread; - - if( g_settings.rage.active->m_spread_limit( ) ) { - bool crouched = g_ctx.m_local->m_vecViewOffset( ).z < 50.f; - bool alt_inaccuracy = wep->is_sniper( ) || wep->m_iItemDefinitionIndex( ) == WEAPON_R8REVOLVER; - float min_accuracy = crouched ? ( alt_inaccuracy ? wpn_info->inaccuracy_crouch_alt : wpn_info->inaccuracy_crouch ) - : ( alt_inaccuracy ? wpn_info->inaccuracy_stand_alt : wpn_info->inaccuracy_stand ); - - float max_accuracy = alt_inaccuracy ? wpn_info->inaccuracy_move_alt : wpn_info->inaccuracy_move; - min_accuracy += 0.0005f; - - float spread_accuracy_fraction = -( g_settings.rage.active->m_spread_limit_min( ) * 0.01f - 1.0f ); - float spread_accuracy_tolerance = max_accuracy * spread_accuracy_fraction; - min_accuracy += spread_accuracy_tolerance; - - if( wep->m_iItemDefinitionIndex( ) == WEAPON_SSG08 && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - min_accuracy = 0.008750f; - } - - if( min_accuracy >= inaccuracy ) - return true; - } - - struct hitbox_data_t { - hitbox_data_t( const vec3_t& min, const vec3_t& max, float radius ) { - m_min = min; - m_max = max; - m_radius = radius; - } - - vec3_t m_min{ }; - vec3_t m_max{ }; - float m_radius{ }; - }; - - std::vector< hitbox_data_t > m_hitbox_data; - - auto model = ent->ce( )->GetModel( ); - if( !model ) return false; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - if( !hdr ) return false; - - matrix3x4 bone_matrix[ 128 ]; - memcpy( bone_matrix, - ent->m_CachedBoneData( ).GetElements( ), - ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); - - auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); - if( !set ) return false; - - if( hitbox == -1 ) { - for( int hitbox{ }; hitbox < set->numhitboxes; ++hitbox ) { - auto box = set->pHitbox( hitbox ); - if( !box ) continue; - - auto min = math::vector_transform( box->bbmin, bone_matrix[ box->bone ] ); - auto max = math::vector_transform( box->bbmax, bone_matrix[ box->bone ] ); - auto radius = box->m_flRadius; - - if( radius == -1.f ) { - radius = min.dist_to( max ); - } - - m_hitbox_data.push_back( hitbox_data_t( min, max, radius ) ); - } - } - else { - auto box = set->pHitbox( hitbox ); - if( !box ) return false; - - auto min = math::vector_transform( box->bbmin, bone_matrix[ box->bone ] ); - auto max = math::vector_transform( box->bbmax, bone_matrix[ box->bone ] ); - auto radius = box->m_flRadius; - - if( radius == -1.f ) { - radius = min.dist_to( max ); - } - - m_hitbox_data.push_back( hitbox_data_t( min, max, radius ) ); - } - - if( m_hitbox_data.empty( ) ) - return false; - - for ( int i{ }; i < 256; i ++ ) { - vec3_t spread_dir = get_spread_dir( wep, inaccuracy, spread, angles, i ); - - //Ray_t ray; - //vec3_t end_pos = eye_pos + spread_dir * length; - //ray.Init( eye_pos, end_pos ); - // - // - //CGameTrace tr; - //g_csgo.m_trace( )->ClipRayToEntity( ray, 0x46004003, ent->ce( ), &tr ); - - vec3_t end_pos = eye_pos + ( spread_dir * length ); - - for( const auto& hitbox : m_hitbox_data ) { - if( intersects_hitbox( eye_pos, end_pos, hitbox.m_min, hitbox.m_max, hitbox.m_radius ) ) { - hits++; - break; // cannot hit more than one hitbox - } - } - - if ( hits >= hits_needed ) - return true; - } - - return false; -} - - -float util::get_total_latency( ) { - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - - if ( nci ) { - float latency = nci->GetLatency( 0 ) + nci->GetLatency( 1 ); - return latency; - } - - return 0.f; -} - -float util::get_lerptime( ) { - static cvar_t* cl_interpolate = g_csgo.m_cvar( )->FindVar( xors( "cl_interpolate" ) ); - static cvar_t* cl_interp = g_csgo.m_cvar( )->FindVar( xors( "cl_interp" ) ); - static cvar_t* cl_updaterate = g_csgo.m_cvar( )->FindVar( xors( "cl_updaterate" ) ); - static cvar_t* cl_interp_ratio = g_csgo.m_cvar( )->FindVar( xors( "cl_interp_ratio" ) ); - - if( cl_interp && cl_interpolate && cl_updaterate && cl_interp_ratio ) { - bool interpolate = cl_interpolate->get_int( ); - if( interpolate ) { - float interp = cl_interp->get_float( ); - float interp_ratio = cl_interp_ratio->get_float( ); - float updaterate = cl_updaterate->get_float( ); - - return std::max< float >( interp, interp_ratio / updaterate ); - } - } - - return 0.f; -} - -bool util::is_tick_valid( int tickcount ) { - - float latency = get_total_latency( ); - float correct = std::clamp( latency + get_lerptime( ), 0.f, *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ? 0.2f : 1.0f ); - float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) ); - - if( g_settings.rage.enabled ) { - return delta > -0.2f + TICK_INTERVAL( ) * 2.f && delta < 0.2f; - } - - return std::abs( delta ) < 0.2f; -} - -void util::disable_pvs( ) { - for( int i{ 1 }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_valid( ) ) - continue; - - if( ent == g_ctx.m_local ) - continue; - - *( int* )( uintptr_t( ent ) + 0xa30 ) = g_csgo.m_globals->m_framecount; - *( int* )( uintptr_t( ent ) + 0xa28 ) = 0; - } -} - -vec2_t util::screen_transform( vec3_t world ) { - vec2_t screen; - auto w2s = [ &world, &screen ]( ) -> bool { - static uintptr_t view_matrix = 0; - if( !view_matrix ) { - view_matrix = pattern::first_code_match( g_csgo.m_chl.dll( ), - xors( "0F 10 05 ? ? ? ? 8D 85 ? ? ? ? B9" ) ); - - view_matrix = *reinterpret_cast< uintptr_t* >( view_matrix + 0x3 ) + 176; - } - - const matrix3x4& matrix = *( matrix3x4* )view_matrix; - screen.x = matrix[ 0 ][ 0 ] * world[ 0 ] + matrix[ 0 ][ 1 ] * world[ 1 ] + matrix[ 0 ][ 2 ] * world[ 2 ] + matrix[ 0 ][ 3 ]; - screen.y = matrix[ 1 ][ 0 ] * world[ 0 ] + matrix[ 1 ][ 1 ] * world[ 1 ] + matrix[ 1 ][ 2 ] * world[ 2 ] + matrix[ 1 ][ 3 ]; - - float w = matrix[ 3 ][ 0 ] * world[ 0 ] + matrix[ 3 ][ 1 ] * world[ 1 ] + matrix[ 3 ][ 2 ] * world[ 2 ] + matrix[ 3 ][ 3 ]; - - if( w < 0.001f ) { - //screen.x *= 100000.f; - //screen.y *= 100000.f; - return true; - } - - float invw = 1.0f / w; - screen.x *= invw; - screen.y *= invw; - - return false; - }; - - w2s( ); - //if ( !w2s( ) ) { - int w, h; - g_csgo.m_engine( )->GetScreenSize( w, h ); - - screen.x = ( w * .5f ) + ( screen.x * w ) * .5f; - screen.y = ( h * .5f ) - ( screen.y * h ) * .5f; - - return screen; - //} - - return vec2_t{ }; -} - -int util::hitbox_to_hitgroup( int hitbox ) { - switch( hitbox ) { - case HITBOX_HEAD: - case HITBOX_NECK: - return HITGROUP_HEAD; - case HITBOX_BODY: - case HITBOX_CHEST: - case HITBOX_THORAX: - case HITBOX_PELVIS: - return HITGROUP_STOMACH; - case HITBOX_LEFT_CALF: - case HITBOX_LEFT_THIGH: - case HITBOX_LEFT_FOOT: - return HITGROUP_RIGHTLEG; - case HITBOX_RIGHT_CALF: - case HITBOX_RIGHT_THIGH: - case HITBOX_RIGHT_FOOT: - return HITGROUP_LEFTLEG; - case HITBOX_LEFT_HAND: - case HITBOX_LEFT_FOREARM: - case HITBOX_LEFT_UPPER_ARM: - return HITGROUP_LEFTARM; - case HITBOX_RIGHT_HAND: - case HITBOX_RIGHT_FOREARM: - case HITBOX_RIGHT_UPPER_ARM: - return HITGROUP_RIGHTARM; - default: - return HITGROUP_GENERIC; - } -} - -const char* util::definition_index_to_name( int index ) { - index = std::clamp( index, 0, 65 ); - - switch( index ) { - case 0: - return xors( "knife" ); - case WEAPON_DEAGLE: - return xors( "deagle" ); - case WEAPON_ELITE: - return xors( "elite" ); - case WEAPON_FIVESEVEN: - return xors( "five seven" ); - case WEAPON_GLOCK: - return xors( "glock" ); - case WEAPON_AK47: - return xors( "ak47" ); - case WEAPON_AUG: - return xors( "aug" ); - case WEAPON_AWP: - return xors( "awp" ); - case WEAPON_FAMAS: - return xors( "famas" ); - case WEAPON_G3SG1: - return xors( "g3sg1" ); - case WEAPON_GALILAR: - return xors( "galil" ); - case WEAPON_M249: - return xors( "m249" ); - case WEAPON_M4A1: - return xors( "m4a4" ); - case WEAPON_MAC10: - return xors( "mac10" ); - case WEAPON_P90: - return xors( "p90" ); - case WEAPON_UMP45: - return xors( "ump45" ); - case WEAPON_XM1014: - return xors( "xm1014" ); - case WEAPON_BIZON: - return xors( "bizon" ); - case WEAPON_MAG7: - return xors( "mag7" ); - case WEAPON_NEGEV: - return xors( "negev" ); - case WEAPON_SAWEDOFF: - return xors( "sawed-off" ); - case WEAPON_TEC9: - return xors( "tec9" ); - case WEAPON_TASER: - return xors( "zeus" ); - case WEAPON_HKP2000: - return xors( "p2000" ); - case WEAPON_MP7: - return xors( "mp7" ); - case WEAPON_MP9: - return xors( "mp9" ); - case WEAPON_NOVA: - return xors( "nova" ); - case WEAPON_P250: - return xors( "p250" ); - case WEAPON_SCAR20: - return xors( "scar20" ); - case WEAPON_SG556: - return xors( "sg556" ); - case WEAPON_SSG08: - return xors( "ssg08" ); - case WEAPON_KNIFEGG: - return xors( "golden knife" ); // for the gun game hackers - case WEAPON_KNIFE: - return xors( "knife" ); - case WEAPON_FLASHBANG: - return xors( "flash" ); - case WEAPON_HEGRENADE: - return xors( "nade" ); - case WEAPON_SMOKEGRENADE: - return xors( "smoke" ); - case WEAPON_MOLOTOV: - return xors( "molotov" ); - case WEAPON_DECOY: - return xors( "decoy" ); - case WEAPON_INCGRENADE: - return xors( "incendiary" ); - case WEAPON_C4: - return xors( "c4" ); - case WEAPON_KNIFE_T: - return xors( "knife" ); - case WEAPON_M4A1_SILENCER: - return xors( "M4A1" ); - case WEAPON_USP_SILENCER: - return xors( "usp" ); - case WEAPON_CZ75A: - return xors( "cz75" ); - case WEAPON_R8REVOLVER: - return xors( "revolver" ); - default: - return xors( "none" ); - } -} diff --git a/internal_rewrite/util.hpp b/internal_rewrite/util.hpp deleted file mode 100644 index ba7c779..0000000 --- a/internal_rewrite/util.hpp +++ /dev/null @@ -1,111 +0,0 @@ -#pragma once -#include -#include -#include "strings.hpp" - -//#define COMIC_SANS - -#define NAMESPACE_REGION( x ) namespace x { -#define END_REGION } - -extern int TIME_TO_TICKS( float dt ); -extern float TICKS_TO_TIME( int tick ); -extern float TICK_INTERVAL( ); - -//WEE WOO WEE WOO ITS THE DWORD POLICE -using ulong_t = unsigned long; -using uword_t = unsigned short; - -class IClientEntity; -class CTraceFilter; -class CGameTrace; -class vec3_t; -class vec2_t; - -NAMESPACE_REGION( util ) - -template < typename t > -struct reverse_iterable { - reverse_iterable( t&& it ) : - iterable( it ) { } - - t& iterable; - inline auto begin( ) { - return std::rbegin( iterable ); - } - - inline auto end( ) { - return std::rend( iterable ); - } -}; - -struct hitchance_data_t { - float m_random[ 2 ]; - float m_inaccuracy [ 2 ]; - float m_spread[ 2 ]; -}; - -template< typename t > -reverse_iterable< t > -reverse_iterator( t&& iter ) { - return reverse_iterable< t >{ iter }; -} - -template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { - if ( !classbase ) return fn{ }; - return ( fn )( *( uintptr_t** )classbase )[ index ]; -} - -template < size_t index, typename ret, class ... args_ > -__forceinline ret get_vfunc( void* thisptr, args_... args ) { - using fn = ret( __thiscall* )( void*, args_... ); - - auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; - return fn_ptr( thisptr, args... ); -} - -__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { - std::string ascii_str( unicode.begin( ), unicode.end( ) ); - return ascii_str; -} - -__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { - std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); - return unicode_str; -} - -template < typename integer > -__forceinline auto to_hex_str( const integer& w, - size_t hex_len = sizeof( integer ) << 1 ) { - constexpr char* hex_digits = xors( "0123456789abcdef" ); - std::string rc( hex_len, 0 ); - - for( size_t i{ }, j{ ( hex_len - 1 ) * 4 } ; i < hex_len; ++i, j -= 4 ) - rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; - - return rc; -} - -extern void clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, - unsigned mask, CTraceFilter* filter, CGameTrace* trace ); - -extern bool trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ); -extern bool is_low_fps( ); -extern bool is_tick_valid( int tickcount ); -extern void set_random_seed( int seed ); -extern vec3_t get_spread_dir( void *weapon, float inaccuracy, float spread, vec3_t angles, int seed ); -extern float get_random_float( float min, float max ); -extern bool __vectorcall intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ); -extern bool hitchance( int target, const vec3_t& angles, int percentage, int hitbox = -1 ); -extern void calculate_spread_runtime( ); - -extern float get_total_latency( ); -extern float get_lerptime( ); -extern int get_closest_player( bool distance = false ); -extern vec2_t screen_transform( vec3_t world ); -extern const char* definition_index_to_name( int index ); -extern void disable_pvs( ); -extern int hitbox_to_hitgroup( int hitbox ); -extern std::string hitgroup_to_string( int hitgroup ); - -END_REGION \ No newline at end of file diff --git a/internal_rewrite/vector.hpp b/internal_rewrite/vector.hpp deleted file mode 100644 index 4fef1b7..0000000 --- a/internal_rewrite/vector.hpp +++ /dev/null @@ -1,334 +0,0 @@ -#pragma once -#include -#include - - -class vec2_t { -public: - vec2_t( ) { - x = y = 0.0f; - } - - vec2_t( float X, float Y ) { - x = X; y = Y; - } - - vec2_t( float* v ) { - x = v[ 0 ]; y = v[ 1 ]; - } - - vec2_t( const float* v ) { - x = v[ 0 ]; y = v[ 1 ]; - } - - vec2_t( const vec2_t& v ) { - x = v.x; y = v.y; - } - - vec2_t& operator=( const vec2_t& v ) { - x = v.x; y = v.y; return *this; - } - - float& operator[]( int i ) { - return ( ( float* )this )[ i ]; - } - - float operator[]( int i ) const { - return ( ( float* )this )[ i ]; - } - - vec2_t& operator+=( const vec2_t& v ) { - x += v.x; y += v.y; return *this; - } - - vec2_t& operator-=( const vec2_t& v ) { - x -= v.x; y -= v.y; return *this; - } - - vec2_t& operator*=( const vec2_t& v ) { - x *= v.x; y *= v.y; return *this; - } - - vec2_t& operator/=( const vec2_t& v ) { - x /= v.x; y /= v.y; return *this; - } - - vec2_t& operator+=( float v ) { - x += v; y += v; return *this; - } - - vec2_t& operator-=( float v ) { - x -= v; y -= v; return *this; - } - - vec2_t& operator*=( float v ) { - x *= v; y *= v; return *this; - } - - vec2_t& operator/=( float v ) { - x /= v; y /= v; return *this; - } - - vec2_t operator+( const vec2_t& v ) const { - return vec2_t( x + v.x, y + v.y ); - } - - vec2_t operator-( const vec2_t& v ) const { - return vec2_t( x - v.x, y - v.y ); - } - - vec2_t operator*( const vec2_t& v ) const { - return vec2_t( x * v.x, y * v.y ); - } - - vec2_t operator/( const vec2_t& v ) const { - return vec2_t( x / v.x, y / v.y ); - } - - vec2_t operator+( float v ) const { - return vec2_t( x + v, y + v ); - } - - vec2_t operator-( float v ) const { - return vec2_t( x - v, y - v ); - } - - vec2_t operator*( float v ) const { - return vec2_t( x * v, y * v ); - } - - vec2_t operator/( float v ) const { - return vec2_t( x / v, y / v ); - } - - void set( float X = 0.0f, float Y = 0.0f ) { - x = X; y = Y; - } - - float length( void ) const { - return sqrtf( x * x + y * y ); - } - - float lengthsqr( void ) const { - return ( x * x + y * y ); - } - - float dist_to( const vec2_t& v ) const { - return ( *this - v ).length( ); - } - - float dist_to_sqr( const vec2_t& v ) const { - return ( *this - v ).lengthsqr( ); - } - - float dot( const vec2_t& v ) const { - return ( x * v.x + y * v.y ); - } - - bool is_zero( void ) const { - return ( x > -FLT_EPSILON && x < FLT_EPSILON && - y > -FLT_EPSILON && y < FLT_EPSILON ); - } - - operator bool( ) const noexcept { - return !is_zero( ); - } - -public: - float x, y; -}; - -class vec3_t { -public: - vec3_t( ) { - x = y = z = 0.0f; - } - - vec3_t( float X, float Y, float Z ) { - x = X; y = Y; z = Z; - } - - vec3_t( float* v ) { - x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; - } - - vec3_t( const float* v ) { - x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; - } - - vec3_t( const vec3_t& v ) { - x = v.x; y = v.y; z = v.z; - } - - vec3_t( const vec2_t& v ) { - x = v.x; y = v.y; z = 0.0f; - } - - __forceinline vec3_t& operator=( const vec3_t& v ) { - x = v.x; y = v.y; z = v.z; return *this; - } - - __forceinline vec3_t& operator=( const vec2_t& v ) { - x = v.x; y = v.y; z = 0.0f; return *this; - } - - float& operator[]( int i ) { - return ( ( float* )this )[ i ]; - } - - __forceinline float operator[]( int i ) const { - return ( ( float* )this )[ i ]; - } - - vec3_t& operator+=( const vec3_t& v ) { - x += v.x; y += v.y; z += v.z; return *this; - } - - vec3_t& operator-=( const vec3_t& v ) { - x -= v.x; y -= v.y; z -= v.z; return *this; - } - - vec3_t& operator*=( const vec3_t& v ) { - x *= v.x; y *= v.y; z *= v.z; return *this; - } - - vec3_t& operator/=( const vec3_t& v ) { - x /= v.x; y /= v.y; z /= v.z; return *this; - } - - vec3_t& operator+=( float v ) { - x += v; y += v; z += v; return *this; - } - - vec3_t& operator-=( float v ) { - x -= v; y -= v; z -= v; return *this; - } - - vec3_t& operator*=( float v ) { - x *= v; y *= v; z *= v; return *this; - } - - vec3_t& operator/=( float v ) { - x /= v; y /= v; z /= v; return *this; - } - - __forceinline vec3_t operator+( const vec3_t& v ) const { - return vec3_t( x + v.x, y + v.y, z + v.z ); - } - - __forceinline vec3_t operator-( const vec3_t& v ) const { - return vec3_t( x - v.x, y - v.y, z - v.z ); - } - - __forceinline vec3_t operator*( const vec3_t& v ) const { - return vec3_t( x * v.x, y * v.y, z * v.z ); - } - - __forceinline vec3_t operator/( const vec3_t& v ) const { - return vec3_t( x / v.x, y / v.y, z / v.z ); - } - - __forceinline vec3_t operator+( float v ) const { - return vec3_t( x + v, y + v, z + v ); - } - - __forceinline vec3_t operator-( float v ) const { - return vec3_t( x - v, y - v, z - v ); - } - - __forceinline vec3_t operator*( float v ) const { - return vec3_t( x * v, y * v, z * v ); - } - - __forceinline vec3_t operator/( float v ) const { - return vec3_t( x / v, y / v, z / v ); - } - - __forceinline float length( ) const { - return sqrtf( x * x + y * y + z * z ); - } - - __forceinline float lengthsqr( ) const { - return ( x * x + y * y + z * z ); - } - - __forceinline float length2d( ) const { - return sqrtf( x * x + y * y ); - } - - __forceinline float length2dsqr( ) const { - return ( x * x + y * y ); - } - - __forceinline float dist_to( const vec3_t& v ) const { - return ( *this - v ).length( ); - } - - __forceinline float dist_to_sqr( const vec3_t& v ) const { - return ( *this - v ).lengthsqr( ); - } - - __forceinline float dot( const vec3_t& v ) const { - return ( x * v.x + y * v.y + z * v.z ); - } - - __forceinline float fov_to( const vec3_t& to ) { - const float from_length = length( ); - const float to_length = to.length( ); - - if( from_length && to_length ) { - return acos( dot( to ) / from_length * to_length ); - } - - return 0.f; - } - - vec3_t cross( const vec3_t& v ) const { - return vec3_t( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); - } - - bool is_zero( ) const { - return ( x > -FLT_EPSILON && x < FLT_EPSILON && - y > -FLT_EPSILON && y < FLT_EPSILON && - z > -FLT_EPSILON && z < FLT_EPSILON ); - } - - operator bool( ) const { - return !is_zero( ); - } - - inline void normalize_vector( ) { - vec3_t& v = *this; - - float iradius = 1.f / ( this->length( ) + FLT_EPSILON ); //FLT_EPSILON - - v.x *= iradius; - v.y *= iradius; - v.z *= iradius; - } - - vec3_t abs( ) const { - return vec3_t{ std::abs( x ), std::abs( y ), std::abs( z ) }; - } - - vec3_t clamp( ) { - for ( size_t axis{ }; axis < 2; axis++ ) { - auto &cur_axis = operator[]( axis ); - if ( !std::isfinite( cur_axis ) ) { - cur_axis = 0.f; - } - } - - x = std::clamp( x, -89.f, 89.f ); - y = std::clamp( std::remainder( y, 360.f ), -180.f, 180.f ); - z = 0.f; - return *this; - } - -public: - float x, y, z; -}; - -__forceinline vec3_t operator*( float f, const vec3_t& v ) { - return v * f; -} diff --git a/internal_rewrite/visual.hpp b/internal_rewrite/visual.hpp deleted file mode 100644 index 4d0e996..0000000 --- a/internal_rewrite/visual.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#pragma once -#include -#include "vector.hpp" -#include "color.hpp" -#include -#include "strings.hpp" -#include "IVRenderView.hpp" -#include "context.hpp" - -class c_base_player; - -enum HitFlag_t { - HIT_NONE = 0, - HIT_ALERT = 1, - HIT_1W = 2 -}; - -namespace features -{ - class c_visuals { - private: - static const clr_t esp_green( uint8_t alpha = 255 ) { - return clr_t( 110, 200, 20, alpha ); - } - static const clr_t esp_red( uint8_t alpha = 255 ) { - return clr_t( 240, 0, 0, alpha ); - } - static const clr_t esp_blue( uint8_t alpha = 255 ) { - return clr_t( 84, 173, 247, alpha ); - } - - void draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ); - void draw_line( int x, int y, int x1, int y1, const clr_t& clr ); - void draw_rect( int x, int y, int w, int h, const clr_t& clr ); - void draw_filled_rect( int x, int y, int w, int h, const clr_t& clr ); - void draw_circle( int x, int y, int r, const clr_t& clr, int res = 48 ); - - void draw_really_big_string( int x, int y, const clr_t& clr, const char* msg, ... ); - void draw_string( int x, int y, int align, bool big, const clr_t& clr, const char* msg, ... ); - - - void draw_local( ); - void draw_players( ); - void draw_world( ); - - void draw_hits( ); - void spectator_list( ); - void grenade_prediction( ); - void draw_firegrenade( ); - - struct tracer_t { - float m_time; - vec3_t m_start; - vec3_t m_end; - bool m_local; - }; - - struct hit_t { - int m_ent; - char m_name[ 32 ]; - matrix3x4 m_matrix[ 128 ]; - vec3_t m_pos; - bool m_dead; - float m_time; - }; - - //you should always store the entity index rather than the ptr - struct sound_t { - float m_time; - vec3_t m_pos; - int m_ent; - }; - - struct firegrenade_t { - float m_time; - vec3_t m_pos; - int m_ent; - }; - - struct shot_t { - float time; - vec3_t pos; - bool hit; - }; - - std::vector< firegrenade_t > m_firegrenades; - std::vector< shot_t > m_shots; - std::vector< sound_t > m_sounds; - std::vector< tracer_t > m_tracers; - std::vector< hit_t > m_hits; - - vec3_t m_stored_pos[ 65 ]{ }; - float m_anim_progress[ 65 ]{ }; - bool m_has_seen[ 65 ]{ }; - float m_last_hit{ }; - int m_ent_dmg[ 65 ]{ }; - int m_teamdmg{ 0 }; - int m_hit_flag[ 65 ]{ }; - float m_last_roundstart{ }; - public: - void update_glow( ); - void world_modulate( ); - void update_position( int index, const vec3_t& pos ); - void reset_position( ); - void store_tracer( int ent_index, vec3_t shot ); - void store_sound( int ent, vec3_t origin ); - void store_firegrenades( int ent, vec3_t origin ); - void draw_autowall( ); - void draw_spread( ); - void out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ); - void update_positions( ); - void store_hit( ); - void radar( ); - void draw_tracers( ); - void store_ent_dmg( int, int, int ); - void store_shot( vec3_t pos, bool hit = false ); - void draw_shots( ); - void reset_local_dmg( ); - void draw_skeletons( ); - void on_round_start( ); - void draw_sound( ); - void update_hit_flags( ); - void store_hit( context::shot_data_t* shot ); - void operator()( ); - }; -} \ No newline at end of file diff --git a/internal_rewrite/visual_draw.cpp b/internal_rewrite/visual_draw.cpp deleted file mode 100644 index 8636af2..0000000 --- a/internal_rewrite/visual_draw.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "d3d.hpp" -#include "interface.hpp" -#include "renderer.hpp" -#include "visual.hpp" -#include "settings.hpp" - -namespace features -{ - void c_visuals::draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_line( clr, a.x, a.y, b.x, b.y ); - else - g_renderer.draw_line( a, b, clr ); - } - - void c_visuals::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_line( clr, x, y, x1, y1 ); - else - g_renderer.draw_line( x, y, x1, y1, clr ); - } - - void c_visuals::draw_rect( int x, int y, int w, int h, const clr_t& clr ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_rect( clr, x, y, w, h ); - else - g_renderer.draw_box( x, y, w, h, clr ); - } - - void c_visuals::draw_filled_rect( int x, int y, int w, int h, const clr_t& col ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_filled_rect( col, x, y, w, h ); - else - g_renderer.draw_rect( x, y, w, h, col ); - } - - void c_visuals::draw_circle( int x, int y, int r, const clr_t& col, int res ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_circle( col, x, y, r, res ); - else - g_renderer.draw_circle( x, y, r, col, res ); - } - - void c_visuals::draw_string( int x, int y, int align, bool big, const clr_t& col, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - switch( align ) { - case ALIGN_CENTER: - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_CENTER >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, D3DFONTFLAG_DROPSHADOW, buffer ); - else - g_renderer.draw_string< ALIGN_CENTER >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); - - break; - case ALIGN_LEFT: - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_LEFT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, D3DFONTFLAG_DROPSHADOW, buffer ); - else - g_renderer.draw_string< ALIGN_LEFT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); - - break; - case ALIGN_RIGHT: - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_RIGHT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, D3DFONTFLAG_DROPSHADOW, buffer ); - else - g_renderer.draw_string< ALIGN_RIGHT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); - - break; - } - } - - void c_visuals::draw_really_big_string( int x, int y, const clr_t& col, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_LEFT >( ::d3d::fonts.f_18, col, x, y, D3DFONTFLAG_OUTLINE, buffer ); - else - g_renderer.draw_string< ALIGN_LEFT >( g_fonts.f_bold, x, y, col, msg ); - } -} \ No newline at end of file diff --git a/internal_rewrite/visual_local.cpp b/internal_rewrite/visual_local.cpp deleted file mode 100644 index 119c352..0000000 --- a/internal_rewrite/visual_local.cpp +++ /dev/null @@ -1,661 +0,0 @@ -#include - -#include "visual.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "renderer.hpp" -#include "input_system.hpp" -#include "math.hpp" - -namespace features -{ - void c_visuals::draw_local( ) { - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - - int cur_pos{ }; - - draw_shots( ); - grenade_prediction( ); - draw_spread( ); - spectator_list( ); - - const int offset = 21; - - - if( g_ctx.m_local->is_valid( ) ) { - //isvalveds - - if( g_settings.misc.team_dmg( ) && *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ) { - const float kick = 300.f; - float percentage = m_teamdmg / kick; - - clr_t col = clr_t::blend( esp_green( ), esp_red( ), std::clamp( percentage, 0.f, 1.f ) ); - - draw_really_big_string( 10, cur_pos += offset, col, xors( "DMG: %d" ), m_teamdmg ); - } - - static float incoming_latency; - if( g_settings.misc.net_fakelag ) { - float desired_latency = incoming_latency + 0.15f; - if( g_settings.misc.net_fakelag == 4 ) - desired_latency = 1.0f; - - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - float cur_latency = nci->GetLatency( 1 ); - float percentage = cur_latency / desired_latency; - percentage = std::clamp( percentage + 0.1f, 0.f, 1.f ); - - clr_t col = clr_t::blend( esp_red( ), esp_green( ), percentage ); - - //bool visible = g_settings.misc.net_fakeping_active; - //if( g_settings.misc.net_fakelag == 4 ) - //visible = true; - - if( percentage > 0.35f ) { - draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "PING" ) ); - draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "PING" ) ); - draw_really_big_string( 10, cur_pos, col, xors( "PING" ) ); - } - } - } - else { - auto nci = g_csgo.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - incoming_latency = nci->GetLatency( 1 ); - } - } - - if( g_settings.rage.anti_aim( ) ) { - static float last_lby = 0.f; - static float last_update = 0.f; - float lby = g_ctx.m_local->m_flLowerBodyYawTarget( ); - if( lby != last_lby ) { - last_update = g_csgo.m_globals->m_curtime; - last_lby = lby; - } - - float lby_delta = std::abs( std::remainderf( lby - g_ctx.m_thirdperson_angle.y, 360.f ) ); - float time_delta = g_csgo.m_globals->m_curtime - last_update; - - bool breaking = lby_delta > 35.f && time_delta > 0.2f; - - if( g_cheat.m_ragebot.m_antiaim->is_edging( ) ) { - draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "EDGE" ) ); - draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "EDGE" ) ); - draw_really_big_string( 10, cur_pos, esp_green( ), xors( "EDGE" ) ); - } - - if( g_settings.rage.break_lby( ) ) { - draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "LBY" ) ); - draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "LBY" ) ); - draw_really_big_string( 10, cur_pos, breaking ? esp_green( ) : esp_red( ), xors( "LBY" ) ); - - auto animstate = g_ctx.m_local->get_animstate( ); - if( animstate && animstate->m_velocity < 0.1f && animstate->m_bOnGround ) { - draw_filled_rect( 11, ( cur_pos += 4 ) + 18, 36, 3, clr_t( 0, 0, 0, 170 ) ); - - float progress = ( float )g_cheat.m_ragebot.m_antiaim->get_next_update( ) / TIME_TO_TICKS( 1.1f ); - - if( progress <= 1.f ) - draw_filled_rect( 11, cur_pos + 19, 34 * progress, 1, esp_green( ) ); - } - } - - if( g_settings.rage.preserve_fps && g_settings.rage.enabled && util::is_low_fps( ) ) { - draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "FPS" ) ); - draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "FPS" ) ); - draw_really_big_string( 10, cur_pos, esp_red( ), xors( "FPS" ) ); - } - } - - bool onground = g_ctx.m_local->m_fFlags( ) & FL_ONGROUND; - bool air_lag = g_settings.rage.fakelag.in_air; - bool move_lag = g_settings.rage.fakelag.in_move; - - bool should_lag = ( air_lag && !onground ) || ( move_lag && onground ); - - if( g_settings.rage.fakelag.mode( ) && - g_settings.rage.fakelag.ticks( ) && - should_lag ) { - int min_dist = 64; - int max_ticks = g_settings.rage.fakelag.ticks; - max_ticks += g_settings.rage.fakelag.fluctuate * max_ticks * 0.01f; - max_ticks = std::min( max_ticks, 16 ); - - float speed = g_ctx.m_local->m_vecVelocity( ).length2d( ); - bool breaking = g_cheat.m_lagmgr.is_breaking_lc( ); - if( speed * g_csgo.m_globals->m_interval_per_tick * max_ticks > 55 && speed >= 245.f || breaking ) { - draw_really_big_string( 9, ( cur_pos += offset ), clr_t( 110, 110, 110, 255 ), xors( "LC" ) ); - draw_really_big_string( 11, cur_pos + 2, clr_t( 0, 0, 0, 255 ), xors( "LC" ) ); - draw_really_big_string( 10, cur_pos, breaking ? esp_green( ) : esp_red( ), xors( "LC" ) ); - } - } - } - - if( g_settings.misc.no_scope( ) && - g_ctx.m_local->m_bIsScoped( ) ) { - int w, h; - g_csgo.m_engine( )->GetScreenSize( w, h ); - - auto wep = g_ctx.m_local->get_weapon( ); - if( wep ) { - float inacc = g_ctx.m_weapon_inaccuracy; - - int pixels = inacc * 75; - - if( pixels < 2 ) { - draw_line( 0, h / 2, w, h / 2, clr_t( 0, 0, 0 ) ); - draw_line( w / 2, 0, w / 2, h, clr_t( 0, 0, 0 ) ); - } - else { - for( int i = -pixels; i < pixels; ++i ) { - float a = 1.f - ( float )( std::abs( i ) ) / ( float )( pixels ); - - float inacc_alpha = 1.f - ( inacc * 3.f ); - inacc_alpha = std::clamp( inacc_alpha, 0.4f, 1.f ); - - draw_line( 0, h / 2 + i, w, h / 2 + i, clr_t( 0, 0, 0, 255 * a * inacc_alpha ) ); - draw_line( w / 2 + i, 0, w / 2 + i, h, clr_t( 0, 0, 0, 255 * a * inacc_alpha ) ); - } - } - } - } - - draw_autowall( ); - } - - void c_visuals::spectator_list( ) { - if( !g_settings.visuals.spec_list ) - return; - - std::vector< std::string > spec_list; - - for( size_t i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - if( ent && ent->is_player( ) && !ent->ce( )->IsDormant( ) ) { - auto spec_handle = ent->m_hObserverTarget( ); - auto spec_ent = g_csgo.m_entlist( )->GetClientEntityFromHandle< >( spec_handle ); - - if( spec_ent == g_ctx.m_local ) { - char player_name[ 32 ]; - ent->get_name_safe( player_name ); - spec_list.push_back( player_name ); - } - } - } - - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - - int cur_pos{ }; - - if( g_settings.misc.watermark ) { - cur_pos = 20; - } - - for( auto& it : spec_list ) { - draw_string( screen_w - 3, cur_pos, ALIGN_RIGHT, true, clr_t( 255, 255, 255 ), it.c_str( ) ); - cur_pos += 10; - } - } - - void c_visuals::grenade_prediction( ) { - static auto molotov_detonate_time = g_csgo.m_cvar( )->FindVar( xors( "molotov_throw_detonate_time" ) ); - static auto molotov_detonate_slope = g_csgo.m_cvar( )->FindVar( xors( "weapon_molotov_maxdetonateslope" ) ); - static auto sv_gravity = g_csgo.m_cvar( )->FindVar( xors( "sv_gravity" ) ); - - if( !g_settings.visuals.grenade_prediction ) - return; - - auto is_grenade = [ ]( int defindex ) { - switch( defindex ) { - case WEAPON_FLASHBANG: - case WEAPON_HEGRENADE: - case WEAPON_SMOKEGRENADE: - case WEAPON_MOLOTOV: - case WEAPON_INCGRENADE: - case WEAPON_DECOY: - return true; - default: return false; - } - }; - - auto get_detonate_time = [ ]( int defindex ) { - switch( defindex ) { - case WEAPON_FLASHBANG: - case WEAPON_HEGRENADE: - return 1.5f; - case WEAPON_INCGRENADE: - case WEAPON_MOLOTOV: - return molotov_detonate_time->get_float( ); - case WEAPON_DECOY: - return 5.f; - default: return 3.f; - } - }; - - auto draw_3d_line = [ this ]( const vec3_t& start, const vec3_t& end, clr_t col, bool circle = false ) { - vec2_t start_w2s = util::screen_transform( start ); - vec2_t end_w2s = util::screen_transform( end ); - - draw_line( start_w2s, end_w2s, col ); - if( circle ) - draw_rect( end_w2s.x - 1, end_w2s.y - 1, 2, 2, clr_t( 230, 230, 230 ) ); - }; - - auto clip_velocity = [ ]( const vec3_t& in, const vec3_t& normal, vec3_t& out, float overbounce ) { - int blocked = 0; - float angle = normal[ 2 ]; - - if( angle > 0.f ) - blocked |= 1; - - if( !angle ) - blocked |= 2; - - float backoff = in.dot( normal ) * overbounce; - - for( int i{ }; i < 3; ++i ) { - out[ i ] = in[ i ] - ( normal[ i ] * backoff ); - - if( out[ i ] > -0.1f && out[ i ] < 0.1f ) { - out[ i ] = 0.f; - } - } - - return blocked; - }; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon ) return; - - int def_index = weapon->m_iItemDefinitionIndex( ); - if( !is_grenade( def_index ) || !weapon->m_bPinPulled( ) ) - return; - - auto wpn_info = weapon->get_wpn_info( ); - - vec3_t throw_ang, forward; - g_csgo.m_engine( )->GetViewAngles( throw_ang ); - throw_ang.x -= ( 90.f - abs( throw_ang.x ) ) * 0.11111111f; - throw_ang.x = std::remainderf( throw_ang.x, 360.f ); - - forward = math::angle_vectors( throw_ang ); - - float throw_strength = weapon->m_flThrowStrength( ); - float throw_velocity = std::min( std::max( wpn_info->throw_velocity * 0.9f, 15.f ), 750.f ); - - float throw_height = ( throw_strength * 12.f ) - 12.f; - float v68 = throw_velocity * ( ( 0.7f * throw_strength ) + 0.3f ); - - vec3_t start_pos = g_ctx.m_local->get_eye_pos( ) + vec3_t( 0, 0, throw_height ); - vec3_t end_pos = start_pos + ( forward * 22.f ); - - CTraceFilter filter; - filter.pSkip = g_ctx.m_local; - - CGameTrace trace; - Ray_t ray; - ray.Init( start_pos, end_pos, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - - g_csgo.m_trace( )->TraceRay( ray, CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_MOVEABLE | CONTENTS_CURRENT_90, &filter, &trace ); - end_pos = trace.endpos - forward * 6.f; - vec3_t throw_pos = g_ctx.m_local->m_vecVelocity( ) * 1.25f + forward * v68; - - //draw_3d_line( start_pos, end_pos, clr_t( 255, 255, 255 ) ); - float gravity = sv_gravity->get_float( ) * 0.4f; - - player_info_t info{ }; - - for( int ticks = TIME_TO_TICKS( get_detonate_time( def_index ) ); ticks >= 0; --ticks ) { - auto throw_dir = vec3_t( throw_pos.x, throw_pos.y, ( throw_pos.z + ( throw_pos.z - ( gravity * TICK_INTERVAL( ) ) ) ) * 0.5f ); - auto temp = throw_dir * TICK_INTERVAL( ); - throw_pos.z -= gravity * TICK_INTERVAL( ); - - vec3_t src = end_pos, end = end_pos + temp; - Ray_t ray; - ray.Init( src, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - - g_csgo.m_trace( )->TraceRay( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); - if( trace.allsolid ) - throw_pos = vec3_t( ); - - end_pos = trace.endpos; - draw_3d_line( src, end_pos, g_settings.visuals.grenade_pred_clr ); - - if( trace.fraction != 1.f ) { - float surf_elasticity = 1.f; - vec3_t throw_pos2{ }; - clip_velocity( throw_pos, trace.plane.normal, throw_pos2, 2.f ); - - if( trace.m_pEnt && g_csgo.m_engine( )->GetPlayerInfo( trace.m_pEnt->GetIndex( ), &info ) ) { - surf_elasticity = 0.3f; - } - - throw_pos2 *= std::clamp( surf_elasticity * 0.45f, 0.f, 0.9f ); - end = end_pos + throw_pos2 * ( ( 1.f - trace.fraction ) * TICK_INTERVAL( ) ); - - if( def_index == WEAPON_MOLOTOV || def_index == WEAPON_INCGRENADE ) { - if( trace.plane.normal.z >= cos( DEG2RAD( molotov_detonate_slope->get_float( ) ) ) ) { - return; - } - } - - ray.Init( end_pos, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - g_csgo.m_trace( )->TraceRay( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); - - draw_3d_line( end_pos, end, g_settings.visuals.grenade_pred_clr, true ); - end_pos = trace.endpos; - throw_pos = throw_pos2; - } - } - } - - void c_visuals::store_shot( vec3_t pos, bool hit ) { - if( !g_settings.visuals.target ) - return; - - m_shots.push_back( { g_csgo.m_globals->m_curtime, pos, hit } ); - } - - void c_visuals::draw_shots( ) { - if( !g_settings.visuals.target ) - return; - - for( size_t i{ }; i < m_shots.size( ) && !m_shots.empty( ); ++i ) { - if( m_shots[ i ].time + g_settings.visuals.target_time < g_csgo.m_globals->m_curtime ) { - m_shots.erase( m_shots.begin( ) + i ); - } - } - - for( auto& it : m_shots ) { - vec3_t min = it.pos - vec3_t( 3.5f, 3.5f, 3.5f ); - vec3_t max = it.pos + vec3_t( 3.5f, 3.5f, 3.5f ); - - std::array< vec3_t, 8 > points = { - vec3_t{ min.x, min.y, min.z }, - vec3_t{ min.x, max.y, min.z }, - vec3_t{ max.x, max.y, min.z }, - vec3_t{ max.x, min.y, min.z }, - vec3_t{ max.x, max.y, max.z }, - vec3_t{ min.x, max.y, max.z }, - vec3_t{ min.x, min.y, max.z }, - vec3_t{ max.x, min.y, max.z } - }; - - vec2_t - flb = util::screen_transform( points[ 3 ] ), - blb = util::screen_transform( points[ 0 ] ), - frb = util::screen_transform( points[ 2 ] ), - blt = util::screen_transform( points[ 6 ] ), - brt = util::screen_transform( points[ 5 ] ), - frt = util::screen_transform( points[ 4 ] ), - brb = util::screen_transform( points[ 1 ] ), - flt = util::screen_transform( points[ 7 ] ); - - vec2_t lines[ 12 ][ 2 ]; - - lines[ 0 ][ 0 ] = { flb.x, flb.y }; - lines[ 0 ][ 1 ] = { frb.x, frb.y }; - lines[ 1 ][ 0 ] = { frb.x, frb.y }; - lines[ 1 ][ 1 ] = { brb.x, brb.y }; - lines[ 2 ][ 0 ] = { brb.x, brb.y }; - lines[ 2 ][ 1 ] = { blb.x, blb.y }; - lines[ 3 ][ 0 ] = { blb.x, blb.y }; - lines[ 3 ][ 1 ] = { flb.x, flb.y }; - - // top - lines[ 4 ][ 0 ] = { flt.x, flt.y }; - lines[ 4 ][ 1 ] = { frt.x, frt.y }; - lines[ 5 ][ 0 ] = { frt.x, frt.y }; - lines[ 5 ][ 1 ] = { brt.x, brt.y }; - lines[ 6 ][ 0 ] = { brt.x, brt.y }; - lines[ 6 ][ 1 ] = { blt.x, blt.y }; - lines[ 7 ][ 0 ] = { blt.x, blt.y }; - lines[ 7 ][ 1 ] = { flt.x, flt.y }; - - //bottom to top - lines[ 8 ][ 0 ] = { flb.x, flb.y }; - lines[ 8 ][ 1 ] = { flt.x, flt.y }; - lines[ 9 ][ 0 ] = { frb.x, frb.y }; - lines[ 9 ][ 1 ] = { frt.x, frt.y }; - lines[ 10 ][ 0 ] = { brb.x, brb.y }; - lines[ 10 ][ 1 ] = { brt.x, brt.y }; - lines[ 11 ][ 0 ] = { blb.x, blb.y }; - lines[ 11 ][ 1 ] = { blt.x, blt.y }; - - for( size_t i{ }; i < 12; ++i ) { - draw_line( lines[ i ][ 0 ], lines[ i ][ 1 ], it.hit ? esp_blue( 160 ) : esp_red( 160 ) ); - } - } - } - - void c_visuals::draw_autowall( ) { - if( !g_settings.visuals.autowall_crosshair ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( !weapon || weapon->is_knife( ) || weapon->is_grenade( ) ) - return; - - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - - auto wpn_data = weapon->get_wpn_info( ); - - vec3_t angles{ }; - g_csgo.m_engine( )->GetViewAngles( angles ); - - fire_bullet_data_t data{ }; - data.src = g_ctx.m_local->get_eye_pos( ); - vec3_t end = data.src; - end += math::angle_vectors( angles ) * wpn_data->range; - - data.filter.pSkip = g_ctx.m_local; - data.current_damage = wpn_data->damage; - data.penetrate_count = 1; - data.travel_range = ( end - data.src ).length( ); - data.traveled = 0.f; - data.to_travel = data.travel_range; - - data.direction = math::angle_vectors( angles ); - - data.direction.normalize_vector( ); - - CTraceFilter filter; - Ray_t ray; - - filter.pSkip = g_ctx.m_local; - ray.Init( data.src, end ); - g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT | CONTENTS_GRATE, &filter, &data.enter_trace ); - - bool can_penetrate = g_cheat.m_autowall.handle_bullet_penetration( wpn_data, data ); - - draw_line( screen_w / 2 - 1, screen_h / 2, screen_w / 2 + 2, screen_h / 2, - can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ) ); - - draw_line( screen_w / 2, screen_h / 2 - 1, screen_w / 2, screen_h / 2 + 2, - can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ) ); - -#ifdef _DEBUG - static con_var< bool > dbg_awall{ &data::holder_, fnv( "dbg_awall" ) }; - - if( dbg_awall( ) ) { - draw_string( screen_w / 2 + 5, screen_h / 2 + 5, ALIGN_LEFT, true, - can_penetrate ? clr_t( 0, 220, 0 ) : clr_t( 220, 0, 0 ), "%d", ( int )data.current_damage ); - } -#endif - } - - void c_visuals::draw_spread( ) { - if( !g_settings.visuals.draw_spread ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - if( weapon ) { - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - int cross_x = screen_w / 2, cross_y = screen_h / 2; - - float recoil_step = screen_h / g_ctx.m_fov; - - cross_x -= ( int )( g_ctx.m_local->m_aimPunchAngle( ).y * recoil_step ); - cross_y += ( int )( g_ctx.m_local->m_aimPunchAngle( ).x * recoil_step ); - - weapon->update_accuracy_penalty( ); - float inaccuracy = weapon->get_inaccuracy( ); - float spread = weapon->get_spread( ); - - float cone = inaccuracy * spread; - cone *= screen_h * 0.7f; - cone *= 90.f / g_ctx.m_fov; - - for( int seed{ }; seed < 256; ++seed ) { - util::set_random_seed( math::random_number( 0, 255 ) + 1 ); - float rand_a = util::get_random_float( 0.f, 1.0f ); - float pi_rand_a = util::get_random_float( 0.f, 2.0f * M_PI ); - float rand_b = util::get_random_float( 0.0f, 1.0f ); - float pi_rand_b = util::get_random_float( 0.f, 2.f * M_PI ); - - float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); - float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); - - float max_x = cos( pi_rand_a ) * cone + cos( pi_rand_b ) * cone; - float max_y = sin( pi_rand_a ) * cone + sin( pi_rand_b ) * cone; - - float step = screen_h / g_ctx.m_fov * 90.f; - int screen_spread_x = ( int )( spread_x * step * 0.7f ); - int screen_spread_y = ( int )( spread_y * step * 0.7f ); - - float percentage = ( rand_a * inaccuracy + rand_b * spread ) / ( inaccuracy + spread ); - - draw_filled_rect( cross_x + screen_spread_x, cross_y + screen_spread_y, 1, 1, - clr_t( 255, 255, 255, 255 * ( 0.4f + percentage * 0.6f ) ) * ( 0.1f + percentage * 0.9f ) ); - } - } - } - - - void c_visuals::store_tracer( int index, vec3_t pos ) { - static float last_time[ 65 ]{ }; - tracer_t new_tracer; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); - if( ent && ent->is_valid( ) ) { - bool valid = ent == g_ctx.m_local; - float time = g_csgo.m_globals->m_curtime; - auto ent_pos = ent->get_hitbox_pos( 0 ); - - if( ent != g_ctx.m_local && g_ctx.m_local->is_valid( ) && - ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || g_settings.visuals.friendlies( ) ) ) { - vec3_t ang = math::vector_angles( ent_pos, pos ); - vec3_t local_pos = g_ctx.m_local->get_hitbox_pos( 0 ); - float dist = local_pos.dist_to( ent_pos ); - - vec3_t local_ang = math::vector_angles( ent_pos, local_pos ); - - constexpr float max_delta_sqr = 30.f * 30.f; - - float pitch_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).x ) ) ) * dist; - float yaw_delta = sin( DEG2RAD( std::abs( ( ang - local_ang ).clamp( ).y ) ) ) * dist; - float delta_sqr = ( yaw_delta * yaw_delta + pitch_delta * pitch_delta ); - - if( delta_sqr > max_delta_sqr ) return; - - vec3_t vec = math::angle_vectors( ang ); - vec *= dist; - vec += ent_pos; - - pos = vec; - - valid = true; - } - - if( valid ) { - float delta = std::abs( g_csgo.m_globals->m_curtime - last_time[ index ] ); - if( delta > g_csgo.m_globals->m_interval_per_tick ) { - new_tracer.m_time = time; - new_tracer.m_start = ent_pos; - new_tracer.m_end = pos; - new_tracer.m_local = ent == g_ctx.m_local; - m_tracers.emplace_back( new_tracer ); - - last_time[ index ] = g_csgo.m_globals->m_curtime; - } - } - } - } - - void c_visuals::draw_tracers( ) { - if( !g_settings.visuals.active ) return; - float time = g_csgo.m_globals->m_curtime; - - if( m_tracers.empty( ) ) - return; - - for( size_t i{ }; i < m_tracers.size( ) && !m_tracers.empty( ); ++i ) { - auto& tr = m_tracers[ i ]; - - float delta = time - tr.m_time; - if( delta > 1.0f || std::abs( delta ) > 5.f ) m_tracers.erase( m_tracers.begin( ) + i ); - } - - if( !m_tracers.empty( ) ) { - for( auto& it : m_tracers ) { - - float delta = time - it.m_time; - clr_t col = it.m_local ? clr_t::from_hsb( delta, 1.0f, 1.0f ) : clr_t( 255, 15, 46 ); - col.a( ) = 1.0f - delta * 255; - auto w2s_begin = util::screen_transform( it.m_start ); - auto w2s_end = util::screen_transform( it.m_end ); - - - switch( g_settings.visuals.bullet_tracers( ) ) { - case 1: - draw_line( w2s_begin, w2s_end, col ); - break; - case 2: - if( !g_ctx.precache_model( xors( "materials/sprites/laserbeam.vmt" ) ) ) { - g_con->log( "nigga cant get" ); - break; - } - - BeamInfo_t beam_info; - - beam_info.m_nType = beam_normal; - beam_info.m_pszModelName = xors( "materials/sprites/laserbeam.vmt" ); - beam_info.m_nModelIndex = g_csgo.m_model_info( )->GetModelIndex( xors( "materials/sprites/laserbeam.vmt" ) ); - beam_info.m_flHaloScale = 0.0f; - beam_info.m_flLife = 0.09f; //0.09 - beam_info.m_flWidth = .6f; - beam_info.m_flEndWidth = .75f; - beam_info.m_flFadeLength = 3.0f; - beam_info.m_flAmplitude = 0.f; - beam_info.m_flBrightness = ( col.a( ) - 255.f ) * 0.8f; - beam_info.m_flSpeed = 1.f; - beam_info.m_nStartFrame = 1; - beam_info.m_flFrameRate = 60; - beam_info.m_flRed = col.r( ); - beam_info.m_flGreen = col.g( ); - beam_info.m_flBlue = col.b( ); - beam_info.m_nSegments = 4; - beam_info.m_bRenderable = true; - beam_info.m_nFlags = 0; - - beam_info.m_vecStart = it.m_start; - beam_info.m_vecEnd = it.m_end; - - Beam_t* beam = g_csgo.m_beams( )->CreateBeamPoints( beam_info ); - - if( beam ) { - g_csgo.m_beams( )->DrawBeam( beam ); - } - - break; - } - } - } - } -} \ No newline at end of file diff --git a/internal_rewrite/visual_player.cpp b/internal_rewrite/visual_player.cpp deleted file mode 100644 index f14a0d7..0000000 --- a/internal_rewrite/visual_player.cpp +++ /dev/null @@ -1,1174 +0,0 @@ -#include - -#include "visual.hpp" -#include "context.hpp" -#include "base_cheat.hpp" -#include "renderer.hpp" -#include "input_system.hpp" -#include "math.hpp" - -#undef PlaySound - -//2k lines of code here -int screen_w, screen_h; -con_var< bool > dbg_anims{ &data::holder_, fnv( "dbg_anims" ), false }; - -namespace features -{ - void c_visuals::update_position( int index, const vec3_t& pos ) { - m_stored_pos[ index ] = pos; - if( m_anim_progress[ index ] > 0.f && m_anim_progress[ index ] <= 0.3f - && m_has_seen[ index ] && g_settings.visuals.dormant ) { - m_anim_progress[ index ] = 0.3f; - } - } - - void c_visuals::reset_position( ) { - for( size_t i{ }; i < 65; ++i ) { - m_anim_progress[ i ] = 0.f; - m_has_seen[ i ] = false; - } - } - - void c_visuals::store_hit( ) { - if( !g_settings.visuals.hitmarkers ) - return; - - g_csgo.m_surface( )->PlaySound( xors( "buttons\\arena_switch_press_02.wav" ) ); - m_last_hit = g_csgo.m_globals->m_curtime; - } - - void c_visuals::radar( ) { - if( !g_settings.visuals.radar( ) ) - return; - - for( int i = 0; i < 32; i++ ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); - if( !ent || !ent->is_valid( ) ) - continue; - - ent->m_bSpotted( ) = true; - } - } - - void c_visuals::draw_hits( ) { - if( !g_settings.visuals.hitmarkers || !g_ctx.run_frame( ) ) - return; - - float delta = ( g_csgo.m_globals->m_curtime - m_last_hit ) * 1.5f; - if( std::abs( delta ) > 1.0f ) return; - - clr_t col = g_settings.menu.menu_color; - if( delta > 0.75f ) { - col.a( ) = 255 * ( 1.0f - delta ) * 4.f; - } - - auto get_rotated_point = [ ]( vec2_t point, float rotation, float distance ) { - float rad = DEG2RAD( rotation ); - - point.x += sin( rad ) * distance; - point.y += cos( rad ) * distance; - - return point; - }; - - - for( size_t i{ }; i < 2; ++i ) { - float rotation = 135.f + i * 90.f; - - vec2_t center = { screen_w * 0.5f, screen_h * 0.5f }; - - for( size_t dist = 7; dist < 14; ++dist ) { - vec2_t start = get_rotated_point( center, rotation, dist ); - vec2_t end = get_rotated_point( center, rotation, dist + 1 ); - - vec2_t rot_start = get_rotated_point( center, rotation - 180.f, dist ); - vec2_t rot_end = get_rotated_point( center, rotation - 180.f, dist + 1 ); - - int point = dist - 6; - float percentage = point / 7; - - percentage = 1.f - percentage; - percentage *= std::clamp( delta + 0.75f, 0.f, 1.f ); - - clr_t draw = col; - draw.a( ) *= percentage; - - draw_line( start, end, draw ); - draw_line( rot_start, rot_end, draw ); - } - } - } - - struct box_t { - int x, y, w, h; - }; - - box_t get_box( c_base_player* ent, vec3_t stored_origin ) { - const matrix3x4& matrix = ent->m_CoordinateFrame( ); - - vec2_t min_corner{ FLT_MAX, FLT_MAX }; - vec2_t max_corner{ FLT_MIN, FLT_MIN }; - - vec3_t min_pos; - vec3_t max_pos; - - matrix3x4 bone_matrix[ 128 ]; - memcpy( bone_matrix, ent->m_CachedBoneData( ).GetElements( ), ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); - - for( size_t i{ }; i < hdr->numbones; ++i ) { - auto bone = hdr->GetBone( i ); - - if( bone && bone->parent != -1 && bone->flags & 0x100 ) { - auto& matrix = bone_matrix[ i ]; - vec3_t hitbox = vec3_t( matrix[ 0 ][ 3 ], matrix[ 1 ][ 3 ], matrix[ 2 ][ 3 ] ); - hitbox -= ent->ce( )->GetRenderOrigin( ); - hitbox += stored_origin; - - - vec2_t pos = util::screen_transform( hitbox ); - - if( pos.x < min_corner.x ) - min_corner.x = pos.x; - - if( pos.x > max_corner.x ) - max_corner.x = pos.x; - - if( pos.y < min_corner.y ) - min_corner.y = pos.y; - - if( pos.y > max_corner.y ) - max_corner.y = pos.y; - } - } - - vec2_t origin = util::screen_transform( stored_origin ); - if( max_corner.y > 1 && max_corner.x > 1 && min_corner.y < screen_h && min_corner.x < screen_w ) { - vec3_t origin_zoffset = stored_origin; - origin_zoffset.z += 10; - - vec2_t delta = util::screen_transform( origin_zoffset ) - origin; - - min_corner.x += delta.y; - max_corner.x -= delta.y; - - min_corner.y += delta.y; - max_corner.y -= delta.y; - } - else { - return { -100, -100, 0, 0 }; - } - - int x = ( int )min_corner.x; - int w = ( int )( max_corner.x - min_corner.x ); - - int y = ( int )min_corner.y; - int h = ( int )( max_corner.y - min_corner.y ); - - return { x, y, w, h }; - } - - void c_visuals::out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ) { - vec2_t screen; - vec2_t circle; - - auto find_point = [ ]( vec2_t& point, float deg_x, float deg_y ) { - float x2 = screen_w / 2.f; - float y2 = screen_h / 2.f; - - float d = sqrt( pow( point.x - x2, 2 ) + pow( point.y - y2, 2 ) ); - float r_x = deg_x / d; - float r_y = deg_y / d; - - point.x = r_x * point.x + ( 1.f - r_x ) * x2; - point.y = r_y * point.y + ( 1.f - r_y ) * y2; - }; - - auto get_screen_point = [ ]( vec2_t& screen, const vec3_t& delta ) { - decltype( auto ) w2s_matrix = g_csgo.m_engine( )->WorldToScreenMatrix( ); - float x; - float w; - float y; - - screen.x = w2s_matrix[ 0 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 0 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 0 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 0 ][ 3 ]; - screen.y = w2s_matrix[ 1 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 1 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 1 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 1 ][ 3 ]; - w = w2s_matrix[ 3 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 3 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 3 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 3 ][ 3 ]; - - if( w < 0.001f ) { - float invw = -1.0f / w; - screen.x *= invw; - screen.y *= invw; - } - else { - float invw = 1.0f / w; - screen.x *= invw; - screen.y *= invw; - } - - x = float( screen_w ) / 2.f; - y = float( screen_h ) / 2.f; - x += 0.5f * screen.x * screen_w + 0.5f; - y -= 0.5f * screen.y * screen_h + 0.5f; - screen.x = x; - screen.y = y; - }; - - screen = util::screen_transform( pos );//get_screen_point( screen, pos ); - circle = util::screen_transform( pos );// get_screen_point( circle, pos ); - - float radius = g_settings.visuals.out_of_pov_radius * 0.49f; - - float ratio = g_settings.visuals.out_of_pov_radius; - - float w = screen_w * ratio + screen_h * ( 1.0f - ratio ); - - find_point( screen, w * radius, - float( screen_h ) * radius ); - - auto min = std::min< int >( screen_w, screen_h ) * radius; - find_point( circle, float( min ), float( min ) ); - - auto rot_around_center = [ ]( vec2_t start, float rot ) { - float rad = rot * ( M_PI / 180.f ); - - start.x += sin( rad ) * float( g_settings.visuals.out_of_pov_size ); - start.y += cos( rad ) * float( g_settings.visuals.out_of_pov_size ); - - return start; - }; - - float delta_x = ( float( screen_w / 2 ) - circle.x ); - float delta_y = ( float( screen_h / 2 ) - circle.y ); - - auto hyp = sqrt( delta_x * delta_x + delta_y * delta_y ); - - float cos_ = delta_x / hyp; - - float deg = RAD2DEG( acos( cos_ ) ); - - if( screen.y < screen_h / 2 ) { - deg *= -1.f; - } - - auto rotated_pos_1 = rot_around_center( screen, deg + 115 ); - auto rotated_pos_2 = rot_around_center( screen, deg + 65 ); - - col.a( ) *= 0.8f; - - vertex_t v[ ] = { - { screen }, - { rotated_pos_1 }, - { rotated_pos_2 } - }; - - if( !g_settings.misc.hide_from_obs ) - g_renderer.draw_polygon( 3, v, col ); - else { - draw_line( screen, rotated_pos_1, col ); - draw_line( screen, rotated_pos_2, col ); - draw_line( rotated_pos_1, rotated_pos_2, col ); - } - } - - void c_visuals::update_glow( ) { - if( !g_settings.visuals.active || g_settings.misc.hide_from_obs ) - return; - -#ifdef HEADER_MODULE - static auto manager_ptr = g_header.patterns.glow_manager + 0x3; -#else - static auto manager_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "0F 11 05 00 00 00 00 83 C8 01" ), 0x3 ); -#endif - - auto glow_object_manager = *( GlowObjectManager_t** )( manager_ptr ); - auto glow_count = glow_object_manager->Count; - auto glow_objects = glow_object_manager->DataPtr; - - if( glow_count > 500 || glow_count <= 0 ) - return; - - for( int i{ }; i < glow_count; ++i ) { - auto& object = glow_objects[ i ]; - - auto ent = object.m_pEntity->as< c_base_player >( ); - if( !ent ) continue; - - if( ent->is_player( ) ) { - if( g_settings.visuals.glow && - ent->is_valid( ) && ent->has_valid_anim( ) && ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || - g_settings.visuals.friendlies || g_settings.visuals.chams.friendlies ) ) { - - clr_t clr = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? - g_settings.visuals.glow_friendly : g_settings.visuals.glow_enemy; - - object.color = clr.to_fclr( ); - object.m_bRenderWhenOccluded = true; - object.m_bRenderWhenUnoccluded = false; - object.m_flBloomAmount = 0.85f; - } - } - else { - auto ce = ent->ce( ); - auto client_class = ce->GetClientClass( ); - if( !client_class ) continue; - int class_id = client_class->m_class_id; - if( class_id != CBaseWeaponWorldModel && ( strstr( client_class->m_name, xors( "Weapon" ) ) - || class_id == CDEagle || class_id == CAK47 ) ) { - bool glow = g_settings.visuals.weapon_esp == 2 || g_settings.visuals.weapon_esp == 3; - object.color = g_settings.visuals.weapon_esp_clr( ).to_fclr( ); - object.m_bRenderWhenOccluded = true; - object.m_bRenderWhenUnoccluded = false; - object.m_flBloomAmount = glow ? 0.85f : 0.0f; - } - else { - auto model = ce->GetModel( ); - if( !model ) continue; - - bool glow = g_settings.visuals.grenade_esp( ) == 2 || g_settings.visuals.grenade_esp( ) == 3; - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) - continue; - - object.color = g_settings.visuals.grenade_esp_clr( ).to_fclr( ); - object.m_bRenderWhenOccluded = true; - object.m_bRenderWhenUnoccluded = false; - object.m_flBloomAmount = glow ? 0.85f : 0.0f; - } - } - } - } - - inline clr_t blend_clr( clr_t in, float progress ) { - static const clr_t clr_gray = { 160, 160, 160, 255 }; - int a = in.a( ); - - clr_t ret = clr_t::blend( clr_gray, in, 0.1f + progress * 0.9f ); - ret.a( ) = a; - return ret; - } - - void c_visuals::update_positions( ) { - CUtlVector< CSndInfo > sound_info{ }; - - g_csgo.m_engine_sound( )->GetActiveSounds( sound_info ); - - for( size_t i{ }; i < sound_info.GetSize( ); ++i ) { - auto& snd = sound_info.GetElements( )[ i ]; - - if( snd.origin ) { - int idx = snd.sound_source; - auto ent = g_csgo.m_entlist( )->GetClientEntity( idx ); - - if( ent && ent->is_player( ) && ent->ce( )->IsDormant( ) ) - update_position( idx, snd.origin[ 0 ] ); - } - } - } - - void c_visuals::draw_players( ) { - static constexpr float anim_rate = 1.0f / 0.5f; - static float pov_progress[ 65 ]{ }; - - auto resource = c_base_player::get_player_resource( ); - - for( int i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( i ); - - if( !ent || !ent->is_player( ) || !ent->is_alive( ) || ent == g_ctx.m_local ) { - m_has_seen[ i ] = false; - m_anim_progress[ i ] = 0.f; - continue; - } - - if( !ent->has_valid_anim( ) ) - continue; - - if( i == ( g_ctx.m_local->m_hObserverTarget( ) & 0xfff ) ) - continue; - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && - !g_settings.visuals.friendlies( ) ) - continue; - - float rate = g_csgo.m_globals->m_frametime * anim_rate; - float& anim = m_anim_progress[ i ]; - float alpha = anim; - bool dormant = ent->ce( )->IsDormant( ); - int health = ent->m_iHealth( ); - auto origin = ent->ce( )->GetRenderOrigin( ); - int right_pos = 0; - int bottom_pos = 0; - bool too_distant = true; - if( g_ctx.m_local ) - too_distant = ent->m_vecOrigin( ).dist_to( g_ctx.m_local->m_vecOrigin( ) ) > 2000.f; - - if( !dormant ) { - update_position( i, origin ); - if( anim > 0.f ) - anim = std::clamp( anim + rate, 0.f, 1.f ); - else - anim = 0.5f; - - m_has_seen[ i ] = true; - } - else { - if( anim < 0.3f && g_settings.visuals.dormant && !too_distant ) { - rate *= 0.02f; - } - anim = std::clamp( anim -= rate, 0.f, 1.0f ); - if( m_anim_progress[ i ] <= 0.f ) { - m_has_seen[ i ] = false; - continue; - } - } - - auto box = get_box( ent, m_stored_pos[ i ] ); - - clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? - g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; - - if( dormant ) { - col = blend_clr( col, anim ); - col.a( ) *= anim; - } - - if( box.x > screen_w || box.x + box.w < 0 || - box.y > screen_h || box.y + box.h < 0 ) { - if( g_settings.visuals.out_of_pov ) { - auto& anim = pov_progress[ i ]; - - if( dormant ) - anim = std::clamp( anim -= g_csgo.m_globals->m_frametime * anim_rate, 0.f, 1.0f ); - else - anim = std::clamp( anim += g_csgo.m_globals->m_frametime * anim_rate, 0.f, 1.0f ); - - col.a( ) *= anim; - out_of_fov( ent, ent->ce( )->GetRenderOrigin( ), col ); - } - continue; - } - - pov_progress[ i ] = 0.f; - - if( g_settings.visuals.skeleton( ) && !dormant ) { - clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.skeleton_friendly : g_settings.visuals.skeleton_enemy; - col.a( ) *= alpha; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); - if( hdr ) { - matrix3x4 matrix[ 128 ]; - memcpy( matrix, ent->m_CachedBoneData( ).GetElements( ), - ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); - - for( size_t bone{ }; bone < hdr->numbones; ++bone ) { - auto b = hdr->GetBone( bone ); - if( b && b->flags & 0x100 && b->parent != -1 ) { - vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; - vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; - - auto child_screen = util::screen_transform( child ); - auto parent_screen = util::screen_transform( parent ); - - draw_line( child_screen, parent_screen, col ); - } - } - } - } - - if( g_settings.visuals.box( ) ) { - auto alpha_ = col.a( ); - float percent = float( alpha_ ) / 255.f; - draw_rect( box.x + 1, box.y + 1, box.w - 2, box.h - 2, clr_t( 0, 0, 0, 180 * alpha * percent ) ); - draw_rect( box.x, box.y, box.w, box.h, col ); - } - - if( g_settings.visuals.health( ) ) { - auto fill = box.h - 1; - fill *= std::clamp( health, 0, 100 ) * 0.01f; - - auto hp_col = clr_t( - std::min< int >( 510 * ( 100 - health ) / 100, 255 ), - std::min< int >( 510 * health / 100, 255 ), - 0, - 255 * alpha ); - - draw_filled_rect( box.x - 4, box.y, 3, box.h + 1, clr_t( 0, 0, 0, 170 * alpha ) ); - draw_filled_rect( box.x - 3, box.y + box.h - fill, 1, fill, hp_col ); - - if( health != 100 ) - draw_string( box.x - 2, box.y + 1 + box.h - fill - 3, ALIGN_CENTER, false, clr_t( 255, 255, 255, 255 * alpha ), "%d", health ); - } - - if( g_settings.visuals.name( ) ) { - clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.name_friendly( ) : g_settings.visuals.name_enemy( ); - col.a( ) *= alpha; - - char name[ 32 ]; - ent->get_name_safe( name ); - - draw_string( box.x + box.w / 2, box.y - 12, ALIGN_CENTER, true, - blend_clr( col, anim ), name ); - } - - if( g_settings.visuals.money( ) ) { - int x_pos = box.x + box.w + 2; - int y_pos = box.y - 1 + right_pos; - draw_string( x_pos, y_pos, ALIGN_LEFT, false, - blend_clr( esp_green( 255 * alpha ), anim ), - xors( "%d$" ), ent->m_iAccount( ) ); - - right_pos += 9; - } - - if( g_settings.visuals.resolver_indicator && g_settings.rage.resolver && g_cheat.m_player_mgr.is_cheater( i ) && !dormant && g_ctx.m_local->is_valid( ) ) { - bool can_backtrack_lby = g_cheat.m_ragebot.m_lagcomp->can_backtrack_entity( i ) == RECORD_LBY && !ent->is_breaking_lc( ); - bool can_backtrack = !!g_cheat.m_ragebot.m_lagcomp->can_backtrack_entity( i ) && !ent->is_breaking_lc( ); - int x_pos = box.x + box.w + 3; - int y_pos = box.y - 1 + right_pos; - - bool is_fake = !can_backtrack_lby; - bool is_breaking_lc = g_cheat.m_prediction.is_breaking_lc( i ); - - if( is_breaking_lc ) { - draw_string( x_pos, y_pos, ALIGN_LEFT, false, - clr_t( 255, 255, 255, 255 * alpha ), - xors( "lc" ) ); - - right_pos += 9; - } - else if( is_fake && g_ctx.m_local->is_valid( ) ) { - if( ent->m_fFlags( ) & FL_ONGROUND && ent->get_anim_velocity( ).length2d( ) < 0.1f && !dormant && !g_settings.misc.hide_from_obs ) { - float update = g_cheat.m_ragebot.m_lagcomp->get_flick_time( i ); - float delta = ( ent->m_flSimulationTime( ) - update ) * 0.9f; - - if( delta >= 0.f && delta <= 1.f ) { - - //don't allocate 20000000 bytes on the stack thx - static vertex_t v[ 48 ]; - - float radius = box.w / 5.f; - - radius = std::clamp( radius, 4.f, 8.f ); - - right_pos += radius * 2; - - v[ 0 ].init( x_pos + radius / 2 + 2, y_pos + radius / 2 + 2 ); - - int progress = ( 1.f - delta ) * 48; - - - const float step = ( M_PI * 2.f ) / 48.f; - - for( int r = 1; r < progress; ++r ) { - float s = sin( step * r ) * radius; - float c = cos( step * r ) * radius; - - - v[ r ].init( x_pos + radius / 2 + c + 2, y_pos + s + radius / 2 + 2 ); - } - - g_renderer.draw_filled_circle( x_pos + radius / 2 + 2, y_pos + radius / 2 + 2, radius + 1, clr_t( 0, 0, 0, 170 * alpha ) ); - g_renderer.draw_polygon( progress, v, g_settings.visuals.lby_bar_clr ); - } - } - else { - draw_string( x_pos, y_pos, ALIGN_LEFT, false, - clr_t( 255, 255, 255, 255 * alpha ), - xors( "fake" ) ); - - right_pos += 9; - } - } - - if( !!g_cheat.m_ragebot.m_resolver->get_state( i ) && !dormant && g_ctx.m_local->is_valid( ) && g_settings.misc.hide_from_obs( ) ) { - float update = g_cheat.m_ragebot.m_lagcomp->get_flick_time( i ); - float delta = ( ent->m_flSimulationTime( ) - update ) * 0.9f; - if( delta >= 0.f && delta <= 1.f ) { - float max = box.w - 2.f; - float fill = max * std::clamp( delta, 0.f, 1.f ); - - draw_filled_rect( box.x, box.y + box.h + 3 + bottom_pos, - box.w, 3, clr_t( 0, 0, 0, 180 * alpha ) ); - - clr_t col = g_settings.visuals.lby_bar_clr; - col.a( ) *= alpha; - - draw_filled_rect( box.x + 1, box.y + box.h + 4 + bottom_pos, - fill, 1, blend_clr( col, anim ) ); - - bottom_pos += 4; - } - } - } - - if( g_settings.visuals.ping( ) ) { - auto ping = ent->get_ping( ); - - if( ping > 310 ) { - int x_pos = box.x + box.w + 3; - int y_pos = box.y - 1 + right_pos; - - draw_string( x_pos, y_pos, ALIGN_LEFT, false, - blend_clr( esp_blue( 255 * alpha ), anim ), - xors( "ping" ) ); - - right_pos += 9; - } - } - - if( g_settings.visuals.weapon( ) ) { - auto weapon = ent->get_weapon( ); - if( weapon ) { //magic font - auto weapon_info = weapon->get_wpn_info( ); - int max = weapon_info->max_clip_ammo; - - if( g_settings.visuals.ammo && max > 1 ) { - auto progress = float( weapon->m_iClip1( ) ) / max; - float fill = box.w - 2.f; - float percent = fill * progress; - - draw_filled_rect( box.x, box.y + box.h + 3 + bottom_pos, - box.w, 3, clr_t( 0, 0, 0, 180 * alpha ) ); - - clr_t col = g_settings.visuals.ammo_bar_clr; - col.a( ) *= alpha; - - draw_filled_rect( box.x + 1, box.y + box.h + 4 + bottom_pos, - percent, 1, blend_clr( col, anim ) ); - - if( progress < 0.25f ) { - draw_string( - box.x + percent, box.y + box.h + bottom_pos, ALIGN_LEFT, false, - clr_t( 255, 255, 255, 180 * alpha ), "%d", weapon->m_iClip1( ) ); - } - - bottom_pos += 4; - } - - - char wep_str[ 64 ]; - sprintf_s< 64 >( wep_str, "%s", util::definition_index_to_name( weapon->m_iItemDefinitionIndex( ) ) ); - - draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, false, - clr_t( 255, 255, 255, alpha * 255 ), wep_str ); - } - } - - if( g_settings.visuals.flags( ) ) { - int x_pos = box.x + box.w + 3; - int y_pos = box.y - 1; - - if( ent->m_bIsScoped( ) && right_pos < box.h ) { - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "scope" ) ); - right_pos += 9; - } - - if( ent->is_flashed( ) && right_pos < box.h ) { - const float step = M_PI * 2.f / 6; - - float radius = std::clamp( box.w / 5.f, 4.f, 8.f ); - - for( int i = 0; i < 6; ++i ) { - float c = cos( step * i + DEG2RAD( 30.f ) ); - float s = sin( step * i + DEG2RAD( 30.f ) ); - - float off = 0; - - if( i == 5 || i == 0 ) - off = 0.25f; - - draw_line( x_pos + c * radius / 2 + radius / 2 + 2, y_pos + right_pos + s * radius / 2 + radius / 2 + 3, - x_pos + c * ( radius + off ) + radius / 2 + off + 2, y_pos + s * ( radius + off ) + right_pos + radius / 2 + 3, - blend_clr( esp_blue( 255 * alpha ), anim ) ); - } - - //draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, blend_clr( esp_blue( 255 * alpha ), anim ), xors( "flash" ) ); - right_pos += radius * 2.3f; - } - - if( !( util::is_low_fps( ) && g_settings.rage.preserve_fps( ) ) ) { - if( m_hit_flag[ i ] && g_ctx.m_local->is_valid( ) && i != g_cheat.m_ragebot.get_target( ) && g_settings.rage.enabled ) { - clr_t col = m_hit_flag[ i ] == HIT_1W ? clr_t( 255, 255, 255, 255 * alpha ) : esp_red( alpha * 255 ); - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, blend_clr( col, anim ), xors( "hit" ) ); - right_pos += 9; - } - } - - if( ent->is_reloading( ) && right_pos < box.h ) { - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "rel" ) ); - right_pos += 9; - } - } - - - - static con_var< bool > dbg_multipoint{ &data::holder_, fnv( "dbg_multipoint" ), false }; - if( dbg_multipoint( ) ) { - auto should_multipoint = [ ]( int hitbox, bool moving ) -> bool { - auto& setting = g_settings.rage.multipoint; - - switch( hitbox ) { - case HITBOX_HEAD: - return setting.head; - case HITBOX_PELVIS: - case HITBOX_BODY: - return setting.stomach; - //case HITBOX_CHEST: - case HITBOX_UPPER_CHEST: - case HITBOX_THORAX: - return setting.chest; - case HITBOX_RIGHT_THIGH: - case HITBOX_LEFT_THIGH: - if( moving && g_settings.rage.ignore_limbs_moving ) - return false; - - if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) - return false; - - return setting.thighs; - - case HITBOX_LEFT_CALF: - case HITBOX_RIGHT_CALF: - if( moving && g_settings.rage.ignore_limbs_moving ) - return false; - - if( g_settings.rage.preserve_fps && util::is_low_fps( ) ) - return false; - - return setting.calves; - default: - return false; - } - }; - - bool moving = ent->m_vecVelocity( ).length2d( ) > 0.1f && !ent->is_fakewalking( ); - - matrix3x4 bone_matrix[ 128 ]; - ent->ce( )->SetupBones( bone_matrix, 128, BONE_USED_BY_HITBOX, 0.f ); - - for( int hitbox = 0; hitbox < HITBOX_MAX; ++hitbox ) { - if( should_multipoint( hitbox, moving ) ) { - const auto model = ent->ce( )->GetModel( ); - if( !model ) continue; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - if( !hdr ) continue; - - auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) ); - if( !set ) continue; - - //literally 20000 iq, the best multipoint - //im an actual fucking retard jesus christ - auto box = set->pHitbox( hitbox ); - if( !box ) continue; - - vec3_t center = ( box->bbmax + box->bbmin ) * 0.5f; - - float dist = box->m_flRadius; - - if( box->m_flRadius == -1.f ) - dist = center.dist_to( box->bbmin ) * 0.85f; - vec3_t min_dir = math::angle_vectors( math::vector_angles( center, box->bbmin ) ); - vec3_t min = center + min_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; - - if( box->m_flRadius == -1.f ) - dist = center.dist_to( box->bbmax ) * 0.85f; - vec3_t max_dir = math::angle_vectors( math::vector_angles( center, box->bbmax ) ); - vec3_t max = center + max_dir * dist * g_settings.rage.active->m_hitbox_scale * 1.1f; - - std::vector< vec3_t > points; - - points.push_back( center ); - - if( g_settings.rage.multipoint_enable( ) == 1 || - hitbox == HITBOX_LEFT_CALF || hitbox == HITBOX_RIGHT_CALF || - hitbox == HITBOX_LEFT_THIGH || hitbox == HITBOX_RIGHT_THIGH ) { - points.push_back( vec3_t{ min.x, min.y, center.z } ); - points.push_back( vec3_t{ max.x, min.y, center.z } ); - points.push_back( vec3_t{ min.x, max.y, center.z } ); - points.push_back( vec3_t{ max.x, max.y, center.z } ); - } - else if( g_settings.rage.multipoint_enable( ) == 2 ) { - points.push_back( vec3_t{ max.x, max.y, max.z } ); - points.push_back( vec3_t{ min.x, max.y, max.z } ); - points.push_back( vec3_t{ max.x, min.y, max.z } ); - points.push_back( vec3_t{ min.x, min.y, max.z } ); - - points.push_back( vec3_t{ max.x, max.y, min.z } ); - points.push_back( vec3_t{ min.x, max.y, min.z } ); - points.push_back( vec3_t{ max.x, min.y, min.z } ); - points.push_back( vec3_t{ min.x, min.y, min.z } ); - } - else if( g_settings.rage.multipoint_enable( ) == 3 ) { - points.push_back( vec3_t{ min.x, min.y, center.z } ); - points.push_back( vec3_t{ max.x, min.y, center.z } ); - points.push_back( vec3_t{ min.x, max.y, center.z } ); - points.push_back( vec3_t{ max.x, max.y, center.z } ); - - points.push_back( vec3_t{ max.x, max.y, max.z } ); - points.push_back( vec3_t{ min.x, max.y, max.z } ); - points.push_back( vec3_t{ max.x, min.y, max.z } ); - points.push_back( vec3_t{ min.x, min.y, max.z } ); - - points.push_back( vec3_t{ max.x, max.y, min.z } ); - points.push_back( vec3_t{ min.x, max.y, min.z } ); - points.push_back( vec3_t{ max.x, min.y, min.z } ); - points.push_back( vec3_t{ min.x, min.y, min.z } ); - } - - for( size_t i1 = 0; i1 < points.size( ); i1++ ) { - auto& it = points.at( i1 ); - - auto trans = math::vector_transform( it, bone_matrix[ box->bone ] ); - auto w2s_box = util::screen_transform( trans ); - - draw_circle( ( int )w2s_box.x, ( int )w2s_box.y, 3, esp_blue( ), 16 ); - } - } - } - } - -#ifdef _DEBUG - static con_var< bool > dbg_bt{ &data::holder_, fnv( "dbg_bt" ), false }; - if( dbg_bt( ) && i == g_cheat.m_ragebot.get_shot_target( ) ) { - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); - if( hdr ) { - auto matrix = g_cheat.m_ragebot.get_shot_matrix( ); - for( size_t bone{ }; bone < hdr->numbones; ++bone ) { - auto b = hdr->GetBone( bone ); - if( b && b->flags & 0x100 && b->parent != -1 ) { - vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; - vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; - - auto child_screen = util::screen_transform( child ); - auto parent_screen = util::screen_transform( parent ); - - draw_line( child_screen, parent_screen, clr_t( 255, 255, 255, 200 ) ); - } - } - } - } - - static con_var< bool > dbg_pose{ &data::holder_, fnv( "dbg_pose" ) }; - if( dbg_pose( ) ) { - for( size_t i{ }; i < 24; ++i ) { - int x = box.x + box.w + 15; - int y = box.y + 11 * i; - - draw_string( x, y, ALIGN_LEFT, false, clr_t( 255, 255, 255 ), "%d %f", i, ent->m_flPoseParameter( )[ i ] ); - } - } - - static con_var< bool > dbg_anim{ &data::holder_, fnv( "dbg_anim" ) }; - if( dbg_anim( ) ) { - draw_string( box.x - 14, box.y - 15, ALIGN_RIGHT, false, clr_t( 255, 255, 255 ), "%f", ent->get_animdata( ).m_last_velocity.length2d( ) ); - draw_string( box.x - 14, box.y, ALIGN_RIGHT, false, clr_t( 255, 255, 255 ), "%f", ent->get_animdata( ).m_anim_velocity.length2d( ) ); - for( size_t i{ }; i < 13; ++i ) { - int x = box.x - 15; - int y = box.y + 11 * ( i + 2 ); - - draw_string( x, y, ALIGN_RIGHT, false, clr_t( 255, 255, 255 ), "%d %f", i, ent->m_AnimOverlay( ).GetElements( )[ i ].m_flCycle ); - } - - auto ent_origin = ent->m_vecOrigin( ); - auto ent_origin_vel = origin + ent->get_animdata( ).m_anim_velocity; - ent_origin_vel.z = ent_origin.z; - - draw_line( util::screen_transform( ent_origin ), util::screen_transform( ent_origin_vel ), esp_blue( ) ); - } -#endif - } - } - - void c_visuals::store_sound( int index, vec3_t origin ) { - if( !g_settings.visuals.sound ) - return; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); - if( ent && ent->is_player( ) && ent->is_alive( ) && ent != g_ctx.m_local ) { - if( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || ( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && g_settings.visuals.friendlies( ) ) ) { - sound_t new_sound; - new_sound.m_time = g_csgo.m_globals->m_curtime; - new_sound.m_ent = index; - new_sound.m_pos = origin; - new_sound.m_pos.z += 5.f; - m_sounds.emplace_back( new_sound ); - } - } - } - - void c_visuals::store_hit( context::shot_data_t* shot ) { - if( !g_settings.visuals.hits ) - return; - - hit_t new_hit; - - auto ent = g_csgo.m_entlist( )->GetClientEntity( shot->m_enemy_index ); - - new_hit.m_ent = shot->m_enemy_index; - ent->get_name_safe( new_hit.m_name ); - - memcpy( new_hit.m_matrix, - shot->m_matrix, - sizeof( matrix3x4 ) * 128 ); - - new_hit.m_pos = shot->m_enemy_pos; - new_hit.m_time = g_csgo.m_globals->m_curtime; - - m_hits.push_back( new_hit ); - } - - void c_visuals::draw_skeletons( ) { - if( !g_settings.visuals.hits ) - return; - - for( size_t i{ }; i < m_hits.size( ) && !m_hits.empty( ); ++i ) { - auto& hit = m_hits[ i ]; - - float delta = g_csgo.m_globals->m_curtime - hit.m_time; - if( std::abs( delta ) > g_settings.visuals.target_time ) - m_hits.erase( m_hits.begin( ) + i ); - } - - for( auto& it : m_hits ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_ent ); - - if( !ent || !ent->is_player( ) ) - continue; - - if( !ent->is_alive( ) ) - it.m_dead = true; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); - - auto matrix = it.m_matrix; - vec3_t pos = it.m_pos; - float delta = g_csgo.m_globals->m_curtime - it.m_time; - - float total = g_settings.visuals.target_time; - float threshold = total * 0.5f; - - float fade = total - delta < threshold ? ( total - delta ) / ( total * 0.5f ) : 1.f; - - float dist_fade = 1.f; - if( ent->is_valid( ) && !it.m_dead ) { - dist_fade = 300.f - std::clamp( ent->ce( )->GetRenderOrigin( ).dist_to( pos ), 1.f, 300.f ) / 300.f; - } - - clr_t col = clr_t( 255, 255, 255, 100 * dist_fade * fade ); - - clr_t outer_col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? - g_settings.visuals.glow_friendly : - g_settings.visuals.glow_enemy; - - outer_col.a( ) *= 0.65f; - outer_col.a( ) *= ( fade * dist_fade ); - - for( size_t bone{ }; bone < hdr->numbones; ++bone ) { - auto b = hdr->GetBone( bone ); - if( b && b->flags & 0x100 && b->parent != -1 ) { - vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; - vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; - - auto child_screen = util::screen_transform( child ); - auto parent_screen = util::screen_transform( parent ); - - draw_line( child_screen - vec2_t( 1, 1 ), parent_screen - vec2_t( 1, 1 ), outer_col ); - draw_line( child_screen, parent_screen, col ); - - draw_line( child_screen + vec2_t( 1, 1 ), parent_screen + vec2_t( 1, 1 ), outer_col ); - } - } - } - } - - void c_visuals::update_hit_flags( ) { - if( !g_settings.visuals.flags || !g_settings.rage.enabled ) - return; - - if( util::is_low_fps( ) && g_settings.rage.preserve_fps ) - return; - - auto weapon = g_ctx.m_local->get_weapon( ); - - for( size_t i{ }; i < 65; ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( i ); - - if( !ent || !ent->is_valid( ) || !ent->has_valid_anim( ) || - ( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && !g_settings.rage.friendlies ) - || ent->m_bGunGameImmunity( ) ) { - m_hit_flag[ i ] = HIT_NONE; - continue; - } - - vec3_t local_pos = g_ctx.m_local->get_eye_pos( ); - vec3_t enemy_pos = ent->get_hitbox_pos( 0 ); - - auto local_wep = g_ctx.m_local->get_weapon( ); - auto enemy_wep = ent->get_weapon( ); - - if( !local_wep || !enemy_wep || local_wep->is_knife( ) || enemy_wep->is_knife( ) || local_wep->is_grenade( ) || enemy_wep->is_grenade( ) ) { - m_hit_flag[ i ] = HIT_NONE; - continue; - } - - float local_dmg = g_cheat.m_autowall.run( g_ctx.m_local, ent, enemy_pos, false ); - float enemy_dmg = g_cheat.m_autowall.run( ent, g_ctx.m_local, g_ctx.m_local->get_hitbox_pos( 0 ), false ); - - auto min_dmg = g_cheat.m_ragebot.get_min_dmg( ent ); - - if( enemy_dmg < 5.f && local_dmg > g_cheat.m_ragebot.get_min_dmg( ent ) ) - m_hit_flag[ i ] = HIT_1W; - else if( enemy_dmg > 15.f && local_dmg < g_cheat.m_ragebot.get_min_dmg( ent ) ) - m_hit_flag[ i ] = HIT_ALERT; - else - m_hit_flag[ i ] = HIT_NONE; - } - } - - void c_visuals::store_ent_dmg( int attacker, int entindex, int dmg ) { - if( entindex == g_ctx.m_local->ce( )->GetIndex( ) ) - return; - - bool dead = false; - int hp = 100 - m_ent_dmg[ entindex ]; - - if( hp - dmg < 0 ) { - dmg = hp; - dead = true; - } - - m_ent_dmg[ entindex ] += dmg; - - auto ent = g_csgo.m_entlist( )->GetClientEntity( entindex ); - if( attacker == g_csgo.m_engine( )->GetLocalPlayer( ) && ent && ent->is_player( ) && ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && g_ctx.m_local->is_valid( ) ) { - m_teamdmg += ( g_csgo.m_globals->m_curtime - m_last_roundstart > 10.f ) || dead ? dmg : dmg * 2; - } - } - - void c_visuals::on_round_start( ) { - reset_position( ); - - m_last_roundstart = g_csgo.m_globals->m_curtime; - for( size_t i{ }; i < 65; ++i ) { - m_ent_dmg[ i ] = 0.f; - } - } - - void c_visuals::reset_local_dmg( ) { - m_teamdmg = 0; - } - - void c_visuals::draw_sound( ) { - if( !g_settings.visuals.active ) return; - if( g_settings.misc.hide_from_obs ) return; - - float time = g_csgo.m_globals->m_curtime; - - if( m_sounds.empty( ) ) - return; - - - for( size_t i{ }; i < m_sounds.size( ) && !m_sounds.empty( ); ++i ) { - auto& tr = m_sounds[ i ]; - - float delta = g_csgo.m_globals->m_curtime - tr.m_time; - if( delta > 0.001f || std::abs( delta ) > 0.001f ) m_sounds.erase( m_sounds.begin( ) + i ); - } - - if( !m_sounds.empty( ) ) { - for( auto& it : m_sounds ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_ent ); - if( !ent || !ent->is_player( ) ) - continue; - - clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; - float delta = time - it.m_time; - if( !g_ctx.precache_model( xors( "materials/sprites/laserbeam.vmt" ) ) ) { - g_con->log( "nigga cant get" ); - continue; - } - - BeamInfo_t beam_info; - - beam_info.m_nType = beam_ring_point; - beam_info.m_pszModelName = xors( "materials/sprites/laserbeam.vmt" ); - beam_info.m_nModelIndex = g_csgo.m_model_info( )->GetModelIndex( xors( "materials/sprites/laserbeam.vmt" ) ); - beam_info.m_flHaloScale = 0.0f; - beam_info.m_flLife = 0.75f; //0.09 - beam_info.m_flWidth = 1.5f; - beam_info.m_flEndWidth = 1.5f; - beam_info.m_flFadeLength = 1.0f; - beam_info.m_flAmplitude = 0.f; - beam_info.m_flBrightness = col.a( ); - beam_info.m_flSpeed = 2.f; - beam_info.m_nStartFrame = 0; - beam_info.m_flFrameRate = 60; - beam_info.m_flRed = col.r( ); - beam_info.m_flGreen = col.g( ); - beam_info.m_flBlue = col.b( ); - beam_info.m_nSegments = 1; - beam_info.m_bRenderable = true; - beam_info.m_nFlags = 0; - - beam_info.m_vecCenter = it.m_pos; - beam_info.m_flStartRadius = 0.f; - beam_info.m_flEndRadius = ( float )g_settings.visuals.sound_range( ); - - Beam_t* beam = g_csgo.m_beams( )->CreateBeamRingPoint( beam_info ); - - if( beam ) { - g_csgo.m_beams( )->DrawBeam( beam ); - } - } - } - } - - void c_visuals::operator()( ) { - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - if( g_ctx.run_frame( ) ) { - draw_local( ); - } - - if( !g_ctx.m_local ) - return; - - switch( g_settings.visuals.activation_type( ) ) { - case 0: - g_settings.visuals.active = false; - break; - case 1: - g_settings.visuals.active = true; - break; - case 2: - g_settings.visuals.active = g_input.is_key_pressed( g_settings.visuals.key ); - break; - case 3: { - static bool held = false; - bool pressed = g_input.is_key_pressed( g_settings.visuals.key ); - if( pressed ) { - if( !held ) - g_settings.visuals.active ^= 1; - held = true; - } - else held = false; - } - break; - default: - g_settings.visuals.active = false; - break; - } - - if( g_settings.visuals.active ) { - update_positions( ); - draw_players( ); - draw_skeletons( ); - } - - draw_world( ); - draw_tracers( ); - draw_hits( ); - } -} \ No newline at end of file diff --git a/internal_rewrite/visual_world.cpp b/internal_rewrite/visual_world.cpp deleted file mode 100644 index ea3d31d..0000000 --- a/internal_rewrite/visual_world.cpp +++ /dev/null @@ -1,415 +0,0 @@ -#include -#include -#include "context.hpp" -#include "visual.hpp" -#include "interface.hpp" -#include "renderer.hpp" -#include "base_cheat.hpp" -namespace features -{ - void fix_static_props( ) { - static auto cvar = g_csgo.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) ); - static bool fixed{ }; - if( !fixed ) { - cvar->m_flags |= 0; - cvar->set_value( 1 ); - - fixed = true; - } - } - - void c_visuals::store_firegrenades( int index, vec3_t pos ) { - firegrenade_t new_grenade; - - auto ent = g_csgo.m_entlist( )->GetClientEntity< >( index ); - if( !ent || !ent->is_player( ) ) - return; - - - new_grenade.m_time = g_csgo.m_globals->m_curtime; - new_grenade.m_ent = index; - new_grenade.m_pos = pos; - - m_firegrenades.emplace_back( new_grenade ); - } - - void c_visuals::draw_world( ) { - if( !g_settings.visuals.active ) - return; - - static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) ); - static auto c4_time = g_csgo.m_cvar( )->FindVar( xors( "mp_c4timer" ) ); - - draw_firegrenade( ); - - for( int i{ 64 }; i < g_csgo.m_entlist( )->GetHighestEntityIndex( ); ++i ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity< IClientEntity >( i ); - if( !ent ) continue; - - auto client_class = ent->GetClientClass( ); - if( !client_class ) continue; - - int class_id = client_class->m_class_id; - - if( g_settings.visuals.bomb_info && class_id == CPlantedC4 && ( strstr( client_class->m_name, xors( "Planted" ) ) ) ) { - //yea i know this is yuck i just want to get it out there for now, ill revisit it sometime in the week - //not bad at all tbh - int screen_w, screen_h; - g_csgo.m_engine( )->GetScreenSize( screen_w, screen_h ); - - auto pos = ent->GetRenderOrigin( ); - auto w2s = util::screen_transform( pos ); - auto bomb = ent->as< c_base_weapon >( ); - auto to_target = pos - g_ctx.m_local->ce( )->GetRenderOrigin( ); - - float bomb_time = bomb->m_flC4Blow( ) - g_csgo.m_globals->m_curtime; - float bomb_percentage = bomb_time / c4_time->get_float( ); - float time = ( bomb_time < 0 || bomb->m_bBombDefused( ) ) ? 0.f : bomb_time; - - if( time <= 0.f ) - return; - - bool out_of_pov = w2s.x > screen_w || w2s.x < 0.f || w2s.y > screen_h || w2s.y < 0.f; - if( out_of_pov ) { - static auto safezoney = g_csgo.m_cvar( )->FindVar( xors( "safezoney" ) ); - static auto hud_scaling = g_csgo.m_cvar( )->FindVar( xors( "hud_scaling" ) ); - - w2s.x = screen_w / 2; - w2s.y = ( 45 * hud_scaling->get_float( ) ) + ( screen_h - screen_h * safezoney->get_float( ) + 1 ) * 0.5f; - } - - float bomb_damage = 500 * exp( -((to_target.length( ) * to_target.length( ) ) / ( ( ( 1750 * 0.33333334 ) * 2.f ) * ( 1750 * 0.33333334 ) ) ) ); - float damage = bomb_damage; - - if( g_ctx.m_local->m_ArmorValue( ) > 0 ) { - damage *= 0.5f; - float armor = ( bomb_damage - damage ) * 0.5f; - if( armor > g_ctx.m_local->m_ArmorValue( ) ) - damage = bomb_damage - ( g_ctx.m_local->m_ArmorValue( ) * ( 1.f / 0.5f ) ); - } - - int health_remaining = g_ctx.m_local->m_iHealth( ) - round(damage); - - float damage_percentage = std::clamp( round( damage ) / g_ctx.m_local->m_iHealth( ), 0.f, 1.0f ); - - clr_t bomb_col = clr_t::blend( esp_red( ), esp_green( ), bomb_percentage ); - clr_t damage_col = clr_t::blend( esp_green( ), esp_red( ), damage_percentage ); - - char health_str[ 100 ]; - - strenc::w_sprintf_s( health_str, 100, xors( "health: %d" ), health_remaining ); - - if( health_remaining <= 0 ) { - strenc::w_sprintf_s( health_str, 100, xors( "dead" ) ); - damage_percentage = 100.f; - } - - draw_string( w2s.x, w2s.y + 20, ALIGN_CENTER, false, damage_col, health_str ); - - auto draw_timer = [ & ]( const char* text, float progress, bool red = false ) { - clr_t col = red ? esp_red( ) : clr_t::blend( esp_green( ), esp_red( ), progress ); - - const float full = 78.f; - float fill = full * progress; - - draw_filled_rect( w2s.x - 40, w2s.y, 80, 18, clr_t( 0, 0, 0, 170 ) ); - draw_filled_rect( w2s.x - 39, w2s.y + 1, fill, 16, col ); - - draw_string( w2s.x, w2s.y + 3, ALIGN_CENTER, false, clr_t( 255, 255, 255 ), text ); - }; - - if( bomb->m_hBombDefuser( ) != ULONG_MAX ) { - auto defuser = g_csgo.m_entlist( )->GetClientEntity( bomb->m_hBombDefuser( ) & 0xfff ); - - float defuse_time = std::clamp( bomb->m_flDefuseCountDown( ) - g_csgo.m_globals->m_curtime, 0.f, 10.f ); - float defuse_percentage = defuser->m_bHasDefuser( ) ? defuse_time / 5.f : defuse_time / 10.f; - - char defuse_str[ 32 ]; - strenc::w_sprintf_s( defuse_str, 32, xors( "defuse: %.1f" ), defuse_time ); - - draw_timer( defuse_str, 1.f - defuse_percentage, defuse_time > bomb_time ); - } - else { - char bomb_str[ 32 ]; - strenc::w_sprintf_s( bomb_str, 32, xors( "bomb: %.1f" ), bomb_time ); - - draw_timer( bomb_str, 1.f - bomb_percentage ); - } - } - - if( class_id != CBaseWeaponWorldModel && ( strstr( client_class->m_name, xors( "Weapon" ) ) - || class_id == CDEagle || class_id == CAK47 ) ) { - auto owner = ( int )ent->as< c_base_weapon >( )->m_hOwner( ) & 0xfff; - if( owner <= 0 || owner > 64 ) { - auto origin = ent->GetRenderOrigin( ); - if( origin ) { - bool draw = g_settings.visuals.weapon_esp( ) == 1; - bool glow = g_settings.visuals.weapon_esp( ) == 2; - - if( draw || g_settings.visuals.weapon_esp == 3 ) { - if( !glow && !g_settings.misc.hide_from_obs ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false; - } - - auto w2s = util::screen_transform( origin ); - auto def_index = ent->as< c_base_weapon >( )->m_iItemDefinitionIndex( ); - auto name = util::definition_index_to_name( def_index ); - - auto dist = g_ctx.m_local->m_vecOrigin( ).dist_to( origin ); - - clr_t col = g_settings.visuals.weapon_esp_clr; - if( dist > 250.f ) { - col.a( ) *= std::clamp( ( 750.f - ( dist - 250.f ) ) / 750.f, 0.f, 1.f ); - }; - - draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, - col, name ); - } - if( ( glow || g_settings.visuals.weapon_esp == 3 ) && !g_settings.misc.hide_from_obs ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - } - } - } - else { - if( g_settings.visuals.grenade_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) { - auto model = ent->GetModel( ); - if( !model ) continue; - - auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model ); - if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) - continue; - - bool fade = false; - - std::string name = xors( "nade" ); - if( strstr( hdr->name, xors( "flash" ) ) ) { - name = xors( "flash" ); - fade = true; - } - else if( strstr( hdr->name, xors( "smoke" ) ) ) { - name = xors( "smoke" ); - fade = true; - } - else if( strstr( hdr->name, xors( "decoy" ) ) ) { - name = xors( "decoy" ); - fade = true; - } - else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) { - name = xors( "molotov" ); - } - - if( ( g_settings.visuals.grenade_esp == 2 || g_settings.visuals.grenade_esp == 3 ) && !g_settings.misc.hide_from_obs ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - - if( g_settings.visuals.grenade_esp == 1 || g_settings.visuals.grenade_esp == 3 ) { - auto pos = ent->GetRenderOrigin( ); - auto w2s = util::screen_transform( pos ); - auto cutie = g_csgo.m_entlist( )->GetClientEntityFromHandle( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); - - auto dist = g_ctx.m_local->m_vecOrigin( ).dist_to( pos ); - - clr_t col = g_settings.visuals.grenade_esp_clr( ); - if( dist > 250.f && fade ) { - col.a( ) *= std::max( ( 1000.f - ( dist - 250.f ) ) / 1000.f, 0.f ); - } - - draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, - col, name.c_str( ) ); - - char name[ 32 ]; - cutie->get_name_safe( name ); - - if( g_settings.visuals.grenade_owner( ) ) - draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, col, name ); - } - } - } - } - } - - void c_visuals::draw_firegrenade( ) { - static auto life_span = g_csgo.m_cvar( )->FindVar( xors( "inferno_flame_lifetime" ) ); - float time = g_csgo.m_globals->m_curtime; - - if( m_firegrenades.empty( ) ) - return; - - for( size_t i{ }; i < m_firegrenades.size( ) && !m_firegrenades.empty( ); ++i ) { - auto& tr = m_firegrenades[ i ]; - - float delta = g_csgo.m_globals->m_curtime - tr.m_time; - if( std::abs( delta ) > life_span->get_float( ) ) m_firegrenades.erase( m_firegrenades.begin( ) + i ); - } - - if( !m_firegrenades.empty( ) ) { - for( auto& it : m_firegrenades ) { - auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_ent ); - if( !ent || !ent->is_player( ) ) - continue; - - clr_t col = g_settings.visuals.grenade_esp_clr; - - vec3_t text_pos = it.m_pos; - text_pos.z += 5.f; - - auto w2s = util::screen_transform( text_pos ); - - float delta = g_csgo.m_globals->m_curtime - it.m_time; - - if( g_ctx.m_local->is_valid( ) && ( ent->m_iTeamNum( ) != g_ctx.m_local->m_iTeamNum( ) || ent == g_ctx.m_local ) ) { - vec3_t last_pos; - - const float fill = ( life_span->get_float( ) - delta ) / ( life_span->get_float( ) ) * 180.f; - - for( float rot = -fill; rot <= fill; rot += 3.f ) { - auto rotation = rot + delta * 90.f; - - while( rotation > 360.f ) - rotation -= 360.f; - - vec3_t rotated_pos = it.m_pos; - - rotated_pos.z -= 5.f; - - const auto radius = 50.f; - rotated_pos.x += cos( DEG2RAD( rotation ) ) * radius; - rotated_pos.y += sin( DEG2RAD( rotation ) ) * radius; - - if( rot != -fill ) { - auto w2s_new = util::screen_transform( rotated_pos ); - auto w2s_old = util::screen_transform( last_pos ); - auto alpha = 1.f - ( std::abs( rot ) / fill ); - - float threshold = life_span->get_float( ) * 0.2f; - - if( life_span->get_float( ) - delta < threshold ) { - float diff = ( life_span->get_float( ) - delta ) / ( life_span->get_float( ) ) * 5.f; - - alpha *= diff; - } - - clr_t col = g_settings.visuals.grenade_esp_clr; - - col.a( ) *= alpha; - - draw_line( w2s_old, w2s_new, col ); - } - - last_pos = rotated_pos; - } - } - - draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, col, xors( "molotov" ) ); - if( g_settings.visuals.grenade_owner ) - draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, col, ent->get_info( ).name ); - } - } - } - - void c_visuals::world_modulate( ) { - static std::unordered_map< MaterialHandle_t, fclr_t > world_materials; - static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2; - static c_base_player* local_player = nullptr; - static auto night_mode = false; - static bool modulated = false; - static bool alpha = false; - - if( !g_settings.visuals.world_modulate || !g_csgo.m_engine( )->IsInGame( ) || g_settings.misc.hide_from_obs ) { - modulated = false; - if( !world_materials2.empty( ) ) { - for( auto& it : world_materials2 ) { - auto mat = g_csgo.m_mat_system( )->GetMaterial( it.first ); - if( !mat ) continue; - - auto original_col = it.second; - mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) ); - mat->AlphaModulate( original_col.a( ) ); - } - - world_materials.clear( ); - world_materials2.clear( ); - } - - return; - } - - if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) { - fix_static_props( ); - - if( local_player == g_ctx.m_local && - night_mode == g_settings.visuals.night_mode( ) && - alpha == g_settings.visuals.transparent_props( ) && - modulated == g_settings.visuals.world_modulate( ) ) - return; - - - for( auto i = g_csgo.m_mat_system( )->FirstMaterial( ); - i != g_csgo.m_mat_system( )->InvalidMaterial( ); - i = g_csgo.m_mat_system( )->NextMaterial( i ) ) { - - auto mat = g_csgo.m_mat_system( )->GetMaterial( i ); - if( !mat ) continue; - - const char* group = mat->GetTextureGroupName( ); - bool is_world = strstr( group, xors( "World" ) ); - bool is_sky = strstr( group, xors( "Sky" ) ); - bool is_prop = strstr( group, xors( "StaticProp" ) ); - - if( is_world || is_sky || is_prop ) { - const char* name = mat->GetName( ); - if( world_materials.find( i ) == world_materials.end( ) ) { - fclr_t clr; - - mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) ); - clr.a( ) = mat->GetAlphaModulation( ); - - world_materials.emplace( i, clr ); - world_materials2.emplace( i, clr ); - } - - fclr_t new_color; - - new_color = world_materials2.find( i )->second; - bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate; - - if( is_world ) { - if( apply ) { - new_color.r( ) *= 0.15f; - new_color.g( ) *= 0.15f; - new_color.b( ) *= 0.15f; - } - } - else if( is_prop ) { - if( apply ) { - new_color.r( ) *= 0.3f; - new_color.g( ) *= 0.3f; - new_color.b( ) *= 0.3f; - } - if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) { - new_color.a( ) *= 0.6f; - } - } - else if( is_sky ) { - if( apply ) { - new_color = fclr_t( 0.f, 0.f, 0.f ); - } - } - - if( !( world_materials.at( i ) == new_color ) ) { - mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) ); - mat->AlphaModulate( new_color.a( ) ); - - world_materials.at( i ) = new_color; - } - } - } - - modulated = g_settings.visuals.world_modulate; - night_mode = g_settings.visuals.night_mode; - alpha = g_settings.visuals.transparent_props; - local_player = g_ctx.m_local; - } - } -} \ No newline at end of file diff --git a/internal_rewrite/vmt.hpp b/internal_rewrite/vmt.hpp deleted file mode 100644 index 03409ce..0000000 --- a/internal_rewrite/vmt.hpp +++ /dev/null @@ -1,95 +0,0 @@ -#pragma once -#include -#include "util.hpp" - -// todo - dex; rewrite this, VirtualQuery (except for custom codeptr / readptr) and VirtualProtect shouldnt be used -// and we need to copy rtti over too or stuff will break later on - -// correct me if im wrong, but the vtable isnt replaced, instead the original is edited during hooking, rtti should be intact and accessable by game -// class could definetly do with a rewrite tho! - -// ^ you're corrct, but changing page rights and replacing ptrs direclty in rdata (or usually the heap, since thats where vmts go) is not a safe solution -// copying table + aligning it to compensate for rtti is safer -// vac loves scanning memory regions but it doesnt really do much outside of game servers (only loads some shit for checking DEP and stuff) - -// trash - -//llama is a fucking nigger -//true - -namespace hooks -{ - //we in 2017 still - - class c_vmt { - uintptr_t* m_table; - uintptr_t* m_original; - bool m_copied; - std::vector< uintptr_t > m_new; - public: - int count( ) { - int vfunc_count{ }; - - while ( m_original[ vfunc_count ] ) { - vfunc_count++; - }; - - return vfunc_count; - } - - c_vmt( void* table ) { - if ( !table ) { - return; - } - - this->m_table = reinterpret_cast< uintptr_t* >( table ); - this->m_original = *reinterpret_cast< uintptr_t** >( this->m_table ); - - for ( int i = -1; i < this->count( ); ++i ) { - this->m_new.push_back( this->m_original[ i ] ); - } - - m_copied = false; - } - - ~c_vmt( ) { } - - template< typename T = uintptr_t > T get_function( int index ) { - return( ( T )( this->m_new.at( index + 1 ) ) ); - } - - template< typename T = uintptr_t > T get_old_function( int index ) { - return( ( T )( this->m_original[ index ] ) ); - } - - void hook( int index, uintptr_t new_func ) { - if( !m_copied ) { - auto data = this->m_new.data( ); - *this->m_table = uintptr_t( &data[ 1 ] ); - - m_copied = true; - } - - this->m_new.at( index + 1 ) = new_func; - } - - void unhook( int index ) { - this->m_new.at( index + 1 ) = this->m_original[ index ]; - } - - void hook( int index, void* new_func ) { - if( !m_copied ) { - auto data = this->m_new.data( ); - *this->m_table = uintptr_t( &data[ 1 ] ); - - m_copied = true; - } - - hook( index, reinterpret_cast< uintptr_t >( new_func ) ); - } - - void restore( ) const { - *this->m_table = uintptr_t( m_original ); - } - }; -} \ No newline at end of file diff --git a/internal_rewrite/window_procedure.cpp b/internal_rewrite/window_procedure.cpp deleted file mode 100644 index ffe9ccb..0000000 --- a/internal_rewrite/window_procedure.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "hooks.hpp" -#include "input_system.hpp" -#include "settings.hpp" - -decltype( &hooks::window_procedure ) hooks::window_procedure_o; -long __stdcall hooks::window_procedure( HWND hwnd, uint32_t msg, uint32_t wparam, long lparam ) { - if ( g_csgo.m_panic ) { - return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); - } - - if ( msg == WM_ACTIVATE && wparam == WA_INACTIVE ) { - g_input.clear_keys( ); - } - - if ( msg == WM_MOUSEMOVE ) { - g_input.capture_mouse_move( lparam ); - g_con->get_input( )->capture_mouse_move( lparam ); - } - - static auto con_pressed = false; - if( g_con->get_input( )->is_key_pressed( KEYS_HOME ) ) { - if( !con_pressed ) { - if( !g_con->m_open ) { - g_con->m_consuming_input = true; - } - - g_con->m_open ^= 1; - } - - con_pressed = true; - } - else con_pressed = false; - - if( g_con->get_input( )->register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) ) { - if( g_con->m_open ) return false; - } - - if( !g_con->m_open ) { - static bool was_pressed = false; - if( g_input.is_key_pressed( KEYS_INSERT ) ) { - if( !was_pressed ) { - g_settings.menu.open ^= 1; - - was_pressed = true; - } - } - else { - was_pressed = false; - } - - if( g_input.register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) - && g_settings.menu.open ) { - return false; - } - } - - return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); -} \ No newline at end of file diff --git a/internal_rewrite/wipe.hpp b/internal_rewrite/wipe.hpp deleted file mode 100644 index dfb72a8..0000000 --- a/internal_rewrite/wipe.hpp +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once - -#include "util.hpp" -#include - -#ifdef HEADER_MODULE - #define EXPAND( x,y )x##y - - #define BEGIN___( MARKER_BEGIN )MARKER_BEGIN: - - #define DEL_END___( MARKER_BEGIN, MARKER_END )__asm { __asm PUSH MARKER_END __asm PUSH MARKER_BEGIN __asm CALL antidebug::erase } \ - MARKER_END: - - #define BEGIN__( x, y ) BEGIN___( EXPAND2( MARKER_BEGIN_, x, y ) ) - #define END__( x, y ) DEL_END___( EXPAND2( MARKER_BEGIN_, x, y ), EXPAND2( MARKER_END_, x, y ) ) - - #define DELETE_START( x ) BEGIN___( EXPAND( MARKER_BEGIN_, x ) ) - #define DELETE_END( x ) DEL_END___( EXPAND( MARKER_BEGIN_, x ), EXPAND( MARKER_END_, x ) ) -#else - #define DELETE_START( x ) - #define DELETE_END( x ) -#endif - -namespace antidebug -{ - static void __stdcall erase( uintptr_t start, uintptr_t end ) { - uintptr_t size = end - start; - - DWORD protection_flag{ }; - VirtualProtect( ( void* )start, size, PAGE_EXECUTE_READWRITE, &protection_flag ); - - for( unsigned int i = 0; i < size; i++ ) { - int random = rand( ) % 0x90; - memset( ( void* )( start + i ), random, 1 ); - } - - VirtualProtect( ( void* )start, size, protection_flag, &protection_flag ); - } - - static void fuck_skids( ) { - DELETE_START( 0 ); - // stop most debuggers from working as breakpoint is patched to exit process call - - ulong_t old_protection = 0; - - uintptr_t exit_process = ( uintptr_t )GetProcAddress( GetModuleHandleA( xors( "kernel32.dll" ) ), xors( "ExitProcess" ) ); - uintptr_t dbg_ui_remote_breakin = ( uintptr_t )GetProcAddress( GetModuleHandleA( xors( "ntdll.dll" ) ), xors( "DbgUiRemoteBreakin" ) ); - uintptr_t dbg_break_point = ( uintptr_t )GetProcAddress( GetModuleHandleA( xors( "ntdll.dll" ) ), xors( "DbgBreakPoint" ) ); - - // fuck DbgUiRemoteBreakin - VirtualProtect( ( void* )dbg_ui_remote_breakin, 6, PAGE_EXECUTE_READWRITE, &old_protection ); - - *( uint8_t* )( dbg_ui_remote_breakin ) = 0x68; // push - *( uintptr_t* )( dbg_ui_remote_breakin + 1 ) = exit_process; - *( uint8_t* )( dbg_ui_remote_breakin + 5 ) = 0xC3; // ret - - VirtualProtect( ( void* )dbg_ui_remote_breakin, 6, old_protection, &old_protection ); - - // fuck DbgBreakPoint - VirtualProtect( ( void* )dbg_break_point, 6, PAGE_EXECUTE_READWRITE, &old_protection ); - - *( uint8_t* )( dbg_break_point ) = 0x68; // push - *( uintptr_t* )( dbg_break_point + 1 ) = exit_process; - *( uint8_t* )( dbg_break_point + 5 ) = 0xC3; // ret - - VirtualProtect( ( void* )dbg_break_point, 6, old_protection, &old_protection ); - - DELETE_END( 0 ); - } -} \ No newline at end of file diff --git a/internal_rewrite/x86.hpp b/internal_rewrite/x86.hpp deleted file mode 100644 index e737013..0000000 --- a/internal_rewrite/x86.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include - -namespace x86 -{ - enum class reg : size_t { - eax = 0, - ecx, - edx, - ebx, - esp, - ebp, - esi, - edi, - - /* - x64: - r8, - r9, - r10, - r11, - r12, - r13, - r14, - r15,*/ - }; - - enum instruction : uint8_t { - retn_imm16 = 0xc2, - retn = 0xc3, - fs = 0x64, - //its big nigga season - call = 0xff - }; - - __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { - return ( 0xb8 + ( size_t( dreg ) ) ); - } - - __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { - return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); - } - - __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { - return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); - } -}; \ No newline at end of file diff --git a/legacy/enc_file/enc_file.vcxproj b/legacy/enc_file/enc_file.vcxproj new file mode 100644 index 0000000..0df84b6 --- /dev/null +++ b/legacy/enc_file/enc_file.vcxproj @@ -0,0 +1,179 @@ + + + + + Debug + Win32 + + + pHit + Win32 + + + pHit + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8} + encfile + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + + + + \ No newline at end of file diff --git a/legacy/enc_file/enc_file.vcxproj.filters b/legacy/enc_file/enc_file.vcxproj.filters new file mode 100644 index 0000000..9fa84c5 --- /dev/null +++ b/legacy/enc_file/enc_file.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/legacy/enc_file/source.cpp b/legacy/enc_file/source.cpp new file mode 100644 index 0000000..9056764 --- /dev/null +++ b/legacy/enc_file/source.cpp @@ -0,0 +1,40 @@ +#include +#include + +int main( ) { + uint8_t key{ }; + std::cin >> key; + printf( "key: %d", key ); + + auto file = CreateFileA( "./enc.dll", GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0 ); + if( !file ) return 0; + + auto size = GetFileSize( file, 0 ); + if( !size ) { + CloseHandle( file ); + return 0; + } + + uint8_t* data = ( uint8_t* )( malloc( size ) ); + if( !ReadFile( file, data, size, 0, 0 ) ) { + CloseHandle( file ); + free( data ); + return 0; + } + + CloseHandle( file ); + + for( size_t i{ }; i < size; ++i ) { + data[ i ] ^= key; + } + + data[ 0 ] = 'c'; + data[ 1 ] = 'd'; + + FILE* f; + fopen_s( &f, "./out.dll", "wb" ); + fwrite( data, 1, size, f ); + fclose( f ); + + return 0; +} \ No newline at end of file diff --git a/legacy/injector/injector.vcxproj b/legacy/injector/injector.vcxproj new file mode 100644 index 0000000..b376272 --- /dev/null +++ b/legacy/injector/injector.vcxproj @@ -0,0 +1,184 @@ + + + + + Debug + Win32 + + + pHit + Win32 + + + pHit + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64} + injector + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacy/injector/injector.vcxproj.filters b/legacy/injector/injector.vcxproj.filters new file mode 100644 index 0000000..d81baf0 --- /dev/null +++ b/legacy/injector/injector.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + \ No newline at end of file diff --git a/legacy/injector/main.cpp b/legacy/injector/main.cpp new file mode 100644 index 0000000..f3d3511 --- /dev/null +++ b/legacy/injector/main.cpp @@ -0,0 +1,121 @@ +#include +#include "winapi.h" + +const wchar_t* const kernel32_str = L"KERNEL32.DLL"; +const wchar_t* const ucrtbase_str = L"ucrtbase.dll"; +const char* const loadlib_str = "LoadLibraryA"; +const char* const printf_str = "printf"; + +const char* const printf_fmt = "print: %08x\n\0"; +const char* const fail_msg = "k32 null\n"; +const char* const pause_str = "pause"; +const char* const system_str = "system"; + +uintptr_t printf_addr = ( uintptr_t )&printf; +uintptr_t system_addr = 0; + +//i dont even +//unfinished btw + +__declspec( naked ) int print_var( uint32_t var ) { + __asm { + push ebp + mov ebp, esp + sub esp, __LOCAL_SIZE + + mov eax, var + push eax + push printf_fmt + call printf_addr + + add esp, 8 + mov esp, ebp + pop ebp + + mov eax, 0 + ret + } +} + +__declspec( naked ) void print_error( const char* err ) { + __asm { + push ebp + mov ebp, esp + sub esp, __LOCAL_SIZE + + mov eax, err + push eax + call printf_addr + + add esp, 8 + mov esp, ebp + pop ebp + } +} + +__declspec( naked ) int main( void ) { + void* k32; + void* ucrtbase; + uintptr_t loadlib; + + __asm { + push ebp + mov ebp, esp + sub esp, __LOCAL_SIZE + + mov eax, ds:ucrtbase_str + push eax + call winapi::k32::get_module_handle + add esp, 4 + mov ucrtbase, eax + + mov eax, ds:system_str + push eax + mov ecx, ucrtbase + push ecx + call winapi::k32::get_proc_address + add esp, 4 + mov system_addr, eax + + mov eax, ds:kernel32_str + push eax + call winapi::k32::get_module_handle + add esp, 4 + mov k32, eax + + mov eax, k32 + push eax + call print_var + + cmp k32, 0 + je K32_FAIL + + mov eax, ds:loadlib_str + push eax + mov ecx, k32 + push ecx + call winapi::k32::get_proc_address + + add esp, 8 + mov loadlib, eax + + mov eax, loadlib + push eax + call print_var + + jmp END + + K32_FAIL: + mov eax, fail_msg + push eax + call printf_addr + + END: + mov eax, pause_str + push eax + call system_addr + mov esp, ebp + pop ebp + ret + } +} \ No newline at end of file diff --git a/legacy/injector/pe.h b/legacy/injector/pe.h new file mode 100644 index 0000000..f67e46d --- /dev/null +++ b/legacy/injector/pe.h @@ -0,0 +1,309 @@ +#pragma once +#include + +namespace nt { + using WORD = short; + using BYTE = unsigned char; + using DWORD = unsigned long; + + typedef struct _IMAGE_DATA_DIRECTORY { + DWORD VirtualAddress; + DWORD Size; + } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; + + typedef struct _IMAGE_OPTIONAL_HEADER { + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + DWORD BaseOfData; + DWORD ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + DWORD SizeOfStackReserve; + DWORD SizeOfStackCommit; + DWORD SizeOfHeapReserve; + DWORD SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[ 16 ]; + } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; + + typedef struct _IMAGE_FILE_HEADER { + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbols; + WORD SizeOfOptionalHeader; + WORD Characteristics; + } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; + + typedef struct _IMAGE_NT_HEADERS { + DWORD Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER OptionalHeader; + } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; + + typedef struct _IMAGE_EXPORT_DIRECTORY { + uint32_t Characteristics; + uint32_t TimeDateStamp; + uint16_t MajorVersion; + uint16_t MinorVersion; + uint32_t Name; + uint32_t Base; + uint32_t NumberOfFunctions; + uint32_t NumberOfNames; + uint32_t AddressOfFunctions; // RVA from base of image + uint32_t AddressOfNames; // RVA from base of image + uint32_t AddressOfNameOrdinals; // RVA from base of image + } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; + + typedef struct _IMAGE_DOS_HEADER { + WORD e_magic; + WORD e_cblp; + WORD e_cp; + WORD e_crlc; + WORD e_cparhdr; + WORD e_minalloc; + WORD e_maxalloc; + WORD e_ss; + WORD e_sp; + WORD e_csum; + WORD e_ip; + WORD e_cs; + WORD e_lfarlc; + WORD e_ovno; + WORD e_res[ 4 ]; + WORD e_oemid; + WORD e_oeminfo; + WORD e_res2[ 10 ]; + long e_lfanew; + } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; + + typedef struct _LIST_ENTRY { + struct _LIST_ENTRY *Flink; + struct _LIST_ENTRY *Blink; + } LIST_ENTRY, *PLIST_ENTRY; + + struct PEB_LDR_DATA { + uint32_t Length; + uint8_t Initialized; + uintptr_t SsHandle; + LIST_ENTRY InLoadOrderModuleList; + LIST_ENTRY InMemoryOrderModuleList; + LIST_ENTRY InInitializationOrderModuleList; + uintptr_t EntryInProgress; + uint8_t ShutdownInProgress; + uintptr_t ShutdownThreadId; + }; + + struct UNICODE_STRING { + uint16_t Length; + uint16_t MaximumLength; + wchar_t *Buffer; + }; + + struct STRING { + uint16_t Length; + uint16_t MaximumLength; + char *Buffer; + }; + + struct CURDIR { + UNICODE_STRING DosPath; + uintptr_t Handle; + }; + + struct RTL_DRIVE_LETTER_CURDIR { + uint16_t Flags; + uint16_t Length; + uint32_t TimeStamp; + STRING DosPath; + }; + + struct RTL_USER_PROCESS_PARAMETERS { + uint32_t MaximumLength; + uint32_t Length; + uint32_t Flags; + uint32_t DebugFlags; + uintptr_t ConsoleHandle; + uint32_t ConsoleFlags; + uintptr_t StandardInput; + uintptr_t StandardOutput; + uintptr_t StandardError; + CURDIR CurrentDirectory; + UNICODE_STRING DllPath; + UNICODE_STRING ImagePathName; + UNICODE_STRING CommandLine; + uintptr_t Environment; + uint32_t StartingX; + uint32_t StartingY; + uint32_t CountX; + uint32_t CountY; + uint32_t CountCharsX; + uint32_t CountCharsY; + uint32_t FillAttribute; + uint32_t WindowFlags; + uint32_t ShowWindowFlags; + UNICODE_STRING WindowTitle; + UNICODE_STRING DesktopInfo; + UNICODE_STRING ShellInfo; + UNICODE_STRING RuntimeData; + RTL_DRIVE_LETTER_CURDIR CurrentDirectores[ 32 ]; + uintptr_t EnvironmentSize; + uintptr_t EnvironmentVersion; + uintptr_t PackageDependencyData; + uint32_t ProcessGroupId; + uint32_t LoaderThreads; + }; + + struct RTL_BALANCED_NODE { + RTL_BALANCED_NODE *Children[ 2 ]; + RTL_BALANCED_NODE *Left; + RTL_BALANCED_NODE *Right; + uintptr_t ParentValue; + }; + + struct _PEB { + uint8_t InheritedAddressSpace; + uint8_t ReadImageFileExecOptions; + uint8_t BeingDebugged; + uint8_t BitField; + //uchar Padding0[ 4 ]; + uintptr_t Mutant; + uintptr_t ImageBaseAddress; + PEB_LDR_DATA *Ldr; + RTL_USER_PROCESS_PARAMETERS *ProcessParameters; + uintptr_t SubSystemData; + uintptr_t ProcessHeap; + uintptr_t *FastPebLock; + uintptr_t AtlThunkSListPtr; + uintptr_t IFEOKey; + uint32_t CrossProcessFlags; + uint8_t Padding1[ 4 ]; + uintptr_t KernelCallbackTable; + uintptr_t UserSharedInfoPtr; + uint32_t SystemReserved[ 1 ]; + uint32_t AtlThunkSListPtr32; + uintptr_t ApiSetMap; + uint32_t TlsExpansionCounter; + uint8_t Padding2[ 4 ]; + uintptr_t TlsBitmap; + uint32_t TlsBitmapBits[ 2 ]; + uintptr_t ReadOnlySharedMemoryBase; + uintptr_t SparePvoid0; + uintptr_t ReadOnlyStaticServerData; + uintptr_t AnsiCodePageData; + uintptr_t OemCodePageData; + uintptr_t UnicodeCaseTableData; + uint32_t NumberOfProcessors; + uint32_t NtGlobalFlag; + uint64_t CriticalSectionTimeout; + uintptr_t HeapSegmentReserve; + uintptr_t HeapSegmentCommit; + uintptr_t HeapDeCommitTotalFreeThreshold; + uintptr_t HeapDeCommitFreeBlockThreshold; + uint32_t NumberOfHeaps; + uint32_t MaximumNumberOfHeaps; + uintptr_t ProcessHeaps; + uintptr_t GdiSharedHandleTable; + uintptr_t ProcessStarterHelper; + uint32_t GdiDCAttributeList; + uint8_t Padding3[ 4 ]; + uintptr_t *LoaderLock; + uint32_t OSMajorVersion; + uint32_t OSMinorVersion; + uint16_t OSBuildNumber; + uint16_t OSCSDVersion; + uint32_t OSPlatformId; + uint32_t ImageSubsystem; + uint32_t ImageSubsystemMajorVersion; + uint32_t ImageSubsystemMinorVersion; + uint8_t Padding4[ 4 ]; + uintptr_t ActiveProcessAffinityMask; +#ifdef _WIN32 + uint32_t GdiHandleBuffer[ 34 ]; +#else + uint32_t GdiHandleBuffer[ 60 ]; +#endif + uintptr_t PostProcessInitRoutine; + uintptr_t TlsExpansionBitmap; + uint32_t TlsExpansionBitmapBits[ 32 ]; + uint32_t SessionId; + uint8_t Padding5[ 4 ]; + uint64_t AppCompatFlags; + uint64_t AppCompatFlagsUser; + uintptr_t pShimData; + uintptr_t AppCompatInfo; + UNICODE_STRING CSDVersion; + uintptr_t ActivationContextData; + uintptr_t ProcessAssemblyStorageMap; + uintptr_t SystemDefaultActivationContextData; + uintptr_t SystemAssemblyStorageMap; + uintptr_t MinimumStackCommit; + uintptr_t FlsCallback; + LIST_ENTRY FlsListHead; + uintptr_t FlsBitmap; + uint32_t FlsBitmapBits[ 4 ]; + uint32_t FlsHighIndex; + uintptr_t WerRegistrationData; + uintptr_t WerShipAssertPtr; + uintptr_t pUnused; + uintptr_t pImageHeaderHash; + uint32_t TracingFlags; + uint8_t Padding6[ 4 ]; + uint64_t CsrServerReadOnlySharedMemoryBase; + uintptr_t TppWorkerpListLock; + LIST_ENTRY TppWorkerpList; + uintptr_t WaitOnAddressHashTable[ 128 ]; + }; + + struct LDR_DATA_TABLE_ENTRY { + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + uintptr_t DllBase; + uintptr_t EntryPoint; + uint32_t SizeOfImage; + UNICODE_STRING FullDllName; + UNICODE_STRING BaseDllName; + uint8_t FlagGroup[ 4 ]; + uint32_t Flags; + uint16_t ObsoleteLoadCount; + uint16_t TlsIndex; + LIST_ENTRY HashLinks; + uint32_t TimeDateStamp; + uintptr_t EntryPointActivationContext; + uintptr_t Lock; + uintptr_t DdagNode; + LIST_ENTRY NodeModuleLink; + uintptr_t LoadContext; + uintptr_t ParentDllBase; + uintptr_t SwitchBackContext; + RTL_BALANCED_NODE BaseAddressIndexNode; + RTL_BALANCED_NODE MappingInfoIndexNode; + uintptr_t OriginalBase; + int64_t LoadTime; + uint32_t BaseNameHashValue; + uint32_t LoadReason; + uint32_t ImplicitPathOptions; + uint32_t ReferenceCount; + }; +}; \ No newline at end of file diff --git a/legacy/injector/util.h b/legacy/injector/util.h new file mode 100644 index 0000000..61b18dc --- /dev/null +++ b/legacy/injector/util.h @@ -0,0 +1,44 @@ +#pragma once +#include + +namespace util +{ + __forceinline void memcpy( void* dst, void* src, size_t size ) { + uint8_t* data = ( uint8_t* )src; + uint8_t* dest = ( uint8_t* )dst; + + for( size_t i{ }; i < size; ++i ) { + dest[ i ] = data[ i ]; + } + } + + __forceinline size_t strlen( const char* str ) { + size_t len; + for( len = 0; !!str[ len ]; ++len ); + + return len; + } + + __forceinline bool strcmp( const char* str, const char* comp ) { + for( size_t i{ }; i < strlen( comp ); ++i ) { + if( str[ i ] != comp[ i ] ) return false; + } + + return true; + } + + __forceinline size_t wstrlen( const wchar_t* str ) { + size_t len; + for( len = 0; !!str[ len ]; ++len ); + + return len; + } + + __forceinline bool wstrcmp( const wchar_t* str, const wchar_t* comp ) { + for( size_t i{ }; i < wstrlen( comp ); ++i ) { + if( str[ i ] != comp[ i ] ) return false; + } + + return true; + } +} \ No newline at end of file diff --git a/legacy/injector/winapi.h b/legacy/injector/winapi.h new file mode 100644 index 0000000..6fceeb7 --- /dev/null +++ b/legacy/injector/winapi.h @@ -0,0 +1,81 @@ +#pragma once +#include + +#include "pe.h" +#include "util.h" + +namespace winapi +{ + auto get_peb( ) { + return ( nt::_PEB* )( __readfsdword( 0x30 ) ); + } + + namespace k32 { + __declspec( noinline ) static void* get_module_handle( const wchar_t* module_ ) { + auto peb = get_peb( ); + auto ldr = peb->Ldr; + + auto root = &ldr->InMemoryOrderModuleList; + + for( auto mod = root->Flink; mod != root; mod = mod->Flink ) { + nt::LDR_DATA_TABLE_ENTRY* data_table; + void* module_base; + wchar_t* module_name; + + data_table = reinterpret_cast< decltype( data_table ) >( mod ); + module_base = reinterpret_cast< void* >( ( ( void** )( uintptr_t( data_table ) + 0x10 ) )[ 0 ] ); + + module_name = ( wchar_t* )_alloca( ( data_table->FullDllName.Length + 1 ) * 2 ); + util::memcpy( module_name, data_table->FullDllName.Buffer, data_table->FullDllName.Length * 2 ); + module_name[ data_table->FullDllName.Length ] = L'0'; + + if( util::wstrcmp( module_name, module_ ) ) { + return module_base; + } + } + + return false; + } + + __declspec( noinline ) uintptr_t get_proc_address( void* module_, const char* proc_name ) { + nt::IMAGE_DOS_HEADER* dos_header; + nt::IMAGE_NT_HEADERS* nt_headers; + uintptr_t export_address; + nt::IMAGE_EXPORT_DIRECTORY* export_dir; + const char* export_name; + uintptr_t* names; + uintptr_t* funcs; + uint16_t* ords; + uint32_t export_hash; + + dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); + nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); + + //find addresses of functions from nt headers + export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; + export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); + + if( !export_dir->NumberOfFunctions ) + return uintptr_t{ }; + + names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); + funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); + + ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); + + if( names && funcs && ords ) { + //iterate the exports + for( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { + export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); + if( util::strcmp( export_name, proc_name ) ) { + return uintptr_t( module_ ) + funcs[ ords[ i ] ]; + } + } + } + + while( 1 ) { } + + return uintptr_t{ }; + } + } +} \ No newline at end of file diff --git a/legacy/legacy.sln b/legacy/legacy.sln new file mode 100644 index 0000000..60d7aa5 --- /dev/null +++ b/legacy/legacy.sln @@ -0,0 +1,65 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.106 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_file", "enc_file\enc_file.vcxproj", "{9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "injector", "injector\injector.vcxproj", "{0CD36550-BDEB-4967-9AC1-9AB1AE778C64}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader", "loader\loader.vcxproj", "{C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + pHit|x64 = pHit|x64 + pHit|x86 = pHit|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x64.ActiveCfg = Debug|x64 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x64.Build.0 = Debug|x64 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x86.ActiveCfg = Debug|Win32 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x86.Build.0 = Debug|Win32 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x64.ActiveCfg = pHit|x64 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x64.Build.0 = pHit|x64 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x86.ActiveCfg = pHit|Win32 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x86.Build.0 = pHit|Win32 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x64.ActiveCfg = Release|x64 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x64.Build.0 = Release|x64 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x86.ActiveCfg = Release|Win32 + {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x86.Build.0 = Release|Win32 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x64.ActiveCfg = Debug|x64 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x64.Build.0 = Debug|x64 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x86.ActiveCfg = Debug|Win32 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x86.Build.0 = Debug|Win32 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x64.ActiveCfg = pHit|x64 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x64.Build.0 = pHit|x64 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x86.ActiveCfg = pHit|Win32 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x86.Build.0 = pHit|Win32 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x64.ActiveCfg = Release|x64 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x64.Build.0 = Release|x64 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x86.ActiveCfg = Release|Win32 + {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x86.Build.0 = Release|Win32 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x64.ActiveCfg = Debug|x64 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x64.Build.0 = Debug|x64 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x86.ActiveCfg = Debug|Win32 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x86.Build.0 = Debug|Win32 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x64.ActiveCfg = pHit|x64 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x64.Build.0 = pHit|x64 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x86.ActiveCfg = pHit|Win32 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x86.Build.0 = pHit|Win32 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x64.ActiveCfg = Release|x64 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x64.Build.0 = Release|x64 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x86.ActiveCfg = Release|Win32 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {85DF5E86-C3F3-431C-BFC6-95E3F13530E5} + EndGlobalSection +EndGlobal diff --git a/legacy/loader/Source.cpp b/legacy/loader/Source.cpp new file mode 100644 index 0000000..8d72c2b --- /dev/null +++ b/legacy/loader/Source.cpp @@ -0,0 +1,190 @@ +#include +#include +#include "d3d_sprite.hpp" +#include "window.hpp" +#include "ui.h" + +#include "http.h" + +#include "manualmap.hpp" +#include "iface.hpp" + +bool g_in_inject = false; + +void on_frame( ) { + if( g_d3d.run_frame( g_window.m_d3d_device ) ) { + g_d3d.begin( ); + for( auto& it : d3d::sprites ) { + it->begin( g_window.m_d3d_device ); + } + + static auto last_time = GetTickCount( ) * 0.001f; + auto cur_time = GetTickCount( ) * 0.001f; + + auto deltatime = cur_time - last_time; + + last_time = cur_time; + + constexpr float anim_step = 1.0f / 15.f; + static float anim_time = 0.f; + static bool flip = false; + if( anim_time == 1.0f ) { + flip = true; + } + if( anim_time == 0.f ) { + flip = false; + } + + if( flip ) anim_time = std::clamp( anim_time - anim_step * deltatime, 0.f, 1.0f ); + else anim_time = std::clamp( anim_time + anim_step * deltatime, 0.f, 1.0f ); + + ui::set_animtime( anim_time ); + ui::render( ); + + RECT cur_rect{ }; + GetWindowRect( g_window.get_hwnd( ), &cur_rect ); + + g_d3d.end( ); + for( auto& it : d3d::sprites ) { + it->end( ); + } + } +} + +void decrypt_file( std::vector< uint8_t >& file, uint8_t key ) { + for( size_t i{ }; i < file.size( ); ++i ) { + file.data( )[ i ] ^= key; + } +} + +int find_process( std::string name ) { + auto window = FindWindowA( 0, name.c_str( ) ); + if( !window ) return -1; + + ulong_t pid{ }; + GetWindowThreadProcessId( window, &pid ); + + return pid; +} + +void thread_fn( ) { + if( g_in_inject ) return; + + g_in_inject = true; + ulong_t hwid{ }; + GetVolumeInformationA( xors( "C:\\" ), 0, 0, &hwid, 0, 0, 0, 0 ); + + g_progress = 0.1f; + + std::string game{ }; + switch( g_game ) { + case 1: + game = xors( "Counter-Strike: Global Offensive" ); + break; + case 2: + game = xors( "Team Fortress 2" ); + break; + case 3: + game = xors( "Counter-Strike: Global Offensive" ); + break; + case 4: + game = xors( "Garry's Mod" ); + break; + default: + MessageBoxA( 0, xors( "unknown error" ), xors( "error" ), MB_OK ); + exit( 0 ); + break; + } + + auto pid = find_process( game ); + if( pid == -1 ) { + MessageBoxA( 0, xors( "game must be running" ), xors( "error" ), MB_OK ); + g_progress = 0.f; + g_in_inject = false; + return; + } + + auto h = OpenProcess( PROCESS_ALL_ACCESS, 0, pid ); + iface::manager mgr( h ); + + mgr.dump_all_modules( pid ); + if( !mgr.count( ) ) { + MessageBoxA( 0, xors( "unknown error" ), xors( "error" ), MB_OK ); + exit( 0 ); + } + + g_progress = 0.3f; + + //enter a new scope to run cleanup after we're done, epic life hack + { + auto result = http::send_request( g_login, hwid, g_game ); + + if( result.empty( ) ) { + MessageBoxA( 0, xors( "unknown error" ), xors( "error" ), MB_OK ); + exit( 0 ); + return; + } + + if( result[ 0 ] == '1' ) { + char str[ 256 ]; + strenc::w_sprintf_s( str, 256, xors( "hwid mismatch, request change: %08x" ), hwid ); + MessageBoxA( 0, str, xors( "error" ), MB_OK ); + exit( 0 ); + } + if( result[ 0 ] == '2' ) { + MessageBoxA( 0, xors( "user unknown" ), xors( "error" ), MB_OK ); + exit( 0 ); + } + if( result[ 0 ] == '3' ) { + MessageBoxA( 0, xors( "coming soon" ), xors( "error" ), MB_OK ); + g_progress = 0.f; + g_in_inject = false; + return; + } + + g_progress = 0.5f; + + //to meme whoever decides to reverse this + decrypt_file( result, [ ]( ) { + constexpr auto key_sqr = 49 * 49; + return 49; + }( ) ); + + inject::c_map map( result ); + g_progress = 0.7f; + + map.initialize( pid ); + std::this_thread::sleep_for( std::chrono::milliseconds( 300 ) ); + g_progress = 0.8f; + map.inject( mgr.write_to_process( ) ); + g_progress = 1.0f; + } + + MessageBoxA( 0, xors( "injection successful" ), xors( "success" ), MB_OK ); + exit( 0 ); + g_in_inject = false; +} + +void execute_login( ) { + std::thread t( thread_fn ); + + t.detach( ); +} + +int __stdcall WinMain( HINSTANCE inst, HINSTANCE prev, char* str, int cmdshow ) { + std::thread window_thread( [ & ]( ) { + g_window.create( ); + std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); + g_window.add_on_frame( &on_frame ); + for( ;; ) { + g_window.on_frame( ); + + std::this_thread::sleep_for( std::chrono::milliseconds( 1 ) ); + exit( -1 ); + } + } ); + + window_thread.detach( ); + + while( 1 ) { if( GetAsyncKeyState( VK_END ) & 0x8000 ) break; Sleep( 1 ); } +} \ No newline at end of file diff --git a/legacy/loader/color.hpp b/legacy/loader/color.hpp new file mode 100644 index 0000000..f28d35c --- /dev/null +++ b/legacy/loader/color.hpp @@ -0,0 +1,287 @@ +#pragma once + +#include +#include + +//this is a fucking mess + +class fclr_t { + float R, G, B, A; +public: + fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } + + fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + float& r( ) { return R; } + float& g( ) { return G; } + float& b( ) { return B; } + float& a( ) { return A; } + + fclr_t& operator =( fclr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + fclr_t operator+( const fclr_t& v ) const { + return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + bool operator==( fclr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; + +class clr_t { + uint8_t R, G, B, A; +public: + clr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } + + clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } + + uint8_t& r( ) { return R; } + uint8_t& g( ) { return G; } + uint8_t& b( ) { return B; } + uint8_t& a( ) { return A; } + + clr_t& operator=( clr_t& c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + clr_t& operator=( clr_t c ) { + R = c.r( ); + G = c.g( ); + B = c.b( ); + A = c.a( ); + return *this; + } + + clr_t operator+( const clr_t& v ) const { + return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); + } + + clr_t operator*( float f ) { + return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); + } + + explicit operator bool( ) const noexcept { + return ( R > 0 || G > 0 || B > 0 || A > 0 ); + } + + float brightness( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if( R >= max ) + out.h = static_cast( G - B ) / delta; + else if( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if( out.h < 0.0f ) + out.h += 360.0f; + + return out.v; + } + + float saturation( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + + float min = static_cast( R < G ? R : G ); + min = static_cast( min < B ? min : B ); + + float max = static_cast( R > G ? R : G ); + max = static_cast( max > B ? max : B ); + + out.v = max; + float delta = max - min; + if( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if( max > 0.0f ) { + out.s = delta / max; + } + else { + out.s = 0.0f; + out.h = NAN; + return out.h; + } + if( R >= max ) + out.h = static_cast( G - B ) / delta; + else if( G >= max ) + out.h = 2.0f + static_cast( B - R ) / delta; + else + out.h = 4.0f + static_cast( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if( out.h < 0.0f ) + out.h += 360.0f; + + return out.s; + } + + static clr_t from_hsb( float hue, float saturation, float brightness ) { + float h = hue == 1.0f ? 0 : hue * 6.0f; + float f = h - ( int )h; + float p = brightness * ( 1.0f - saturation ); + float q = brightness * ( 1.0f - saturation * f ); + float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); + + if( h < 1 ) { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if( h < 2 ) { + return clr_t( + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ) + ); + } + else if( h < 3 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ), + ( unsigned char )( t * 255 ) + ); + } + else if( h < 4 ) { + return clr_t( + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else if( h < 5 ) { + return clr_t( + ( unsigned char )( t * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( brightness * 255 ) + ); + } + else { + return clr_t( + ( unsigned char )( brightness * 255 ), + ( unsigned char )( p * 255 ), + ( unsigned char )( q * 255 ) + ); + } + } + + static clr_t blend( clr_t first, clr_t second, float t ) { + return clr_t( + first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), + first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), + first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), + first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) + ); + } + + float hue( ) { + typedef struct { + float h, s, v; + } hsv; + hsv out; + float min, max, delta; + + min = static_cast< float >( R < G ? R : G ); + min = static_cast< float >( min < B ? min : B ); + + max = static_cast< float >( R > G ? R : G ); + max = static_cast< float >( max > B ? max : B ); + + out.v = max; + delta = max - min; + if( delta < 0.0010f ) { + out.s = 0.f; + out.h = 0.f; + return out.h; + } + if( max > 0.0f ) { + out.s = ( delta / max ); + } + else { + out.s = 0.0f; + out.h = ( float )NAN; + return out.h; + } + if( R >= max ) + out.h = static_cast< float >( G - B ) / delta; + else + if( G >= max ) + out.h = 2.0f + static_cast< float >( B - R ) / delta; + else + out.h = 4.0f + static_cast< float >( R - G ) / delta; + + out.h *= 60.0f; + out.h /= 360.f; + + if( out.h < 0.0f ) + out.h += 360.0f; + + return out.h; + } + + fclr_t to_fclr( ) { + return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; + } + + operator fclr_t( ) { + return this->to_fclr( ); + } + + bool operator==( clr_t& c ) const { + return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); + } +}; \ No newline at end of file diff --git a/legacy/loader/console.h b/legacy/loader/console.h new file mode 100644 index 0000000..1494d94 --- /dev/null +++ b/legacy/loader/console.h @@ -0,0 +1,69 @@ +#pragma once +#include + +#define STD_HANDLE GetStdHandle( STD_OUTPUT_HANDLE ) + +namespace con +{ + enum class concol : int { + black = 0, + dark_blue = 1, + dark_green = 2, + dark_aqua, dark_cyan = 3, + dark_red = 4, + dark_purple = 5, dark_pink = 5, dark_magenta = 5, + dark_yellow = 6, + dark_white = 7, + gray = 8, + blue = 9, + green = 10, + aqua = 11, cyan = 11, + red = 12, + purple = 13, pink = 13, magenta = 13, + yellow = 14, + white = 15 + }; + + inline void set_console_cursor( bool cursor ) { + CONSOLE_CURSOR_INFO cursor_info; + cursor_info.bVisible = cursor; + cursor_info.dwSize = 1; + SetConsoleCursorInfo( STD_HANDLE, &cursor_info ); + } + + inline void set_cursor_pos( int x, int y ) { + COORD cursor_pos = { static_cast< short >( x ), static_cast< short >( y ) }; + SetConsoleCursorPosition( STD_HANDLE, cursor_pos ); + } + + inline void set_console_color( concol text, concol bg ) { + SetConsoleTextAttribute( STD_HANDLE, ( ( int )text + ( ( int )bg * 16 ) ) ); + } + + inline void clear_console( ) { + CONSOLE_SCREEN_BUFFER_INFO buf_info; + HANDLE std_out; + DWORD count; + DWORD cell_count; + COORD null_coord{ }; + + std_out = STD_HANDLE; + if ( std_out == INVALID_HANDLE_VALUE ) return; + + if ( !GetConsoleScreenBufferInfo( std_out, &buf_info ) ) return; + cell_count = buf_info.dwSize.X * buf_info.dwSize.Y; + + if ( !FillConsoleOutputCharacter( std_out, ( TCHAR )' ', cell_count, null_coord, &count ) ) return; + if ( !FillConsoleOutputAttribute( std_out, buf_info.wAttributes, cell_count, null_coord, &count ) ) return; + + set_cursor_pos( 0, 0 ); + } + + inline void set_size( int w, int h ) { + auto con = GetConsoleWindow( ); + RECT r; + + GetWindowRect( con, &r ); + MoveWindow( con, r.left, r.top, w, h, 1 ); + } +} \ No newline at end of file diff --git a/legacy/loader/d3d.cpp b/legacy/loader/d3d.cpp new file mode 100644 index 0000000..89005ee --- /dev/null +++ b/legacy/loader/d3d.cpp @@ -0,0 +1,335 @@ +#include "d3d.hpp" +#include "math.hpp" +#include "d3d_sprite.hpp" + +d3d::c_renderer g_d3d; +d3d::d3d_fonts_t d3d::fonts; + + +//theres shit still left to add like drawrect etc but thats really simple +//this is the base and it works so thats ok +//love +// - nave + +// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) +// DrawPrimitiveUP for each object will slow stuff down eventually +// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else + +namespace d3d +{ + void d3d_fonts_t::release( ) { + if( f_12 ) f_12->Release( ); + if( f_14 ) f_14->Release( ); + if( f_16 ) f_16->Release( ); + if( f_18 ) f_18->Release( ); + if( f_menu ) f_menu->Release( ); + if( f_con ) f_con->Release( ); + } + + void d3d_fonts_t::create( IDirect3DDevice9* device ) { + auto create_font = [ & ]( ID3DXFont** font, const char* font_name, bool bold, int size, int weight ) { + //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); + + auto code = D3DXCreateFontA( device, size, 0, FW_NORMAL, weight, false, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); + + if( code < 0 ) throw xors( "fuck d3d" ); + }; + + create_font( &f_12, xors( "Verdana" ), false, 12, 0 ); //change this idc + create_font( &f_14, xors( "Verdana" ), false, 14, 0 ); + create_font( &f_16, xors( "Verdana" ), false, 16, 0 ); + create_font( &f_18, xors( "Verdana" ), false, 18, 0 ); + create_font( &f_menu, xors( "Tahoma" ), true, 12, 700 ); + create_font( &f_con, xors( "Courier New" ), false, 12, 400 ); + } + + + c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { + create_objects( ); + } + + bool c_renderer::run_frame( IDirect3DDevice9* device ) { + if( !m_device ) { + m_device = device; + create_objects( ); + return false; + } + + return true; + } + + c_renderer::~c_renderer( ) { + invalidate_objects( ); + } + + void c_renderer::on_device_lost( ) { + invalidate_objects( ); + } + + void c_renderer::on_device_reset( ) { + create_objects( ); + } + + void c_renderer::invalidate_objects( ) { + if( m_block ) m_block->Release( ); + fonts.release( ); + } + + void c_renderer::create_objects( ) { + D3DVIEWPORT9 viewport; + + if( !m_device ) return; + + if( m_device->GetViewport( &viewport ) < 0 ) { + return; + } + + if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { + return; + } + + if( !m_block ) { + return; + } + + // get display size. + m_width = viewport.Width; + m_height = viewport.Height; + + fonts.create( m_device ); + } + + void c_renderer::begin( ) { + if( !m_device ) return; + + D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; + + m_block->Capture( ); + + m_device->SetViewport( &vp ); + + // set vertex stream declaration. + m_device->SetVertexShader( nullptr ); + m_device->SetPixelShader( nullptr ); + m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); + + m_block->Capture( ); + + m_device->SetRenderState( D3DRS_LIGHTING, false ); + m_device->SetRenderState( D3DRS_FOGENABLE, false ); + m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); + + m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); + m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); + m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_STENCILENABLE, false ); + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); + + m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); + m_device->SetRenderState( D3DRS_ALPHATESTENABLE, true ); + m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); + + m_device->SetTexture( 0, nullptr ); + m_device->SetTexture( 1, nullptr ); + m_device->SetTexture( 2, nullptr ); + m_device->SetTexture( 3, nullptr ); + + m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); + m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); + m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); + + m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); + m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); + m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); + + m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); + m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); + + // todo - dex; if we use textures, need to set those rendering states too + } + + void c_renderer::end( ) { + //m_device->SetTexture( 0, nullptr ); + //m_device->SetTexture( 1, nullptr ); + //m_device->SetTexture( 2, nullptr ); + //m_device->SetTexture( 3, nullptr ); + m_block->Apply( ); + //m_block->Release( ); + } + + void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { + d3d_vertex_t v[ 2 ] = { + d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why + d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) + }; //edit: do we wanna use z for shit? i mean we could for like menu stuff + //so it renders above other stuff + + m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); + } + + void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 5 ] = { + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); + } + + void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { + d3d_vertex_t v[ 6 ] = { + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y ), 1.0f, color ), + d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), + d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) + }; + + m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); + } + + void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { + d3d_vertex_t v[ 4 ]; + + switch( type ) { + case GRADIENT_VERTICAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + case GRADIENT_HORIZONTAL: + v[ 0 ] = { float( x ), float( y ), 1.0f, start }; + v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; + v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; + v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; + break; + } + + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); + //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { + constexpr float PI = 3.1415926f; + const float step = PI * 2.0f / float( res ); + + int point_x = x + r, + point_y = y - r, + point_x_o{ }, + point_y_o{ }; + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + for( int i{ }; i <= res; i++ ) { + float theta = float( i ) * step; + + point_x = x + ( int )( r * cos( theta ) ); + point_y = y - ( int )( r * sin( theta ) ); + if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); + point_x_o = point_x; + point_y_o = point_y; + } + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { + d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); + const float step = M_PI * 2.0f / res; + + for( size_t i{ }; i < res; ++i ) { + float theta = i * step; + float x_off = r * cos( theta ); + float y_off = r * sin( theta ); + + v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; + } + + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); + m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); + m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); + } + + void c_renderer::draw_text( ID3DXFont* font, clr_t color, + int x, int y, FontAlign_t align, long font_flags, const char* msg ) { + if( !msg ) return; + if( !font ) return; + + auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); + auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); + auto buf = msg; + + if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; + if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); + RECT rect{ x, y, 1000, 100 }; + + ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; + + if( font_flags & D3DFONTFLAG_DROPSHADOW ) { + RECT r{ rect }; + r.left++; + r.top++; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + + if( font_flags & D3DFONTFLAG_OUTLINE ) { + for( int i = -1; i < 2; i++ ) { + RECT r{ rect }; + r.left += i; + r.top += i; + font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); + } + } + + font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); + } + + int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.right - temp.left ); + } + + int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + RECT temp{ }; + font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); + + return ( temp.bottom - temp.top ); + } +} diff --git a/legacy/loader/d3d.hpp b/legacy/loader/d3d.hpp new file mode 100644 index 0000000..034724a --- /dev/null +++ b/legacy/loader/d3d.hpp @@ -0,0 +1,126 @@ +#ifndef D3D_HEADER //stackoverflow my niggas +#define D3D_HEADER + +#include +#include + +#pragma comment(lib, "d3d9.lib") +#pragma comment(lib, "d3dx9.lib") +#pragma warning(disable : 4838) + +#include +#include + +#include +#pragma comment(lib, "dwmapi.lib") + +#include "util.hpp" +#include "color.hpp" + +enum FontAlign_t : size_t { + ALIGN_CENTER, + ALIGN_LEFT, + ALIGN_RIGHT +}; + +enum D3DFontFlags_t { + D3DFONTFLAG_OUTLINE = 0x10, + D3DFONTFLAG_DROPSHADOW = 0x100, +}; + +enum GradientType_t { + GRADIENT_HORIZONTAL, + GRADIENT_VERTICAL +}; + +//suck my dick +namespace d3d +{ + struct d3d_vertex_t { + d3d_vertex_t( float x, float y, float z, clr_t color ) : + m_x( x ), m_y( y ), m_z( z ), + m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; + + d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), + m_clr( 0 ) { }; + + float m_x; + float m_y; + float m_z; + float m_rhw = 1.f; + D3DCOLOR m_clr; + }; + + constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); + + struct d3d_fonts_t { + void release( ); + void create( IDirect3DDevice9* device ); + + ID3DXFont* f_12; + ID3DXFont* f_14; + ID3DXFont* f_16; + ID3DXFont* f_18; + ID3DXFont* f_menu; + ID3DXFont* f_con; + }; + + class c_renderer { + private: + IDirect3DDevice9* m_device; + IDirect3DStateBlock9* m_block; + public: + ulong_t m_width; + ulong_t m_height; + + c_renderer( ) { }; + c_renderer( IDirect3DDevice9* device ); + ~c_renderer( ); + + void on_device_lost( ); + void on_device_reset( ); + auto get_device( ) { + return m_device; + } + + bool run_frame( IDirect3DDevice9* device ); + void begin( ); + void end( ); + + void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); + void draw_rect( clr_t color, int x, int y, int w, int h ); + void draw_filled_rect( clr_t color, int x, int y, int w, int h ); + void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); + void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); + + void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); + + template < FontAlign_t align = ALIGN_CENTER > + void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { + char* buffer = ( char* )_alloca( 2048 ); + va_list list{ }; + + memset( buffer, 0, 2048 ); + + __crt_va_start( list, msg ); + vsprintf_s( buffer, 2048, msg, list ); + __crt_va_end( list ); + + draw_text( font, color, x, y, align, font_flags, buffer ); + } + + int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); + int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); + + private: + void invalidate_objects( ); + void create_objects( ); + }; + + extern d3d::d3d_fonts_t fonts; +} + +extern d3d::c_renderer g_d3d; + +#endif \ No newline at end of file diff --git a/legacy/loader/d3d_sprite.cpp b/legacy/loader/d3d_sprite.cpp new file mode 100644 index 0000000..8dd6705 --- /dev/null +++ b/legacy/loader/d3d_sprite.cpp @@ -0,0 +1,13 @@ +#include "d3d_sprite.hpp" + +std::vector< d3d::c_sprite* > d3d::sprites; + +namespace icons +{ + d3d::c_sprite sprite_legit; + d3d::c_sprite sprite_visuals_; + d3d::c_sprite sprite_rage; + d3d::c_sprite sprite_visuals; + d3d::c_sprite sprite_misc; + d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/legacy/loader/d3d_sprite.hpp b/legacy/loader/d3d_sprite.hpp new file mode 100644 index 0000000..584fddb --- /dev/null +++ b/legacy/loader/d3d_sprite.hpp @@ -0,0 +1,107 @@ +#pragma once +#include +#include "d3d.hpp" + + +namespace d3d +{ + class c_sprite; + + extern std::vector< c_sprite* > sprites; + + class c_sprite { + public: + size_t m_width{ }; + size_t m_height{ }; + + IDirect3DDevice9* m_device{ }; + ID3DXSprite* m_sprite{ }; + IDirect3DTexture9* m_texture{ }; + const byte* m_image{ }; + size_t m_image_size{ }; + + + public: + c_sprite( ) { + sprites.push_back( this ); + } + + ~c_sprite( ) { + on_reset( ); + } + + void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { + m_width = width; + m_height = height; + + m_device = device; + m_image = file; + m_image_size = img_size; + } + + void begin( IDirect3DDevice9* device ) { + m_device = device; + + if( !m_device ) { + return; + } + + if( !m_sprite ) + D3DXCreateSprite( m_device, &m_sprite ); + + if( m_sprite ) + m_sprite->Begin( D3DXSPRITE_ALPHABLEND ); + + if( !m_texture ) { + auto hr = D3DXCreateTextureFromFileInMemoryEx( + m_device, m_image, m_image_size, + m_width, m_height, D3DX_DEFAULT, 0, D3DFMT_A8B8G8R8, + D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, + 0, 0, &m_texture ); + } + } + + void end( ) { + if( !m_device || !m_sprite || !m_texture ) return; + if( m_sprite ) m_sprite->End( ); + } + + void on_reset( ) { + if( m_sprite && m_device && m_texture ) { + m_sprite->OnLostDevice( ); + m_sprite->OnResetDevice( ); + m_texture->Release( ); + m_texture = nullptr; + } + } + + void draw( int x, int y, clr_t color ) { + if( !m_device || !m_texture || !m_sprite ) { + return; + } + + ulong_t hr; + D3DXVECTOR2 center = D3DXVECTOR2( m_width * 0.5f, m_height * 0.5f ); + D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); + D3DXMATRIX matrix; + D3DXVECTOR2 scale( 1.f, 1.f ); + D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale, ¢er, 0.f, &trans ); + + hr = m_sprite->SetTransform( &matrix ); + + auto d3dcolor = D3DCOLOR_RGBA( color.r( ), + color.g( ), color.b( ), color.a( ) ); + hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); + } + }; +} + +namespace icons +{ + extern d3d::c_sprite sprite_legit; + extern d3d::c_sprite sprite_visuals_; + extern d3d::c_sprite sprite_rage; + extern d3d::c_sprite sprite_visuals; + extern d3d::c_sprite sprite_misc; + extern d3d::c_sprite sprite_config; +} \ No newline at end of file diff --git a/legacy/loader/http.h b/legacy/loader/http.h new file mode 100644 index 0000000..a965dfe --- /dev/null +++ b/legacy/loader/http.h @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include "strings.hpp" + +#pragma comment( lib, "wininet.lib" ) + +//very innovative PROTECTED !!! loader +// do NOT LEAK + +using namespace std::chrono_literals; +using ulong_t = unsigned long; + +namespace http { + class inethandle_t { + public: + operator HINTERNET( ) { return m_handle; } + inethandle_t( HINTERNET handle ) : m_handle( handle ) { }; + inethandle_t( ) : m_handle( nullptr ) { }; + ~inethandle_t( ) { + InternetCloseHandle( m_handle ); + } + + private: + HINTERNET m_handle; + }; + + auto send_request( char* uname, ulong_t hwid, int appid ) { + std::vector< uint8_t > response{ }; + inethandle_t intern = InternetOpenA( "none", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0 ); + inethandle_t addr = InternetConnectA( intern, xors( "moneybot.cc" ), INTERNET_DEFAULT_HTTPS_PORT, xors( "HakNtBNxed" ), xors( "PYfBKRduQUdl3oR" ), INTERNET_SERVICE_HTTP, 0, 0 ); + if( !addr ) { + MessageBoxA( 0, xors( "error" ), xors( "server error" ), MB_OK ); + exit( 0 ); + } + + inethandle_t req = HttpOpenRequestA( addr, xors( "POST" ), xors( "iakSZFzfST/money.php" ), 0, 0, 0, INTERNET_FLAG_SECURE | INTERNET_FLAG_KEEP_CONNECTION, 0 ); + + auto headers = xors( "Content-Type: application/json\r\n" ); + const char* POST_FORMAT = xors( R"( +{ + "user": "%s", + "hwid": "%08x", + "app_id": "%d" +} +)" ); + + char send_data[ 300 ]; + sprintf_s( send_data, 300, POST_FORMAT, uname, hwid, appid ); + + auto sent = HttpSendRequestA( req, headers, strlen( headers ), ( void* )send_data, strlen( send_data ) ); + if( sent ) { + ulong_t blocksize = 4096; + ulong_t size{ }; + uint8_t* block = ( uint8_t* )malloc( blocksize ); + + while( InternetReadFile( req, block, blocksize, &size ) && size ) { + for( size_t i{ }; i < std::min< ulong_t >( blocksize, size ); ++i ) { + response.push_back( block[ i ] ); + } + } + + free( block ); + } + + return response; + } +} \ No newline at end of file diff --git a/legacy/loader/iface.hpp b/legacy/loader/iface.hpp new file mode 100644 index 0000000..49a4dc5 --- /dev/null +++ b/legacy/loader/iface.hpp @@ -0,0 +1,198 @@ +#pragma once +#include +#include +#include "winapi.hpp" +#include "util.hpp" + +namespace iface +{ + class container { + private: + struct reg { + char m_key; + uintptr_t m_ptr; + uintptr_t m_module; + char m_module_name[ 64 ]; + char m_name[ 64 ]; + }; + + std::vector< reg > m_regs; + public: + void emplace_reg( uintptr_t ptr, uintptr_t module_, const char* name, const char* module_name, char name_key ) { + reg new_reg{ }; + new_reg.m_ptr = ptr; + new_reg.m_module = module_; + + memcpy( new_reg.m_name, name, 64 ); + memcpy( new_reg.m_module_name, module_name, 64 ); + + new_reg.m_key = name_key; + + m_regs.emplace_back( new_reg ); + } + + auto& get_regs( ) { + return m_regs; + } + }; + + struct iface_reg_t { + void* m_create_fn; + const char* m_name; + uintptr_t m_next; + + inline auto follow( HANDLE process ) { + iface_reg_t buf; + ReadProcessMemory( process, ( void* )( m_next ), &buf, sizeof( buf ), nullptr ); + return buf; + } + }; + + class manager { + HANDLE& m_process; + container m_container; + + inline auto is_createinterface_export( uintptr_t export_ ) { + uint8_t buf[ 12 ]; + + ReadProcessMemory( m_process, ( void* )( export_ ), buf, sizeof( buf ), nullptr ); + + return( buf[ 0 ] == 0x55 + && buf[ 4 ] == 0xe9 + && buf[ 9 ] == 0xcc + && buf[ 10 ] == 0xcc ); + } + + inline auto is_createinterface_fn( uintptr_t fn_ ) { + uint8_t buf[ 12 ]; + + ReadProcessMemory( m_process, ( void* )( fn_ ), buf, sizeof( buf ), nullptr ); + + return( buf[ 0 ] == 0x55 + && buf[ 4 ] == 0x8b + && buf[ 10 ] == 0x57 ); + } + + inline auto follow_createinterface_export( uintptr_t export_ ) { + uintptr_t jmp = export_ + 0x4; + + uintptr_t rel; + ReadProcessMemory( m_process, ( void* )( jmp + 0x1 ), &rel, sizeof( rel ), nullptr ); + + return jmp + rel + 0x5; + } + + inline auto find_list_ptr( uintptr_t createinterface ) { + uintptr_t + first = createinterface + 0x6, + second, + third; + + ReadProcessMemory( m_process, ( void* )( first ), &second, sizeof( second ), nullptr ); + ReadProcessMemory( m_process, ( void* )( second ), &third, sizeof( third ), nullptr ); + + return third; + } + + inline auto get_list( uintptr_t ptr ) { + iface_reg_t reg; + ReadProcessMemory( m_process, ( void* )( ptr ), ®, sizeof( reg ), nullptr ); + + return reg; + } + + public: + manager( HANDLE& process ) : m_process( process ) { }; + + inline void dump_from_module( HMODULE mod, const char* module_name ) { + auto read_str = [ this ]( char* buf, size_t size, uintptr_t addr ) { + for( size_t i{ }; i < size; ++i ) { + char _c; + ReadProcessMemory( m_process, ( void* )( addr + i ), &_c, 1, 0 ); + buf[ i ] = _c; + if( !_c ) break; + } + + buf[ size - 1 ] = 0; + }; + + auto enc_str = [ ]( char* buf, size_t size, char key ) { + for( size_t i{ }; i < size; ++i ) { + buf[ i ] ^= key; + } + }; + + auto create_interface = winapi::get_procaddr_ex( m_process, mod, xors( "CreateInterface" ) ); + if( !create_interface || !is_createinterface_export( create_interface ) ) + return; + + auto fn = follow_createinterface_export( create_interface ); + if( !is_createinterface_fn( fn ) ) + return; + + auto list_ptr = find_list_ptr( fn ); + auto list = get_list( list_ptr ); + + char name_buf[ 64 ]; + char module_buf[ 64 ]; + + do { + read_str( name_buf, 64, ( uintptr_t )( list.m_name ) ); + strcpy( module_buf, module_name ); + + srand( list_ptr ); + auto key = rand( ) & 0xff; + + enc_str( name_buf, 64, key ); + enc_str( module_buf, 64, key ); + + uintptr_t iface_ptr = 0; + ReadProcessMemory( m_process, ( void* )( ( uintptr_t )list.m_create_fn + 1 ), + &iface_ptr, sizeof( uintptr_t ), nullptr ); + + m_container.emplace_reg( iface_ptr, uintptr_t( mod ), name_buf, module_name, key ); + + list_ptr = list.m_next; + list = get_list( list_ptr ); + } while( list_ptr && name_buf[ 0 ] && list_ptr != list.m_next ); + } + + void dump_all_modules( int pid ) { + HANDLE t32_snapshot; + MODULEENTRY32 entry; + + t32_snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid ); + entry.dwSize = sizeof( MODULEENTRY32 ); + + for( Module32First( t32_snapshot, &entry ); + !!Module32Next( t32_snapshot, &entry ); ) { + + //why valve troll me + if( strstr( entry.szModule, xors( "valve_avi" ) ) ) + continue; + + dump_from_module( ( HMODULE )( entry.modBaseAddr ), entry.szModule ); + } + } + + auto count( ) { + return m_container.get_regs( ).size( ); + } + + auto& get( ) { + return m_container; + } + + uintptr_t write_to_process( ) { + size_t count_ = count( ); + size_t size = count_ * 137 + sizeof( size_t ); + + auto allocation = VirtualAllocEx( m_process, 0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE ); + WriteProcessMemory( m_process, allocation, &count_, sizeof( count_ ), nullptr ); + WriteProcessMemory( m_process, ( void* )( uintptr_t( allocation ) + 0x4 ), + get( ).get_regs( ).data( ), size, nullptr ); + + return ( uintptr_t )( allocation ); + } + }; +} \ No newline at end of file diff --git a/legacy/loader/input_system.cpp b/legacy/loader/input_system.cpp new file mode 100644 index 0000000..b71917e --- /dev/null +++ b/legacy/loader/input_system.cpp @@ -0,0 +1,523 @@ +#include + +#include "input_system.hpp" +#include "util.hpp" + +util::c_input_manager g_input; + +NAMESPACE_REGION( util ) + +const char* const key_names_short[] = { + "unk", + "m1", + "m2", + "can", + "m3", + "m4", + "m5", + "unk", + "back", + "tab", + "unk", + "unk", + "clr", + "ret", + "unk", + "unk", + "shift", + "ctrl", + "alt", + "pause", + "caps", + "kana", + "unk", + "junja", + "final", + "kanji", + "unk", + "esc", + "convert", + "nonconvert", + "accept", + "modechange", + " ", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "slct", + "prnt", + "execute", + "snapshot", + "ins", + "del", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unk", + "unk", + "num0", + "num1", + "num2", + "num3", + "num4", + "num5", + "num6", + "num7", + "num8", + "num9", + "*", + "+", + "sep", + "-", + ",", + "/", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "unk", + "lshift", + "rshift", + "lctrl", + "rctrl", + "lalt", + "ralt", +}; + +const char* const key_names[] = { + "unknown", + "mouse_1", + "mouse_2", + "cancel", + "mouse_3", + "mouse_4", + "mouse_5", + "unknown", + "back", + "tab", + "unknown", + "unknown", + "clear", + "return", + "unknown", + "unknown", + "shift", + "control", + "alt", + "pause", + "capital", + "kana", + "unknown", + "junja", + "final", + "kanji", + "unknown", + "escape", + "convert", + "nonconvert", + "accept", + "modechange", + "space", + "prior", + "next", + "end", + "home", + "left", + "up", + "right", + "down", + "select", + "print", + "execute", + "snapshot", + "insert", + "delete", + "help", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "lwin", + "rwin", + "apps", + "unknown", + "unknown", + "numpad0", + "numpad1", + "numpad2", + "numpad3", + "numpad4", + "numpad5", + "numpad6", + "numpad7", + "numpad8", + "numpad9", + "multiply", + "add", + "separator", + "subtract", + "decimal", + "divide", + "f1", + "f2", + "f3", + "f4", + "f5", + "f6", + "f7", + "f8", + "f9", + "f10", + "f11", + "f12", + "f13", + "f14", + "f15", + "f16", + "f17", + "f18", + "f19", + "f20", + "f21", + "f22", + "f23", + "f24", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "numlock", + "scroll", + "oem_nec_equal", + "oem_fj_masshou", + "oem_fj_touroku", + "oem_fj_loya", + "oem_fj_roya", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "unknown", + "lshift", + "rshift", + "lcontrol", + "rcontrol", + "lmenu", + "rmenu", +}; + +void c_input_manager::capture_mouse_move( ulong_t lparam ) { + m_mouse_pos[ 0 ] = LOWORD( lparam ); + m_mouse_pos[ 1 ] = HIWORD( lparam ); +} + +bool c_input_manager::register_key_press( VirtualKeyEvents_t key_event, VirtualKeys_t key ) +{ + switch ( key_event ) { + case KEYDOWN: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = true; + return true; + } + case KEYUP: { + if ( is_valid_key( key ) ) + m_pressed_keys[ key ] = false; + return true; + } + case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = true; + break; + } + case SYSKEYUP: { + if ( key == KEYS_ALT ) + m_pressed_keys[ key ] = false; + break; + } + case LBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE1 ] = true; + return true; + case LBUTTONUP: + m_pressed_keys[ KEYS_MOUSE1 ] = false; + return true; + case RBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE2 ] = true; + return true; + case RBUTTONUP: + m_pressed_keys[ KEYS_MOUSE2 ] = false; + return true; + case MBUTTONDOWN: + m_pressed_keys[ KEYS_MOUSE3 ] = true; + return true; + case MBUTTONUP: + m_pressed_keys[ KEYS_MOUSE3 ] = false; + return true; + case XBUTTONDOWN: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; + return true; + } + case XBUTTONUP: { + bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true + m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; + return true; + } + case MOUSEWHEEL: { + short scroll_input = ( short )HIWORD( key ); + m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; + return true; + } + } + + return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK +} + +bool c_input_manager::is_key_pressed( int key ) { + auto k = static_cast< VirtualKeys_t >( key ); + return is_valid_key( k ) && m_pressed_keys[ k ]; +} + +const char* c_input_manager::get_key_name( VirtualKeys_t key ) { + if ( !is_valid_key( key ) ) + return key_names[ KEYS_NONE ]; + + return key_names[ key ]; +} + +const char* c_input_manager::get_short_name( VirtualKeys_t key ) { + return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; +} + +VirtualKeys_t c_input_manager::is_any_key_pressed( ) { + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( m_pressed_keys[ i ] ) { + return VirtualKeys_t( i ); + } + } + + return KEYS_NONE; +} + +int c_input_manager::get_scroll_state( ) { + int current_state = m_scroll_wheel_state; + m_scroll_wheel_state = 0; + return current_state; +} + +char c_input_manager::get_pressed_char( VirtualKeys_t* out ) { + size_t pressed_character{ }; + for ( size_t i{ }; i < KEYS_MAX; ++i ) { + if ( is_key_pressed( VirtualKeys_t( i ) ) ) { + if ( ( i >= KEYS_A && i <= KEYS_Z ) + || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { + pressed_character = i; + } + } + } + + if ( pressed_character ) { + if ( out ) { + *out = VirtualKeys_t( pressed_character ); + } + + if ( is_key_pressed( KEYS_SHIFT ) ) { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( pressed_character ); + + //gay way to shift it to symbols + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) { + switch ( pressed_character ) { + case KEYS_N0: + return ')'; + case KEYS_N1: + return '!'; + case KEYS_N2: + return '@'; + case KEYS_N3: + return '#'; + case KEYS_N4: + return '$'; + case KEYS_N5: + return '%'; + case KEYS_N6: + return '^'; + case KEYS_N7: + return '&'; + case KEYS_N8: + return '*'; + case KEYS_N9: + return '('; + } + } + } + else { + if ( pressed_character >= KEYS_A + && pressed_character <= KEYS_Z ) + return char( ::tolower( pressed_character ) ); + + if ( pressed_character >= KEYS_N0 + && pressed_character <= KEYS_N9 ) + return char( pressed_character ); + } + } + else if ( is_key_pressed( KEYS_SPACE ) ) { + if ( out ) + *out = KEYS_SPACE; + + return ' '; + } + else if ( is_key_pressed( KEYS_BACK ) ) { + if ( out ) + *out = KEYS_BACK; + + return 0; + } + + if ( out ) + *out = KEYS_NONE; + + return 0; +} + +END_REGION \ No newline at end of file diff --git a/legacy/loader/input_system.hpp b/legacy/loader/input_system.hpp new file mode 100644 index 0000000..c517f38 --- /dev/null +++ b/legacy/loader/input_system.hpp @@ -0,0 +1,177 @@ +#pragma once +#include "util.hpp" + +enum VirtualKeyEvents_t { + KEYDOWN = 0x0100, + KEYUP = 0x0101, + SYSKEYDOWN = 0x104, + SYSKEYUP = 0x105, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, +}; + +enum VirtualKeys_t { + KEYS_NONE = 0, + KEYS_MOUSE1 = 0X01, + KEYS_MOUSE2 = 0X02, + KEYS_CANCEL = 0X03, + KEYS_MOUSE3 = 0X04, + KEYS_MOUSE4 = 0X05, + KEYS_MOUSE5 = 0X06, + KEYS_BACK = 0X08, + KEYS_TAB = 0X09, + KEYS_CLEAR = 0X0C, + KEYS_RETURN = 0X0D, + KEYS_SHIFT = 0X10, + KEYS_CONTROL = 0X11, + KEYS_ALT = 0X12, + KEYS_PAUSE = 0X13, + KEYS_CAPSLOCK = 0X14, + KEYS_ESCAPE = 0X1B, + KEYS_CONVERT = 0X1C, + KEYS_NONCONVERT = 0X1D, + KEYS_ACCEPT = 0X1E, + KEYS_MODECHANGE = 0X1F, + KEYS_SPACE = 0X20, + KEYS_PRIOR = 0X21, + KEYS_NEXT = 0X22, + KEYS_END = 0X23, + KEYS_HOME = 0X24, + KEYS_LEFT = 0X25, + KEYS_UP = 0X26, + KEYS_RIGHT = 0X27, + KEYS_DOWN = 0X28, + KEYS_SELECT = 0X29, + KEYS_PRINT = 0X2A, + KEYS_EXECUTE = 0X2B, + KEYS_SNAPSHOT = 0X2C, + KEYS_INSERT = 0X2D, + KEYS_DELETE = 0X2E, + KEYS_HELP = 0X2F, + KEYS_N0 = 0X30, + KEYS_N1 = 0X31, + KEYS_N2 = 0X32, + KEYS_N3 = 0X33, + KEYS_N4 = 0X34, + KEYS_N5 = 0X35, + KEYS_N6 = 0X36, + KEYS_N7 = 0X37, + KEYS_N8 = 0X38, + KEYS_N9 = 0X39, + KEYS_A = 0X41, + KEYS_B = 0X42, + KEYS_C = 0X43, + KEYS_D = 0X44, + KEYS_E = 0X45, + KEYS_F = 0X46, + KEYS_G = 0X47, + KEYS_H = 0X48, + KEYS_I = 0X49, + KEYS_J = 0X4A, + KEYS_K = 0X4B, + KEYS_L = 0X4C, + KEYS_M = 0X4D, + KEYS_N = 0X4E, + KEYS_O = 0X4F, + KEYS_P = 0X50, + KEYS_Q = 0X51, + KEYS_R = 0X52, + KEYS_S = 0X53, + KEYS_T = 0X54, + KEYS_U = 0X55, + KEYS_V = 0X56, + KEYS_W = 0X57, + KEYS_X = 0X58, + KEYS_Y = 0X59, + KEYS_Z = 0X5A, + KEYS_LEFTWINDOWS = 0X5B, + KEYS_RIGHTWINDOWS = 0X5C, + KEYS_APPLICATION = 0X5D, + KEYS_NUMPAD0 = 0X60, + KEYS_NUMPAD1 = 0X61, + KEYS_NUMPAD2 = 0X62, + KEYS_NUMPAD3 = 0X63, + KEYS_NUMPAD4 = 0X64, + KEYS_NUMPAD5 = 0X65, + KEYS_NUMPAD6 = 0X66, + KEYS_NUMPAD7 = 0X67, + KEYS_NUMPAD8 = 0X68, + KEYS_NUMPAD9 = 0X69, + KEYS_MULTIPLY = 0X6A, + KEYS_ADD = 0X6B, + KEYS_SEPARATOR = 0X6C, + KEYS_SUBTRACT = 0X6D, + KEYS_DECIMAL = 0X6E, + KEYS_DIVIDE = 0X6F, + KEYS_F1 = 0X70, + KEYS_F2 = 0X71, + KEYS_F3 = 0X72, + KEYS_F4 = 0X73, + KEYS_F5 = 0X74, + KEYS_F6 = 0X75, + KEYS_F7 = 0X76, + KEYS_F8 = 0X77, + KEYS_F9 = 0X78, + KEYS_F10 = 0X79, + KEYS_F11 = 0X7A, + KEYS_F12 = 0X7B, + KEYS_NUMLOCK = 0X90, + KEYS_SCROLLLOCK = 0X91, + KEYS_LEFTSHIFT = 0XA0, + KEYS_RIGHTSHIFT = 0XA1, + KEYS_LEFTCONTROL = 0XA2, + KEYS_RIGHTCONTROL = 0XA3, + KEYS_LEFTMENU = 0XA4, + KEYS_RIGHTMENU = 0XA5, + KEYS_PERIOD = 0xBE, + KEYS_MAX = 0XA6, + KEYS_LAST = 0xfe +}; + +namespace util +{ + class c_input_manager { + bool m_pressed_keys[ KEYS_MAX ]; + int m_mouse_pos[ 2 ]; + int m_scroll_wheel_state; + public: + void capture_mouse_move( ulong_t lparam ); + + //registers a key press from wndproc + bool register_key_press( VirtualKeyEvents_t key_event, VirtualKeys_t key ); + + //checks if the key is pressed + bool is_key_pressed( int key ); + + //returns the first found key pressed, or KEY_NONE if none are + VirtualKeys_t is_any_key_pressed( ); + + //returns the last scroll state and resets it to 0 + int get_scroll_state( ); + + //returns the key's name + const char* get_key_name( VirtualKeys_t key ); + const char* get_short_name( VirtualKeys_t key ); + + //returns the first found currently pressed key + char get_pressed_char( VirtualKeys_t* pressed_key = nullptr ); + + //check if a key is valid + inline bool is_valid_key( VirtualKeys_t key ) { return key > KEYS_NONE && key < KEYS_MAX; } + + //get cursor pos + inline void get_cursor_pos( int& x, int& y ) { + x = m_mouse_pos[ 0 ]; + y = m_mouse_pos[ 1 ]; + } + }; +} + +extern util::c_input_manager g_input; \ No newline at end of file diff --git a/legacy/loader/loader.vcxproj b/legacy/loader/loader.vcxproj new file mode 100644 index 0000000..e8202b2 --- /dev/null +++ b/legacy/loader/loader.vcxproj @@ -0,0 +1,245 @@ + + + + + Debug + Win32 + + + pHit + Win32 + + + pHit + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0} + loader + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) + C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) + + + + Level3 + MaxSpeed + true + true + true + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + stdcpp17 + + + true + true + false + false + /NXCOMPAT:NO %(AdditionalOptions) + + RequireAdministrator + + + + + Level3 + MaxSpeed + true + true + true + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + stdcpp17 + + + true + true + false + false + /NXCOMPAT:NO %(AdditionalOptions) + + + RequireAdministrator + + + + + Level3 + Disabled + true + true + stdcpp17 + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS + + + Windows + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/legacy/loader/loader.vcxproj.filters b/legacy/loader/loader.vcxproj.filters new file mode 100644 index 0000000..7aeaacb --- /dev/null +++ b/legacy/loader/loader.vcxproj.filters @@ -0,0 +1,147 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {2a67ca5a-84ca-481c-b6dd-d35db109320e} + + + {0ae239aa-5489-4d37-9ca5-f5ed596b8364} + + + {6f16eb64-7a39-4a36-84ed-a3ad1492b272} + + + {dc9e1541-2daf-4e48-b5fc-96803b1b5a26} + + + {4f442dba-539b-4639-a710-b7a4ef78465b} + + + {7a55fde6-06f2-45c5-bd1a-6a8a316739a8} + + + + + Source Files + + + Source Files\ui + + + Source Files\util + + + Source Files\util + + + Source Files\util + + + Source Files\util + + + Source Files\manualmap + + + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\util + + + Source Files\util + + + Source Files\util + + + Source Files\util + + + Source Files\util + + + Source Files\util + + + Source Files\util + + + Source Files\manualmap + + + Source Files\http + + + Source Files\enc + + + Source Files\ui + + + Source Files\iface + + + Source Files\util + + + \ No newline at end of file diff --git a/legacy/loader/manualmap.cpp b/legacy/loader/manualmap.cpp new file mode 100644 index 0000000..da49a13 --- /dev/null +++ b/legacy/loader/manualmap.cpp @@ -0,0 +1,109 @@ +#include "manualmap.hpp" + +void inject::c_map::initialize( int pid ) { + m_handle = OpenProcess( PROCESS_ALL_ACCESS, 0, pid ); +} + +void inject::c_map::initialize( HANDLE process ) { + m_handle = process; +} + +void inject::c_map::write( uintptr_t address, void* data, size_t size ) { + WriteProcessMemory( m_handle, ( void* )address, data, size, nullptr ); +} + +uintptr_t inject::c_map::allocate( size_t size ) { + void* allocation = VirtualAllocEx( m_handle, 0, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE ); + m_allocations.push_back( allocation ); + + return uintptr_t( allocation ); +} + +void inject::c_map::free_allocated_regions( ) { + for( auto& it : m_allocations ) { + VirtualFreeEx( m_handle, it, 0, MEM_FREE ); + } + + m_allocations.clear( ); +} + +void inject::c_map::inject( uintptr_t interfaces ) { + HMODULE mod_data = ( HMODULE )m_inject_data.data( ); + + IMAGE_DOS_HEADER dos_hdr; + IMAGE_NT_HEADERS nt_hdrs; + + dos_hdr = *( decltype( dos_hdr )* )( mod_data ); + nt_hdrs = *( decltype( nt_hdrs )* )( uintptr_t( mod_data ) + dos_hdr.e_lfanew ); + + auto allocation = allocate( nt_hdrs.OptionalHeader.SizeOfImage ); + + auto size_of_headers = nt_hdrs.OptionalHeader.SizeOfHeaders; + auto num_of_sections = nt_hdrs.FileHeader.NumberOfSections; + + m_allocation = malloc( nt_hdrs.OptionalHeader.SizeOfImage ); + memset( m_allocation, 0, nt_hdrs.OptionalHeader.SizeOfImage ); + memcpy( m_allocation, mod_data, size_of_headers ); + write( allocation, m_allocation, size_of_headers ); + + auto sections = ( IMAGE_SECTION_HEADER* )( ( uintptr_t )( mod_data ) + dos_hdr.e_lfanew + sizeof( IMAGE_NT_HEADERS ) ); + for( size_t i{ }; i < num_of_sections; ++i ) { + auto section = sections[ i ]; + uintptr_t address = ( uintptr_t )m_allocation + section.VirtualAddress; + memcpy( ( void* )address, + ( void* )( uintptr_t( mod_data ) + section.PointerToRawData ), + ( size_t )section.SizeOfRawData ); + } + + auto base = nt_hdrs.OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_BASERELOC ].VirtualAddress; + auto base_reloc = ( IMAGE_BASE_RELOCATION* )( ( uintptr_t )m_allocation + base ); + auto delta = allocation - nt_hdrs.OptionalHeader.ImageBase; + + while( base_reloc->VirtualAddress ) { + if( base_reloc->SizeOfBlock >= sizeof( IMAGE_BASE_RELOCATION ) ) { + size_t count = ( base_reloc->SizeOfBlock - sizeof( IMAGE_BASE_RELOCATION ) ) / sizeof( uint16_t ); + + auto list = ( uint16_t* )( base_reloc + 1 ); + + uintptr_t* ptr{ }; + for( size_t i{ }; i < count; ++i ) { + if( list[ i ] ) { + ptr = ( uintptr_t* )( ( uintptr_t )( m_allocation ) + ( base_reloc->VirtualAddress + ( list[ i ] & 0xfff ) ) ); + *ptr += delta; + } + } + } + + base_reloc = ( IMAGE_BASE_RELOCATION* )( ( uintptr_t )base_reloc + base_reloc->SizeOfBlock ); + } + + write( allocation, m_allocation, nt_hdrs.OptionalHeader.SizeOfImage ); + free( m_allocation ); + + auto shellcode_allocation = allocate( 0x1000 ); + + img_data_t img_data{ + allocation, + nt_hdrs.OptionalHeader.ImageBase, + nt_hdrs.OptionalHeader.AddressOfEntryPoint, + nt_hdrs.OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_BASERELOC ].VirtualAddress, + nt_hdrs.OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT ].VirtualAddress, + ( uintptr_t )( LoadLibraryA ), + ( uintptr_t )( GetProcAddress ), + interfaces + }; + + write( shellcode_allocation, &img_data, sizeof( img_data_t ) ); + + auto loader_code_start = shellcode_allocation + sizeof( img_data_t ); + auto loader_code_size = ( size_t )( ( uintptr_t )( &dummy_func_1 ) - ( uintptr_t )( &loader_shellcode ) ); + + write( loader_code_start, &loader_shellcode, loader_code_size ); + auto thread = CreateRemoteThread( m_handle, nullptr, 0, + ( LPTHREAD_START_ROUTINE )loader_code_start, + ( void* )shellcode_allocation, 0, 0 ); + + WaitForSingleObject( thread, INFINITE ); + ulong_t exit{ }; + GetExitCodeThread( thread, &exit ); +} \ No newline at end of file diff --git a/legacy/loader/manualmap.hpp b/legacy/loader/manualmap.hpp new file mode 100644 index 0000000..39cdecf --- /dev/null +++ b/legacy/loader/manualmap.hpp @@ -0,0 +1,169 @@ +#pragma once +#include +#include +#include +#include "util.hpp" + +enum DllSections_t { + SECTION_TEXT, //.text | allocation + write( obviously ) + SECTION_RDATA, //.rdata | allocation + write + SECTION_DATA, //.data | need to allocate + SECTION_RSRC, //.rsrc | not needed + SETCION_RELOC, //.reloc | will need to do on server + SECTION_MAX +}; + +namespace inject +{ + struct img_data_t { + uintptr_t m_base; + uintptr_t m_image; + uintptr_t m_entry; + uintptr_t m_relocation; + uintptr_t m_imports; + uintptr_t m_loadlib; + uintptr_t m_get_procaddr; + uintptr_t m_interface_ptr; + }; + + using dllmain_t = int( __stdcall* )( void*, ulong_t, void* ); + + static __declspec( naked ) ulong_t __stdcall loader_shellcode( void* address ) { + __asm { + push ebp + mov ebp, esp + sub esp, __LOCAL_SIZE + } + + img_data_t* data; data = ( img_data_t* )address; + + uintptr_t base; base = data->m_base; + uintptr_t entry_point; entry_point = base + data->m_entry; + uintptr_t delta; delta = base - data->m_image; + + IMAGE_BASE_RELOCATION* base_reloc; + IMAGE_IMPORT_DESCRIPTOR* import_dir; + + base_reloc = ( IMAGE_BASE_RELOCATION* )( base + data->m_relocation ); + import_dir = ( IMAGE_IMPORT_DESCRIPTOR* )( base + data->m_imports ); + + decltype( &LoadLibraryA ) loadlib; + decltype( &GetProcAddress ) get_procaddr; + + loadlib = ( decltype( &LoadLibraryA ) )( data->m_loadlib ); + get_procaddr = ( decltype( &GetProcAddress ) )( data->m_get_procaddr ); + + IMAGE_THUNK_DATA* orig_first_thunk; + IMAGE_THUNK_DATA* first_thunk; + + uintptr_t name; + HMODULE import_module; + uintptr_t ordinal; + uintptr_t import_fn; + + IMAGE_IMPORT_BY_NAME* import_; + + while( import_dir->Characteristics ) { + orig_first_thunk = ( IMAGE_THUNK_DATA* )( base + import_dir->OriginalFirstThunk ); + first_thunk = ( IMAGE_THUNK_DATA* )( base + import_dir->FirstThunk ); + + import_module = 0; + + name = base + import_dir->Name; + __asm { + push name + call loadlib + mov import_module, eax + } + + if( !import_module ) { + //return 0 + __asm mov eax, 0; + goto END; + } + + while( orig_first_thunk->u1.AddressOfData ) { + if( orig_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) { + ordinal = orig_first_thunk->u1.Ordinal & 0xffff; + import_fn = 0; + + __asm { + push ordinal + push import_module + call get_procaddr + mov import_fn, eax + } + + if( !import_fn ) { + __asm mov eax, 0; + goto END; + } + + + first_thunk->u1.Function = import_fn; + } + else { + import_ = ( IMAGE_IMPORT_BY_NAME* )( base + orig_first_thunk->u1.AddressOfData ); + name = ( uintptr_t )( import_->Name ); + + import_fn = 0; + + __asm { + push name + push import_module + call get_procaddr + mov import_fn, eax + } + + if( !import_fn ) { + __asm mov eax, 0; + goto END; + } + + first_thunk->u1.Function = import_fn; + } + + ++orig_first_thunk; + ++first_thunk; + } + + ++import_dir; + } + + void* interface_ptr; + interface_ptr = ( void* )( data->m_interface_ptr ); + + dllmain_t fn; fn = reinterpret_cast< dllmain_t >( entry_point ); + fn( ( void* )base, DLL_PROCESS_ATTACH, interface_ptr ); + + __asm mov eax, 1; + + END: + __asm { + mov esp, ebp + pop ebp + ret + } + } + + static ulong_t __stdcall dummy_func_1( ) { return 0; } + + class c_map { + HANDLE m_handle; + std::vector< void* > m_allocations; + std::vector< uint8_t > m_inject_data; + void* m_allocation; + + void write( uintptr_t address, void* data, size_t size ); + uintptr_t allocate( size_t size ); + + void free_allocated_regions( ); + public: + c_map( std::vector< uint8_t >& file ) : m_inject_data( file ) { }; + ~c_map( ) { if( m_handle ) { CloseHandle( m_handle ); } } + + void initialize( int process_id ); + void initialize( HANDLE process ); + void inject( uintptr_t interfaces ); + }; +} \ No newline at end of file diff --git a/legacy/loader/math.hpp b/legacy/loader/math.hpp new file mode 100644 index 0000000..bebe7d5 --- /dev/null +++ b/legacy/loader/math.hpp @@ -0,0 +1,60 @@ +#pragma once +#include +#include "util.hpp" + +static constexpr long double M_PI = 3.14159265358979323846f; +static constexpr long double M_RADPI = 57.295779513082f; +static constexpr long double M_PIRAD = 0.01745329251f; +static constexpr float M_PI_F = ( ( float )( M_PI ) ); +__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } +__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } + +namespace { + //make a random generator and seed it with a p random number + static std::random_device rd; + static std::mt19937 gen( rd( ) ); +} + +NAMESPACE_REGION( math ) + +#undef min +#undef max + +template < typename t > +t min( const t& t1, const t& t2 ) { + return t1 < t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t min( const t& t1, const t& t2, ts_&&... ts ) { + return t1 < t2 ? + min( t1, std::forward< ts_ >( ts )... ) : + min( t2, std::forward< ts_ >( ts )... ); +} + +template < typename t > +t max( const t& t1, const t& t2 ) { + return t1 > t2 ? t1 : t2; +} + +template < typename t, typename... ts_ > +t max( const t& t1, const t& t2, ts_&&... ts ) { + return t1 > t2 ? + max( t1, std::forward< ts_ >( ts )... ) : + max( t2, std::forward< ts_ >( ts )... ); +} + +// todo - dex; make 2 random generator funcs here, this one only works for floats normally + +template < typename t > __forceinline t random_number( t min, t max ) { + if constexpr( !std::is_integral_v< t > ) { + std::uniform_real_distribution< t > dist( min, max ); + return dist( gen ); + } + else { + std::uniform_int_distribution< t > dist( min, max ); + return dist( gen ); + } +} + +END_REGION \ No newline at end of file diff --git a/legacy/loader/strings.hpp b/legacy/loader/strings.hpp new file mode 100644 index 0000000..569f9a0 --- /dev/null +++ b/legacy/loader/strings.hpp @@ -0,0 +1,163 @@ +//-------------------------------------------------------------------------------- +//-- XorCompileTime.hpp +// +// Author: frk +// Date: 12.12.2015 +// +//-------------------------------------------------------------------------------- + +#pragma once +#include +#include +#include + +#define BEGIN_NAMESPACE( x ) namespace x { +#define END_NAMESPACE } + +BEGIN_NAMESPACE( strenc ) + +constexpr auto time = __TIME__; +constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; + +// 1988, Stephen Park and Keith Miller +// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" +// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: +// with 32-bit math and without division + +template < int N > +struct RandomGenerator { +private: + static constexpr unsigned a = 16807; // 7^5 + static constexpr unsigned m = 2147483647; // 2^31 - 1 + + static constexpr unsigned s = RandomGenerator< N - 1 >::value; + static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 + static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 + static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits + static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi + static constexpr unsigned lo3 = lo2 + hi; + +public: + static constexpr unsigned max = m; + static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; +}; + +template <> +struct RandomGenerator< 0 > { + static constexpr unsigned value = seed; +}; + +template < int N, int M > +struct RandomInt { + static constexpr auto value = RandomGenerator< N + 1 >::value % M; +}; + +template < int N > +struct RandomChar { + static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); +}; + +template < size_t N, int K > +struct XorString { +private: + const char _key; + std::array< char, N + 1 > _encrypted; + bool decrypted = false; + + constexpr char enc( char c ) const { + return c ^ _key; + } + + char dec( char c ) const { + return c ^ _key; + } + +public: + template < size_t... Is > + constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { + } + + __forceinline const char* decrypt( void ) { + if( !decrypted ) { + for( size_t i = 0; i < N; ++i ) { + _encrypted[ i ] = dec( _encrypted[ i ] ); + } + _encrypted[ N ] = '\0'; + decrypted = true; + } + + return _encrypted.data( ); + } +}; + +//-------------------------------------------------------------------------------- +//-- Note: XorStr will __NOT__ work directly with functions like printf. +// To work with them you need a wrapper function that takes a const char* +// as parameter and passes it to printf and alike. +// +// The Microsoft Compiler/Linker is not working correctly with variadic +// templates! +// +// Use the functions below or use std::cout (and similar)! +//-------------------------------------------------------------------------------- + +#if( 1 ) +static auto w_printf = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_printf_s = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf( buf, fmt, args ); + va_end( args ); +}; + +static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf_s( buf, buf_size, fmt, args ); + va_end( args ); +}; +#endif + +//for compatibility with debug mode +struct debug_ret { +private: + const char* ret; + +public: + debug_ret( const char* str ) : ret( str ) { }; + + auto decrypt( ) { + return ret; + } +}; + +constexpr size_t strlen_ct( const char* const str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; +} + +#if 1 +#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) +#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) +#else +#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) +#define xors( s ) ( s ) +#endif + +END_NAMESPACE \ No newline at end of file diff --git a/legacy/loader/syscall.h b/legacy/loader/syscall.h new file mode 100644 index 0000000..0f608ba --- /dev/null +++ b/legacy/loader/syscall.h @@ -0,0 +1,167 @@ +#pragma once +#include + +#include "x86.h" + +using ulong_t = unsigned long; + +constexpr bool is86 = sizeof( uintptr_t ) == sizeof( uint32_t ); + +class c_syscalls { +protected: + std::unordered_map< std::string, std::pair< uint16_t, uint16_t > > m_syscalls; + + // 16 is very arbitrary... but whatever + // if something crashes this is why + __forceinline size_t syscall_wrapper_size( uint8_t* funptr, uint16_t *ret_c_out ) { + for ( size_t offset{ }; offset < 0x30; offset++ ) { + if ( funptr[ offset ] == x86::instruction::retn ) { + if ( ret_c_out ) + *ret_c_out = 0; + + return offset + 1; + } + else if ( funptr[ offset ] == x86::instruction::retn_imm16 ) { + if ( ret_c_out ) + *ret_c_out = *( uint16_t * )( &funptr[ offset + 1 ] ); + + return offset + 3; + } + } + return 0; + } + + __forceinline bool is_syscall( uint8_t* funptr, size_t func_size ) { + const uint32_t encoded_opcode = x86::encode_mov_imm32( x86::reg::eax ); + + if ( /*is86*/ true ? funptr[ 0 ] != encoded_opcode : !( funptr[ 0 ] == 0x4c && funptr[ 1 ] == 0x8b && funptr[ 2 ] == 0xd1 ) ) + return false; + + for ( size_t offset{ }; offset < func_size; offset++ ) { + if ( true /*is86*/ ) { + if ( ( funptr[ offset ] == x86::instruction::fs && // win7 + funptr[ offset + 1 ] == x86::instruction::call ) || + + ( funptr[ offset ] == x86::instruction::call && // win10 + funptr[ offset + 1 ] == 0xd2 /*call edx*/ ) ) + + return true; + + } + + else { + if ( funptr[ offset ] == 0x0f && // win7 + win10 + funptr[ offset + 1 ] == 0x05 ) + return true; + } + } + + return false; + } + + __forceinline uint16_t get_syscall_index( uintptr_t func_addr, std::ptrdiff_t *stub_offset = nullptr, uint16_t *ret_c_out = nullptr ) { + uint8_t* ubp_addr = reinterpret_cast< uint8_t* >( func_addr ); + uint16_t ret_c{ }; + size_t wrapper_size = syscall_wrapper_size( ubp_addr, &ret_c ); + + if ( ret_c_out ) + *ret_c_out = ret_c; + + wrapper_size = ( wrapper_size ) ? wrapper_size : 16; + + if ( is_syscall( ubp_addr, wrapper_size ) ) { + // mov eax, imm32 + const uint32_t encoded_opcode = x86::encode_mov_imm32( x86::reg::eax ); + + for ( size_t offset{ }; offset < wrapper_size; offset++ ) { + if ( *reinterpret_cast< uint8_t* >( func_addr + offset ) == encoded_opcode ) { + if ( stub_offset ) + *stub_offset = offset; + + return ( *reinterpret_cast< uint16_t* >( func_addr + offset + 1 ) ); + } + } + } + + return 0; + } + + std::pair< uint8_t*, size_t > m_shellcode_stub; + void *m_call_table; +public: + + __forceinline ~c_syscalls( ) { + if ( m_call_table ) + delete[ ] m_call_table; + + if ( m_shellcode_stub.first ) + delete[ ] m_shellcode_stub.first; + } + + __forceinline c_syscalls( ) : + m_syscalls{ }, m_shellcode_stub{ } { + + init( ); + + // b1gr0fl + m_call_table = new char[ 0x100000 ]; + util::set( m_call_table, 0, 0x100000 ); + + if ( true /*x86*/ ) { + for ( auto& syscall : m_syscalls ) { + void *stub_addr = ( void* )( uintptr_t( m_call_table ) + ( syscall.second.first * m_shellcode_stub.second ) ); + util::copy( stub_addr, m_shellcode_stub.first, m_shellcode_stub.second ); + + std::ptrdiff_t index_offset{ }; + get_syscall_index( ( uintptr_t )stub_addr, &index_offset ); + + auto stub_return = ( uint16_t * )( uintptr_t( stub_addr ) + m_shellcode_stub.second - 2 ); + *stub_return = syscall.second.second; + + *( uint32_t * )( uintptr_t( stub_addr ) + index_offset + 1 ) = ( syscall.second.first ); + + } + } + } + + __forceinline void init( ) { + uint32_t index; + uint16_t ret_c{ }; + + if ( g_nt.m_exports.empty( ) ) { + g_nt.dump_exports( ); + } + + for ( const auto& exp : g_nt.m_exports ) { + index = get_syscall_index( exp.second, nullptr, &ret_c ); + + if ( index ) { + m_syscalls[ exp.first ].first = index; + m_syscalls[ exp.first ].second = ret_c; + + if ( !m_shellcode_stub.first ) { + m_shellcode_stub.second = syscall_wrapper_size( reinterpret_cast< uint8_t* >( exp.second ), &ret_c ); + + m_shellcode_stub.first = new uint8_t[ m_shellcode_stub.second ]; + + m_syscalls[ exp.first ].second = ret_c; + + util::copy( m_shellcode_stub.first, reinterpret_cast< void* >( exp.second ), m_shellcode_stub.second ); + } + } + } + } + + template< typename t = void* > + __forceinline t get_syscall_func( std::string name ) { + return ( t )( GetProcAddress( GetModuleHandleA( "ntdll.dll" ), name.c_str( ) ) ); + } + + __forceinline uint16_t get_syscall( std::string name ) { + return m_syscalls[ name ].first; + } + + __forceinline auto& get_syscalls( ) { + return m_syscalls; + } +}; \ No newline at end of file diff --git a/legacy/loader/ui.h b/legacy/loader/ui.h new file mode 100644 index 0000000..a6874f5 --- /dev/null +++ b/legacy/loader/ui.h @@ -0,0 +1,123 @@ +#pragma once +#include "ui_base_item.h" +#include "ui_menu.h" +#include "ui_form.h" +#include "ui_render.h" +#include "ui_checkbox.h" +#include "ui_tab_manager.h" +#include "ui_slider.h" +#include "ui_dropdown.h" +#include "ui_key_picker.h" +#include "ui_button.h" +#include "ui_color_picker.h" +#include "ui_label.h" +#include "ui_text_input.h" +#include "ui_progressbar.h" + +char g_login[ 32 ]; +int g_game = 1; +float g_progress = 0.f; + +enum { + STATUS_LOGIN, + STATUS_LOGGING_IN, + STATUS_LOGGED_IN, + STATUS_LOADING, +}; + +int g_status = STATUS_LOGIN; + +extern void execute_login( ); + +enum { + GAME_UNSAFE = 0, + GAME_SAFE = 1, +}; + +struct game_t { + int status; + char name[ 32 ]; + bool valid_sub; +}; + + +std::vector< game_t > games = { + { GAME_SAFE, xors( "csgo" ), true }, + { GAME_UNSAFE, xors( "csgo ( beta )" ), false } +}; + + +//fill this vector when receiving game data based on the one above (this is just a test sample one) +std::vector< ui::dropdowns::dropdown_item_t< int > > game_list = { + { xors( "csgo" ), 1 }, + { xors( "csgo ( beta )" ), 2 }, +}; + +namespace ui +{ + auto menu = std::make_shared< ui::c_menu >( 0, 0, 500, 400, xors( "moneybot" ), "" ); + + static void render( ) { + static bool was_setup = false; + if( !was_setup ) { + menu = std::make_shared< ui::c_menu >( 0, 0, 450, 375, xors( "moneybot" ), "" ); + + auto login_form = menu->add_item( std::make_shared< ui::c_form >( 120, 20, 190, + 115, xors( "login" ) ) ); { + login_form->add_item( std::make_shared< ui::c_text_input >( 15, 0, 140, xors( "username" ), 32, g_login, true ) ); + login_form->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 3 ) ); + login_form->add_item( std::make_shared< ui::c_button >( 15, 0, 140, 18, xors( "submit" ), [ ]( ) { + g_status = STATUS_LOGGING_IN; + /* + execute your code to log in here + */ + } ) ); + } + + login_form->set_cond( [ ]( ) { return g_status == STATUS_LOGIN; } ); + + auto logging_in_form = menu->add_item( std::make_shared< ui::c_form >( 120, 20, 190, 115, xors( "logging in" ) ) ); { + logging_in_form->add_item( std::make_shared< ui::c_label >( 54, 39, xors( "please wait." ) ) ); + } + + logging_in_form->set_cond( [ ]( ) { return g_status == STATUS_LOGGING_IN; } ); + + auto games_form = menu->add_item( std::make_shared< ui::c_form >( 120, 20, 190, 115, xors( "inject" ) ) ); { + games_form->add_item( std::make_shared< ui::c_dropdown< > >( 15, 0, 140, xors( "game" ), &g_game, &game_list ) ); + games_form->add_item( std::make_shared< ui::c_button >( 15, 0, 140, 18, xors( "inject" ), [ ]( ) { + g_status = STATUS_LOADING; + /* + execute your code to inject here + */ + } ) ); + + games_form->add_item( std::make_shared< ui::c_label >( 15, 0, xors( "subscription: active" ) ) )->set_cond( [ ]( ) { return games.at( g_game - 1 ).valid_sub; } ); + games_form->add_item( std::make_shared< ui::c_label >( 15, 0, xors( "subscription: inactive" ) ) )->set_cond( [ ]( ) { return !games.at( g_game - 1 ).valid_sub; } ); + games_form->add_item( std::make_shared< ui::c_label >( 15, 0, xors( "status: safe" ) ) )->set_cond( [ ]( ) { return games.at( g_game - 1 ).status == GAME_SAFE; } ); + games_form->add_item( std::make_shared< ui::c_label >( 15, 0, xors( "status: unsafe" ) ) )->set_cond( [ ]( ) { return games.at( g_game - 1 ).status == GAME_UNSAFE; } ); + } + + games_form->set_cond( [ ]( ) { return g_status == STATUS_LOGGED_IN; } ); + + auto loading_form = menu->add_item( std::make_shared< ui::c_form >( 120, 20, 190, 115, xors( "loading" ) ) ); { + loading_form->add_item( std::make_shared< ui::c_label >( 54, 39, xors( "please wait." ) ) ); + } + + loading_form->set_cond( [ ]( ) { return g_status == STATUS_LOADING; } ); + + menu->add_item( std::make_shared< ui::c_button >( 393, 208, 50, 18, xors( "exit" ), [ ]( ) { exit( 0 ); } ) ); + + was_setup = true; + } + else { + render_item( menu.get( ) ); + static float loading_time; + if( g_status == STATUS_LOGGING_IN && !loading_time ) { + loading_time = GetTickCount( ) * 0.001f + 2.f; + } + else if( g_status == STATUS_LOGGING_IN && GetTickCount( ) * 0.001f > loading_time ) { + g_status = STATUS_LOGGED_IN; + } + } + } +} \ No newline at end of file diff --git a/legacy/loader/ui_base_item.h b/legacy/loader/ui_base_item.h new file mode 100644 index 0000000..f33a21e --- /dev/null +++ b/legacy/loader/ui_base_item.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include + +#include "ui_draw.h" + +namespace ui +{ + //the offset between each item + constexpr int ITEM_OFFSET = 5; + + class base_item : public std::enable_shared_from_this< base_item > { + public: + base_item( ) { } + base_item( int x, int y, int w, int h, const char* name = nullptr ) : + m_x( x ), m_y( y ), m_width( w ), m_height( h ) { + if( name ) { + strcpy_s< 256 >( m_text, name ); + } + } + + virtual void render( ) { }; + virtual bool is_hovered( ) { return false; } + virtual bool is_form( ) const { return false; } + + virtual void reset( ) { + m_y_offset = 0; + } + + virtual int get_total_height( ) const { + return m_height; + } + + void set_y_offset( int offset ) { + m_y_offset = offset; + } + + int get_y_offset( ) const { + return m_y_offset; + } + + auto add_item( std::shared_ptr< base_item > item ) { + item.get( )->m_parent = shared_from_this( ); + m_items.emplace( m_items.begin( ), item ); + + return item; + } + + auto& get_items( ) { return m_items; } + auto get_parent( ) { return m_parent; } + + virtual int x( ) const { return m_x; } + virtual int y( ) const { return m_y; } + virtual int w( ) const { return m_width; } + virtual int h( ) const { return m_height; } + + void set_x( int x ) { m_x = x; } + void set_y( int y ) { m_y = y; } + + void set_width( int w ) { m_width = w; } + void set_height( int h ) { m_height = h; } + + bool get_visible( ) const { + if( m_cond && !m_cond( ) ) { + return false; + } + + return m_visible; + } + + void set_cond( std::function< bool( ) > func ) { + m_cond = func; + } + + void set_visible( bool vis ) { m_visible = vis; } + void set_text( const char* text ) { + strcpy_s< 256 >( m_text, text ); + } + auto get_text( ) const { + return m_text; + } + + std::shared_ptr< base_item > find_item( const char* name ) { + if( !m_items.empty( ) ) { + for( auto& it : m_items ) { + if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { + return it; + } + + auto it_find = it->find_item( name ); + if( it_find != it ) return it_find; + } + } + + return shared_from_this( ); + } + + auto get_top_parent( ) { + for( auto parent = m_parent; ; + parent = parent->get_parent( ) ) { + if( !parent->get_parent( ) ) { + return parent; + } + } + + return shared_from_this( ); + } + + int get_relative_x( ) { + int x = m_x; + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + x += parent->x( ); + } + + return x; + } + + int get_relative_y( ) { + int y = m_y + get_y_offset( ); + for( auto parent = get_parent( ); !!parent; + parent = parent->get_parent( ) ) { + y += parent->y( ) + parent->get_y_offset( ); + } + + return y; + } + + void set_disabled( bool disabled ) { + m_disabled = disabled; + + for( auto& it : m_items ) { + it->set_disabled( disabled ); + } + } + + void set_disabled_callbacks( bool disabled ) { + auto top = get_top_parent( ); + + top->set_disabled( disabled ); + + m_disabled = false; + } + + protected: + int m_x{ }; + int m_y{ }; + + int m_width{ }; + int m_height{ }; + + //current y position for rendering + int m_y_offset{ }; + + bool m_visible = true; + bool m_disabled = false; + char m_text[ 256 ]{ }; + + std::shared_ptr< base_item > m_parent; + std::vector< std::shared_ptr< base_item > > m_items; + std::function< bool( ) > m_cond; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_button.h b/legacy/loader/ui_button.h new file mode 100644 index 0000000..022fc67 --- /dev/null +++ b/legacy/loader/ui_button.h @@ -0,0 +1,56 @@ +#pragma once + +#include + +#include "ui_base_item.h" + +namespace ui +{ + class c_button : public base_item { + public: + c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : + base_item( x, y, w, h, name ), m_fn( fn ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); + if ( !m_mouse_held ) { + m_fn( ); + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); + } + + protected: + std::function< void( ) > m_fn; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_checkbox.h b/legacy/loader/ui_checkbox.h new file mode 100644 index 0000000..50cad1c --- /dev/null +++ b/legacy/loader/ui_checkbox.h @@ -0,0 +1,68 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_checkbox : public base_item { + public: + c_checkbox( int x, int y, const char* txt, bool* setting ) : + base_item( x, y, 16, 16, txt ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int rel_x = get_relative_x( ); + int rel_y = get_relative_y( ); + + return mouse_x >= rel_x && mouse_x <= rel_x + m_width + && mouse_y >= rel_y && mouse_y <= rel_y + m_height; + } + + inline void render_checkbox( const int& x, const int& y ) { + clr_t col = ui_get_bg_col( ); + if ( is_hovered( ) ) { + col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; + } + else if ( *m_setting ) { + col = ui_get_accent_col( ); + } + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); + + //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + } + + inline void input( ) { + bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); + + if ( is_hovered( ) && mouse_presesed ) { + if ( !m_mouse_held ) { + *m_setting = !*m_setting; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + render_checkbox( x, y ); + input( ); + + + ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); + } + + protected: + bool* m_setting; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_color_picker.h b/legacy/loader/ui_color_picker.h new file mode 100644 index 0000000..2711d29 --- /dev/null +++ b/legacy/loader/ui_color_picker.h @@ -0,0 +1,201 @@ +#pragma once + +#include "ui_base_item.h" +#include "d3d.hpp" + +namespace ui +{ + class c_color_picker : public base_item { + static constexpr int BOX_WIDTH = 106; + static constexpr int BOX_HEIGHT = 125; + public: + c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : + base_item( x, y, w, 4, name ), m_setting( setting ), + m_has_text( true ) { } + + c_color_picker( int x, int y, int w, clr_t* setting ) : + base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), + m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ); + + int cursor_x, cursor_y; + ui_get_cursor_pos( cursor_x, cursor_y ); + + if ( m_has_text ) y += 12; + + if ( !m_active ) { + return cursor_x >= x && cursor_x <= x + m_width + && cursor_y >= y && cursor_y <= y + m_height; + } + + return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 + && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; + } + + virtual int get_total_height( ) const override { + return m_has_text ? ( m_height + 12 ) : m_height; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_active ) { + m_mouse_held = true; + } + + m_active = true; + } + else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_active = false; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + + m_hue = m_setting->hue( ); + if ( m_hue > 1.0f ) { + m_hue -= 359.f; + } + + m_saturation = m_setting->saturation( ); + m_brightness = m_setting->brightness( ) / 255.f; + m_alpha = m_setting->a( ); + } + + void output( ) { + *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); + m_setting->a( ) = m_alpha; + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + if ( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + y += 12; + } + + input( ); + + if ( m_active ) { + RECT old_rect; + g_d3d.get_device( )->GetScissorRect( &old_rect ); + + RECT new_rect{ + x - 1, y - 1, + x + BOX_WIDTH + 22, + y + BOX_HEIGHT + 2 + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + clr_t bg_col( 0, 0, 0, 90 ); + ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); + ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); + + for ( int i{ }; i < 100; i += 3 ) { + for ( int i2{ }; i2 < 100; i2 += 3 ) { + ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, + clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); + } + } + + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held + && mouse_x > x && mouse_x <= x + 100 + && mouse_y > y && mouse_y <= y + 100 ) { + + int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); + int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); + + int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); + int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); + + m_saturation = float( delta_y ) * 0.01f; + m_brightness = float( delta_x ) * 0.01f; + } + + auto is_hue_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 110 && mouse_x < x + 122 + && mouse_y > y && mouse_y < y + 100; + }; + + auto draw_slider_hue = [&]( ) { + for ( int i{ }; i < 100; ++i ) { + auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); + + ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); + } + + ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, + is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + auto is_alpha_slider_hovered = [&]( ) -> bool { + return mouse_x > x + 1 && mouse_x < x + 122 + && mouse_y > y + 110 && mouse_y < y + 124; + }; + + auto draw_slider_alpha = [&]( ) { + for ( int i{ 121 }; i >= 0; --i ) { + auto col = *m_setting; + col.a( ) = ( int )( float( i ) * 255.f / 121.f ); + + ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); + } + + int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); + ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, + is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); + }; + + draw_slider_hue( ); + if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_y - y, 0, 100 ); + m_hue = float( delta ) * 0.01f; + } + + draw_slider_alpha( ); + if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + int delta = std::clamp( mouse_x - x, 0, 121 ); + m_alpha = ( int )( float( delta ) * 255.f / 121.f ); + } + + output( ); + + g_d3d.get_device( )->SetScissorRect( &old_rect ); + } + else { + if ( is_hovered( ) ) { + ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); + } + ui_draw_rect( x, y, m_width, m_height, *m_setting ); + } + } + + protected: + clr_t* m_setting = nullptr; + bool m_active = false; + bool m_mouse_held = false; + float m_saturation = 1.0f; + float m_brightness = 1.0f; + float m_hue = 0.f; + uint8_t m_alpha = 255; + bool m_has_text = false; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_draw.h b/legacy/loader/ui_draw.h new file mode 100644 index 0000000..46c91de --- /dev/null +++ b/legacy/loader/ui_draw.h @@ -0,0 +1,160 @@ +#pragma once +#include + +#include "color.hpp" +#include "d3d.hpp" +#include "d3d_sprite.hpp" +#include "input_system.hpp" +#include "window.hpp" + +namespace ui +{ + /*__forceinline auto ui_get_background_texture( ) { + static auto buffer = std::make_shared< byte[ 512 ] >( ); + static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); + static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); + static IDirect3DTexture9* texture; + + if ( !texture ) { + for ( int i = 0; i < 512; i += 4 ) { + *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; + } + + D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); + } + + return texture; + }*/ + + static float anim_time{ }; + + __forceinline void set_animtime( float animtime ) { + anim_time = animtime; + } + + __forceinline void setup_sprites( IDirect3DDevice9* device ) { + //fuck msvc + //icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + //icons::sprite_visuals_.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); + //icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); + //icons::sprite_visuals.init( device, icons::raw::visuals_raw, icons::visuals_size, 66, 66 ); + //icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); + //icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); + } + + __forceinline clr_t ui_get_accent_col( ) { + static const clr_t col_start = clr_t( 231, 105, 105, 255 ); + static const clr_t col_end = clr_t( 0xf4, 0x7c, 0xa8, 255 ); + + clr_t col = clr_t::blend( col_start, col_end, anim_time ); + + return col; + } + + __forceinline clr_t& ui_get_disabled_col( ) { + static clr_t col = clr_t( 61, 61, 61, 255 ); + return col; + } + + __forceinline clr_t& ui_get_bg_col( ) { + static clr_t col = clr_t( 24, 25, 27, 255 ); + return col; + } + + __forceinline clr_t& ui_get_text_col( ) { + static clr_t col = clr_t( 221, 221, 221, 255 ); + return col; + } + + __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, + clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { + + g_d3d.draw_gradient( start, end, x, y, w, h, type ); + } + + __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { + g_d3d.draw_line( color, x, y, x1, y1 ); + } + + __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_filled_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { + g_d3d.draw_rect( color, x, y, w, h ); + } + + __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { + g_d3d.draw_filled_circle( color, x, y, r, res ); + } + + __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { + char buf[ 2048 ]{ }; + va_list list{ }; + + __crt_va_start( list, str ); + vsprintf_s( buf, 2048, str, list ); + __crt_va_end( list ); + + g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, + center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); + } + + __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { + char* buf = ( char* )_alloca( 2048 ); + va_list list{ }; + + __crt_va_start( list, text ); + vsprintf_s( buf, 2048, text, list ); + __crt_va_end( list ); + + w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); + h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); + } + + __forceinline void ui_get_cursor_pos( int& x, int& y ) { + POINT p; + GetCursorPos( &p ); + ScreenToClient( g_window.get_hwnd( ), &p ); + x = p.x; y = p.y; + } + + __forceinline float ui_get_frametime( ) { + return 0.0152f; + //return g_csgo.m_frametime; + } + + __forceinline void ui_draw_cursor( ) { + const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); + int x, y; + ui_get_cursor_pos( x, y ); + + + for ( int i{ }; i <= 9; ++i ) { + ui_draw_line( x, y, x + i, y + 11, accent ); + } + + for ( int i{ }; i <= 7; ++i ) { + ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); + } + + for ( int i{ }; i <= 3; ++i ) { + ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); + } + + ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); + ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); + + ui_draw_line( x, y, x, y + 17, black ); + ui_draw_line( x, y + 17, x + 3, y + 14, black ); + ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); + ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); + ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); + ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); + ui_draw_line( x + 11, y + 12, x, y, black ); + } +} \ No newline at end of file diff --git a/legacy/loader/ui_dropdown.h b/legacy/loader/ui_dropdown.h new file mode 100644 index 0000000..ea626bc --- /dev/null +++ b/legacy/loader/ui_dropdown.h @@ -0,0 +1,217 @@ +#pragma once +#include "ui_dropdown_item.h" + +namespace ui +{ + template < typename t = int > + class c_dropdown : public base_item { + public: + c_dropdown( int x, int y, int w, const char* name, t* setting, + std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : + base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), + m_max_items( max_items ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + inline bool is_any_item_hovered( ) { + if ( m_disabled || !m_active ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + m_height + 12; + int h = m_height * ( std::min< size_t >( + m_dropdown_items->size( ), m_max_items ) ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 13; + } + + void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { + ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); + ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); + } + + void update_value( ) { + for ( auto& it : *m_dropdown_items ) { + if ( it.m_value == *m_setting ) { + m_selected_item = ⁢ + } + } + } + + void draw_items( const int& x, const int& y ) { + auto& items = *m_dropdown_items; + auto it = &items.front( ); + int offset = m_height + 1; + int hovered = 0; + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + auto is_hovered = [ & ] ( int y_offset ) { + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; + }; + + + for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; + i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); + ++i, offset += m_height + 1 + ) { + it = &items.at( i ); + + draw_box( x, y + offset, it->m_name ); + + if ( is_hovered( offset ) ) { + hovered = offset; + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_selected_item = it; + *m_setting = it->m_value; + m_active = false; + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + } + } + + if ( hovered ) { + ui_draw_outlined_rect( x - 1, y - 1 + hovered, + m_width + 1, m_height + 1, ui_get_text_col( ) ); + } + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = !m_active; + } + m_mouse_held = true; + } + else if ( !is_any_item_hovered( ) ) { + m_mouse_held = false; + } + + if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { + m_active = false; + } + + if ( GetTickCount( ) * 0.001f > m_enable_time && m_enable_next_frame ) { + set_disabled_callbacks( false ); + m_enable_next_frame = false; + } + + + active_changed = m_active != active_backup; + //disable input on all items + if ( active_changed ) { + if ( !m_active ) { + m_enable_time = GetTickCount( ) * 0.001f + 0.220f; + m_enable_next_frame = true; + } + else { + set_disabled_callbacks( true ); + } + } + + if ( m_selected_item ) { + *m_setting = m_selected_item->m_value; + } + + if ( m_active && m_dropdown_items->size( ) > m_max_items ) { + int scroll_input = g_input.get_scroll_state( ); + + if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max + m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it + + if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) + m_curr_scroll = m_dropdown_items->size( ) - m_max_items; + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + bool restore = false; + RECT prev_rect{ }; + + if ( m_active ) { + restore = true; + g_d3d.get_device( )->GetScissorRect( &prev_rect ); + + RECT new_rect{ + prev_rect.left, + prev_rect.top, + g_d3d.m_width, + g_d3d.m_height, + }; + + g_d3d.get_device( )->SetScissorRect( &new_rect ); + + draw_items( x, y + 11 ); + + + //draw scrollbar + size_t total_items = m_dropdown_items->size( ); + if ( total_items > m_max_items ) { + const size_t height = ( m_height + 1 ) * m_max_items; + const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); + + size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); + ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); + } + } + + update_value( ); + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + if ( m_selected_item ) { + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); + } + + if( restore ) { + g_d3d.get_device( )->SetScissorRect( &prev_rect ); + } + } + + protected: + std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; + dropdowns::dropdown_item_t< t >* m_selected_item{ }; + bool m_active = false; + bool m_mouse_held = false; + t* m_setting{ }; + size_t m_max_items{ }; + size_t m_curr_scroll{ }; + float m_enable_time{ }; + int m_enable_next_frame{ }; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_dropdown_item.h b/legacy/loader/ui_dropdown_item.h new file mode 100644 index 0000000..9ffa60d --- /dev/null +++ b/legacy/loader/ui_dropdown_item.h @@ -0,0 +1,22 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + namespace dropdowns + { + template < typename t = int > + struct dropdown_item_t { + const char* m_name; + t m_value; + }; + + std::vector< dropdown_item_t< > > games = { + { xors( "csgo" ), 1 }, + { xors( "csgo (beta)" ), 3 }, + { xors( "tf2" ), 2 }, + { xors( "gmod (beta)" ), 4 } + }; + } +} \ No newline at end of file diff --git a/legacy/loader/ui_form.h b/legacy/loader/ui_form.h new file mode 100644 index 0000000..2fdf6e7 --- /dev/null +++ b/legacy/loader/ui_form.h @@ -0,0 +1,130 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_form : public base_item { + public: + c_form( int x, int y, int w, int h, const char* name, int max_h = 0 ) : + base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ) { }; + + virtual int x( ) const override { + return m_x + 10; + } + + virtual int y( ) const override { + return m_y + m_scroll_offset + 9; + } + + virtual bool is_form( ) const override { + return true; + } + + virtual bool is_hovered( ) override { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + int x = get_relative_x( ); + int y = get_relative_y( ); + + return mouse_x > x && mouse_x < x + w( ) + && mouse_y > y && mouse_y < y + h( ); + } + + inline void update_size( ) { + if ( !m_dynamic ) return; + + int total_height{ ITEM_OFFSET * 2 }; + for ( auto& it : m_items ) { + if ( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + if( m_max_height && total_height + item_height > m_max_height ) { + total_height = m_max_height; + break; + } + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + m_height = total_height; + } + + virtual int get_total_height( ) const override { + return m_height + 5; + } + + int get_total_item_height( ) { + int total_height{ ITEM_OFFSET * 2 }; + for( auto& it : m_items ) { + if( it->get_visible( ) ) { + auto item_height = it->get_total_height( ) + ITEM_OFFSET; + total_height += it->get_total_height( ) + ITEM_OFFSET; + } + } + + return total_height; + } + + void input( ) { + if( m_max_height && get_total_item_height( ) > m_max_height ) { + if( !m_disabled && is_hovered( ) ) { + auto scroll_state = g_input.get_scroll_state( ); + if( !!scroll_state && m_was_hovered ) { + scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; + } + m_scroll_offset = std::clamp( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ), 0 ); + } + } + else { + m_scroll_offset = 0; + } + } + + virtual void render( ) override { + update_size( ); + input( ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int text_w, text_h; + ui_get_text_size( text_w, text_h, m_text ); + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); + } + + ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_max_height && get_total_item_height( ) > m_height ) { + const size_t height = get_total_height( ) - 20; + const float delta = ( float )( get_total_item_height( ) - height + 1 ); + const float slider_step = ( ( float )( height ) / delta ); + const float slider_height = slider_step * 13.f; + + size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); + ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); + ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); + } + + if( is_hovered( ) != m_was_hovered ) { + bool backup = m_disabled; + if( !backup ) { + set_disabled( !is_hovered( ) ); + } + m_disabled = backup; + } + + ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); + ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); + + m_was_hovered = is_hovered( ); + } + + protected: + bool m_dynamic{ }; + bool m_was_hovered{ }; + int m_max_height{ }; + int m_scroll_offset{ }; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_key_picker.h b/legacy/loader/ui_key_picker.h new file mode 100644 index 0000000..03aed84 --- /dev/null +++ b/legacy/loader/ui_key_picker.h @@ -0,0 +1,164 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_key_picker : public base_item { + public: + c_key_picker( int x, int y, int w, const char* name, int* setting ) : + base_item( x, y, w, 16, name ), m_setting( setting ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + int h = m_height; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + + return mouse_x >= x && mouse_x <= x + m_width + && mouse_y >= y && mouse_y <= y + h; + } + + virtual int get_total_height( ) const override { + return m_height + 12; + } + + void input( ) { + bool active_backup = m_active; + bool active_changed = false; + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + input( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); + ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, + is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); + + ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), + g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); + } + + protected: + int* m_setting{ }; + bool m_active{ }; + bool m_mouse_held{ }; + }; + + //skEeT PiCkErS + class c_key_picker_small : public base_item { + public: + c_key_picker_small( int x, int y, int* setting ) : + base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } + + virtual int get_total_height( ) const override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int w, h; + ui_get_text_size( w, h, name ); + + return h; + } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + int mouse_x, mouse_y; + int w, h; + + ui_get_text_size( w, h, "[%s]", name ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= x - w && mouse_x <= x + && mouse_y >= y && mouse_y <= y + h; + } + + void input( ) { + + bool active_backup = m_active; + bool active_changed = false; + + if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { + m_active = false; + *m_setting = KEYS_NONE; + } + + if ( m_active && !m_mouse_held ) { + int key = g_input.is_any_key_pressed( ); + if ( key != KEYS_NONE ) { + *m_setting = key; + m_active = false; + } + } + + if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if ( !m_mouse_held ) { + m_active = true; + } + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + + active_changed = active_backup != m_active; + if ( active_changed ) { + set_disabled_callbacks( m_active ); + } + } + + virtual void render( ) override { + const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); + int x = get_relative_x( ); + int y = get_relative_y( ); + + int w, h; + ui_get_text_size( w, h, "[%s]", name ); + + input( ); + + ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? + ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); + } + + protected: + int* m_setting; + bool m_active{ }; + bool m_mouse_held{ }; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_label.h b/legacy/loader/ui_label.h new file mode 100644 index 0000000..9df46b5 --- /dev/null +++ b/legacy/loader/ui_label.h @@ -0,0 +1,18 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_label : public base_item { + public: + c_label( int x, int y, const char* text ) : + base_item( x, y, 0, 16, text ) { } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); + } + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_menu.h b/legacy/loader/ui_menu.h new file mode 100644 index 0000000..c7406b5 --- /dev/null +++ b/legacy/loader/ui_menu.h @@ -0,0 +1,104 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_menu : public base_item { + public: + c_menu( int start_x, int start_y, int width, + int height, const char* name, const char* right_text = nullptr ) : + base_item( start_x, start_y, width, height, name ), + m_right_text( right_text ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= m_x && mouse_x <= m_x + w( ) + && mouse_y >= m_y && mouse_y <= m_y + 19; + } + + virtual int y( ) const override { + return m_y + 19; + } + + inline void input( ) { + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + bool window_hovered = GetActiveWindow( ) == g_window.get_hwnd( ); + + RECT cur_rect{ }; + GetWindowRect( g_window.get_hwnd( ), &cur_rect ); + + POINT p{ cur_rect.left, cur_rect.top }; + ScreenToClient( g_window.get_hwnd( ), &p ); + + if( !window_hovered ) { + m_mouse_held = false; + mouse_clicked = false; + return; + } + + if ( is_hovered( ) ) { + m_mouse_held = true; + } + + if ( !mouse_clicked ) { + m_mouse_held = is_hovered( ); + } + + if ( m_mouse_held && !mouse_clicked ) { + m_drag_offset_y = mouse_y - p.y; + m_drag_offset_x = mouse_x - p.x; + } + + if ( m_mouse_held && mouse_clicked ) { + int new_x = mouse_x - m_drag_offset_x + cur_rect.left; + int new_y = mouse_y - m_drag_offset_y + cur_rect.top; + + MoveWindow( g_window.get_hwnd( ), new_x, new_y, 451, 376, true ); + } + } + + virtual void render( ) override { + constexpr auto top_height = 19; + + input( ); + + //draw a c00l shadow + ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); + + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); + if( is_hovered( ) ) { + ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); + } + + for( int i{ }; i < 8; ++i ) { + clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); + ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); + } + ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); + + if( m_right_text ) { + ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); + + int width, height; + ui_get_text_size( width, height, m_right_text ); + + ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); + } + else { + ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); + } + } + + protected: + int m_drag_offset_x{ }; + int m_drag_offset_y{ }; + bool m_mouse_held{ }; + const char* m_right_text{ }; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_progressbar.h b/legacy/loader/ui_progressbar.h new file mode 100644 index 0000000..33bcf65 --- /dev/null +++ b/legacy/loader/ui_progressbar.h @@ -0,0 +1,44 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_progress_bar : public base_item { + public: + c_progress_bar( int x, int y, int w, float* progress ) : + base_item( x, y, w, 4, xors( "PROGRESS_BAR" ) ), + m_progress( progress ) { } + + + virtual void render( ) override { + static const clr_t col_start = clr_t( 231, 105, 105, 255 ); + static const clr_t col_end = clr_t( 0xf4, 0x7c, 0xa8, 255 ); + + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + if( *m_progress > 0.001f ) { + int fill = *m_progress * m_width; + + bool reverse = false; + for( int i{ }; i < fill; ++i ) { + float progress = std::fmod( float( i ) / fill - ( anim_time ), 1.f ); + if( progress == 1.0f ) reverse = true; + if( reverse ) { + progress = 1.0f - progress; + } + + clr_t col = clr_t::blend( col_start, col_end, progress ); + + + ui_draw_rect( x + i, y, 1, m_height, col ); + } + } + } + + private: + float* m_progress; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_render.h b/legacy/loader/ui_render.h new file mode 100644 index 0000000..6dd27cc --- /dev/null +++ b/legacy/loader/ui_render.h @@ -0,0 +1,57 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + //recursively render all items + static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { + if ( !item->get_visible( ) ) return; + + item->reset( ); + item->render( ); + bool reset = false; + RECT original; + + if( allow_rect && item->is_form( ) ) { + auto device = g_d3d.get_device( ); + device->GetScissorRect( &original ); + + auto x = item->get_relative_x( ); + auto y = item->get_relative_y( ); + + RECT new_rect{ + x, + y + 4, + x + item->w( ), + y + item->get_total_height( ) - 7 + }; + + device->SetScissorRect( &new_rect ); + reset = true; + } + + if ( item->get_items( ).size( ) ) { + //madr0fl + int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); + int cur_offset = 0; + for ( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { + auto& cur_item = item->get_items( )[ i ]; + height_offset[ i ] = cur_offset; + cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; + } + + int i{ }; + for ( auto& it : item->get_items( ) ) { + item->set_y_offset( height_offset[ i ] ); + render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); + ++i; + } + } + + if( reset ) { + auto device = g_d3d.get_device( ); + device->SetScissorRect( &original ); + } + } +} \ No newline at end of file diff --git a/legacy/loader/ui_slider.h b/legacy/loader/ui_slider.h new file mode 100644 index 0000000..0e55a73 --- /dev/null +++ b/legacy/loader/ui_slider.h @@ -0,0 +1,165 @@ +#pragma once + +#include "ui_base_item.h" + +namespace ui +{ + template < typename t > + class c_slider : public base_item { + public: + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; + + c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : + base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), + m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } + + virtual bool is_hovered( ) override { + if ( m_disabled ) return false; + + int x = get_relative_x( ); + int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); + + int mouse_x, mouse_y; + ui_get_cursor_pos( mouse_x, mouse_y ); + + if( !m_has_text ) { + x += 4; + return mouse_x >= x && mouse_x <= x + m_width - 8 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 + && mouse_y >= y && mouse_y <= y + m_height + 2; + } + + void input( ) { + bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); + bool hovered = is_hovered( ); + float progress = 0.f; + int x = get_relative_x( ); + int y = get_relative_y( ) + 2; + int mouse_x, mouse_y; + + *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); + ui_get_cursor_pos( mouse_x, mouse_y ); + + if ( hovered && mouse_clicked ) { + + float progress{ }; + + if( m_has_text ) { + progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); + } + else { + progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); + } + + *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); + } + + if( !m_has_text ) { + bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; + + bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; + bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; + + if( mouse_clicked ) { + if( !m_mouse_held ) { + if( !std::is_floating_point< t >::value ) { + if( minus_hovered ) *m_setting -= ( t )1; + if( plus_hovered ) *m_setting += ( t )1; + } + else if( m_max - m_min <= 2.0f ) { + if( minus_hovered ) *m_setting -= ( t )0.1f; + if( plus_hovered ) *m_setting += ( t )0.1f; + } + } + + m_mouse_held = true; + } + else { + m_mouse_held = false; + } + } + }; + + void draw_slider( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + } + + void draw_slider_small( int x, int y ) { + float val = float( *m_setting ); + float progress = ( val - m_min ) / ( m_max - m_min ); + x -= 1; //i couldnt be fucked + + ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); + + ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); + ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, + is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); + + ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); + ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); + + char val_str[ 12 ]; + if( m_suffix ) + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ) + 3, y + 2, true, ui_get_text_col( ), val_str ); + } + + virtual int get_total_height( ) const override { + return m_height + ( m_has_text ? 12 : 6 ); + } + + virtual void render( ) override { + int x = get_relative_x( ); + int y = get_relative_y( ); + int text_w, text_h; + char val[ 12 ]; + + input( ); + + //weird hacky fix for floating point vars + if ( m_suffix ) + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); + else + sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); + + if( m_has_text ) { + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + ui_get_text_size( text_w, text_h, val ); + ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); + draw_slider( x, y + 12 ); + } + else { + draw_slider_small( x, y + 2 ); + } + } + + + protected: + t* m_setting; + t m_full; + float m_min; + float m_max; + bool m_has_text = true; + const char* m_suffix; + bool m_mouse_held = false; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_tab_manager.h b/legacy/loader/ui_tab_manager.h new file mode 100644 index 0000000..cf8dff6 --- /dev/null +++ b/legacy/loader/ui_tab_manager.h @@ -0,0 +1,224 @@ +#pragma once +#include "ui_base_item.h" + + + +namespace ui +{ + namespace { + constexpr int BUTTON_WIDTH = 120; + constexpr int BUTTON_HEIGHT = 80; + + constexpr int SUBTAB_HEIGHT = 25; + } + + class c_tab_sheet : public base_item { + public: + c_tab_sheet( const char* tab_name ) : + base_item( 0, 0, 0, 0, tab_name ), + m_fade_progress( 0 ) { }; + + c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : + base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), + m_fade_progress( 0.f ) { }; + + virtual void render( ) override { }; + virtual bool is_hovered( ) override { + return false; + }; + + public: + float m_fade_progress{ }; + d3d::c_sprite* m_sprite{ }; + }; + + + class c_tab_manager : public base_item { + public: + c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, + xors( "TAB_MANAGER" ) ) { }; + + virtual bool is_hovered( ) override { + return false; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto text = item->get_text( ); + auto parent_x = m_parent->x( ) + 5; + auto parent_y = m_parent->y( ) + 5; + int item_height = BUTTON_HEIGHT; + + scale_button_fade( item, hovered ); + + ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, + item_height + 1, ui_get_bg_col( ) ); + + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_disabled_col( ) ); + + if( hovered ) { + ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, + parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, + ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); + } + + if( item->m_sprite ) { + auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); + item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, + parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); + } + } + + inline bool is_button_hovered( int start ) { + auto item_x = m_parent->x( ) + 5; + auto item_y = m_parent->y( ) + 5 + start; + int item_height = BUTTON_HEIGHT; + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 + && mouse_y >= item_y && mouse_y <= item_y + item_height; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int cur_y{ 10 }; + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( cur_y ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); + cur_y += BUTTON_HEIGHT + 4; + } + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + + protected: + decltype( m_parent ) m_selected_tab{ }; + }; + + + class c_subtab_manager : public base_item { + public: + c_subtab_manager( ) : base_item( 0, 35, 0, 5, + xors( "SUBTAB_MANAGER" ) ) { } + + virtual bool is_hovered( ) override { return false; } + + int get_button_width( ) { + int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; + + if ( !m_items.empty( ) ) + return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); + + return width; + } + + inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { + if ( hovered ) { + constexpr float frequency = 1.f / 0.3f; + const float step = ui_get_frametime( ) * frequency; + + item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); + } + else { + item->m_fade_progress = 0.f; + } + } + + auto get_selected_tab( ) { + return m_selected_tab; + } + + void render_button( decltype( m_parent )& button, int start, bool hovered ) { + auto item = ( c_tab_sheet* )button.get( ); + auto item_x = get_relative_x( ) + start - 2; + auto item_y = get_relative_y( ) + 3 - m_y; + auto width = get_button_width( ); + + scale_button_fade( item, hovered ); + clr_t tab_clr = ui_get_disabled_col( ); + + //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); + if ( hovered ) { + clr_t col = ui_get_accent_col( ); + col.a( ) *= item->m_fade_progress; + ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); + } + + ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); + } + + bool is_button_hovered( decltype( m_parent )& button, int start ) { + int item_x = get_relative_x( ) + start - 2; + int item_y = get_relative_y( ) + 3 - m_y - 3; + int item_w = get_button_width( ); + int mouse_x, mouse_y; + + ui_get_cursor_pos( mouse_x, mouse_y ); + + return mouse_x >= item_x && mouse_x <= item_x + item_w && + mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; + } + + virtual void render( ) override { + if ( !m_items.empty( ) ) { + int start = 2; + int width = get_button_width( ); + + for ( auto& it : m_items ) { + it->set_visible( false ); + bool hovered = is_button_hovered( it, start ); + if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { + //fix items that disable input mess it up when changing tabs + set_disabled_callbacks( false ); + m_selected_tab = it; + } + + render_button( it, start, hovered || it == m_selected_tab ); + start += width; + } + + if ( !m_selected_tab ) { + m_selected_tab = m_items.front( ); + } + + m_selected_tab->set_visible( true ); + } + } + + protected: + decltype( m_parent ) m_selected_tab; + }; +} \ No newline at end of file diff --git a/legacy/loader/ui_text_input.cpp b/legacy/loader/ui_text_input.cpp new file mode 100644 index 0000000..db1ec7c --- /dev/null +++ b/legacy/loader/ui_text_input.cpp @@ -0,0 +1,86 @@ +#include "ui_text_input.h" +#include + +#include + +void ui::c_text_input::render( ) { + if( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + if( !m_was_held ) { + m_active ^= 1; + } + m_was_held = true; + } + else { + m_was_held = false; + } + + if( m_active ) { + if( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { + m_active = false; + } + + float current_time = GetTickCount( ) * 0.001f; + size_t length = strlen( m_text_ptr ); + + for( size_t i{ }; i < 0xfe; ++i ) { + if( g_input.is_key_pressed( i ) ) { + float delta_time = current_time - m_last_key_input[ i ]; + if( fabs( delta_time ) > 0.2f ) { + if( i == KEYS_BACK ) { + m_text_ptr[ length - 1 ] = 0; + m_last_key_input[ i ] = current_time; + continue; + } + + if( i == KEYS_RETURN ) { + m_active = false; + break; + } + + m_key_states[ i ] = 0xf0; + wchar_t pressed_char; + const auto scan = MapVirtualKeyA( i, 2 ); + auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); + + if( ret == 1 ) { + if( length < m_text_len ) { + m_text_ptr[ length ] = ( char )( pressed_char ); + m_text_ptr[ length + 1 ] = 0; + } + } + m_last_key_input[ i ] = current_time; + } + } + else { + m_last_key_input[ i ] = 0.f; + m_key_states[ i ] = 0; + } + } + + if( g_input.is_key_pressed( KEYS_RETURN ) ) { + m_active = false; + } + } + + int x = get_relative_x( ); + int y = get_relative_y( ); + + ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); + y += 12; + + ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, + ( is_hovered( ) || m_active ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); + ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); + + if( !m_hidden ) + ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), m_active ? "%s_" : "%s", m_text_ptr ); + else { + std::string str; + str.append( strlen( m_text_ptr ), '*' ); + + if( m_active ) + str += '_'; + + ui_draw_string( x + 2, y + 3, false, ui_get_text_col( ), str.c_str( ) ); + } +} \ No newline at end of file diff --git a/legacy/loader/ui_text_input.h b/legacy/loader/ui_text_input.h new file mode 100644 index 0000000..243c40b --- /dev/null +++ b/legacy/loader/ui_text_input.h @@ -0,0 +1,38 @@ +#pragma once +#include "ui_base_item.h" + +namespace ui +{ + class c_text_input : public base_item { + public: + c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str, bool hidden = false ) : + base_item( x, y, w, 16, name ), m_text_len( max_chars ), m_text_ptr( str ), m_hidden( hidden ) { + } + + virtual bool is_hovered( ) override { + int cursor_x, cursor_y; + ui_get_cursor_pos( cursor_x, cursor_y ); + + int x = get_relative_x( ); + int y = get_relative_y( ) + 12; + + return cursor_x >= x && cursor_x <= x + m_width + && cursor_y >= y && cursor_y <= y + m_height; + } + + virtual int get_total_height( ) const override { + return m_height + 12; + } + + virtual void render( ) override; + + protected: + bool m_was_held{ }; + char* m_text_ptr{ }; + size_t m_text_len{ }; + bool m_active{ }; + float m_last_key_input[ KEYS_LAST ]{ }; + uint8_t m_key_states[ 256 ]{ }; + bool m_hidden{ }; + }; +} \ No newline at end of file diff --git a/legacy/loader/util.hpp b/legacy/loader/util.hpp new file mode 100644 index 0000000..68de3fb --- /dev/null +++ b/legacy/loader/util.hpp @@ -0,0 +1,101 @@ +#pragma once +#include +#include +#include + +#define xors( s ) s + +#define NAMESPACE_REGION( x ) namespace x { +#define END_REGION } + +extern int TIME_TO_TICKS( float dt ); +extern float TICKS_TO_TIME( int tick ); +extern float TICK_INTERVAL( ); + +//WEE WOO WEE WOO ITS THE DWORD POLICE +using ulong_t = unsigned long; +using uword_t = unsigned short; + +class IClientEntity; +class CTraceFilter; +class CGameTrace; +class vec3_t; +class vec2_t; + +NAMESPACE_REGION( util ) + +typedef std::unique_ptr< void, void( ) > unique_handle; + +template < typename t > +struct reverse_iterable { + reverse_iterable( t&& it ) : + iterable( it ) { } + + t& iterable; + inline auto begin( ) { + return std::rbegin( iterable ); + } + + inline auto end( ) { + return std::rend( iterable ); + } +}; + +template< typename t > +reverse_iterable< t > +reverse_iterator( t&& iter ) { + return reverse_iterable< t >{ iter }; +} + +template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { + if( !classbase ) return fn{ }; + return ( fn )( *( uintptr_t** )classbase )[ index ]; +} + +template < size_t index, typename ret, class ... args_ > +__forceinline ret get_vfunc( void* thisptr, args_... args ) { + using fn = ret( __thiscall* )( void*, args_... ); + + auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; + return fn_ptr( thisptr, args... ); +} + +__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { + std::string ascii_str( unicode.begin( ), unicode.end( ) ); + return ascii_str; +} + +__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { + std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); + return unicode_str; +} + +template < typename integer > +__forceinline auto to_hex_str( const integer& w, + size_t hex_len = sizeof( integer ) << 1 ) { + constexpr char* hex_digits = xors( "0123456789abcdef" ); + std::string rc( hex_len, 0 ); + + for( size_t i{ }, j{ ( hex_len - 1 ) * 4 }; i < hex_len; ++i, j -= 4 ) + rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; + + return rc; +} + +extern void clip_trace_to_player( IClientEntity* player, const vec3_t& src, const vec3_t& end, + unsigned mask, CTraceFilter* filter, CGameTrace* trace ); + +extern bool trace_ray( const vec3_t& start, const vec3_t& end, IClientEntity* a, IClientEntity* b ); +extern bool is_tick_valid( int tickcount ); +extern void set_random_seed( int seed ); +extern vec3_t get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ); +extern float get_random_float( float min, float max ); +extern bool hitchance( int target, const vec3_t& angles, int percentage ); +extern float get_total_latency( ); +extern float get_lerptime( ); +extern int get_closest_player( ); +extern vec2_t screen_transform( vec3_t world ); +extern const char* definition_index_to_name( int index ); +extern void disable_pvs( ); + +END_REGION \ No newline at end of file diff --git a/legacy/loader/winapi.hpp b/legacy/loader/winapi.hpp new file mode 100644 index 0000000..72fdbfe --- /dev/null +++ b/legacy/loader/winapi.hpp @@ -0,0 +1,64 @@ +#pragma once +#include +#include "util.hpp" + +namespace winapi +{ + static uintptr_t get_procaddr_ex( HANDLE process, HMODULE mod, const char* proc ) { + IMAGE_DOS_HEADER dos_hdr; + IMAGE_NT_HEADERS nt_hdrs; + IMAGE_EXPORT_DIRECTORY export_dir; + uintptr_t export_addr; + char export_name[ 64 ]; + uintptr_t* names; + uintptr_t* funcs; + uint16_t* ords; + uintptr_t ret{ }; + + ReadProcessMemory( process, mod, &dos_hdr, sizeof( dos_hdr ), 0 ); + ReadProcessMemory( process, ( void* )( uintptr_t( mod ) + dos_hdr.e_lfanew ), + &nt_hdrs, sizeof( nt_hdrs ), nullptr ); + + export_addr = nt_hdrs.OptionalHeader.DataDirectory[ 0 ].VirtualAddress; + ReadProcessMemory( process, ( void* )( uintptr_t( mod ) + export_addr ), + &export_dir, sizeof( export_dir ), nullptr ); + + if( !export_dir.NumberOfFunctions ) + return uintptr_t{ }; + + funcs = ( uintptr_t* )( malloc( sizeof( uintptr_t ) * export_dir.AddressOfFunctions ) ); + names = ( uintptr_t* )( malloc( sizeof( uintptr_t ) * export_dir.NumberOfNames ) ); + ords = ( uint16_t* ) ( malloc( sizeof( uint16_t ) * export_dir.NumberOfNames ) ); + + ReadProcessMemory( process, ( void* )( uintptr_t( mod ) + export_dir.AddressOfFunctions ), + funcs, sizeof( uintptr_t ) * export_dir.NumberOfFunctions, nullptr ); + ReadProcessMemory( process, ( void* )( uintptr_t( mod ) + export_dir.AddressOfNames ), + names, sizeof( uintptr_t ) * export_dir.NumberOfNames, nullptr ); + ReadProcessMemory( process, ( void* )( uintptr_t( mod ) + export_dir.AddressOfNameOrdinals ), + ords, sizeof( uint16_t ) * export_dir.NumberOfNames, nullptr ); + + auto read_str = [ &process ]( char* buf, size_t size, uintptr_t addr ) { + for( size_t i{ }; i < size; ++i ) { + char _c; + ReadProcessMemory( process, ( void* )( addr + i ), &_c, 1, 0 ); + buf[ i ] = _c; + if( !_c ) break; + } + + buf[ size - 1 ] = 0; + }; + + for( size_t i{ }; i < export_dir.NumberOfNames; ++i ) { + read_str( export_name, 64, uintptr_t( mod ) + names[ i ] ); + + if( !strcmp( export_name, proc ) ) + ret = uintptr_t( mod ) + funcs[ ords[ i ] ]; + } + + ::free( funcs ); + ::free( names ); + ::free( ords ); + + return ret; + } +} \ No newline at end of file diff --git a/legacy/loader/window.cpp b/legacy/loader/window.cpp new file mode 100644 index 0000000..9699f72 --- /dev/null +++ b/legacy/loader/window.cpp @@ -0,0 +1,148 @@ +#pragma once +#include "window.hpp" +#include "d3d.hpp" + +d3d::c_window g_window; + +#define HACK_NAME xors( "moneybot $$$" ) + +namespace d3d +{ + c_window::c_window( ) { m_size[ 0 ] = 451; m_size[ 1 ] = 376; } //ugh + c_window::~c_window( ) { } + + LRESULT __stdcall c_window::window_procedure( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) { + if( msg == WM_MOUSEMOVE ) { + g_input.capture_mouse_move( lparam ); + } + + g_input.register_key_press( ( VirtualKeyEvents_t )( msg ), VirtualKeys_t( wparam ) ); + + switch( msg ) { + case WM_SIZE: + if( g_window.m_d3d_device && wparam != SIZE_MINIMIZED ) { + g_window.m_present_params.BackBufferWidth = LOWORD( lparam ); + g_window.m_present_params.BackBufferHeight = HIWORD( lparam ); + + g_d3d.on_device_lost( ); + auto result = g_window.m_d3d_device->Reset( &g_window.m_present_params ); + g_d3d.on_device_reset( ); + } + return 0; + case WM_SYSCOMMAND: + if( ( wparam & 0xfff0 ) == SC_KEYMENU ) //disable alt thing + return 0; + break; + + + case WM_DESTROY: + PostQuitMessage( 0 ); + return 0; + } + + return DefWindowProc( hwnd, msg, wparam, lparam ); + } + + bool c_window::create( ) { + m_wc.cbSize = sizeof( WNDCLASSEX ); + m_wc.style = CS_VREDRAW | CS_HREDRAW; + m_wc.lpfnWndProc = window_procedure; + m_wc.cbClsExtra = 0; + m_wc.cbWndExtra = 0; + m_wc.hInstance = 0; + m_wc.hIcon = LoadIcon( 0, IDI_APPLICATION ); + m_wc.hCursor = LoadCursor( 0, IDC_ARROW ); + m_wc.lpszMenuName = 0; + m_wc.lpszClassName = HACK_NAME; + m_wc.hIconSm = LoadIcon( 0, IDI_APPLICATION ); + + //m_wc.hbrBackground = ( HBRUSH )( RGB( 0, 0, 0 ) ); + + RegisterClassEx( &m_wc ); + + m_hwnd = CreateWindowExA( WS_EX_TRANSPARENT, HACK_NAME, HACK_NAME, WS_POPUP, + CW_USEDEFAULT, CW_USEDEFAULT, m_size[ 0 ], m_size[ 1 ], nullptr, nullptr, nullptr, 0 ); + + if( !m_hwnd ) { + return false; + } + + //SetLayeredWindowAttributes( m_hwnd, RGB( 0, 0, 0 ), 0, ULW_COLORKEY ); + //SetLayeredWindowAttributes( m_hwnd, RGB( 0, 0, 0 ), 255, LWA_ALPHA ); + ShowWindow( m_hwnd, SW_SHOWDEFAULT ); + UpdateWindow( m_hwnd ); + + //MARGINS margin = { -1, -1, -1, -1 }; + //DwmExtendFrameIntoClientArea( m_hwnd, &margin ); + + MoveWindow( m_hwnd, 20, 20, m_size[ 0 ], m_size[ 1 ], true ); + + return init_d3d( ); + } + + bool c_window::init_d3d( ) { + if( !( m_d3d = Direct3DCreate9( D3D_SDK_VERSION ) ) ) { + UnregisterClass( HACK_NAME, m_wc.hInstance ); + return false; + } + + ZeroMemory( &m_present_params, sizeof( m_present_params ) ); + + m_present_params.Windowed = true; + m_present_params.SwapEffect = D3DSWAPEFFECT_DISCARD; + m_present_params.BackBufferFormat = D3DFMT_A8R8G8B8; + m_present_params.hDeviceWindow = m_hwnd; + m_present_params.EnableAutoDepthStencil = true; + m_present_params.AutoDepthStencilFormat = D3DFMT_D16; + m_present_params.MultiSampleType = D3DMULTISAMPLE_NONE; + m_present_params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + m_present_params.BackBufferCount = 1; + m_present_params.BackBufferWidth = m_size[ 0 ]; + m_present_params.BackBufferHeight = m_size[ 1 ]; + + if( m_d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_present_params, &m_d3d_device ) < 0 ) { + m_d3d->Release( ); + UnregisterClass( HACK_NAME, m_wc.hInstance ); + return false; + } + + return true; + } + + void c_window::on_frame( ) { + while( m_msg.message != WM_QUIT ) { + if( PeekMessage( &m_msg, 0, 0, 0, PM_REMOVE ) ) { + TranslateMessage( &m_msg ); + DispatchMessage( &m_msg ); + + continue; + } + + if( m_d3d_device ) { + auto device_state = m_d3d_device->TestCooperativeLevel( ); + if( device_state != D3D_OK ) { + g_d3d.on_device_lost( ); + m_d3d_device->Reset( &m_present_params ); + g_d3d.on_device_reset( ); + } + + + if( m_d3d_device->BeginScene( ) >= 0 ) { + for( auto& onframe : m_onframe_vec ) { + if( onframe ) { + onframe( ); + } + } + //m_d3d_device->SetRenderState( D3DRS_ZENABLE, false ); + //m_d3d_device->SetRenderState( D3DRS_ALPHABLENDENABLE, false ); + //m_d3d_device->SetRenderState( D3DRS_SCISSORTESTENABLE, false ); + m_d3d_device->EndScene( ); + } + + m_d3d_device->Present( nullptr, nullptr, nullptr, nullptr ); + Sleep( 1 ); + } + } + } +} + diff --git a/legacy/loader/window.hpp b/legacy/loader/window.hpp new file mode 100644 index 0000000..e1efc86 --- /dev/null +++ b/legacy/loader/window.hpp @@ -0,0 +1,59 @@ +#pragma once +#include +#include + +#pragma comment(lib, "d3d9.lib") +#pragma comment(lib, "d3dx9.lib") + +#include +#include + +#include +#pragma comment(lib, "dwmapi.lib") +#pragma comment(lib, "winmm.lib") + +#include + +#include "input_system.hpp" + +namespace d3d +{ + typedef void( *on_frame_fn )( ); + + class c_window { + public: + c_window( ); + ~c_window( ); + + bool create( ); + void on_frame( ); + void add_on_frame( on_frame_fn fn ) { + m_onframe_vec.push_back( fn ); + } + + HWND get_hwnd( ) { return m_hwnd; } + + private: + bool init_d3d( ); + + public: + static LRESULT __stdcall window_procedure( HWND, UINT, WPARAM, LPARAM ); + + private: + HWND m_hwnd{ }; + int m_size[ 2 ]{ }; + + WNDCLASSEX m_wc{ }; + MSG m_msg{ }; + + public: + LPDIRECT3DDEVICE9 m_d3d_device{ }; + D3DPRESENT_PARAMETERS m_present_params{ }; + LPDIRECT3D9 m_d3d{ }; + + private: + std::vector< on_frame_fn > m_onframe_vec; + }; +} + +extern d3d::c_window g_window; \ No newline at end of file diff --git a/legacy/loader/x86.h b/legacy/loader/x86.h new file mode 100644 index 0000000..5208225 --- /dev/null +++ b/legacy/loader/x86.h @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace x86 +{ + enum class reg : size_t { + eax = 0, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + + /* + x64: + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15,*/ + }; + + enum instruction : uint8_t { + retn_imm16 = 0xc2, + retn = 0xc3, + fs = 0x64, + //its big nigga season + call = 0xff + }; + + __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { + return ( 0xb8 + ( size_t( dreg ) ) ); + } + + __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { + return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); + } + + __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { + return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); + } +}; \ No newline at end of file diff --git a/loader.psess b/loader.psess deleted file mode 100644 index d4c8d9b..0000000 --- a/loader.psess +++ /dev/null @@ -1,78 +0,0 @@ - - - - moneybot.sln - Sampling - None - true - true - Timestamp - Cycles - 10000000 - 10 - 10 - - false - - - - false - 500 - - \Memory\Pages/sec - \PhysicalDisk(_Total)\Avg. Disk Queue Length - \Processor(_Total)\% Processor Time - - - - true - false - false - - false - - - false - - - - Release\loader.exe - 01/01/0001 00:00:00 - true - true - false - false - false - false - false - true - false - Executable - Release\loader.exe - - - - - IIS - InternetExplorer - true - false - - false - - - false - - - - - - loader180727.vspx - - - - - Release\loader.exe - - - \ No newline at end of file diff --git a/loader/client/client.vcxproj b/loader/client/client.vcxproj new file mode 100644 index 0000000..0e44455 --- /dev/null +++ b/loader/client/client.vcxproj @@ -0,0 +1,262 @@ + + + + + Debug + Win32 + + + D_LinuxServer + Win32 + + + D_LinuxServer + x64 + + + Release_Windows + Win32 + + + Release_Windows + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + 15.0 + {B03A0B07-AA28-4122-842D-1B2457F70334} + client + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + false + + + false + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + + + + + Level4 + Disabled + true + true + stdcpplatest + FastCall + AdvancedVectorExtensions2 + _CRT_SECURE_NO_WARNINGS;WIN64;VC_EXTRALEAN;_MBCS;%(PreprocessorDefinitions) + + + false + + + + + Level4 + Disabled + true + true + stdcpplatest + FastCall + AdvancedVectorExtensions2 + _CRT_SECURE_NO_WARNINGS;WIN64;VC_EXTRALEAN;_MBCS;%(PreprocessorDefinitions) + + + false + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level4 + MaxSpeed + true + true + true + true + stdcpplatest + FastCall + AdvancedVectorExtensions2 + _CRT_SECURE_NO_WARNINGS;WIN64;VC_EXTRALEAN;_MBCS;%(PreprocessorDefinitions) + + + true + true + false + + + + + Level4 + MaxSpeed + true + true + true + true + stdcpplatest + FastCall + AdvancedVectorExtensions2 + _CRT_SECURE_NO_WARNINGS;WIN64;VC_EXTRALEAN;_MBCS;%(PreprocessorDefinitions) + + + true + true + false + + + + + + \ No newline at end of file diff --git a/loader/client/client.vcxproj.filters b/loader/client/client.vcxproj.filters new file mode 100644 index 0000000..b5f56db --- /dev/null +++ b/loader/client/client.vcxproj.filters @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/loader/client/client_windows.cpp b/loader/client/client_windows.cpp new file mode 100644 index 0000000..1b493d6 --- /dev/null +++ b/loader/client/client_windows.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include + +#pragma comment( lib, "ws2_32.lib" ) + +#include "connect.hpp" + +/* + 1. Connect + 2. Send hello message + 3. Receive hello message from server, + 4. Enter and send username + 5. Enter and send password (use bcrypt or some shit idk) + 6. Send and let server check hardware id. + 7. Recieve list of games. + 8. Select game and send to server + 9. Receive space of dll. + 10. Allocate space for dll. + 11. Send base address of dll. + 12a. Server does relocations. + 12b. Server does imports. + 13. Server sends dll + 14. Client Manual maps dll + 15. Send game module list and possibly PE headers + 16. Server sends back needed module base addresses and possibly size. + 17. Call DLLMain with correct parameters (Included Base Addresses) + 18. In cheat DLLMain set up base addresses and do cheat stuff. +*/ + + + + +// note below is just pseudo unprotected code... +// will make not retarded soon. +int main( ) { + // TEMPORARY, WE NEED TO ENCRYPT IP STRING SO WE DON'T HAVE DDOS NOOBS. + // or we could do char address[] = { 127, 0, 0, 1 }; + std::string ip = "127.0.0.1"; + // std::cin >> ip; + + // START. + client::c_connect c( ip.c_str( ) ); + if( !c.setup( ) ) + return 1; + + if( !c.connect( ) ) + return 2; + + c.handle( ); + + system( "pause" ); + + return 0; +} diff --git a/loader/client/connect.hpp b/loader/client/connect.hpp new file mode 100644 index 0000000..ddf23a0 --- /dev/null +++ b/loader/client/connect.hpp @@ -0,0 +1,282 @@ +#pragma once + +#include +#include +#include +#include +#include + +#pragma comment( lib, "ws2_32.lib" ) + +#include + +/* TEST */ +#include +#include +/* TEST */ + +#include "err.hpp" +#include "util.hpp" + +/* +protocol rules: +every msg must be xored +first byte is the xorkey + +*/ + +namespace client +{ + constexpr auto PORT_NUM = 6969; + constexpr auto BUFFER_SIZE = 255; + + class c_connect { + public: + c_connect( const char* ip ) : + m_ip( inet_addr( ip ) ) { } + + ~c_connect( ) { + if( m_socket ) + closesocket( m_socket ); + + WSACleanup( ); + } + + bool setup( ) { + int code{ }; + + if( WSAStartup( MAKEWORD( 2, 2 ), &m_wsdata ) ) + code = err::ERR_WSA; + else { + m_socket = socket( AF_INET, SOCK_STREAM, 0 ); + if( m_socket == INVALID_SOCKET ) + code = err::ERR_WSA; + } + + if( code != err::ERR_NONE ) { + MessageBoxA( nullptr, err::translate_err( code ), "", MB_OK ); + return false; + } + + return true; + } + + bool connect( ) { + sockaddr_in server_address{ }; + int code{ }; + + server_address.sin_addr.s_addr = m_ip; + server_address.sin_port = htons( PORT_NUM ); + server_address.sin_family = AF_INET; + + code = ::connect( m_socket, ( sockaddr* )( &server_address ), + sizeof( server_address ) ); + + if( code == -1 ) { + MessageBoxA( nullptr, err::translate_err( err::ERR_CONNECT ), "", MB_OK ); + return false; + } + + return true; + } + + void decode_buffer( uint8_t* buf, size_t length ) { + auto key = buf[ 0 ]; + for( size_t i{ 1 }; i < length; ++i ) + buf[ i ] ^= key; + } + + std::string get_string( ) { + std::string ret{ }; + char buffer[ BUFFER_SIZE ]; + + + while ( true ) { + int received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); + if ( received < 0 ) + break; + + for ( int i{ }; i < received; ++i ) + ret.push_back( buffer[ i ] ); + + if ( received < BUFFER_SIZE ) + break; + } + + if ( ret.size( ) ) { + decode_buffer( ( uint8_t* )ret.data( ), ret.size( ) ); + ret.erase( ret.begin( ) ); + } + + return ret; + } + + std::vector< uint8_t > get_msg( ) { + std::vector< uint8_t > ret; + char buffer[ BUFFER_SIZE ]; + int received = 0; + + while( true ) { + received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); + if( received < 0 ) + break; + + for( int i{ }; i < received; ++i ) + ret.push_back( buffer[ i ] ); + + if( received < BUFFER_SIZE ) + break; + } + + if( ret.size( ) ) { + decode_buffer( ret.data( ), ret.size( ) ); + ret.erase( ret.begin( ) ); + } + return ret; + } + + void send_msg( const uint8_t* msg, int length ) { + auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); + uint8_t key = util::random_number( 0, 255 ) & 0xff; + + buffer[ 0 ] = key; + memcpy( buffer.get( ) + 1, + msg, + length ); + + for( int i = 1; i <= length; ++i ) { + buffer[ i ] ^= key; + } + + int ret = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); + if ( ret == SOCKET_ERROR ) { + printf( xors( "error sending message error code: %d" ), WSAGetLastError( ) ); + } + } + + void send_msg( const char* msg ) { + auto length = strlen( msg ); + auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); + uint8_t key = util::random_number( 0, 255 ) & 0xff; + + buffer[ 0 ] = key; + memcpy( buffer.get( ) + 1, + msg, + length ); + + for ( size_t i = 1; i <= length; ++i ) { + buffer[ i ] ^= key; + } + + int ret = send( m_socket, ( char* )buffer.get( ), (int) length + 1, 0 ); + if ( ret == SOCKET_ERROR ) { + printf( xors( "error sending message error code: %d" ), WSAGetLastError( ) ); + } + } + + + void send_msg( const char msg ) { + auto buffer = std::make_unique< uint8_t[ ] >( 2 ); + uint8_t key = util::random_number( 0, 255 ) & 0xff; + + buffer[ 0 ] = key; + buffer[ 1 ] = msg; + buffer[ 1 ] ^= buffer[ 0 ]; + + int ret = send( m_socket, ( char* )buffer.get( ), 2, 0 ); + if ( ret == SOCKET_ERROR ) { + printf( xors( "error sending message error code: %d" ), WSAGetLastError( ) ); + } + } + + void handle( ) { + + auto msg = get_string( ); + if ( msg != xors( "hello" ) ) { + std::cout << "connection failed." << std::endl; + //return 0; + } + + send_msg( "hello" ); + + std::string username{ }, password{ }; + std::cout << "Enter your username" << std::endl << "> "; + std::cin >> username; + + send_msg( username.c_str( ) ); + msg = get_string( ); + std::cout < "; + std::cin >> password; + + send_msg( password.c_str( ) ); + if ( get_string( ) != xors( "correct password" ) ) { + std::cout << "incorrect password"; + //return 0; // remember to close connection on server when bad values were sent. + } + + // Receive list of games, + msg = get_string( ); + std::cout << msg << std::endl; + + + std::cout << "For what game do you want to inject on?" << std::endl << "> "; + + char game_id{ }; + std::cin >> game_id; + + send_msg( game_id ); + + // get process name. + msg = get_string( ); + + std::cout << msg << std::endl; + + int process_identifier{ }; + + HANDLE snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); + if ( snapshot != INVALID_HANDLE_VALUE ) { + PROCESSENTRY32 entry{ sizeof( PROCESSENTRY32 ) }; + + if ( Process32First( snapshot, &entry ) ) { + do { + if ( msg == entry.szExeFile ) { + process_identifier = entry.th32ProcessID; + break; + } + } while ( Process32Next( snapshot, &entry ) ); + } + } + + if ( !process_identifier ) { + std::cout << "Could not find process." << std::endl; + return; + } + + std::cout << "found" << std::endl; + send_msg( "found" ); + + auto file = get_msg( ); + auto file_data = file.data( ); + auto file_size = file.size( ); + + auto save_file = std::ofstream( "gmod.txt", std::ofstream::binary ); + if ( save_file.is_open( ) ) { + save_file.write( ( const char* )file_data, file_size ); + save_file.close( ); + } + + + } + + private: + SOCKET m_socket; + WSADATA m_wsdata; + int m_ip; + }; +} \ No newline at end of file diff --git a/loader/client/err.hpp b/loader/client/err.hpp new file mode 100644 index 0000000..5a6691d --- /dev/null +++ b/loader/client/err.hpp @@ -0,0 +1,22 @@ +#pragma once +#include "strings.hpp" + +namespace err +{ + enum ErrCode_t { + ERR_NONE = 0, + ERR_WSA = 1, + ERR_CONNECT = 2, + }; + + const char* translate_err( int code ) { + switch( code ) { + case ERR_WSA: + return xors( "socket error" ); + case ERR_CONNECT: + return xors( "connection error" ); + } + + return xors( "unknown error" ); + } +} \ No newline at end of file diff --git a/loader/client/strings.hpp b/loader/client/strings.hpp new file mode 100644 index 0000000..b5dba75 --- /dev/null +++ b/loader/client/strings.hpp @@ -0,0 +1,163 @@ +//-------------------------------------------------------------------------------- +//-- XorCompileTime.hpp +// +// Author: frk +// Date: 12.12.2015 +// +//-------------------------------------------------------------------------------- + +#pragma once +#include +#include +#include + +#define BEGIN_NAMESPACE( x ) namespace x { +#define END_NAMESPACE } + +BEGIN_NAMESPACE( strenc ) + +constexpr auto time = __TIME__; +constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; + +// 1988, Stephen Park and Keith Miller +// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" +// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: +// with 32-bit math and without division + +template < int N > +struct RandomGenerator { +private: + static constexpr unsigned a = 16807; // 7^5 + static constexpr unsigned m = 2147483647; // 2^31 - 1 + + static constexpr unsigned s = RandomGenerator< N - 1 >::value; + static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 + static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 + static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits + static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi + static constexpr unsigned lo3 = lo2 + hi; + +public: + static constexpr unsigned max = m; + static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; +}; + +template <> +struct RandomGenerator< 0 > { + static constexpr unsigned value = seed; +}; + +template < int N, int M > +struct RandomInt { + static constexpr auto value = RandomGenerator< N + 1 >::value % M; +}; + +template < int N > +struct RandomChar { + static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); +}; + +template < size_t N, int K > +struct XorString { +private: + const char _key; + std::array< char, N + 1 > _encrypted; + bool decrypted = false; + + constexpr char enc( char c ) const { + return c ^ _key; + } + + char dec( char c ) const { + return c ^ _key; + } + +public: + template < size_t... Is > + constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { + } + + __forceinline const char* decrypt( void ) { + if( !decrypted ) { + for( size_t i = 0; i < N; ++i ) { + _encrypted[ i ] = dec( _encrypted[ i ] ); + } + _encrypted[ N ] = '\0'; + decrypted = true; + } + + return _encrypted.data( ); + } +}; + +//-------------------------------------------------------------------------------- +//-- Note: XorStr will __NOT__ work directly with functions like printf. +// To work with them you need a wrapper function that takes a const char* +// as parameter and passes it to printf and alike. +// +// The Microsoft Compiler/Linker is not working correctly with variadic +// templates! +// +// Use the functions below or use std::cout (and similar)! +//-------------------------------------------------------------------------------- + +#if( 1 ) +static auto w_printf = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_printf_s = [ ]( const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vprintf_s( fmt, args ); + va_end( args ); +}; + +static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf( buf, fmt, args ); + va_end( args ); +}; + +static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { + va_list args; + va_start( args, fmt ); + vsprintf_s( buf, buf_size, fmt, args ); + va_end( args ); +}; +#endif + +//for compatibility with debug mode +struct debug_ret { +private: + const char* ret; + +public: + debug_ret( const char* str ) : ret( str ) { }; + + auto decrypt( ) { + return ret; + } +}; + +constexpr size_t strlen_ct( const char* const str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; +} + +#if TRUE +#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) +#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) +#else +#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) +#define xors( s ) ( s ) +#endif + +END_NAMESPACE \ No newline at end of file diff --git a/loader/client/util.hpp b/loader/client/util.hpp new file mode 100644 index 0000000..aabfd69 --- /dev/null +++ b/loader/client/util.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include +#include "strings.hpp" + +#include + +namespace util +{ + namespace { + //make a random generator and seed it with a p random number + static std::random_device rd; + static std::mt19937 gen( rd( ) ); + } + + template < typename t > + __forceinline t random_number( t min, t max ) { + if constexpr( !std::is_integral_v< t > ) { + std::uniform_real_distribution< t > dist( min, max ); + return dist( gen ); + } + else { + std::uniform_int_distribution< t > dist( min, max ); + return dist( gen ); + } + } + + // okay now this is epic + __forceinline void raise_error(const char *error) { + MessageBoxA(0, error, xors("error"), MB_ICONERROR); + ExitProcess(0); + } +} \ No newline at end of file diff --git a/loader/loader.sln b/loader/loader.sln new file mode 100644 index 0000000..3048c18 --- /dev/null +++ b/loader/loader.sln @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.106 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server", "server\server.vcxproj", "{A6D4FCB9-F886-424C-8493-758A15CCD7A9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "client", "client\client.vcxproj", "{B03A0B07-AA28-4122-842D-1B2457F70334}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + D_LinuxServer|x64 = D_LinuxServer|x64 + D_LinuxServer|x86 = D_LinuxServer|x86 + D_WindowsServer|x64 = D_WindowsServer|x64 + D_WindowsServer|x86 = D_WindowsServer|x86 + R_LinuxServer|x64 = R_LinuxServer|x64 + R_LinuxServer|x86 = R_LinuxServer|x86 + R_WindowsServer|x64 = R_WindowsServer|x64 + R_WindowsServer|x86 = R_WindowsServer|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_LinuxServer|x64.ActiveCfg = D_LinuxServer|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_LinuxServer|x64.Build.0 = D_LinuxServer|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_LinuxServer|x86.ActiveCfg = D_LinuxServer|Win32 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_LinuxServer|x86.Build.0 = D_LinuxServer|Win32 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_WindowsServer|x64.ActiveCfg = Debug|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_WindowsServer|x64.Build.0 = Debug|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_WindowsServer|x86.ActiveCfg = Debug|Win32 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.D_WindowsServer|x86.Build.0 = Debug|Win32 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_LinuxServer|x64.ActiveCfg = Release|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_LinuxServer|x64.Build.0 = Release|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_LinuxServer|x86.ActiveCfg = Release|Win32 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_LinuxServer|x86.Build.0 = Release|Win32 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_WindowsServer|x64.ActiveCfg = Release_Windows|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_WindowsServer|x64.Build.0 = Release_Windows|x64 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_WindowsServer|x86.ActiveCfg = Release_Windows|Win32 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9}.R_WindowsServer|x86.Build.0 = Release_Windows|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_LinuxServer|x64.ActiveCfg = D_LinuxServer|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_LinuxServer|x64.Build.0 = D_LinuxServer|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_LinuxServer|x86.ActiveCfg = D_LinuxServer|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_LinuxServer|x86.Build.0 = D_LinuxServer|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_WindowsServer|x64.ActiveCfg = Debug|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_WindowsServer|x64.Build.0 = Debug|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_WindowsServer|x86.ActiveCfg = Debug|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.D_WindowsServer|x86.Build.0 = Debug|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_LinuxServer|x64.ActiveCfg = Release|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_LinuxServer|x64.Build.0 = Release|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_LinuxServer|x86.ActiveCfg = Release|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_LinuxServer|x86.Build.0 = Release|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_WindowsServer|x64.ActiveCfg = Release_Windows|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_WindowsServer|x64.Build.0 = Release_Windows|x64 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_WindowsServer|x86.ActiveCfg = Release_Windows|Win32 + {B03A0B07-AA28-4122-842D-1B2457F70334}.R_WindowsServer|x86.Build.0 = Release_Windows|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3F3309B9-EA04-4C25-BF7B-37B736370BF1} + EndGlobalSection +EndGlobal diff --git a/loader/server/client.cpp b/loader/server/client.cpp new file mode 100644 index 0000000..8e7d3d3 --- /dev/null +++ b/loader/server/client.cpp @@ -0,0 +1,201 @@ +#include "client.hpp" +#include "server.hpp" + +/* +std::vector< byte > server::c_client::receive_message( ) { + std::vector< uint8_t > ret; + char buffer[ BUFFER_SIZE ]{ }; + int received = 0; + + while( true ) { + received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); + if( received < 0 ) + break; + + for( int i{ }; i < received; ++i ) + ret.push_back( buffer[ i ] ); + + if( received < BUFFER_SIZE ) + break; + } + + if( ret.size( ) ) { + decode_buffer( ret.data( ), ret.size( ) ); + ret.push_back( 0 ); + ret.erase( ret.begin( ) ); + } + + return ret; +} +*/ + +void server::c_client::kill( ) { + closesocket( m_socket ); + printf( "%s disconnected\n", get_ip( ) ); +} + +std::string server::c_client::get_msg( ) { + std::string ret{ }; + char buffer[ BUFFER_SIZE ]{ }; + int received = 0; + + while ( true ) { + received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); + if ( received < 0 ) + break; + + for ( int i{ }; i < received; ++i ) + ret.push_back( buffer[ i ] ); + + if ( received < BUFFER_SIZE ) + break; + } + + if ( ret.size( ) ) { + decode_buffer( ( uint8_t* )ret.data( ), ret.size( ) ); + // ret.push_back( 0 ); somehow broke things :/ + ret.erase( ret.begin( ) ); + } + + return ret; +} + +bool server::c_client::send_msg( byte* msg, size_t length ) { + auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); + uint8_t key = util::random_number( 0, 255 ) & 0xff; + + buffer[ 0 ] = key; + memcpy( buffer.get( ) + 1, + msg, + length ); + + for( size_t i = 1; i <= length; ++i ) { + buffer[ i ] ^= key; + } + + int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); + if( result == -1 ) { +#if WIN64 + printf( "error sending message to %s: %d\n", + get_ip( ), WSAGetLastError( ) ); +#else + printf( "error sending message to %s\n", + get_ip( ) ); +#endif + return false; + } + + return true; +} + +bool server::c_client::send_msg( const char* msg ) { + auto length = strlen( msg ); + auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); + uint8_t key = util::random_number( 0, 255 ) & 0xff; + + memset( buffer.get( ), 0, length+1 ); + + buffer[ 0 ] = key; + memcpy( buffer.get( ) + 1, + msg, + length ); + + for ( size_t i = 1; i <= length; ++i ) { + buffer[ i ] ^= key; + } + + int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); + if ( result == -1 ) { +#if WIN64 + printf( "error sending message to %s: %d\n", + get_ip( ), WSAGetLastError( ) ); +#else + printf( "error sending message to %s\n", + get_ip( ) ); +#endif + return false; + } + + return true; +} + +bool server::c_client::handle( ) { + /* + ALL TEST CODE BELOW. + */ + auto hello_msg = get_msg( ); + printf( "%s\n", hello_msg.c_str( ) ); + + if ( hello_msg != "hello" ) + return false; + + auto username = get_msg( ); + if ( username != "friendly" ) + return false; + + printf( "correct username\n" ); + send_msg( "correct username" ); + + auto password = get_msg( ); + if ( password != "nigger" ) + return false; + + printf( "correct password\n" ); + send_msg( "correct password" ); + + const char* games_list = +R"(games: +1: CSGO +2: CSGO (test) +3: Garry's Mod +)"; + + send_msg( games_list ); + + auto game_id = get_msg( ); + + if ( game_id== "1" ) { + printf( "csgo\n" ); + send_msg( "csgo.exe" ); + } + else if ( game_id == "2" ) { + printf( "csgo test\n" ); + send_msg( "csgo.exe" ); + } + else if ( game_id == "3" ) { + printf( "gmod\n" ); + send_msg( "hl2.exe" ); + } + else { + printf( "invalid\n" ); + return false; + } + + auto found = get_msg( ); + if ( found != "found" ) + return false; + + printf( "process found\n" ); + + if ( game_id == "3" ) { + // test. make sure the file is in ur directory + auto file = std::ifstream( "gmod.dll", std::ifstream::binary ); + if ( file.is_open( ) ) { + file.seekg( 0, file.end ); + + auto size = ( int )file.tellg( ); + auto buffer = std::make_unique< char[ ] >( size ); + + memset( buffer.get( ), 0, size ); + + file.seekg( 0, file.beg ); + file.read( buffer.get( ), size ); + + send_msg( ( uint8_t* )buffer.get( ), size ); + + file.close( ); + } + } + + return true; +} diff --git a/loader/server/client.hpp b/loader/server/client.hpp new file mode 100644 index 0000000..1f577c7 --- /dev/null +++ b/loader/server/client.hpp @@ -0,0 +1,67 @@ +#pragma once + +#ifdef WIN64 +#include +#pragma comment(lib, "ws2_32.lib") +#else +#include +#include +#include +#include +#include +#include +#endif + + +#include +#include +#include +#include +#include +#include + + +#include "util.hpp" + +constexpr auto PORT_NUM = 6969; +constexpr auto BUFFER_SIZE = 255; + +namespace server +{ + class c_client { + SOCKET m_socket{ }; + in_addr m_address{ }; + ulong_t m_hwid{ }; + public: + c_client( SOCKET socket, in_addr& address ) : + m_socket( socket ), + m_address( address ) + { } + + ~c_client( ) { + kill( ); + } + + + void decode_buffer( uint8_t* buf, size_t length ) { + auto key = buf[ 0 ]; + for( size_t i{ 1 }; i < length; ++i ) + buf[ i ] ^= key; + } + + auto get_ip( ) { + return inet_ntoa( m_address ); + } + + void kill( ); + + //std::vector< byte > receive_message( ); + std::string get_msg( ); + bool send_msg( byte* msg, size_t length ); + bool send_msg( const char* ); + + //handles messages, hwid etc + void handle_buffer( byte* msg ); + virtual bool handle( ); + }; +} \ No newline at end of file diff --git a/loader/server/message.hpp b/loader/server/message.hpp new file mode 100644 index 0000000..bf67389 --- /dev/null +++ b/loader/server/message.hpp @@ -0,0 +1,8 @@ +#pragma once + +enum MessageType_t { + MSG_HELLO = 'h', + MSG_READY = 'r', + MSG_BAN = 'q', + MSG_IMPORT = 'i' +}; \ No newline at end of file diff --git a/loader/server/server.cpp b/loader/server/server.cpp new file mode 100644 index 0000000..e12e691 --- /dev/null +++ b/loader/server/server.cpp @@ -0,0 +1,48 @@ +#include "server.hpp" + +int server::c_server::init( ) { +#if WIN64 + if( WSAStartup( MAKEWORD( 2, 2 ), &m_sock_data ) ) // windows + return 1; +#endif + + m_socket = socket( AF_INET, SOCK_STREAM, 0 ); + if( m_socket == INVALID_SOCKET ) + return 2; + + sockaddr_in server_address{ }; + server_address.sin_addr.s_addr = INADDR_ANY; + server_address.sin_port = htons( PORT_NUM ); + server_address.sin_family = AF_INET; + + auto result = ::bind( m_socket, ( sockaddr* )( &server_address ), sizeof( server_address ) ); + return result != -1 ? 0 : 3; +} + +void server::c_server::listen( ) { + ::listen( m_socket, 5 ); + + sockaddr_in client_address{ }; + + // not needed, this is set in accept, values are input. + // client_address.sin_port = htons( PORT_NUM ); + int len = sizeof( client_address ); + + SOCKET result = accept( m_socket, ( sockaddr* )( &client_address ), &len ); + if( result == INVALID_SOCKET ) { + printf( "socket error accepting a connection\n" ); + return; + } + + printf( "incoming connection from: %s\n", inet_ntoa( client_address.sin_addr ) ); + + // connection established. + auto client = std::make_shared< c_client >( result, client_address.sin_addr ); + + // handshake. + client->send_msg( "hello" ); + + // surprised it even works with shared_ptr. + std::thread thread{ &c_client::handle, client }; + thread.detach( ); +} diff --git a/loader/server/server.hpp b/loader/server/server.hpp new file mode 100644 index 0000000..5ac8393 --- /dev/null +++ b/loader/server/server.hpp @@ -0,0 +1,34 @@ +#pragma once +#include +#include +#include +#include + +#include "client.hpp" + + +//since this will be running on our vps we dont need string encryption or protection for anything +//which is cool, i guess + +namespace server +{ + class c_server { + // not sure if even needed. + std::mutex m_mutex; + private: + WSADATA m_sock_data{ }; + SOCKET m_socket{ }; + + public: + ~c_server( ) { + if ( m_socket ) + closesocket( m_socket ); + } + + int init( ); + void listen( ); + void client_loop( ); + }; +} + +extern server::c_server g_server; \ No newline at end of file diff --git a/loader/server/server.vcxproj b/loader/server/server.vcxproj new file mode 100644 index 0000000..543a42f --- /dev/null +++ b/loader/server/server.vcxproj @@ -0,0 +1,248 @@ + + + + + Debug + Win32 + + + D_LinuxServer + Win32 + + + D_LinuxServer + x64 + + + Release_Windows + Win32 + + + Release_Windows + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + 15.0 + {A6D4FCB9-F886-424C-8493-758A15CCD7A9} + server + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + + + + + Level4 + Disabled + true + true + AdvancedVectorExtensions2 + false + stdcpplatest + FastCall + WIN64;VC_EXTRALEAN;_MBCS;%(PreprocessorDefinitions) + + + + + Level4 + Disabled + true + true + AdvancedVectorExtensions2 + false + stdcpplatest + FastCall + VC_EXTRALEAN;_MBCS;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level4 + MaxSpeed + true + true + true + true + AdvancedVectorExtensions2 + false + stdcpplatest + FastCall + + + true + true + + + + + Level4 + MaxSpeed + true + true + true + true + AdvancedVectorExtensions2 + false + stdcpplatest + FastCall + WIN64;VC_EXTRALEAN;_MBCS;%(PreprocessorDefinitions) + + + true + true + + + + + + \ No newline at end of file diff --git a/loader/server/server.vcxproj.filters b/loader/server/server.vcxproj.filters new file mode 100644 index 0000000..5ef28fc --- /dev/null +++ b/loader/server/server.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/loader/server/server_windows.cpp b/loader/server/server_windows.cpp new file mode 100644 index 0000000..cdc6ac4 --- /dev/null +++ b/loader/server/server_windows.cpp @@ -0,0 +1,40 @@ +#ifdef WIN64 +#include +#pragma comment(lib, "ws2_32.lib") +#else +#include +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include "server.hpp" + +server::c_server g_server; + +int main( ) { + std::thread listen_thread; + + int result = g_server.init( ); + if( !result ) { + //listen_thread = std::thread( [ ]( ) { while( 1 ) { g_server.listen( ); } } ); + //listen_thread.detach( ); + + while( true ) { + g_server.listen( ); + //Sleep( 1 ); + } + } + else + printf( "server init error (%d)\n", result ); + + system( "pause" ); + return 0; +} diff --git a/loader/server/util.hpp b/loader/server/util.hpp new file mode 100644 index 0000000..1d408e0 --- /dev/null +++ b/loader/server/util.hpp @@ -0,0 +1,25 @@ +#pragma once +#include + +using ulong_t = unsigned long; + +namespace util +{ + namespace { + //make a random generator and seed it with a p random number + static std::random_device rd; + static std::mt19937 gen( rd( ) ); + } + + template < typename t > + __forceinline t random_number( t min, t max ) { + if constexpr( !std::is_integral_v< t > ) { + std::uniform_real_distribution< t > dist( min, max ); + return dist( gen ); + } + else { + std::uniform_int_distribution< t > dist( min, max ); + return dist( gen ); + } + } +} \ No newline at end of file diff --git a/loader/x64/D_LinuxServer/client.ilk b/loader/x64/D_LinuxServer/client.ilk new file mode 100644 index 0000000..7db2185 Binary files /dev/null and b/loader/x64/D_LinuxServer/client.ilk differ diff --git a/loader/x64/D_LinuxServer/server.ilk b/loader/x64/D_LinuxServer/server.ilk new file mode 100644 index 0000000..29c34f2 Binary files /dev/null and b/loader/x64/D_LinuxServer/server.ilk differ diff --git a/moneybot.sln b/moneybot.sln deleted file mode 100644 index c964ed6..0000000 --- a/moneybot.sln +++ /dev/null @@ -1,206 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27004.2002 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "moneybot", "internal_rewrite\internal_rewrite.vcxproj", "{140DEC51-B0E7-4289-BB6F-79686422318E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "injector", "injector\injector.vcxproj", "{0CD36550-BDEB-4967-9AC1-9AB1AE778C64}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loader", "loader\loader.vcxproj", "{C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enc_file", "enc_file\enc_file.vcxproj", "{9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tf2_base", "tf2\test_cso2.vcxproj", "{DD486C1B-C911-42B8-AB24-A9102A23DC02}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmod", "gmod\gmod.vcxproj", "{82E7C50B-01E3-4D65-AECC-196E9494DFF4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server", "server\server.vcxproj", "{F0038E32-6DE8-47B7-BC86-8A2274B24406}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "client", "client\client.vcxproj", "{E877E475-A428-4FBC-AF71-378AFB92B706}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Online|x64 = Online|x64 - Online|x86 = Online|x86 - optimize_test|x64 = optimize_test|x64 - optimize_test|x86 = optimize_test|x86 - pHit|x64 = pHit|x64 - pHit|x86 = pHit|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x64.ActiveCfg = Debug|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x64.Build.0 = Debug|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x86.ActiveCfg = Debug|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Debug|x86.Build.0 = Debug|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x64.ActiveCfg = Online|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x64.Build.0 = Online|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x86.ActiveCfg = Online|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Online|x86.Build.0 = Online|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x64.ActiveCfg = optimize_test|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x64.Build.0 = optimize_test|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x86.ActiveCfg = optimize_test|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.optimize_test|x86.Build.0 = optimize_test|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x64.ActiveCfg = pHit|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x64.Build.0 = pHit|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x86.ActiveCfg = pHit|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.pHit|x86.Build.0 = pHit|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x64.ActiveCfg = Release|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x64.Build.0 = Release|x64 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x86.ActiveCfg = Release|Win32 - {140DEC51-B0E7-4289-BB6F-79686422318E}.Release|x86.Build.0 = Release|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x64.ActiveCfg = Debug|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x64.Build.0 = Debug|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x86.ActiveCfg = Debug|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Debug|x86.Build.0 = Debug|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Online|x64.ActiveCfg = Release|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Online|x64.Build.0 = Release|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Online|x86.ActiveCfg = Release|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Online|x86.Build.0 = Release|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.optimize_test|x64.ActiveCfg = Release|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.optimize_test|x64.Build.0 = Release|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.optimize_test|x86.ActiveCfg = Release|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.optimize_test|x86.Build.0 = Release|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x64.ActiveCfg = pHit|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x64.Build.0 = pHit|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x86.ActiveCfg = pHit|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.pHit|x86.Build.0 = pHit|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x64.ActiveCfg = Release|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x64.Build.0 = Release|x64 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x86.ActiveCfg = Release|Win32 - {0CD36550-BDEB-4967-9AC1-9AB1AE778C64}.Release|x86.Build.0 = Release|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x64.ActiveCfg = Debug|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x64.Build.0 = Debug|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x86.ActiveCfg = Debug|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Debug|x86.Build.0 = Debug|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Online|x64.ActiveCfg = Release|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Online|x64.Build.0 = Release|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Online|x86.ActiveCfg = Release|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Online|x86.Build.0 = Release|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.optimize_test|x64.ActiveCfg = Release|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.optimize_test|x64.Build.0 = Release|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.optimize_test|x86.ActiveCfg = Release|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.optimize_test|x86.Build.0 = Release|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x64.ActiveCfg = pHit|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x64.Build.0 = pHit|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x86.ActiveCfg = pHit|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.pHit|x86.Build.0 = pHit|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x64.ActiveCfg = Release|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x64.Build.0 = Release|x64 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x86.ActiveCfg = Release|Win32 - {C376FC6E-5E1C-4ADD-A921-BC8E2968E8B0}.Release|x86.Build.0 = Release|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x64.ActiveCfg = Debug|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x64.Build.0 = Debug|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x86.ActiveCfg = Debug|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Debug|x86.Build.0 = Debug|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Online|x64.ActiveCfg = Release|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Online|x64.Build.0 = Release|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Online|x86.ActiveCfg = Release|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Online|x86.Build.0 = Release|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.optimize_test|x64.ActiveCfg = Release|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.optimize_test|x64.Build.0 = Release|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.optimize_test|x86.ActiveCfg = Release|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.optimize_test|x86.Build.0 = Release|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x64.ActiveCfg = pHit|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x64.Build.0 = pHit|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x86.ActiveCfg = pHit|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.pHit|x86.Build.0 = pHit|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x64.ActiveCfg = Release|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x64.Build.0 = Release|x64 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x86.ActiveCfg = Release|Win32 - {9EF8BCE2-B57C-413C-803B-0FAB5A0747D8}.Release|x86.Build.0 = Release|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x64.ActiveCfg = Debug|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x64.Build.0 = Debug|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x86.ActiveCfg = Debug|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Debug|x86.Build.0 = Debug|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x64.ActiveCfg = Release|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x64.Build.0 = Release|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x86.ActiveCfg = Release|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Online|x86.Build.0 = Release|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x64.ActiveCfg = Release|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x64.Build.0 = Release|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x86.ActiveCfg = Release|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.optimize_test|x86.Build.0 = Release|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x64.ActiveCfg = pHit|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x64.Build.0 = pHit|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x86.ActiveCfg = pHit|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.pHit|x86.Build.0 = pHit|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x64.ActiveCfg = Release|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x64.Build.0 = Release|x64 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x86.ActiveCfg = Release|Win32 - {DD486C1B-C911-42B8-AB24-A9102A23DC02}.Release|x86.Build.0 = Release|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x64.ActiveCfg = Debug|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x64.Build.0 = Debug|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x86.ActiveCfg = Debug|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Debug|x86.Build.0 = Debug|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x64.ActiveCfg = Release|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x64.Build.0 = Release|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x86.ActiveCfg = Release|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Online|x86.Build.0 = Release|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.optimize_test|x64.ActiveCfg = Release|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.optimize_test|x64.Build.0 = Release|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.optimize_test|x86.ActiveCfg = optimize_test|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.optimize_test|x86.Build.0 = optimize_test|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x64.ActiveCfg = pHit|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x64.Build.0 = pHit|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x86.ActiveCfg = pHit|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.pHit|x86.Build.0 = pHit|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x64.ActiveCfg = Release|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x64.Build.0 = Release|x64 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x86.ActiveCfg = Release|Win32 - {82E7C50B-01E3-4D65-AECC-196E9494DFF4}.Release|x86.Build.0 = Release|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Debug|x64.ActiveCfg = Debug|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Debug|x64.Build.0 = Debug|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Debug|x86.ActiveCfg = Debug|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Debug|x86.Build.0 = Debug|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Online|x64.ActiveCfg = Release|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Online|x64.Build.0 = Release|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Online|x86.ActiveCfg = Release|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Online|x86.Build.0 = Release|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.optimize_test|x64.ActiveCfg = Release|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.optimize_test|x64.Build.0 = Release|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.optimize_test|x86.ActiveCfg = Release|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.optimize_test|x86.Build.0 = Release|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.pHit|x64.ActiveCfg = pHit|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.pHit|x64.Build.0 = pHit|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.pHit|x86.ActiveCfg = pHit|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.pHit|x86.Build.0 = pHit|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Release|x64.ActiveCfg = Release|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Release|x64.Build.0 = Release|x64 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Release|x86.ActiveCfg = Release|Win32 - {F0038E32-6DE8-47B7-BC86-8A2274B24406}.Release|x86.Build.0 = Release|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Debug|x64.ActiveCfg = Debug|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Debug|x64.Build.0 = Debug|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Debug|x86.ActiveCfg = Debug|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Debug|x86.Build.0 = Debug|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Online|x64.ActiveCfg = Release|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Online|x64.Build.0 = Release|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Online|x86.ActiveCfg = Release|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Online|x86.Build.0 = Release|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.optimize_test|x64.ActiveCfg = Release|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.optimize_test|x64.Build.0 = Release|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.optimize_test|x86.ActiveCfg = Release|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.optimize_test|x86.Build.0 = Release|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.pHit|x64.ActiveCfg = pHit|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.pHit|x64.Build.0 = pHit|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.pHit|x86.ActiveCfg = pHit|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.pHit|x86.Build.0 = pHit|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Release|x64.ActiveCfg = Release|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Release|x64.Build.0 = Release|x64 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Release|x86.ActiveCfg = Release|Win32 - {E877E475-A428-4FBC-AF71-378AFB92B706}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A4DB82D5-1FC8-4F42-9584-C5D51A28E429} - EndGlobalSection - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection -EndGlobal diff --git a/server/client.cpp b/server/client.cpp deleted file mode 100644 index 22aa053..0000000 --- a/server/client.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include "client.hpp" -#include "server.hpp" - -/* -std::vector< byte > server::c_client::receive_message( ) { - std::vector< uint8_t > ret; - char buffer[ BUFFER_SIZE ]{ }; - int received = 0; - - while( true ) { - received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); - if( received < 0 ) - break; - - for( int i{ }; i < received; ++i ) - ret.push_back( buffer[ i ] ); - - if( received < BUFFER_SIZE ) - break; - } - - if( ret.size( ) ) { - decode_buffer( ret.data( ), ret.size( ) ); - ret.push_back( 0 ); - ret.erase( ret.begin( ) ); - } - - return ret; -} -*/ - -void server::c_client::kill( ) { - closesocket( m_socket ); - printf( "%s disconnected\n", get_ip( ) ); -} - -std::string server::c_client::get_msg( ) { - std::string ret{ }; - char buffer[ BUFFER_SIZE ]{ }; - int received = 0; - - while ( true ) { - received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); - if ( received < 0 ) - break; - - for ( int i{ }; i < received; ++i ) - ret.push_back( buffer[ i ] ); - - if ( received < BUFFER_SIZE ) - break; - } - - if ( ret.size( ) ) { - decode_buffer( ( uint8_t* )ret.data( ), ret.size( ) ); - // ret.push_back( 0 ); somehow broke things :/ - ret.erase( ret.begin( ) ); - } - - return ret; -} - -bool server::c_client::send_msg( byte* msg, size_t length ) { - auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); - auto key = util::random_number( 0, 255 ) & 0xff; - - buffer[ 0 ] = key; - memcpy( buffer.get( ) + 1, - msg, - length ); - - for( size_t i = 1; i <= length; ++i ) { - buffer[ i ] ^= key; - } - - int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); - if( result == -1 ) { -#if WIN - printf( "error sending message to %s: %d\n", - get_ip( ), WSAGetLastError( ) ); -#else - printf( "error sending message to %s\n", - get_ip( ) ); -#endif - return false; - } - - return true; -} - -bool server::c_client::send_msg( const char* msg ) { - auto length = strlen( msg ); - auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); - auto key = util::random_number( 0, 255 ) & 0xff; - - memset( buffer.get( ), 0, length+1 ); - - buffer[ 0 ] = key; - memcpy( buffer.get( ) + 1, - msg, - length ); - - for ( size_t i = 1; i <= length; ++i ) { - buffer[ i ] ^= key; - } - - int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); - if ( result == -1 ) { -#if WIN - printf( "error sending message to %s: %d\n", - get_ip( ), WSAGetLastError( ) ); -#else - printf( "error sending message to %s\n", - get_ip( ) ); -#endif - return false; - } - - return true; -} - -bool server::c_client::handle( ) { - /* - ALL TEST CODE BELOW. - */ - auto hello_msg = get_msg( ); - printf( "%s\n", hello_msg.c_str( ) ); - - if ( hello_msg != "hello" ) - return false; - - auto username = get_msg( ); - if ( username != "friendly" ) - return false; - - printf( "correct username\n" ); - send_msg( "correct username" ); - - auto password = get_msg( ); - if ( password != "nigger" ) - return false; - - printf( "correct password\n" ); - send_msg( "correct password" ); - - const char* games_list = -R"(games: -1: CSGO -2: CSGO (test) -3: Garry's Mod -)"; - - send_msg( games_list ); - - auto game_id = get_msg( ); - - if ( game_id== "1" ) { - printf( "csgo\n" ); - send_msg( "csgo.exe" ); - } - else if ( game_id == "2" ) { - printf( "csgo test\n" ); - send_msg( "csgo.exe" ); - } - else if ( game_id == "3" ) { - printf( "gmod\n" ); - send_msg( "hl2.exe" ); - } - else { - printf( "invalid\n" ); - return false; - } - - auto found = get_msg( ); - if ( found != "found" ) - return false; - - printf( "process found\n" ); - - if ( game_id == "3" ) { - // test. make sure the file is in ur directory - auto file = std::ifstream( "gmod.dll", std::ifstream::binary ); - if ( file.is_open( ) ) { - file.seekg( 0, file.end ); - - auto size = ( int )file.tellg( ); - auto buffer = std::make_unique< char[ ] >( size ); - - memset( buffer.get( ), 0, size ); - - file.seekg( 0, file.beg ); - file.read( buffer.get( ), size ); - - send_msg( ( byte* )buffer.get( ), size ); - - file.close( ); - } - } - - return true; -} diff --git a/server/client.hpp b/server/client.hpp deleted file mode 100644 index c59e116..0000000 --- a/server/client.hpp +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once - -#ifdef WIN -#include -#pragma comment(lib, "ws2_32.lib") -#else -#include -#include -#include -#include -#include -#include -#endif - - -#include -#include -#include -#include -#include -#include - - -#include "util.hpp" - -constexpr auto PORT_NUM = 6969; -constexpr auto BUFFER_SIZE = 255; - -namespace server -{ - class c_client { - SOCKET m_socket{ }; - in_addr m_address{ }; - ulong_t m_hwid{ }; - public: - c_client( SOCKET socket, in_addr& address ) : - m_socket( socket ), - m_address( address ) - { } - - ~c_client( ) { - kill( ); - } - - - void decode_buffer( uint8_t* buf, size_t length ) { - auto key = buf[ 0 ]; - for( size_t i{ 1 }; i < length; ++i ) - buf[ i ] ^= key; - } - - auto get_ip( ) { - return inet_ntoa( m_address ); - } - - void kill( ); - - //std::vector< byte > receive_message( ); - std::string get_msg( ); - bool send_msg( byte* msg, size_t length ); - bool send_msg( const char* ); - - //handles messages, hwid etc - void handle_buffer( byte* msg ); - virtual bool handle( ); - }; -} \ No newline at end of file diff --git a/server/message.hpp b/server/message.hpp deleted file mode 100644 index bf67389..0000000 --- a/server/message.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -enum MessageType_t { - MSG_HELLO = 'h', - MSG_READY = 'r', - MSG_BAN = 'q', - MSG_IMPORT = 'i' -}; \ No newline at end of file diff --git a/server/server.cpp b/server/server.cpp deleted file mode 100644 index 010ec84..0000000 --- a/server/server.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "server.hpp" - -int server::c_server::init( ) { -#if WIN - if( WSAStartup( MAKEWORD( 2, 2 ), &m_sock_data ) ) // windows - return 1; -#endif - - m_socket = socket( AF_INET, SOCK_STREAM, 0 ); - if( m_socket == INVALID_SOCKET ) - return 2; - - sockaddr_in server_address{ }; - server_address.sin_addr.s_addr = INADDR_ANY; - server_address.sin_port = htons( PORT_NUM ); - server_address.sin_family = AF_INET; - - auto result = ::bind( m_socket, ( sockaddr* )( &server_address ), sizeof( server_address ) ); - return result != -1 ? 0 : 3; -} - -void server::c_server::listen( ) { - ::listen( m_socket, 5 ); - - sockaddr_in client_address{ }; - - // not needed, this is set in accept, values are input. - // client_address.sin_port = htons( PORT_NUM ); - int len = sizeof( client_address ); - - SOCKET result = accept( m_socket, ( sockaddr* )( &client_address ), &len ); - if( result == INVALID_SOCKET ) { - printf( "socket error accepting a connection\n" ); - return; - } - - printf( "incoming connection from: %s\n", inet_ntoa( client_address.sin_addr ) ); - - // connection established. - auto client = std::make_shared< c_client >( result, client_address.sin_addr ); - - // handshake. - client->send_msg( "hello" ); - - // surprised it even works with shared_ptr. - std::thread thread{ &c_client::handle, client }; - thread.detach( ); -} diff --git a/server/server.hpp b/server/server.hpp deleted file mode 100644 index 5ac8393..0000000 --- a/server/server.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#include -#include -#include -#include - -#include "client.hpp" - - -//since this will be running on our vps we dont need string encryption or protection for anything -//which is cool, i guess - -namespace server -{ - class c_server { - // not sure if even needed. - std::mutex m_mutex; - private: - WSADATA m_sock_data{ }; - SOCKET m_socket{ }; - - public: - ~c_server( ) { - if ( m_socket ) - closesocket( m_socket ); - } - - int init( ); - void listen( ); - void client_loop( ); - }; -} - -extern server::c_server g_server; \ No newline at end of file diff --git a/server/server.vcxproj b/server/server.vcxproj deleted file mode 100644 index 2135457..0000000 --- a/server/server.vcxproj +++ /dev/null @@ -1,234 +0,0 @@ - - - - - Debug - Win32 - - - pHit - Win32 - - - pHit - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {F0038E32-6DE8-47B7-BC86-8A2274B24406} - Win32Proj - server - 10.0.17763.0 - - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - false - - - Application - false - v141 - true - Unicode - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - false - - - Application - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - - - false - - - false - - - - Level3 - Disabled - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - stdcpp17 - - - true - Console - - - - - Level3 - Disabled - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - true - Console - - - - - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - stdcpp17 - - - true - true - true - Console - - - - - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - stdcpp17 - - - true - true - true - Console - - - - - Level3 - MaxSpeed - true - true - true - WIN;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - true - stdcpplatest - - - true - true - true - Console - - - - - Level3 - MaxSpeed - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - true - true - true - Console - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/server/server.vcxproj.filters b/server/server.vcxproj.filters deleted file mode 100644 index d732209..0000000 --- a/server/server.vcxproj.filters +++ /dev/null @@ -1,42 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/server/server_windows.cpp b/server/server_windows.cpp deleted file mode 100644 index e372ee5..0000000 --- a/server/server_windows.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#ifdef WIN -#include -#pragma comment(lib, "ws2_32.lib") -#else -#include -#include -#include -#include -#include -#include -#endif - -#include -#include -#include -#include -#include -#include "server.hpp" - -server::c_server g_server; - -int main( ) { - std::thread listen_thread; - - int result = g_server.init( ); - if( !result ) { - //listen_thread = std::thread( [ ]( ) { while( 1 ) { g_server.listen( ); } } ); - //listen_thread.detach( ); - - while( true ) { - g_server.listen( ); - //Sleep( 1 ); - } - } - else - printf( "server init error (%d)\n", result ); - - system( "pause" ); - return 0; -} diff --git a/server/util.hpp b/server/util.hpp deleted file mode 100644 index 1d408e0..0000000 --- a/server/util.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include - -using ulong_t = unsigned long; - -namespace util -{ - namespace { - //make a random generator and seed it with a p random number - static std::random_device rd; - static std::mt19937 gen( rd( ) ); - } - - template < typename t > - __forceinline t random_number( t min, t max ) { - if constexpr( !std::is_integral_v< t > ) { - std::uniform_real_distribution< t > dist( min, max ); - return dist( gen ); - } - else { - std::uniform_int_distribution< t > dist( min, max ); - return dist( gen ); - } - } -} \ No newline at end of file diff --git a/tf2/ButtonCode_t.h b/tf2/ButtonCode_t.h deleted file mode 100644 index 1d11c19..0000000 --- a/tf2/ButtonCode_t.h +++ /dev/null @@ -1,253 +0,0 @@ -#pragma once - -#define MAX_SPLITSCREEN_CLIENT_BITS 2 -#define MAX_SPLITSCREEN_CLIENTS ( 1 << MAX_SPLITSCREEN_CLIENT_BITS ) // 4 - -#define JOYSTICK_BUTTON_INTERNAL( _joystick, _button ) ( JOYSTICK_FIRST_BUTTON + ((_joystick) * JOYSTICK_MAX_BUTTON_COUNT) + (_button) ) -#define JOYSTICK_POV_BUTTON_INTERNAL( _joystick, _button ) ( JOYSTICK_FIRST_POV_BUTTON + ((_joystick) * JOYSTICK_POV_BUTTON_COUNT) + (_button) ) -#define JOYSTICK_AXIS_BUTTON_INTERNAL( _joystick, _button ) ( JOYSTICK_FIRST_AXIS_BUTTON + ((_joystick) * JOYSTICK_AXIS_BUTTON_COUNT) + (_button) ) - -#define JOYSTICK_BUTTON( _joystick, _button ) ( (ButtonCode_t)JOYSTICK_BUTTON_INTERNAL( _joystick, _button ) ) -#define JOYSTICK_POV_BUTTON( _joystick, _button ) ( (ButtonCode_t)JOYSTICK_POV_BUTTON_INTERNAL( _joystick, _button ) ) -#define JOYSTICK_AXIS_BUTTON( _joystick, _button ) ( (ButtonCode_t)JOYSTICK_AXIS_BUTTON_INTERNAL( _joystick, _button ) ) - -enum { - MAX_JOYSTICKS = MAX_SPLITSCREEN_CLIENTS, - MOUSE_BUTTON_COUNT = 5, -}; - -enum JoystickAxis_t { - JOY_AXIS_X = 0, - JOY_AXIS_Y, - JOY_AXIS_Z, - JOY_AXIS_R, - JOY_AXIS_U, - JOY_AXIS_V, - MAX_JOYSTICK_AXES, -}; - -enum { - JOYSTICK_MAX_BUTTON_COUNT = 32, - JOYSTICK_POV_BUTTON_COUNT = 4, - JOYSTICK_AXIS_BUTTON_COUNT = MAX_JOYSTICK_AXES * 2, -}; - -enum ButtonCode_t { - BUTTON_CODE_INVALID = -1, - BUTTON_CODE_NONE = 0, - - KEY_FIRST = 0, - - KEY_NONE = KEY_FIRST, - KEY_0, - KEY_1, - KEY_2, - KEY_3, - KEY_4, - KEY_5, - KEY_6, - KEY_7, - KEY_8, - KEY_9, - KEY_A, - KEY_B, - KEY_C, - KEY_D, - KEY_E, - KEY_F, - KEY_G, - KEY_H, - KEY_I, - KEY_J, - KEY_K, - KEY_L, - KEY_M, - KEY_N, - KEY_O, - KEY_P, - KEY_Q, - KEY_R, - KEY_S, - KEY_T, - KEY_U, - KEY_V, - KEY_W, - KEY_X, - KEY_Y, - KEY_Z, - KEY_PAD_0, - KEY_PAD_1, - KEY_PAD_2, - KEY_PAD_3, - KEY_PAD_4, - KEY_PAD_5, - KEY_PAD_6, - KEY_PAD_7, - KEY_PAD_8, - KEY_PAD_9, - KEY_PAD_DIVIDE, - KEY_PAD_MULTIPLY, - KEY_PAD_MINUS, - KEY_PAD_PLUS, - KEY_PAD_ENTER, - KEY_PAD_DECIMAL, - KEY_LBRACKET, - KEY_RBRACKET, - KEY_SEMICOLON, - KEY_APOSTROPHE, - KEY_BACKQUOTE, - KEY_COMMA, - KEY_PERIOD, - KEY_SLASH, - KEY_BACKSLASH, - KEY_MINUS, - KEY_EQUAL, - KEY_ENTER, - KEY_SPACE, - KEY_BACKSPACE, - KEY_TAB, - KEY_CAPSLOCK, - KEY_NUMLOCK, - KEY_ESCAPE, - KEY_SCROLLLOCK, - KEY_INSERT, - KEY_DELETE, - KEY_HOME, - KEY_END, - KEY_PAGEUP, - KEY_PAGEDOWN, - KEY_BREAK, - KEY_LSHIFT, - KEY_RSHIFT, - KEY_LALT, - KEY_RALT, - KEY_LCONTROL, - KEY_RCONTROL, - KEY_LWIN, - KEY_RWIN, - KEY_APP, - KEY_UP, - KEY_LEFT, - KEY_DOWN, - KEY_RIGHT, - KEY_F1, - KEY_F2, - KEY_F3, - KEY_F4, - KEY_F5, - KEY_F6, - KEY_F7, - KEY_F8, - KEY_F9, - KEY_F10, - KEY_F11, - KEY_F12, - KEY_CAPSLOCKTOGGLE, - KEY_NUMLOCKTOGGLE, - KEY_SCROLLLOCKTOGGLE, - - KEY_LAST = KEY_SCROLLLOCKTOGGLE, - KEY_COUNT = KEY_LAST - KEY_FIRST + 1, - - // Mouse - MOUSE_FIRST = KEY_LAST + 1, - - MOUSE_LEFT = MOUSE_FIRST, - MOUSE_RIGHT, - MOUSE_MIDDLE, - MOUSE_4, - MOUSE_5, - MOUSE_WHEEL_UP, // A fake button which is 'pressed' and 'released' when the wheel is moved up - MOUSE_WHEEL_DOWN, // A fake button which is 'pressed' and 'released' when the wheel is moved down - - MOUSE_LAST = MOUSE_WHEEL_DOWN, - MOUSE_COUNT = MOUSE_LAST - MOUSE_FIRST + 1, - - // Joystick - JOYSTICK_FIRST = MOUSE_LAST + 1, - - JOYSTICK_FIRST_BUTTON = JOYSTICK_FIRST, - JOYSTICK_LAST_BUTTON = JOYSTICK_BUTTON_INTERNAL( MAX_JOYSTICKS - 1, JOYSTICK_MAX_BUTTON_COUNT - 1 ), - JOYSTICK_FIRST_POV_BUTTON, - JOYSTICK_LAST_POV_BUTTON = JOYSTICK_POV_BUTTON_INTERNAL( MAX_JOYSTICKS - 1, JOYSTICK_POV_BUTTON_COUNT - 1 ), - JOYSTICK_FIRST_AXIS_BUTTON, - JOYSTICK_LAST_AXIS_BUTTON = JOYSTICK_AXIS_BUTTON_INTERNAL( MAX_JOYSTICKS - 1, JOYSTICK_AXIS_BUTTON_COUNT - 1 ), - - JOYSTICK_LAST = JOYSTICK_LAST_AXIS_BUTTON, - - BUTTON_CODE_LAST, - BUTTON_CODE_COUNT = BUTTON_CODE_LAST - KEY_FIRST + 1, - - // Helpers for XBox 360 - KEY_XBUTTON_UP = JOYSTICK_FIRST_POV_BUTTON, // POV buttons - KEY_XBUTTON_RIGHT, - KEY_XBUTTON_DOWN, - KEY_XBUTTON_LEFT, - - KEY_XBUTTON_A = JOYSTICK_FIRST_BUTTON, // Buttons - KEY_XBUTTON_B, - KEY_XBUTTON_X, - KEY_XBUTTON_Y, - KEY_XBUTTON_LEFT_SHOULDER, - KEY_XBUTTON_RIGHT_SHOULDER, - KEY_XBUTTON_BACK, - KEY_XBUTTON_START, - KEY_XBUTTON_STICK1, - KEY_XBUTTON_STICK2, - KEY_XBUTTON_INACTIVE_START, - - KEY_XSTICK1_RIGHT = JOYSTICK_FIRST_AXIS_BUTTON, // XAXIS POSITIVE - KEY_XSTICK1_LEFT, // XAXIS NEGATIVE - KEY_XSTICK1_DOWN, // YAXIS POSITIVE - KEY_XSTICK1_UP, // YAXIS NEGATIVE - KEY_XBUTTON_LTRIGGER, // ZAXIS POSITIVE - KEY_XBUTTON_RTRIGGER, // ZAXIS NEGATIVE - KEY_XSTICK2_RIGHT, // UAXIS POSITIVE - KEY_XSTICK2_LEFT, // UAXIS NEGATIVE - KEY_XSTICK2_DOWN, // VAXIS POSITIVE - KEY_XSTICK2_UP, // VAXIS NEGATIVE - KEY_MAX, -}; - -enum AnalogCode_t { - ANALOG_CODE_INVALID = -1, - MOUSE_X = 0, - MOUSE_Y, - MOUSE_XY, // Invoked when either x or y changes - MOUSE_WHEEL, - - JOYSTICK_FIRST_AXIS, - JOYSTICK_LAST_AXIS = 5, - - ANALOG_CODE_LAST, -}; - -enum InputStandardCursor_t { - INPUT_CURSOR_NONE = 0, - INPUT_CURSOR_ARROW, - INPUT_CURSOR_IBEAM, - INPUT_CURSOR_HOURGLASS, - INPUT_CURSOR_CROSSHAIR, - INPUT_CURSOR_WAITARROW, - INPUT_CURSOR_UP, - INPUT_CURSOR_SIZE_NW_SE, - INPUT_CURSOR_SIZE_NE_SW, - INPUT_CURSOR_SIZE_W_E, - INPUT_CURSOR_SIZE_N_S, - INPUT_CURSOR_SIZE_ALL, - INPUT_CURSOR_NO, - INPUT_CURSOR_HAND, - - INPUT_CURSOR_COUNT -}; - -using PlatWindow_t = void*; -using InputCursorHandle_t = void*; - -struct InputEvent_t { - int m_nType; // Type of the event (see InputEventType_t) - int m_nTick; // Tick on which the event occurred - int m_nData; // Generic 32-bit data, what it contains depends on the event - int m_nData2; // Generic 32-bit data, what it contains depends on the event - int m_nData3; // Generic 32-bit data, what it contains depends on the event -}; \ No newline at end of file diff --git a/tf2/CAttribute.h b/tf2/CAttribute.h deleted file mode 100644 index a7dd944..0000000 --- a/tf2/CAttribute.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include "UtlMem.h" - -class c_attribute { -private: - void* vtable; -public: - uint16_t m_attribute_definition_index; - float m_value; -private: - uint32_t unk; - -public: - __forceinline c_attribute( unsigned short index, float value ) { - m_attribute_definition_index = index; - m_value = value; - } -}; - -class c_attribute_list { -private: - uint32_t unk; -public: - CUtlVector< c_attribute, CUtlMemory< c_attribute > > m_attributes; - - __forceinline void add_attribute( int index, float value ) { - if ( m_attributes.Count( ) >= 15 ) return; //setting this above 15 will crash - if ( has_attrib( index ) ) return; - - c_attribute attribute( index, value ); - m_attributes.AddToTail( attribute ); - } - - __forceinline bool has_attrib( int index ) { - for ( int i{ }; i < m_attributes.Count( ); i++ ) { - if ( !m_attributes ) continue; - if ( m_attributes[ i ].m_attribute_definition_index == index ) return true; - } - return false; - } -}; \ No newline at end of file diff --git a/tf2/CBasePlayer.cpp b/tf2/CBasePlayer.cpp deleted file mode 100644 index a5860ac..0000000 --- a/tf2/CBasePlayer.cpp +++ /dev/null @@ -1,264 +0,0 @@ -#include "CBasePlayer.h" -#include "sdk.h" -#include -#include "math.h" -#include "graphics.h" -#include "CBaseWeapon.h" -#include "ClientClass.h" -#include "IVEngineClient.h" - -vec3_t c_base_player::get_eye_pos( ) { - vec3_t offset = get_view_offset( ); - vec3_t origin = get_origin( ); - return offset + origin; -} - -uintptr_t c_base_player::get_player_resource( ) { - for( int i{ 1 }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i ); - if( !ent ) continue; - auto class_ = ent->GetClientClass( ); - if( class_ ) { - if( class_->m_class_id == CTFPlayerResource ) { - return uintptr_t( ent ); - } - } - } - - return 0; -} - -player_info_t c_base_player::get_info( ) { - player_info_t info; - cl.m_engine( )->GetPlayerInfo( ce( )->index( ), &info ); - - return info; -} - -void c_base_player::get_name_safe( char* buf ) { - player_info_t info; - if( cl.m_engine( )->GetPlayerInfo( this->ce( )->index( ), &info ) ) { - for( size_t i{ }; i < 32; ++i ) { - switch( info.name[ i ] ) { - case '"': - case '\\': - case ';': - case '\n': - buf[ i ] = ' '; - break; - default: - buf[ i ] = info.name[ i ]; - break; - } - } - - buf[ 31 ] = 0; - } -} - -uintptr_t c_base_player::get_game_rules( ) { - static uintptr_t** game_rules = pattern::first_code_match< uintptr_t** >( cl.m_chl.dll( ), xors( "A1 ? ? ? ? 85 C0 0F 84 ? ? ? ? 80 B8 ? ? ? ? ? 0F 84 ? ? ? ? 0F 10 05" ), 0x1 ); - return **game_rules; -} - -bool c_base_player::is_valid( ) { - auto local = cl.m_entlist( )->get_local_player( ); - return ( this != local && !is_dormant( ) && is_alive( ) && GetClientClass( )->m_class_id == CTFPlayer ); -} - -vec3_t c_base_player::get_origin( ) { - return m_vecOrigin( ); -} - -vec3_t c_base_player::get_view_offset( ) { - return m_vecViewOffset( ); -} - -vec3_t c_base_player::get_eye_angles( ) { - return m_angEyeAngles( ); -} - -vec3_t c_base_player::get_velocity( ) { - return m_vecVelocity( ); -} - -vec3_t c_base_player::get_bone_position( int bone ) { - matrix3x4 matrix[ 128 ]; - - setup_bones( matrix, 128, 0x100, cl.m_globals->curtime ); - - return vec3_t( matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] ); -} - -// bye fps lol -vec3_t c_base_player::get_hitbox_position( int hitbox ) { - const auto model = get_model( ); - if ( !model ) return vec3_t{ }; - - auto hdr = cl.m_modelinfo( )->GetStudioModel( model ); - if ( !hdr ) return vec3_t{ }; - - matrix3x4 matrix[ 128 ]; - if ( !setup_bones( matrix, 128, 0x100, cl.m_globals->curtime ) ) return vec3_t{ }; - - auto set = hdr->pHitboxSet( m_nHitboxSet( ) ); - if ( !set ) return vec3_t{ }; - - auto box = set->pHitbox( hitbox ); - - vec3_t hitbox_center = ( box->bbmin + box->bbmax ) * 0.5f; - - vec3_t transformed = math::vector_transform( hitbox_center, matrix[ box->bone ] ); - - return transformed; -} - -int c_base_player::get_team( ) { - return m_iTeamNum( ); -} - -bool c_base_player::is_enemy( ) { - auto local = g_ctx.m_local; - if ( !local ) return false; - return get_team( ) != local->get_team( ); -} - -int c_base_player::get_class( ) { - int class_num = m_iClass( ); - return std::clamp( class_num, 0, 10 ); //to prevent crashes if its out of bounds -} - -const char* c_base_player::get_class_name( ) { - static const char* tf2_class_names[ ] = { - "none", - "scout", - "sniper", - "soldier", - "demoman", - "medic", - "heavy", - "pyro", - "spy", - "engineer", - "invalid" - }; - return tf2_class_names[ get_class( ) ]; -} - -byte c_base_player::get_life_state( ) { - return m_lifeState( ); -} - -int c_base_player::get_flags( ) { - return m_fFlags( ); -} - -int c_base_player::get_health( ) { - return m_iHealth( ); -} - -int c_base_player::get_max_health( ) { - IClientEntity* player_resource{ }; - for ( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); i++ ) { - auto ent = cl.m_entlist( )->get_client_entity( i ); - if ( ent && ent->GetClientClass( )->m_class_id == CTFPlayerResource ) { - player_resource = ent; - break; - } - } - if ( !player_resource ) return 0; - - return *reinterpret_cast< int* >( uintptr_t( player_resource ) + m_iMaxHealth( ) + ( 4 * this->index( ) ) ); -} - -bool c_base_player::is_buffed( ) { - return get_health( ) > get_max_health( ); -} - -bool c_base_player::is_alive( ) { - return m_iHealth( ) > 0 && get_life_state( ) == LIFE_ALIVE; -} - -int c_base_player::get_tick_base( ) { - return m_nTickBase( ); -} - -bool c_base_player::is_visible( ) { - auto local = cl.m_entlist( )->get_local_player( ); - if ( !local ) return true; - trace_t tr; - Ray_t ray; - CTraceFilter filter; - - filter.pSkip = local; - - ray.Init( local->get_eye_pos( ), get_eye_pos( ) ); - - cl.m_trace( )->trace_ray( ray, MASK_AIM, &filter, &tr ); - - return ( tr.m_pEnt == this || tr.fraction > 0.99f ); -} - -bool c_base_player::is_visible( int hitbox ) { - auto local = cl.m_entlist( )->get_local_player( ); - if ( !local ) return true; - trace_t tr; - Ray_t ray; - CTraceFilter filter; - - filter.pSkip = local; - - ray.Init( local->get_eye_pos( ), get_hitbox_position( hitbox ) ); - - cl.m_trace( )->trace_ray( ray, MASK_AIM, &filter, &tr ); - - return ( tr.m_pEnt == this || tr.fraction > 0.99f ); -} - -dynamic_box_t c_base_player::get_dynamic_box( ) { - const matrix3x4& trans = m_CollisionGroup( ); - - vec3_t min = *reinterpret_cast< vec3_t* >( this + m_Collision( ) + 0x8 ); - vec3_t max = *reinterpret_cast< vec3_t* >( this + m_Collision( ) + 0x14 ); - - vec3_t point_list[ ] = { - vec3_t( min.x, min.y, min.z ), - vec3_t( min.x, max.y, min.z ), - vec3_t( max.x, max.y, min.z ), - vec3_t( max.x, min.y, min.z ), - vec3_t( max.x, max.y, max.z ), - vec3_t( min.x, max.y, max.z ), - vec3_t( min.x, min.y, max.z ), - vec3_t( max.x, min.y, max.z ) - }; - - vec3_t transformed[ 8 ]; - - for ( int i{ }; i < 8; i++ ) { - transformed[ i ] = math::vector_transform( point_list[ i ], trans ); - } - - vec2_t screen_pos[ 8 ]{ vec2_t( 0.f, 0.f ) }; - - for ( int i = 0; i < 8; i++ ) { - screen_pos[ i ] = graphics.world_to_screen( transformed[ i ] ); - } - - float left = FLT_MAX, top = FLT_MIN, right = FLT_MIN, bottom = FLT_MAX; - - for ( int i{ }; i < 8; i++ ) { - left = std::min< float >( left, screen_pos[ i ].x ); - top = std::max< float >( top, screen_pos[ i ].y ); - right = std::max< float >( right, screen_pos[ i ].x ); - bottom = std::min< float >( bottom, screen_pos[ i ].y ); - } - - if ( right - left > 4000.f || top - bottom > 4000.f ) return{ 10000, 10000, 0, 0 }; //sanity check - return{ ( int )left, ( int )bottom, ( int )( right - left ), ( int )( top - bottom ) + 4 }; -} - -c_base_weapon* c_base_player::get_active_weapon( ) { - auto wep_handle = m_hActiveWeapon( ); - auto weapon = reinterpret_cast< c_base_weapon* >( cl.m_entlist( )->get_entity_from_handle( wep_handle ) ); - return weapon; -} diff --git a/tf2/CBasePlayer.h b/tf2/CBasePlayer.h deleted file mode 100644 index dbce5cd..0000000 --- a/tf2/CBasePlayer.h +++ /dev/null @@ -1,241 +0,0 @@ -#pragma once -#include "vector.hpp" -#include "CBaseWeapon.h" -#include "IVEngineClient.h" - -enum MoveType_t { - MOVETYPE_NONE = 0, // never moves - MOVETYPE_ISOMETRIC, // For players -- in TF2 commander view, etc. - MOVETYPE_WALK, // Player only - moving on the ground - MOVETYPE_STEP, // gravity, special edge handling -- monsters use this - MOVETYPE_FLY, // No gravity, but still collides with stuff - MOVETYPE_FLYGRAVITY, // flies through the air + is affected by gravity - MOVETYPE_VPHYSICS, // uses VPHYSICS for simulation - MOVETYPE_PUSH, // no clip to world, push and crush - MOVETYPE_NOCLIP, // No gravity, no collisions, still do velocity/avelocity - MOVETYPE_LADDER, // Used by players only when going onto a ladder - MOVETYPE_OBSERVER, // Observer movement, depends on player's observer mode - MOVETYPE_CUSTOM, // Allows the entity to describe its own physics - MOVETYPE_LAST = MOVETYPE_CUSTOM, // should always be defined as the last item in the list - MOVETYPE_MAX_BITS = 4, -}; - -enum TFClasses_t { - TF2_None = 0, - TF2_Scout, - TF2_Sniper, - TF2_Soldier, - TF2_Demoman, - TF2_Medic, - TF2_Heavy, - TF2_Pyro, - TF2_Spy, - TF2_Engineer -}; - -enum LifeStates_t { - LIFE_ALIVE = 0, - LIFE_DYING, - LIFE_DEAD, - LIFE_RESPAWNABLE, - LIFE_DISCARDBODY -}; - -enum PlayerStates_t { - FL_ONGROUND = ( 1 << 0 ), - FL_DUCKING = ( 1 << 1 ), - FL_WATERJUMP = ( 1 << 2 ), - FL_ONTRAIN = ( 1 << 3 ), - FL_INRAIN = ( 1 << 4 ), - FL_FROZEN = ( 1 << 5 ), - FL_ATCONTROLS = ( 1 << 6 ), - FL_CLIENT = ( 1 << 7 ), - FL_FAKECLIENT = ( 1 << 8 ), - FL_INWATER = ( 1 << 9 ), -}; - -struct dynamic_box_t { - int x, y, w, h; -}; - -enum PlayerConds_t -{ - TFCond_Slowed = ( 1 << 0 ), //Toggled when a player is slowed down. - TFCond_Zoomed = ( 1 << 1 ), //Toggled when a player is zoomed. - TFCond_Disguising = ( 1 << 2 ), //Toggled when a Spy is disguising. - TFCond_Disguised = ( 1 << 3 ), //Toggled when a Spy is disguised. - TFCond_Cloaked = ( 1 << 4 ), //Toggled when a Spy is invisible. - TFCond_Ubercharged = ( 1 << 5 ), //Toggled when a player is ÜberCharged. - TFCond_TeleportedGlow = ( 1 << 6 ), //Toggled when someone leaves a teleporter and has glow beneath their feet. - TFCond_Taunting = ( 1 << 7 ), //Toggled when a player is taunting. - TFCond_UberchargeFading = ( 1 << 8 ), //Toggled when the ÜberCharge is fading. - TFCond_CloakFlicker = ( 1 << 9 ), //Toggled when a Spy is visible during cloak. - TFCond_Teleporting = ( 1 << 10 ), //Only activates for a brief second when the player is being teleported; not very useful. - TFCond_Kritzkrieged = ( 1 << 11 ), //Toggled when a player is being crit buffed by the KritzKrieg. - TFCond_TmpDamageBonus = ( 1 << 12 ), //Unknown what this is for. Name taken from the AlliedModders SDK. - TFCond_DeadRingered = ( 1 << 13 ), //Toggled when a player is taking reduced damage from the Deadringer. - TFCond_Bonked = ( 1 << 14 ), //Toggled when a player is under the effects of The Bonk! Atomic Punch. - TFCond_Stunned = ( 1 << 15 ), //Toggled when a player's speed is reduced from airblast or a Sandman ball. - TFCond_Buffed = ( 1 << 16 ), //Toggled when a player is within range of an activated Buff Banner. - TFCond_Charging = ( 1 << 17 ), //Toggled when a Demoman charges with the shield. - TFCond_DemoBuff = ( 1 << 18 ), //Toggled when a Demoman has heads from the Eyelander. - TFCond_CritCola = ( 1 << 19 ), //Toggled when the player is under the effect of The Crit-a-Cola. - TFCond_InHealRadius = ( 1 << 20 ), //Unused condition, name taken from AlliedModders SDK. - TFCond_Healing = ( 1 << 21 ), //Toggled when someone is being healed by a medic or a dispenser. - TFCond_OnFire = ( 1 << 22 ), //Toggled when a player is on fire. - TFCond_Overhealed = ( 1 << 23 ), //Toggled when a player has >100% health. - TFCond_Jarated = ( 1 << 24 ), //Toggled when a player is hit with a Sniper's Jarate. - TFCond_Bleeding = ( 1 << 25 ), //Toggled when a player is taking bleeding damage. - TFCond_DefenseBuffed = ( 1 << 26 ), //Toggled when a player is within range of an activated Battalion's Backup. - TFCond_Milked = ( 1 << 27 ), //Player was hit with a jar of Mad Milk. - TFCond_MegaHeal = ( 1 << 28 ), //Player is under the effect of Quick-Fix charge. - TFCond_RegenBuffed = ( 1 << 29 ), //Toggled when a player is within a Concheror's range. - TFCond_MarkedForDeath = ( 1 << 30 ), //Player is marked for death by a Fan O'War hit. Effects are similar to TFCond_Jarated. - TFCond_NoHealingDamageBuff = ( 1 << 31 ), //Unknown what this is used for. - - TFCondEx_SpeedBuffAlly = ( 1 << 0 ), //Toggled when a player gets hit with the disciplinary action. - TFCondEx_HalloweenCritCandy = ( 1 << 1 ), //Only for Scream Fortress event maps that drop crit candy. - TFCondEx_CritCanteen = ( 1 << 2 ), //Player is getting a crit boost from a MVM canteen. - TFCondEx_CritDemoCharge = ( 1 << 3 ), //From demo's shield - TFCondEx_CritHype = ( 1 << 4 ), //Soda Popper crits. - TFCondEx_CritOnFirstBlood = ( 1 << 5 ), //Arena first blood crit buff. - TFCondEx_CritOnWin = ( 1 << 6 ), //End of round crits. - TFCondEx_CritOnFlagCapture = ( 1 << 7 ), //CTF intelligence capture crits. - TFCondEx_CritOnKill = ( 1 << 8 ), //Unknown what this is for. - TFCondEx_RestrictToMelee = ( 1 << 9 ), //Unknown what this is for. - TFCondEx_DefenseBuffNoCritBlock = ( 1 << 10 ), //MvM Buff. - TFCondEx_Reprogrammed = ( 1 << 11 ), //MvM Bot has been reprogrammed. - TFCondEx_PyroCrits = ( 1 << 12 ), //Player is getting crits from the Mmmph charge. - TFCondEx_PyroHeal = ( 1 << 13 ), //Player is being healed from the Mmmph charge. - TFCondEx_FocusBuff = ( 1 << 14 ), //Player is getting a focus buff. - TFCondEx_DisguisedRemoved = ( 1 << 15 ), //Disguised remove from a bot. - TFCondEx_MarkedForDeathSilent = ( 1 << 16 ), //Player is under the effects of the Escape Plan/Equalizer or GRU. - TFCondEx_DisguisedAsDispenser = ( 1 << 17 ), //Bot is disguised as dispenser. - TFCondEx_Sapped = ( 1 << 18 ), //MvM bot is being sapped. - TFCondEx_UberchargedHidden = ( 1 << 19 ), //MvM Related - TFCondEx_UberchargedCanteen = ( 1 << 20 ), //Player is receiving ÜberCharge from a canteen. - TFCondEx_HalloweenBombHead = ( 1 << 21 ), //Player has a bomb on their head from Merasmus. - TFCondEx_HalloweenThriller = ( 1 << 22 ), //Players are forced to dance from Merasmus. - TFCondEx_BulletCharge = ( 1 << 26 ), //Player is receiving 75% reduced damage from bullets. - TFCondEx_ExplosiveCharge = ( 1 << 27 ), //Player is receiving 75% reduced damage from explosives. - TFCondEx_FireCharge = ( 1 << 28 ), //Player is receiving 75% reduced damage from fire. - TFCondEx_BulletResistance = ( 1 << 29 ), //Player is receiving 10% reduced damage from bullets. - TFCondEx_ExplosiveResistance = ( 1 << 30 ), //Player is receiving 10% reduced damage from explosives. - TFCondEx_FireResistance = ( 1 << 31 ), //Player is receiving 10% reduced damage from fire. - - TFCondEx2_Stealthed = ( 1 << 0 ), - TFCondEx2_MedigunDebuff = ( 1 << 1 ), - TFCondEx2_StealthedUserBuffFade = ( 1 << 2 ), - TFCondEx2_BulletImmune = ( 1 << 3 ), - TFCondEx2_BlastImmune = ( 1 << 4 ), - TFCondEx2_FireImmune = ( 1 << 5 ), - TFCondEx2_PreventDeath = ( 1 << 6 ), - TFCondEx2_MVMBotRadiowave = ( 1 << 7 ), - TFCondEx2_HalloweenSpeedBoost = ( 1 << 8 ), //Wheel has granted player speed boost. - TFCondEx2_HalloweenQuickHeal = ( 1 << 9 ), //Wheel has granted player quick heal. - TFCondEx2_HalloweenGiant = ( 1 << 10 ), //Wheel has granted player giant mode. - TFCondEx2_HalloweenTiny = ( 1 << 11 ), //Wheel has granted player tiny mode. - TFCondEx2_HalloweenInHell = ( 1 << 12 ), //Wheel has granted player in hell mode. - TFCondEx2_HalloweenGhostMode = ( 1 << 13 ), //Wheel has granted player ghost mode. - TFCondEx2_Parachute = ( 1 << 16 ), //Player has deployed the BASE Jumper. - TFCondEx2_BlastJumping = ( 1 << 17 ), //Player has sticky or rocket jumped. - - TFCond_MiniCrits = ( TFCond_Buffed | TFCond_CritCola ), - TFCond_IgnoreStates = ( TFCond_Ubercharged | TFCond_Bonked ), - TFCondEx_IgnoreStates = ( TFCondEx_PyroHeal ) -}; - -enum tf_hitbox : int { - head = 0, - pelvis = 1, - spine_0 = 2, - spine_1 = 3, - spine_2 = 4, - spine_3 = 5, - upperArm_L = 6, - lowerArm_L = 7, - hand_L = 8, - upperArm_R = 9, - lowerArm_R = 10, - hand_R = 11, - hip_L = 12, - knee_L = 13, - foot_L = 14, - hip_R = 15, - knee_R = 16, - foot_R = 17, -}; - -class c_base_player : public IClientEntity { -public: - - NETVAR( m_nMoveType, "m_nRenderMode", "DT_BaseEntity", 1, MoveType_t ); - NETVAR( m_fFlags, "m_fFlags", "DT_BasePlayer", 0, int ); - NETVAR( m_vecVelocity, "m_vecVelocity[0]", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_flSimulationTime, "m_flSimulationTime", "DT_BaseEntity", 0, float ); - NETVAR( m_vecOrigin, "m_vecOrigin", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_angRotation, "m_angRotation", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_CollisionGroup, "m_CollisionGroup", "DT_BaseEntity", -0x4c, matrix3x4 ); - NETVAR( m_Collision, "m_Collision", "DT_BaseEntity", 0, std::ptrdiff_t ); - NETVAR( m_vecViewOffset, "m_vecViewOffset[0]", "DT_BasePlayer", 0, vec3_t ); - NETVAR( m_nTickBase, "m_nTickBase", "DT_BasePlayer", 0, int ); - NETVAR( m_lifeState, "m_lifeState", "DT_BasePlayer", 0, byte ); - NETVAR( m_iHealth, "m_iHealth", "DT_BasePlayer", 0, int ); - NETVAR( m_iTeamNum, "m_iTeamNum", "DT_BasePlayer", 0, int ); - NETVAR( m_nHitboxSet, "m_nHitboxSet", "DT_BaseAnimating", 0, int ); - NETVAR( m_PlayerClass, "m_PlayerClass", "DT_TFPlayer", 0, int ); - NETVAR( m_iClass, "m_iClass", "DT_TFPlayer", 0, int ); - NETVAR( m_angEyeAngles, "m_angEyeAngles[0]", "DT_TFPlayer", 0, vec3_t ); - NETVAR( m_hActiveWeapon, "m_hActiveWeapon", "DT_BaseCombatCharacter", 0, uintptr_t ); - NETVAR( m_iMaxHealth, "m_iMaxHealth", "DT_TFPlayerResource", 0, std::ptrdiff_t ); - NETVAR( m_hObserverTarget, "m_hObserverTarget", "DT_BasePlayer", 0, uint32_t ); - NETVAR( m_bIsScoped, "m_bIsScoped", "DT_TFPlayer", 0, bool ); - NETVAR( m_vecMins, "m_vecMins", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_vecMaxs, "m_vecMaxs", "DT_BaseEntity", 0, vec3_t ); - NETVAR( m_iObserverMode, "m_iObserverMode", "DT_Base_player", 0, int ); - NETVAR( m_bGlowEnabled, "m_bGlowEnabled", "DT_TFPlayer", 0, bool ); - NETVAR( m_nPlayerCond, "m_nPlayerCond", "DT_TFPlayer", 0, int ); - - //fuck you this is for ragdolls - NETVAR( m_vecRagdollVelocity, "m_vecRagdollVelocity", "DT_TFRagdoll", 0, vec3_t ); - - - - static uintptr_t get_player_resource( ); - static uintptr_t get_game_rules( ); - - __forceinline IClientEntity* ce( ) { - return reinterpret_cast< IClientEntity* >( this ); - } - - __forceinline bool is_player( ) { - client_class_t* client_class = ce( )->GetClientClass( ); - return client_class && client_class->m_class_id == CTFPlayer; - } - - player_info_t get_info( ); - void get_name_safe( char* buf ); - bool is_valid( ); - vec3_t get_eye_pos( ); - vec3_t get_origin( ); - vec3_t get_view_offset( ); - vec3_t get_bone_position( int ); - vec3_t get_hitbox_position( int ); - vec3_t get_eye_angles( ); - vec3_t get_velocity( ); - int get_team( ); - bool is_enemy( ); - const char* get_class_name( ); - int get_class( ); - byte get_life_state( ); - int get_flags( ); - bool is_alive( ); - bool is_visible( ); - bool is_visible( int ); - dynamic_box_t get_dynamic_box( ); - int get_health( ); - int get_max_health( ); - bool is_buffed( ); - int get_tick_base( ); - c_base_weapon* get_active_weapon( ); -}; \ No newline at end of file diff --git a/tf2/CBaseWeapon.cpp b/tf2/CBaseWeapon.cpp deleted file mode 100644 index b9881d1..0000000 --- a/tf2/CBaseWeapon.cpp +++ /dev/null @@ -1,69 +0,0 @@ -#include "CBaseWeapon.h" -#include "interfaces.h" - -int c_base_weapon::get_max_clip_1( ) { - return call_vfunc< int( __thiscall* )( void* ) >( this, 318 )( this ); -} - -int c_base_weapon::get_max_clip_2( ) { - return call_vfunc< int( __thiscall* )( void* ) >( this, 319 )( this ); -} - -int c_base_weapon::get_slot( ) { - return call_vfunc< int( __thiscall* )( void* ) >( this, 327 )( this ); -} - -char* c_base_weapon::get_name( ) { - return call_vfunc< char *( __thiscall* )( void* ) >( this, 329 )( this ); -} - -char* c_base_weapon::get_print_name( ) { - return call_vfunc< char *( __thiscall* )( void* ) >( this, 330 )( this ); -} - -vec3_t& c_base_weapon::get_bullet_spread( ) { - return call_vfunc< vec3_t& ( __thiscall* )( void* ) >( this, 286 )( this ); -} - -float c_base_weapon::get_spread( ) { - return call_vfunc< float( __thiscall* )( void* ) >( this, 455 )( this ); -} - -int c_base_weapon::get_weaponid( ) { - return call_vfunc< int( __thiscall* )( void* ) >( this, 422 )( this ); -} - -bool c_base_weapon::can_fire( ) { - auto cur_time = g_ctx.m_local->get_tick_base( ) * cl.m_globals->interval_per_tick; - auto next_primary_attack = m_flNextPrimaryAttack( ); - return cur_time >= next_primary_attack; -} - -bool c_base_weapon::is_non_aim( ) { - if ( get_slot( ) >= 2 ) return true; - //more checks to be added - return false; -} - -int& c_base_weapon::get_inspect_stage( ) { - return m_nInspectStage( ); -} - -float& c_base_weapon::get_inspect_time( ) { - return m_flInspectAnimTime( ); -} - -c_attribute_list* c_base_weapon::get_attribute_list( ) { - return reinterpret_cast< c_attribute_list* >( this + 0xA8 ); -} - -float c_base_weapon::get_distance( ) { - - if( is_melee( ) ) - return 100.f; - - if( is_flame_thrower( ) ) - return 185.f; - - return 8012.f; -} diff --git a/tf2/CBaseWeapon.h b/tf2/CBaseWeapon.h deleted file mode 100644 index 213a576..0000000 --- a/tf2/CBaseWeapon.h +++ /dev/null @@ -1,1389 +0,0 @@ -#pragma once -#include "IClientEntity.h" -#include "CAttribute.h" -#include "netvars.h" -enum class weapon_attributes { - weapon_allow_inspect = 731, -}; - -enum scoutweapons -{ - //Primary - WPN_Scattergun = 13, - WPN_NewScattergun = 200, - WPN_FAN = 45, - WPN_Shortstop = 220, - WPN_SodaPopper = 448, - WPN_BabyFaceBlaster = 772, - WPN_BotScattergunS = 799, - WPN_BotScattergunG = 808, - WPN_BotScattergunR = 888, - WPN_BotScattergunB = 897, - WPN_BotScattergunC = 906, - WPN_BotScattergunD = 915, - WPN_BotScattergunES = 964, - WPN_BotScattergunEG = 973, - WPN_FestiveFaN = 1078, - WPN_BackScatter = 1103, - //Secondary - WPN_ScoutPistol = 23, - WPN_NewPistol = 209, - WPN_Bonk = 46, - WPN_CritCola = 163, - WPN_Lugermorph = 160, - WPN_Milk = 222, - WPN_Lugermorph2 = 294, - WPN_Winger = 449, - WPN_PocketPistol = 773, - WPN_MutatedMilk = 1121, - WPN_CAPPER = 30666, - //Melee - WPN_Bat = 0, - WPN_NewBat = 190, - WPN_Sandman = 44, - WPN_Fish = 221, - WPN_Cane = 317, - WPN_BostonBasher = 325, - WPN_SunStick = 349, - WPN_FanOWar = 355, - WPN_RuneBlade = 452, - WPN_Saxxy = 423, - WPN_Atomizer = 450, - WPN_ConscientiousObjector = 474, - WPN_UnarmedCombat = 572, - WPN_WrapAssassin = 648, - WPN_FestiveBat = 660, - WPN_FestiveScattergun = 669, - WPN_FlyingGuillotine1 = 812, - WPN_FlyingGuillotine2 = 833, - WPN_FreedomStaff = 880, - WPN_BatOuttaHell = 939, - WPN_MemoryMaker = 954, - WPN_FestiveFish = 999, - WPN_TheHamShank = 1013, - WPN_CrossingGuard = 1127, - WPN_NecroSmasher = 1123, - WPN_Batsaber = 30667, -}; -enum soldierweapons -{ - //Primary - WPN_RocketLauncher = 18, - WPN_NewRocketLauncher = 205, - WPN_DirectHit = 127, - WPN_BlackBox = 228, - WPN_RocketJumper = 237, - WPN_LibertyLauncher = 414, - WPN_CowMangler = 441, - WPN_Original = 513, - WPN_FestiveRocketLauncher = 658, - WPN_BeggersBazooka = 730, - WPN_BotRocketlauncherS = 800, - WPN_BotRocketlauncherG = 809, - WPN_BotRocketlauncherR = 889, - WPN_BotRocketlauncherB = 898, - WPN_BotRocketlauncherC = 907, - WPN_BotRocketlauncherD = 916, - WPN_BotRocketlauncherES = 965, - WPN_BotRocketlauncherEG = 974, - WPN_FestiveBlackbox = 1085, - WPN_Airstrike = 1104, - //Secondary - WPN_SoldierShotgun = 10, - WPN_NewShotgun = 199, - WPN_BuffBanner = 129, - WPN_BattalionBackup = 226, - WPN_Concheror = 354, - WPN_ReserveShooter = 415, - WPN_RighteousBison = 442, - WPN_FestiveBuffBanner = 1001, - WPN_PanicAttack = 1153, - WPN_ManTreads = 444, - WPN_GunBoats = 133, - WPN_BASEJumper = 1101, - //Melee - WPN_Shovel = 6, - WPN_NewShovel = 196, - WPN_Equalizer = 128, - WPN_PainTrain = 154, - WPN_Katana = 357, - WPN_MarketGardener = 416, - WPN_DisciplinaryAction = 447, - WPN_EscapePlan = 775, -}; -enum pyroweapons -{ - //Primary - WPN_Flamethrower = 21, - WPN_NewFlamethrower = 208, - WPN_Backburner = 40, - WPN_Degreaser = 215, - WPN_FestiveFlamethrower = 659, - WPN_Phlogistinator = 594, - WPN_Rainblower = 741, - WPN_BotFlamethrowerS = 798, - WPN_BotFlamethrowerG = 807, - WPN_BotFlamethrowerR = 887, - WPN_BotFlamethrowerB = 896, - WPN_BotFlamethrowerC = 905, - WPN_BotFlamethrowerD = 914, - WPN_BotFlamethrowerES = 963, - WPN_BotFlamethrowerEG = 972, - WPN_FestiveBackburner = 1146, - //Secondary - WPN_PyroShotgun = 12, - WPN_Flaregun = 39, - WPN_Detonator = 351, - WPN_ManMelter = 595, - WPN_ScorchShot = 740, - WPN_FestiveFlaregun = 1081, - WPN_ThermalThruster = 1179, - WPN_GasPasser = 1180, - //Melee - WPN_Fireaxe = 2, - WPN_NewAxe = 192, - WPN_Axtingusher = 38, - WPN_HomeWrecker = 153, - WPN_PowerJack = 214, - WPN_Backscratcher = 326, - WPN_VolcanoFragment = 348, - WPN_Maul = 466, - WPN_Mailbox = 457, - WPN_ThirdDegree = 593, - WPN_Lollychop = 739, - WPN_NeonAnnihilator1 = 813, - WPN_NeonAnnihilator2 = 834, - WPN_FestiveAxtingisher = 1000, -}; -enum demomanweapons -{ - //Primary - WPN_GrenadeLauncher = 19, - WPN_NewGrenadeLauncher = 206, - WPN_LochNLoad = 308, - WPN_LoooseCannon = 996, - WPN_FestiveGrenadeLauncher = 1007, - WPN_IronBomber = 1151, - //Secondary - WPN_StickyLauncher = 20, - WPN_NewStickyLauncher = 207, - WPN_ScottishResistance = 130, - WPN_StickyJumper = 265, - WPN_FestiveStickyLauncher = 661, - WPN_BotStickyS = 797, - WPN_BotStickyG = 806, - WPN_BotStickyR = 886, - WPN_BotStickyB = 895, - WPN_BotStickyC = 904, - WPN_BotStickyD = 913, - WPN_BotStickyES = 962, - WPN_BotStickyEG = 971, - WPN_QuickieBombLauncher = 1150, - WPN_SplendidScreen = 406, - WPN_CharginTarge = 131, - WPN_FestiveCharginTarge = 1144, - WPN_TideTurner = 1099, - //Melee - WPN_Bottle = 1, - WPN_NewBottle = 191, - WPN_Sword = 132, - WPN_ScottsSkullctter = 172, - WPN_Fryingpan = 264, - WPN_Headless = 266, - WPN_Ullapool = 307, - WPN_Claidheamhmor = 327, - WPN_PersainPersuader = 404, - WPN_Golfclub = 482, - WPN_ScottishHandshake = 609, - WPN_GoldenFryingPan = 1071, - WPN_FestiveEyelander = 1082, -}; -enum heavyweapons -{ - //Primary - WPN_Minigun = 15, - WPN_NewMinigun = 202, - WPN_Natascha = 41, - WPN_IronCurtain = 298, - WPN_BrassBeast = 312, - WPN_Tomislav = 424, - WPN_FestiveMinigun = 654, - WPN_HuoLongHeatmaker1 = 811, - WPN_HuoLongHeatmaker2 = 832, - WPN_BotMinigunS = 793, - WPN_BotMinigunG = 802, - WPN_BotMinigunR = 882, - WPN_BotMinigunB = 891, - WPN_BotMinigunC = 900, - WPN_BotMinigunD = 909, - WPN_Deflector = 850, - WPN_BotMinigunES = 958, - WPN_BotMinigunEG = 967, - //Secondary - WPN_HeavyShotgun = 11, - WPN_Sandvich = 42, - WPN_CandyBar = 159, - WPN_Steak = 311, - WPN_Fishcake = 433, - WPN_FamilyBuisness = 425, - WPN_RobotSandvich = 863, - WPN_FestiveSandvich = 1002, - //Melee - WPN_Fists = 5, - WPN_NewFists = 195, - WPN_KGB = 43, - WPN_GRU = 239, - WPN_WarriorSpirit = 310, - WPN_FistsOfSteel = 331, - WPN_EvictionNotice = 426, - WPN_ApocoFists = 587, - WPN_HolidayPunch = 656, - WPN_FestiveGRU = 1084, - WPN_BreadBite = 1100, -}; -enum engineerweapons -{ - //Primary - WPN_EngineerShotgun = 9, - WPN_FrontierJustice = 141, - WPN_Widowmaker = 527, - WPN_Pomson = 588, - WPN_RescueRanger = 997, - WPN_FestiveFrontierJustice = 1004, - //Secondary - WPN_EngineerPistol = 22, - WPN_Wrangler = 140, - WPN_ShortCircut = 528, - WPN_FestiveWrangler = 1086, - WPN_GeigerCounter = 30668, - //Melee - WPN_Wrench = 7, - WPN_NewWrench = 197, - WPN_Goldenwrench = 169, - WPN_SouthernHospitality = 155, - WPN_Gunslinger = 142, - WPN_Jag = 329, - WPN_FestiveWrench = 662, - WPN_EurekaEffect = 589, - WPN_BotWrenchS = 795, - WPN_BotWrenchG = 804, - WPN_BotWrenchR = 884, - WPN_BotWrenchB = 893, - WPN_BotWrenchC = 902, - WPN_BotWrenchD = 911, - WPN_BotWrenchES = 960, - WPN_BotWrenchEG = 969, - //Misc - WPN_Builder = 25, - WPN_Builder2 = 737, - WPN_Destructor = 26, - WPN_Toolbox = 28, -}; -enum medicweapons -{ - //Primary - WPN_SyringeGun = 17, - WPN_NewSyringeGun = 204, - WPN_Blutsauger = 36, - WPN_Crossbow = 305, - WPN_Overdose = 412, - WPN_FestiveCrossbow = 1079, - //Secondary - WPN_Medigun = 29, - WPN_NewMedigun = 211, - WPN_Kritzkrieg = 35, - WPN_QuickFix = 411, - WPN_FestiveMedigun = 663, - WPN_MedigunS = 796, - WPN_MedigunG = 805, - WPN_MedigunR = 885, - WPN_MedigunB = 894, - WPN_MedigunC = 903, - WPN_MedigunD = 912, - WPN_Vaccinator = 998, - WPN_MedigunES = 961, - WPN_MedigunEG = 970, - //Melee - WPN_Bonesaw = 8, - WPN_NewBonesaw = 198, - WPN_Ubersaw = 37, - WPN_Vitasaw = 173, - WPN_Amputator = 304, - WPN_Solemnvow = 413, - WPN_FestiveUbersaw = 1003, -}; -enum sniperweapons -{ - //Primary - WPN_SniperRifle = 14, - WPN_NewSniperRifle = 201, - WPN_Huntsman = 56, - WPN_SydneySleeper = 230, - WPN_Bazaarbargain = 402, - WPN_Machina = 526, - WPN_FestiveSniperRifle = 664, - WPN_HitmanHeatmaker = 752, - WPN_BotSniperRifleS = 792, - WPN_BotSniperRifleG = 801, - WPN_BotSniperRifleR = 881, - WPN_BotSniperRifleB = 890, - WPN_BotSniperRifleC = 899, - WPN_BotSniperRifleD = 908, - WPN_AWP = 851, - WPN_BotSniperRifleES = 957, - WPN_BotSniperRifleEG = 966, - WPN_FestiveHuntsman = 1005, - WPN_CompoundBow = 1092, - WPN_ClassicSniperRifle = 1098, - WPN_ShootingStar = 30665, - //Secondary - WPN_SMG = 16, - WPN_NewSMG = 203, - WPN_Jarate = 58, - WPN_DarwinDangerShield = 231, - WPN_CleanersCarbine = 751, - WPN_FestiveJarate = 1083, - WPN_SelfAwareBeautyMark = 1105, - WPN_RAZORBACK = 57, - WPN_COZYCAMPER = 642, - //Melee - WPN_Kukri = 3, - WPN_NewKukri = 193, - WPN_TribalmansShiv = 171, - WPN_Bushwacka = 232, - WPN_Shahanshah = 401, -}; -enum spyweapons -{ - //Primary - WPN_Revolver = 24, - WPN_NewRevolver = 210, - WPN_Ambassador = 61, - WPN_BigKill = 161, - WPN_Letranger = 224, - WPN_Enforcer = 460, - WPN_Diamondback = 525, - WPN_FestiveAmbassador = 1006, - //Melee - WPN_Knife = 4, - WPN_NewKnife = 194, - WPN_EternalReward = 225, - WPN_DisguiseKit = 27, - WPN_Kunai = 356, - WPN_BigEarner = 461, - WPN_WangaPrick = 574, - WPN_SharpDresser = 638, - WPN_Spycicle = 649, - WPN_FestiveKnife = 665, - WPN_BlackRose = 727, - WPN_BotKnifeS = 794, - WPN_BotKnifeG = 803, - WPN_BotKnifeR = 883, - WPN_BotKnifeB = 892, - WPN_BotKnifeC = 901, - WPN_BotKnifeD = 910, - WPN_BotKnifeES = 959, - WPN_BotKnifeEG = 968, - //Watches - WPN_InivisWatch = 30, - WPN_DeadRinger = 59, - WPN_CloakAndDagger = 60, - WPN_TimePiece = 297, - //Sapper - WPN_Sapper = 735, - WPN_Sapper2 = 736, - WPN_RedTape1 = 810, - WPN_RedTape2 = 831, - WPN_ApSap = 933, - WPN_FestiveSapper = 1080, - WPN_SnackAttack = 1102, -}; - - -class c_base_weapon : public IClientEntity -{ -public: - - NETVAR( m_iItemDefinitionIndex, "m_iItemDefinitionIndex", "DT_BaseAttributableItem", 0, int ); - NETVAR( m_flNextPrimaryAttack, "m_flNextPrimaryAttack", "DT_TFWeaponBase", 0, float ); - NETVAR( m_nInspectStage, "m_nInspectStage", "DT_TFWeaponBase", 0, int ); - NETVAR( m_flInspectAnimTime, "m_flInspectAnimTime", "DT_TFWeaponBase", 0, float ); - NETVAR( m_AttributeList, "m_AttributeList", "DT_BaseAttributableItem", 0, c_attribute_list* ) - NETVAR( m_hOwnerEntity, "m_hOwnerEntity", "DT_BaseEntity", 0, uint32_t ); - NETVAR( m_iClip1, "m_iClip1", "DT_BaseCombatWeapon", 0, int ); - NETVAR( m_hBuilder, "m_hBuilder", "DT_BaseObject", 0, uint32_t ); - void get_weapon_class( ); - - bool is_sniper( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_SniperRifle: - case WPN_NewSniperRifle: - case WPN_Huntsman: - case WPN_SydneySleeper: - case WPN_Bazaarbargain: - case WPN_Machina: - case WPN_FestiveSniperRifle: - case WPN_HitmanHeatmaker: - case WPN_BotSniperRifleS: - case WPN_BotSniperRifleG: - case WPN_BotSniperRifleR: - case WPN_BotSniperRifleB: - case WPN_BotSniperRifleC: - case WPN_BotSniperRifleD: - case WPN_AWP: - case WPN_BotSniperRifleES: - case WPN_BotSniperRifleEG: - case WPN_FestiveHuntsman: - case WPN_CompoundBow: - case WPN_ClassicSniperRifle: - case WPN_ShootingStar: - return true; - break; - default: - return false; - } - } - - - bool has_trajectory( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Sandman: - case WPN_WrapAssassin: - case WPN_FlyingGuillotine1: - case WPN_FlyingGuillotine2: - case WPN_Flaregun: - case WPN_Detonator: - case WPN_ScorchShot: - case WPN_FestiveFlaregun: - case WPN_GrenadeLauncher: - case WPN_NewGrenadeLauncher: - case WPN_LochNLoad: - case WPN_LoooseCannon: - case WPN_FestiveGrenadeLauncher: - case WPN_IronBomber: - case WPN_Ullapool: - case WPN_QuickieBombLauncher: - case WPN_StickyJumper: - case WPN_NewStickyLauncher: - case WPN_StickyLauncher: - case WPN_ScottishResistance: - case WPN_FestiveHuntsman: - case WPN_Huntsman: - case WPN_FestiveJarate: - case WPN_Jarate: - case WPN_SelfAwareBeautyMark: - case WPN_GasPasser: - case WPN_CompoundBow: - return true; - break; - default: - return false; - } - } - - bool is_primary( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Scattergun: - case WPN_NewScattergun: - case WPN_FAN: - case WPN_Shortstop: - case WPN_SodaPopper: - case WPN_BabyFaceBlaster: - case WPN_BotScattergunS: - case WPN_BotScattergunG: - case WPN_BotScattergunR: - case WPN_BotScattergunB: - case WPN_BotScattergunC: - case WPN_BotScattergunD: - case WPN_BotScattergunES: - case WPN_BotScattergunEG: - case WPN_FestiveFaN: - case WPN_BackScatter: - case WPN_RocketLauncher: - case WPN_NewRocketLauncher: - case WPN_DirectHit: - case WPN_BlackBox: - case WPN_RocketJumper: - case WPN_LibertyLauncher: - case WPN_CowMangler: - case WPN_Original: - case WPN_FestiveRocketLauncher: - case WPN_BeggersBazooka: - case WPN_BotRocketlauncherS: - case WPN_BotRocketlauncherG: - case WPN_BotRocketlauncherR: - case WPN_BotRocketlauncherB: - case WPN_BotRocketlauncherC: - case WPN_BotRocketlauncherD: - case WPN_BotRocketlauncherES: - case WPN_BotRocketlauncherEG: - case WPN_FestiveBlackbox: - case WPN_Airstrike: - case WPN_Flamethrower: - case WPN_NewFlamethrower: - case WPN_Backburner: - case WPN_Degreaser: - case WPN_FestiveFlamethrower: - case WPN_Phlogistinator: - case WPN_Rainblower: - case WPN_BotFlamethrowerS: - case WPN_BotFlamethrowerG: - case WPN_BotFlamethrowerR: - case WPN_BotFlamethrowerB: - case WPN_BotFlamethrowerC: - case WPN_BotFlamethrowerD: - case WPN_BotFlamethrowerES: - case WPN_BotFlamethrowerEG: - case WPN_FestiveBackburner: - case WPN_GrenadeLauncher: - case WPN_NewGrenadeLauncher: - case WPN_LochNLoad: - case WPN_LoooseCannon: - case WPN_FestiveGrenadeLauncher: - case WPN_IronBomber: - case WPN_Minigun: - case WPN_NewMinigun: - case WPN_Natascha: - case WPN_IronCurtain: - case WPN_BrassBeast: - case WPN_Tomislav: - case WPN_FestiveMinigun: - case WPN_HuoLongHeatmaker1: - case WPN_HuoLongHeatmaker2: - case WPN_BotMinigunS: - case WPN_BotMinigunG: - case WPN_BotMinigunR: - case WPN_BotMinigunB: - case WPN_BotMinigunC: - case WPN_BotMinigunD: - case WPN_Deflector: - case WPN_BotMinigunES: - case WPN_BotMinigunEG: - case WPN_EngineerShotgun: - case WPN_FrontierJustice: - case WPN_Widowmaker: - case WPN_Pomson: - case WPN_RescueRanger: - case WPN_FestiveFrontierJustice: - case WPN_SyringeGun: - case WPN_NewSyringeGun: - case WPN_Blutsauger: - case WPN_Crossbow: - case WPN_Overdose: - case WPN_FestiveCrossbow: - case WPN_SniperRifle: - case WPN_NewSniperRifle: - case WPN_Huntsman: - case WPN_SydneySleeper: - case WPN_Bazaarbargain: - case WPN_Machina: - case WPN_FestiveSniperRifle: - case WPN_HitmanHeatmaker: - case WPN_BotSniperRifleS: - case WPN_BotSniperRifleG: - case WPN_BotSniperRifleR: - case WPN_BotSniperRifleB: - case WPN_BotSniperRifleC: - case WPN_BotSniperRifleD: - case WPN_AWP: - case WPN_BotSniperRifleES: - case WPN_BotSniperRifleEG: - case WPN_FestiveHuntsman: - case WPN_CompoundBow: - case WPN_ClassicSniperRifle: - case WPN_ShootingStar: - case WPN_Revolver: - case WPN_NewRevolver: - case WPN_Ambassador: - case WPN_BigKill: - case WPN_Letranger: - case WPN_Enforcer: - case WPN_Diamondback: - case WPN_FestiveAmbassador: - return true; - break; - default: - return false; - } - } - - bool is_secondary( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_ScoutPistol: - case WPN_NewPistol: - case WPN_Bonk: - case WPN_CritCola: - case WPN_Lugermorph: - case WPN_Milk: - case WPN_Lugermorph2: - case WPN_Winger: - case WPN_PocketPistol: - case WPN_MutatedMilk: - case WPN_CAPPER: - case WPN_SoldierShotgun: - case WPN_NewShotgun: - case WPN_BuffBanner: - case WPN_BattalionBackup: - case WPN_Concheror: - case WPN_ReserveShooter: - case WPN_RighteousBison: - case WPN_FestiveBuffBanner: - case WPN_PanicAttack: - case WPN_ManTreads: - case WPN_GunBoats: - case WPN_BASEJumper: - case WPN_PyroShotgun: - case WPN_Flaregun: - case WPN_Detonator: - case WPN_ManMelter: - case WPN_ScorchShot: - case WPN_FestiveFlaregun: - case WPN_ThermalThruster: - case WPN_GasPasser: - case WPN_StickyLauncher: - case WPN_NewStickyLauncher: - case WPN_ScottishResistance: - case WPN_StickyJumper: - case WPN_FestiveStickyLauncher: - case WPN_BotStickyS: - case WPN_BotStickyG: - case WPN_BotStickyR: - case WPN_BotStickyB: - case WPN_BotStickyC: - case WPN_BotStickyD: - case WPN_BotStickyES: - case WPN_BotStickyEG: - case WPN_QuickieBombLauncher: - case WPN_SplendidScreen: - case WPN_CharginTarge: - case WPN_FestiveCharginTarge: - case WPN_TideTurner: - case WPN_HeavyShotgun: - case WPN_Sandvich: - case WPN_CandyBar: - case WPN_Steak: - case WPN_Fishcake: - case WPN_FamilyBuisness: - case WPN_RobotSandvich: - case WPN_FestiveSandvich: - case WPN_EngineerPistol: - case WPN_Wrangler: - case WPN_ShortCircut: - case WPN_FestiveWrangler: - case WPN_GeigerCounter: - case WPN_Medigun: - case WPN_NewMedigun: - case WPN_Kritzkrieg: - case WPN_QuickFix: - case WPN_FestiveMedigun: - case WPN_MedigunS: - case WPN_MedigunG: - case WPN_MedigunR: - case WPN_MedigunB: - case WPN_MedigunC: - case WPN_MedigunD: - case WPN_Vaccinator: - case WPN_MedigunES: - case WPN_MedigunEG: - case WPN_SMG: - case WPN_NewSMG: - case WPN_Jarate: - case WPN_DarwinDangerShield: - case WPN_CleanersCarbine: - case WPN_FestiveJarate: - case WPN_SelfAwareBeautyMark: - case WPN_RAZORBACK: - case WPN_COZYCAMPER: - return true; - break; - default: - return false; - } - } - - bool is_third( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Bat: - case WPN_NewBat: - case WPN_Sandman: - case WPN_Fish: - case WPN_Cane: - case WPN_BostonBasher: - case WPN_SunStick: - case WPN_FanOWar: - case WPN_RuneBlade: - case WPN_Saxxy: - case WPN_Atomizer: - case WPN_ConscientiousObjector: - case WPN_UnarmedCombat: - case WPN_WrapAssassin: - case WPN_FestiveBat: - case WPN_FestiveScattergun: - case WPN_FlyingGuillotine1: - case WPN_FlyingGuillotine2: - case WPN_FreedomStaff: - case WPN_BatOuttaHell: - case WPN_MemoryMaker: - case WPN_FestiveFish: - case WPN_TheHamShank: - case WPN_CrossingGuard: - case WPN_NecroSmasher: - case WPN_Batsaber: - case WPN_Shovel: - case WPN_NewShovel: - case WPN_Equalizer: - case WPN_PainTrain: - case WPN_Katana: - case WPN_MarketGardener: - case WPN_DisciplinaryAction: - case WPN_EscapePlan: - case WPN_Fireaxe: - case WPN_NewAxe: - case WPN_Axtingusher: - case WPN_HomeWrecker: - case WPN_PowerJack: - case WPN_Backscratcher: - case WPN_VolcanoFragment: - case WPN_Maul: - case WPN_Mailbox: - case WPN_ThirdDegree: - case WPN_Lollychop: - case WPN_NeonAnnihilator1: - case WPN_NeonAnnihilator2: - case WPN_FestiveAxtingisher: - case WPN_Bottle: - case WPN_NewBottle: - case WPN_Sword: - case WPN_ScottsSkullctter: - case WPN_Fryingpan: - case WPN_Headless: - case WPN_Ullapool: - case WPN_Claidheamhmor: - case WPN_PersainPersuader: - case WPN_Golfclub: - case WPN_ScottishHandshake: - case WPN_GoldenFryingPan: - case WPN_FestiveEyelander: - case WPN_Fists: - case WPN_NewFists: - case WPN_KGB: - case WPN_GRU: - case WPN_WarriorSpirit: - case WPN_FistsOfSteel: - case WPN_EvictionNotice: - case WPN_ApocoFists: - case WPN_HolidayPunch: - case WPN_FestiveGRU: - case WPN_BreadBite: - case WPN_Wrench: - case WPN_NewWrench: - case WPN_Goldenwrench: - case WPN_SouthernHospitality: - case WPN_Gunslinger: - case WPN_Jag: - case WPN_FestiveWrench: - case WPN_EurekaEffect: - case WPN_BotWrenchS: - case WPN_BotWrenchG: - case WPN_BotWrenchR: - case WPN_BotWrenchB: - case WPN_BotWrenchC: - case WPN_BotWrenchD: - case WPN_BotWrenchES: - case WPN_BotWrenchEG: - case WPN_Bonesaw: - case WPN_NewBonesaw: - case WPN_Ubersaw: - case WPN_Vitasaw: - case WPN_Amputator: - case WPN_Solemnvow: - case WPN_FestiveUbersaw: - case WPN_Kukri: - case WPN_NewKukri: - case WPN_TribalmansShiv: - case WPN_Bushwacka: - case WPN_Shahanshah: - return true; - break; - default: - return false; - } - } - - bool is_shield( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_CharginTarge: - case WPN_SplendidScreen: - case WPN_TideTurner: - case WPN_FestiveCharginTarge: - return true; - break; - default: - return false; - } - } - - - bool is_shotgun( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Scattergun: - case WPN_NewScattergun: - case WPN_FAN: - case WPN_SodaPopper: - case WPN_FestiveFaN: - case WPN_BackScatter: - case WPN_SoldierShotgun: - case WPN_NewShotgun: - case WPN_ReserveShooter: - case WPN_PanicAttack: - case WPN_PyroShotgun: - case WPN_HeavyShotgun: - case WPN_FamilyBuisness: - case WPN_EngineerShotgun: - case WPN_FrontierJustice: - case WPN_Widowmaker: - case WPN_Pomson: - case WPN_RescueRanger: - case WPN_FestiveFrontierJustice: - return true; - break; - default: - return false; - } - } - - bool is_melee( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Bat: - case WPN_NewBat: - case WPN_Sandman: - case WPN_Fish: - case WPN_Cane: - case WPN_BostonBasher: - case WPN_SunStick: - case WPN_FanOWar: - case WPN_RuneBlade: - case WPN_Saxxy: - case WPN_Atomizer: - case WPN_ConscientiousObjector: - case WPN_UnarmedCombat: - case WPN_WrapAssassin: - case WPN_FestiveBat: - case WPN_FreedomStaff: - case WPN_BatOuttaHell: - case WPN_MemoryMaker: - case WPN_FestiveFish: - case WPN_TheHamShank: - case WPN_CrossingGuard: - case WPN_NecroSmasher: - case WPN_Batsaber: - case WPN_Shovel: - case WPN_NewShovel: - case WPN_Equalizer: - case WPN_PainTrain: - case WPN_Katana: - case WPN_MarketGardener: - case WPN_DisciplinaryAction: - case WPN_EscapePlan: - case WPN_Fireaxe: - case WPN_NewAxe: - case WPN_Axtingusher: - case WPN_HomeWrecker: - case WPN_PowerJack: - case WPN_Backscratcher: - case WPN_VolcanoFragment: - case WPN_Maul: - case WPN_Mailbox: - case WPN_ThirdDegree: - case WPN_Lollychop: - case WPN_NeonAnnihilator1: - case WPN_NeonAnnihilator2: - case WPN_FestiveAxtingisher: - case WPN_Bottle: - case WPN_NewBottle: - case WPN_Sword: - case WPN_ScottsSkullctter: - case WPN_Fryingpan: - case WPN_Headless: - case WPN_Ullapool: - case WPN_Claidheamhmor: - case WPN_PersainPersuader: - case WPN_Golfclub: - case WPN_ScottishHandshake: - case WPN_GoldenFryingPan: - case WPN_FestiveEyelander: - case WPN_Fists: - case WPN_NewFists: - case WPN_KGB: - case WPN_GRU: - case WPN_WarriorSpirit: - case WPN_FistsOfSteel: - case WPN_EvictionNotice: - case WPN_ApocoFists: - case WPN_HolidayPunch: - case WPN_FestiveGRU: - case WPN_BreadBite: - case WPN_Wrench: - case WPN_NewWrench: - case WPN_Goldenwrench: - case WPN_SouthernHospitality: - case WPN_Gunslinger: - case WPN_Jag: - case WPN_Bonesaw: - case WPN_NewBonesaw: - case WPN_Ubersaw: - case WPN_Vitasaw: - case WPN_Amputator: - case WPN_Solemnvow: - case WPN_FestiveUbersaw: - case WPN_Kukri: - case WPN_NewKukri: - case WPN_TribalmansShiv: - case WPN_Bushwacka: - case WPN_Shahanshah: - return true; - break; - default: - return false; - } - } - - bool is_pistol( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_EngineerPistol: - case WPN_ScoutPistol: - case WPN_NewPistol: - case WPN_Lugermorph: - case WPN_Lugermorph2: - case WPN_Winger: - case WPN_PocketPistol: - case WPN_CAPPER: - case WPN_ShortCircut: - case WPN_Flaregun: - case WPN_FestiveFlaregun: - case WPN_Detonator: - case WPN_ManMelter: - case WPN_ScorchShot: - case WPN_Shortstop: - return true; - break; - default: - return false; - } - } - - bool is_grenade( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Milk: - case WPN_MutatedMilk: - case WPN_Jarate: - case WPN_FestiveJarate: - case WPN_SelfAwareBeautyMark: - case WPN_GasPasser: - case WPN_FlyingGuillotine1: - case WPN_FlyingGuillotine2: - return true; - break; - default: - return false; - - } - } - - - bool is_util( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Milk: - case WPN_MutatedMilk: - case WPN_Jarate: - case WPN_FestiveJarate: - case WPN_DarwinDangerShield: - case WPN_RAZORBACK: - case WPN_COZYCAMPER: - case WPN_BuffBanner: - case WPN_BattalionBackup: - case WPN_Concheror: - case WPN_BASEJumper: - case WPN_ManTreads: - case WPN_GunBoats: - case WPN_ThermalThruster: - case WPN_DisguiseKit: - case WPN_Builder: - case WPN_Builder2: - case WPN_Destructor: - case WPN_Toolbox: - return true; - break; - default: - return false; - - } - } - - bool is_flame_thrower( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Flamethrower: - case WPN_NewFlamethrower: - case WPN_Backburner: - case WPN_Degreaser: - case WPN_FestiveFlamethrower: - case WPN_Phlogistinator: - case WPN_Rainblower: - case WPN_BotFlamethrowerS: - case WPN_BotFlamethrowerG: - case WPN_BotFlamethrowerR: - case WPN_BotFlamethrowerB: - case WPN_BotFlamethrowerC: - case WPN_BotFlamethrowerD: - case WPN_BotFlamethrowerES: - case WPN_BotFlamethrowerEG: - case WPN_FestiveBackburner: - return true; - break; - default: - return false; - } - } - - bool is_sticky( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_StickyLauncher: - case WPN_NewStickyLauncher: - case WPN_ScottishResistance: - case WPN_StickyJumper: - case WPN_FestiveStickyLauncher: - case WPN_BotStickyS: - case WPN_BotStickyG: - case WPN_BotStickyR: - case WPN_BotStickyB: - case WPN_BotStickyC: - case WPN_BotStickyD: - case WPN_BotStickyES: - case WPN_BotStickyEG: - case WPN_QuickieBombLauncher: - return true; - break; - default: - return false; - } - } - - bool is_grenade_launcher( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_GrenadeLauncher: - case WPN_NewGrenadeLauncher: - case WPN_LochNLoad: - case WPN_LoooseCannon: - case WPN_FestiveGrenadeLauncher: - case WPN_IronBomber: - return true; - break; - default: - return false; - } - } - - bool is_rocket_launcher( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_RocketLauncher: - case WPN_NewRocketLauncher: - case WPN_DirectHit: - case WPN_BlackBox: - case WPN_RocketJumper: - case WPN_LibertyLauncher: - case WPN_CowMangler: - case WPN_Original: - case WPN_FestiveRocketLauncher: - case WPN_BeggersBazooka: - case WPN_BotRocketlauncherS: - case WPN_BotRocketlauncherG: - case WPN_BotRocketlauncherR: - case WPN_BotRocketlauncherB: - case WPN_BotRocketlauncherC: - case WPN_BotRocketlauncherD: - case WPN_BotRocketlauncherES: - case WPN_BotRocketlauncherEG: - case WPN_FestiveBlackbox: - case WPN_Airstrike: - return true; - break; - default: - return false; - } - } - - bool is_minigun( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Minigun: - case WPN_NewMinigun: - case WPN_Natascha: - case WPN_IronCurtain: - case WPN_BrassBeast: - case WPN_Tomislav: - case WPN_FestiveMinigun: - case WPN_HuoLongHeatmaker1: - case WPN_HuoLongHeatmaker2: - case WPN_BotMinigunS: - case WPN_BotMinigunG: - case WPN_BotMinigunR: - case WPN_BotMinigunB: - case WPN_BotMinigunC: - case WPN_BotMinigunD: - case WPN_Deflector: - case WPN_BotMinigunES: - case WPN_BotMinigunEG: - return true; - break; - default: - return false; - } - } - - bool is_edible( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Bonk: - case WPN_CritCola: - case WPN_CandyBar: - case WPN_Steak: - case WPN_Fishcake: - case WPN_Sandvich: - case WPN_RobotSandvich: - case WPN_FestiveSandvich: - return true; - break; - default: - return false; - } - } - - bool is_wrench( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Wrench: - case WPN_NewWrench: - case WPN_Goldenwrench: - case WPN_SouthernHospitality: - case WPN_Gunslinger: - case WPN_Jag: - case WPN_FestiveWrench: - case WPN_EurekaEffect: - case WPN_BotWrenchS: - case WPN_BotWrenchG: - case WPN_BotWrenchR: - case WPN_BotWrenchB: - case WPN_BotWrenchC: - case WPN_BotWrenchD: - case WPN_BotWrenchES: - case WPN_BotWrenchEG: - return true; - break; - default: - return false; - } - } - - bool is_engineer( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Builder: - case WPN_Builder2: - case WPN_Destructor: - case WPN_Toolbox: - return true; - break; - default: - return false; - } - } - - bool is_needle_gun( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_SyringeGun: - case WPN_NewSyringeGun: - case WPN_Blutsauger: - case WPN_Crossbow: - case WPN_Overdose: - case WPN_FestiveCrossbow: - return true; - break; - default: - return false; - } - } - - bool is_healing( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Medigun: - case WPN_NewMedigun: - case WPN_Kritzkrieg: - case WPN_QuickFix: - case WPN_FestiveMedigun: - case WPN_MedigunS: - case WPN_MedigunG: - case WPN_MedigunR: - case WPN_MedigunB: - case WPN_MedigunC: - case WPN_MedigunD: - case WPN_Vaccinator: - case WPN_MedigunES: - case WPN_MedigunEG: - return true; - break; - default: - return false; - } - } - - bool is_revolver( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Revolver: - case WPN_NewRevolver: - case WPN_Ambassador: - case WPN_BigKill: - case WPN_Letranger: - case WPN_Enforcer: - case WPN_Diamondback: - case WPN_FestiveAmbassador: - return true; - break; - default: - return false; - } - } - - bool is_spy_knife( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Knife: - case WPN_NewKnife: - case WPN_EternalReward: - case WPN_DisguiseKit: - case WPN_Kunai: - case WPN_BigEarner: - case WPN_WangaPrick: - case WPN_SharpDresser: - case WPN_Spycicle: - case WPN_FestiveKnife: - case WPN_BlackRose: - case WPN_BotKnifeS: - case WPN_BotKnifeG: - case WPN_BotKnifeR: - case WPN_BotKnifeB: - case WPN_BotKnifeC: - case WPN_BotKnifeD: - case WPN_BotKnifeES: - case WPN_BotKnifeEG: - return true; - break; - default: - return false; - } - } - - bool is_watch( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_InivisWatch: - case WPN_DeadRinger: - case WPN_CloakAndDagger: - case WPN_TimePiece: - return true; - break; - default: - return false; - } - } - - bool is_sapper( ) { - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Sapper: - case WPN_Sapper2: - case WPN_RedTape1: - case WPN_RedTape2: - case WPN_ApSap: - case WPN_FestiveSapper: - case WPN_SnackAttack: - return true; - break; - default: - return false; - } - } - - /*bool get_projectile_speed( float& speed ) { - speed = 0; - switch( m_iItemDefinitionIndex( ) ) { - case WPN_Milk: - case WPN_MutatedMilk: - speed = 1019.9; - break; - case WPN_FlyingGuillotine1: - case WPN_FlyingGuillotine2: - case WPN_Sandman: - case WPN_WrapAssassin: - case WPN_ManMelter: - speed = 3000; - break; - case WPN_RocketJumper: - case WPN_BlackBox: - case WPN_Original: - case WPN_BeggersBazooka: - case WPN_CowMangler: - speed = 1100; - break; - - case WPN_DirectHit: - speed = 1980; - break; - - case WPN_LibertyLauncher: - speed = 1540; - break; - - case WPN_RighteousBison: - case WPN_Pomson: - speed = 1200; - break; - - case WPN_Flaregun: - case WPN_FestiveFlaregun: - case WPN_ScorchShot: - case WPN_Detonator: - speed = 2000; - break; - - case WPN_GrenadeLauncher: - case WPN_NewGrenadeLauncher: - case WPN_FestiveGrenadeLauncher: - case WPN_IronBomber: - speed = 1216.6; - break; - - - - /* - get dynamically - - stickybomb launcher - scottish resistance - sticky jumper - quickiebomb launcher - huntman fortified compound - - - - } - return ( speed ); - }*/ - - int get_max_clip_1( ); - int get_max_clip_2( ); - int get_slot( ); - char* get_name( ); - char* get_print_name( ); - vec3_t& get_bullet_spread( ); - float get_spread( ); - int get_weaponid( ); - bool can_fire( ); - bool is_non_aim( ); - int& get_inspect_stage( ); - float& get_inspect_time( ); - c_attribute_list* get_attribute_list( ); - float get_distance( ); -}; \ No newline at end of file diff --git a/tf2/CGlobalVarsBase.h b/tf2/CGlobalVarsBase.h deleted file mode 100644 index 9b0d79f..0000000 --- a/tf2/CGlobalVarsBase.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -class CGlobalVarsBase { -public: - float realtime; - int framecount; - float absoluteframetime; - float curtime; - float frametime; - int maxclients; - int tickcount; - float interval_per_tick; - float interpolation_amount; -}; \ No newline at end of file diff --git a/tf2/CHLClient.h b/tf2/CHLClient.h deleted file mode 100644 index 7eadb50..0000000 --- a/tf2/CHLClient.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include "dt_common.h" -#include "dt_recv.h" -#include "VFunc.h" -#include "ClientClass.h" - -enum frame_stages_t { - FRAME_UNDEFINED = -1, // (haven't run any frames yet) - FRAME_START, - FRAME_NET_UPDATE_START, - FRAME_NET_UPDATE_POSTDATAUPDATE_START, - FRAME_NET_UPDATE_POSTDATAUPDATE_END, - FRAME_NET_UPDATE_END, - - FRAME_RENDER_START, - FRAME_RENDER_END -}; - -class chl_client { -public: - client_class_t* GetAllClasses( ) { - return call_vfunc< client_class_t*( __thiscall* )( void* ) >( this, 8 )( this ); - } - - void in_activatemouse( ) { - call_vfunc< void( __thiscall* )( void* ) >( this, 15 )( this ); - } - - void in_deactivatemouse( ) { - call_vfunc< void( __thiscall* )( void* ) >( this, 16 )( this ); - } -}; \ No newline at end of file diff --git a/tf2/CInput.hpp b/tf2/CInput.hpp deleted file mode 100644 index 3fb8bff..0000000 --- a/tf2/CInput.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include "vector.hpp" -#include "IClientMode.h" - -#define MULTIPLAYER_BACKUP 150 - -struct verified_cmd_t { - user_cmd_t m_cmd; - CRC32_t m_crc; -}; - -class CInput { - void* pvftable; //0x00 -public: - bool m_fTrackIRAvailable; //0x04 - bool m_fMouseInitialized; //0x05 - bool m_fMouseActive; //0x06 - bool m_fJoystickAdvancedInit; //0x07 -private: - char pad_0x08[ 0x2C ]; //0x08 -public: - void* m_pKeys; //0x34 -private: - char pad_0x38[ 0x64 ]; //0x38 - int pad_0x41; - int pad_0x42; -public: - bool m_fCameraInterceptingMouse; //0x9C - bool m_fCameraInThirdPerson; //0x9D - bool m_fCameraMovingWithMouse; //0x9E - vec3_t m_vecCameraOffset; //0xA0 - bool m_fCameraDistanceMove; //0xAC - int m_nCameraOldX; //0xB0 - int m_nCameraOldY; //0xB4 - int m_nCameraX; //0xB8 - int m_nCameraY; //0xBC - bool m_CameraIsOrthographic; //0xC0 - vec3_t m_angPreviousViewAngles; //0xC4 - vec3_t m_angPreviousViewAnglesTilt; //0xD0 - float m_flLastForwardMove; //0xDC - int m_nClearInputState; //0xE0 -public: - user_cmd_t * m_pCommands; //0xEC - verified_cmd_t* m_pVerifiedCommands; //0xF0 - int m_hSelectedWeapon; - - user_cmd_t* GetUserCmd( int slot, int seq_num ) { - return util::get_vfunc< 8, user_cmd_t* >( this, slot, seq_num ); - } - - void CreateMove( int sequence_number, float input_sample_time, bool active ) { - return util::get_vfunc< 3, void >( this, sequence_number, input_sample_time, active ); - } -}; diff --git a/tf2/CUserCmd.h b/tf2/CUserCmd.h deleted file mode 100644 index f9dd746..0000000 --- a/tf2/CUserCmd.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once -#include "vector.hpp" - -enum PlayerControls_t { - IN_ATTACK = 1 << 0, - IN_JUMP = 1 << 1, - IN_DUCK = 1 << 2, - IN_FORWARD = 1 << 3, - IN_BACK = 1 << 4, - IN_USE = 1 << 5, - IN_CANCEL = 1 << 6, - IN_LEFT = 1 << 7, - IN_RIGHT = 1 << 8, - IN_MOVELEFT = 1 << 9, - IN_MOVERIGHT = 1 << 10, - IN_ATTACK2 = 1 << 11, - IN_RUN = 1 << 12, - IN_RELOAD = 1 << 13, - IN_ALT1 = 1 << 14, - IN_ALT2 = 1 << 15, - IN_SCORE = 1 << 16, - IN_SPEED = 1 << 17, - IN_WALK = 1 << 18, - IN_ZOOM = 1 << 19, - IN_WEAPON1 = 1 << 20, - IN_WEAPON2 = 1 << 21, - IN_BULLRUSH = 1 << 22, - IN_GRENADE1 = 1 << 23, - IN_GRENADE2 = 1 << 24, - IN_ATTACK3 = 1 << 25, -}; - -class user_cmd_t { -public: - virtual ~user_cmd_t( ) {}; - int command_number; //0 - int tick_count; //4 - vec3_t viewangles; //16 - float forwardmove; //20 - float sidemove; //24 - float upmove; //28 - int buttons; //32 - byte impulse; //33 - int weaponselect; // - int weaponsubtype; - int random_seed; - short mousedx; - short mousedy; - bool hasbeenpredicted; - int SetValue; -}; \ No newline at end of file diff --git a/tf2/ClientClass.h b/tf2/ClientClass.h deleted file mode 100644 index 56a1103..0000000 --- a/tf2/ClientClass.h +++ /dev/null @@ -1,382 +0,0 @@ -#pragma once -#include -#include "dt_recv.h" -typedef unsigned char byte; - -enum ClientClassIDs { - SporeExplosion = 359, - RocketTrail = 357, - SmokeTrail = 358, - CPropVehicleDriveable = 107, - ParticleSmokeGrenade = 356, - CParticleFire = 90, - MovieExplosion = 354, - CTEGaussExplosion = 154, - CEnvQuadraticBeam = 43, - CEmbers = 36, - CEnvWind = 47, - CPrecipitation = 106, - CBaseTempEntity = 17, - CWeaponIFMSteadyCam = 349, - CWeaponIFMBaseCamera = 348, - CWeaponIFMBase = 347, - CTFWearableVM = 341, - CTFWearable = 334, - CTFWearableItem = 337, - CEconWearable = 35, - CBaseAttributableItem = 3, - CEconEntity = 34, - CHandleTest = 72, - CTeamplayRoundBasedRulesProxy = 125, - CTeamRoundTimer = 126, - CSpriteTrail = 121, - CSpriteOriented = 120, - CSprite = 119, - CRagdollPropAttached = 110, - CRagdollProp = 109, - CPoseController = 105, - CGameRulesProxy = 68, - CInfoLadderDismount = 75, - CFuncLadder = 58, - CEnvDetailController = 40, - CWorld = 351, - CWaterLODControl = 346, - CWaterBullet = 345, - CVoteController = 344, - CVGuiScreen = 343, - CPropJeep = 0, - CPropVehicleChoreoGeneric = 0, - CTest_ProxyToggle_Networkable = 174, - CTesla = 169, - CTeamTrainWatcher = 127, - CBaseTeamObjectiveResource = 16, - CTeam = 124, - CSun = 123, - CParticlePerformanceMonitor = 91, - CSpotlightEnd = 118, - CSlideshowDisplay = 115, - CShadowControl = 114, - CSceneEntity = 113, - CRopeKeyframe = 112, - CRagdollManager = 108, - CPhysicsPropMultiplayer = 98, - CPhysBoxMultiplayer = 96, - CBasePropDoor = 15, - CDynamicProp = 33, - CPointCommentaryNode = 104, - CPointCamera = 103, - CPlayerResource = 102, - CPlasma = 100, - CPhysMagnet = 99, - CPhysicsProp = 97, - CPhysBox = 95, - CParticleSystem = 92, - CMaterialModifyControl = 81, - CLightGlow = 79, - CInfoOverlayAccessor = 77, - CFuncTrackTrain = 67, - CFuncSmokeVolume = 66, - CFuncRotating = 65, - CFuncReflectiveGlass = 62, - CFuncOccluder = 60, - CFuncMonitor = 59, - CFunc_LOD = 54, - CTEDust = 146, - CFunc_Dust = 53, - CFuncConveyor = 56, - CBreakableSurface = 25, - CFuncAreaPortalWindow = 55, - CFish = 51, - CEntityFlame = 38, - CFireSmoke = 49, - CEnvTonemapController = 46, - CEnvScreenEffect = 44, - CEnvScreenOverlay = 45, - CEnvProjectedTexture = 42, - CEnvParticleScript = 41, - CFogController = 52, - CEntityParticleTrail = 39, - CEntityDissolve = 37, - CDynamicLight = 32, - CColorCorrectionVolume = 30, - CColorCorrection = 29, - CBreakableProp = 24, - CBasePlayer = 13, - CBaseFlex = 8, - CBaseEntity_ = 7, - CBaseDoor = 6, - CBaseCombatCharacter = 4, - CBaseAnimatingOverlay = 2, - CBoneFollower = 20, - CBaseAnimating = 1, - CInfoLightingRelative = 76, - CAI_BaseNPC = 0, - CBeam = 19, - CBaseViewModel = 18, - CBaseProjectile = 14, - CBaseParticleEntity = 12, - CBaseGrenade = 9, - CBaseCombatWeapon = 5, - CTFWearableRazorback = 339, - CTFWearableDemoShield = 336, - CTFWearableLevelableItem = 338, - CTFWearableCampaignItem = 335, - CTFBaseRocket = 184, - CTFWeaponBaseMerasmusGrenade = 323, - CTFWeaponBaseMelee = 322, - CTFWeaponBaseGun = 321, - CTFWeaponBaseGrenadeProj = 320, - CTFWeaponBase = 319, - CTFWearableRobotArm = 340, - CTFRobotArm = 285, - CTFWrench = 342, - CTFProjectile_ThrowableBreadMonster = 277, - CTFProjectile_ThrowableBrick = 278, - CTFProjectile_ThrowableRepel = 279, - CTFProjectile_Throwable = 276, - CTFThrowable = 317, - CTFSyringeGun = 313, - CTFKatana = 224, - CTFSword = 312, - CSniperDot = 117, - CTFSniperRifleClassic = 306, - CTFSniperRifleDecap = 307, - CTFSniperRifle = 305, - CTFChargedSMG = 196, - CTFSMG = 304, - CTFSlap = 303, - CTFShovel = 302, - CTFShotgunBuildingRescue = 301, - CTFPEPBrawlerBlaster = 240, - CTFSodaPopper = 308, - CTFShotgun_Revenge = 299, - CTFScatterGun = 295, - CTFShotgun_Pyro = 298, - CTFShotgun_HWG = 297, - CTFShotgun_Soldier = 300, - CTFShotgun = 296, - CTFRocketPack = 294, - CTFCrossbow = 200, - CTFRocketLauncher_Mortar = 293, - CTFRocketLauncher_AirStrike = 291, - CTFRocketLauncher_DirectHit = 292, - CTFRocketLauncher = 290, - CTFRevolver = 284, - CTFDRGPomson = 201, - CTFRaygun = 282, - CTFPistol_ScoutSecondary = 245, - CTFPistol_ScoutPrimary = 244, - CTFPistol_Scout = 243, - CTFPistol = 242, - CTFPipebombLauncher = 241, - CTFWeaponPDA_Spy = 330, - CTFWeaponPDA_Engineer_Destroy = 329, - CTFWeaponPDA_Engineer_Build = 328, - CTFWeaponPDAExpansion_Teleporter = 332, - CTFWeaponPDAExpansion_Dispenser = 331, - CTFWeaponPDA = 327, - CTFParticleCannon = 238, - CTFParachute_Secondary = 237, - CTFParachute_Primary = 236, - CTFParachute = 235, - CTFMinigun = 233, - CTFMedigunShield = 230, - CWeaponMedigun = 350, - CTFMechanicalArm = 229, - CTFLunchBox_Drink = 228, - CTFLunchBox = 227, - CLaserDot = 78, - CTFLaserPointer = 226, - CTFKnife = 225, - CTFGasManager = 211, - CTFProjectile_JarGas = 260, - CTFJarGas = 222, - CTFProjectile_Cleaver = 253, - CTFProjectile_JarMilk = 261, - CTFProjectile_Jar = 259, - CTFCleaver = 197, - CTFJarMilk = 223, - CTFJar = 221, - CTFWeaponInvis = 326, - CTFCannon = 195, - CTFGrenadeLauncher = 215, - CTFGrenadePipebombProjectile = 216, - CTFGrapplingHook = 214, - CTFFlareGun_Revenge = 209, - CTFFlareGun = 208, - CTFFlameRocket = 206, - CTFFlameThrower = 207, - CTFFists = 204, - CTFFireAxe = 203, - CTFWeaponFlameBall = 325, - CTFCompoundBow = 199, - CTFClub = 198, - CTFBuffItem = 194, - CTFStickBomb = 310, - CTFBreakableSign = 193, - CTFBottle = 191, - CTFBreakableMelee = 192, - CTFBonesaw = 189, - CTFBall_Ornament = 181, - CTFStunBall = 311, - CTFBat_Giftwrap = 187, - CTFBat_Wood = 188, - CTFBat_Fish = 186, - CTFBat = 185, - CTFProjectile_EnergyRing = 255, - CTFDroppedWeapon = 202, - CTFWeaponSapper = 333, - CTFWeaponBuilder = 324, - C_TFWeaponBuilder = 0, - CTFProjectile_Rocket = 262, - CTFProjectile_Flare = 256, - CTFProjectile_EnergyBall = 254, - CTFProjectile_GrapplingHook = 257, - CTFProjectile_HealingBolt = 258, - CTFProjectile_Arrow = 251, - CTFTankBoss = 314, - CTFBaseBoss = 182, - CBossAlpha = 0, - NextBotCombatCharacter = 355, - CTFProjectile_SpellKartBats = 266, - CTFProjectile_SpellKartOrb = 267, - CTFHellZap = 219, - CTFProjectile_SpellLightningOrb = 268, - CTFProjectile_SpellTransposeTeleport = 275, - CTFProjectile_SpellMeteorShower = 269, - CTFProjectile_SpellSpawnBoss = 272, - CTFProjectile_SpellMirv = 270, - CTFProjectile_SpellPumpkin = 271, - CTFProjectile_SpellSpawnHorde = 273, - CTFProjectile_SpellSpawnZombie = 274, - CTFProjectile_SpellBats = 264, - CTFProjectile_SpellFireball = 265, - CTFSpellBook = 309, - CHightower_TeleportVortex = 74, - CTeleportVortex = 159, - CZombie = 352, - CMerasmusDancer = 83, - CMerasmus = 82, - CHeadlessHatman = 73, - CEyeballBoss = 48, - CTFBotHintEngineerNest = 190, - CBotNPCMinion = 0, - CBotNPC = 0, - CPasstimeGun = 94, - CTFViewModel = 318, - CRobotDispenser = 111, - CTFRobotDestruction_Robot = 286, - CTFReviveMarker = 283, - CTFPumpkinBomb = 280, - CTFProjectile_BallOfFire = 252, - CTFBaseProjectile = 183, - CTFPointManager = 249, - CBaseObjectUpgrade = 11, - CTFRobotDestructionLogic = 289, - CTFRobotDestruction_RobotGroup = 287, - CTFRobotDestruction_RobotSpawn = 288, - CTFPlayerDestructionLogic = 247, - CPlayerDestructionDispenser = 101, - CTFMinigameLogic = 232, - CTFHalloweenMinigame_FallingPlatforms = 218, - CTFHalloweenMinigame = 217, - CTFMiniGame = 231, - CTFPowerupBottle = 250, - CTFItem = 220, - CHalloweenSoulPack = 71, - CTFGenericBomb = 212, - CBonusRoundLogic = 23, - CTFGameRulesProxy = 210, - CTETFParticleEffect = 178, - CTETFExplosion = 177, - CTETFBlood = 176, - CTFFlameManager = 205, - CHalloweenGiftPickup = 69, - CBonusDuckPickup = 21, - CHalloweenPickup = 70, - CCaptureFlagReturnIcon = 27, - CCaptureFlag = 26, - CBonusPack = 22, - CTFTeam = 316, - CTFTauntProp = 315, - CTFPlayerResource = 248, - CTFPlayer = 246, - CTFRagdoll = 281, - CTEPlayerAnimEvent = 164, - CTFPasstimeLogic = 239, - CPasstimeBall = 93, - CTFObjectiveResource = 234, - CTFGlow = 213, - CTEFireBullets = 151, - CTFBuffBanner = 0, - CTFAmmoPack = 180, - CObjectTeleporter = 89, - CObjectSentrygun = 88, - CTFProjectile_SentryRocket = 263, - CObjectSapper = 87, - CObjectCartDispenser = 85, - CObjectDispenser = 86, - CMonsterResource = 84, - CFuncRespawnRoomVisualizer = 64, - CFuncRespawnRoom = 63, - CFuncPasstimeGoal = 61, - CFuncForceField = 57, - CCaptureZone = 28, - CCurrencyPack = 31, - CBaseObject = 10, - CTestTraceline = 175, - CTEWorldDecal = 179, - CTESpriteSpray = 173, - CTESprite = 172, - CTESparks = 171, - CTESmoke = 170, - CTEShowLine = 168, - CTEProjectedDecal = 166, - CTEPlayerDecal = 165, - CTEPhysicsProp = 163, - CTEParticleSystem = 162, - CTEMuzzleFlash = 161, - CTELargeFunnel = 158, - CTEKillPlayerAttachments = 157, - CTEImpact = 156, - CTEGlowSprite = 155, - CTEShatterSurface = 167, - CTEFootprintDecal = 153, - CTEFizz = 152, - CTEExplosion = 150, - CTEEnergySplash = 149, - CTEEffectDispatch = 148, - CTEDynamicLight = 147, - CTEDecal = 145, - CTEClientProjectile = 144, - CTEBubbleTrail = 143, - CTEBubbles = 142, - CTEBSPDecal = 141, - CTEBreakModel = 140, - CTEBloodStream = 139, - CTEBloodSprite = 138, - CTEBeamSpline = 137, - CTEBeamRingPoint = 136, - CTEBeamRing = 135, - CTEBeamPoints = 134, - CTEBeamLaser = 133, - CTEBeamFollow = 132, - CTEBeamEnts = 131, - CTEBeamEntPoint = 130, - CTEBaseBeam = 129, - CTEArmorRicochet = 128, - CTEMetalSparks = 160, - CSteamJet = 122, - CSmokeStack = 116, - DustTrail = 353, - CFireTrail = 50, -}; - -class client_class_t { - byte _chpadding[ 8 ]; -public: - char* m_name; - RecvTable* m_rt_table; - client_class_t* m_next; - int m_class_id; -}; \ No newline at end of file diff --git a/tf2/GlowObject.h b/tf2/GlowObject.h deleted file mode 100644 index 00dce81..0000000 --- a/tf2/GlowObject.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -#include "UtlMem.h" -#include -#include "color.hpp" - -static const int END_OF_FREE_LIST = -1; -static const int ENTRY_IN_USE = -2; - -struct GlowObject_t { - uintptr_t ent_ptr; - fclr_t glow_color; - - bool render_when_occluded; - bool render_when_unoccluded; - int pad; - - int next_free_slot; -}; - -struct GlowObjectManager_t { - CUtlVector< GlowObject_t > data; - int first_slot; - - int RegisterGlowObject( IClientEntity* ent ) { - for( int i{ }; i < data.Count( ); i++ ) { - if( data[ i ].ent_ptr == ent->get_ehandle( ) ) return 0; - } - int index{ }; - if( first_slot == -1 ) index = data.AddToTail( ); - else { - index = first_slot; - first_slot = data[ index ].next_free_slot; - } - data[ index ].ent_ptr = ent->get_ehandle( ); - data[ index ].glow_color = clr_t( 255, 255, 255, 255 ).to_fclr( ); - data[ index ].render_when_occluded = true; - data[ index ].render_when_unoccluded = true; - data[ index ].pad = -1; - data[ index ].next_free_slot = -2; - - return index; - } -}; \ No newline at end of file diff --git a/tf2/IAppSystem.h b/tf2/IAppSystem.h deleted file mode 100644 index 84af8c2..0000000 --- a/tf2/IAppSystem.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -class AppSystemInfo_t; - -enum InitReturnVal_t; - -enum AppSystemTier_t { - APP_SYSTEM_TIER0 = 0, - APP_SYSTEM_TIER1, - APP_SYSTEM_TIER2, - APP_SYSTEM_TIER3, - - APP_SYSTEM_TIER_OTHER, -}; - -using CreateInterfaceFn = void*( *)( const char*, int* ); - -class IAppSystem { -public: - // Here's where the app systems get to learn about each other - virtual bool Connect( CreateInterfaceFn factory ) = 0; - virtual void Disconnect( ) = 0; - - // Here's where systems can access other interfaces implemented by this object - // Returns NULL if it doesn't implement the requested interface - virtual void *QueryInterface( const char *pInterfaceName ) = 0; - - // Init, shutdown - virtual InitReturnVal_t Init( ) = 0; - virtual void Shutdown( ) = 0; -}; \ No newline at end of file diff --git a/tf2/IClientEntity.h b/tf2/IClientEntity.h deleted file mode 100644 index 0ba0807..0000000 --- a/tf2/IClientEntity.h +++ /dev/null @@ -1,154 +0,0 @@ -#pragma once -#include "vector.hpp" -#include "VFunc.h" -#include "dt_common.h" -#include "dt_recv.h" -#include "search.h" -#include "util.hpp" -#include "ClientClass.h" - -using matrix3x4 = float[ 3 ][ 4 ]; -class bf_read; - -class ICollideable; -class IClientNetworkable; -class IClientRenderable; -class IClientThinkable; -class IClientEntity; -class IClientAlphaProperty; - -class IClientUnknown { -public: - virtual ICollideable* GetCollideable( ) = 0; - virtual IClientNetworkable* GetClientNetworkable( ) = 0; - virtual IClientRenderable* GetClientRenderable( ) = 0; - virtual IClientEntity* GetIClientEntity( ) = 0; - virtual IClientEntity* GetBaseEntity( ) = 0; - virtual IClientThinkable* GetClientThinkable( ) = 0; - //virtual IClientModelRenderable* GetClientModelRenderable() = 0; - virtual IClientAlphaProperty* GetClientAlphaProperty( ) = 0; -}; - -class IClientNetworkable { -public: - virtual IClientUnknown* GetIClientUnknown( ) = 0; - virtual void Release( ) = 0; - virtual client_class_t* GetClientClass( ) = 0; - virtual void NotifyShouldTransmit( int state ) = 0; - virtual void OnPreDataChanged( int updateType ) = 0; - virtual void OnDataChanged( int updateType ) = 0; - virtual void PreDataUpdate( int updateType ) = 0; - virtual void PostDataUpdate( int updateType ) = 0; - virtual void OnDataUnchangedInPVS( void ) = 0; - virtual bool IsDormant( void ) = 0; - virtual int EntIndex( void ) const = 0; - virtual void ReceiveMessage( int classID, bf_read& msg ) = 0; - virtual void* GetDataTableBasePtr( ) = 0; - virtual void SetDestroyedOnRecreateEntities( void ) = 0; -}; - -class IClientEntity { -public: - void* get_client_renderable( ) { - return reinterpret_cast< void* >( this + 0x4 ); - } - - IClientNetworkable* get_client_networkable( ) { - return reinterpret_cast< IClientNetworkable* >( this + 0x8 ); - } - -public: - uintptr_t get_ehandle( ) { - return call_vfunc< uintptr_t( __thiscall* )( void* ) >( this, 1 )( this ); - } - - bool setup_bones( matrix3x4* bonetoworld, int maxbones, long bonemask, float curtime ) { - return call_vfunc< bool( __thiscall* )( void*, matrix3x4*, int, long, float ) >( get_client_renderable( ), 16 )( get_client_renderable( ), bonetoworld, maxbones, bonemask, curtime ); - } - - int DrawModel( int flags, uint8_t alpha ) { - using fn = int( __thiscall* )( void*, int, uint8_t ); - return util::get_vfunc< fn >( this->get_client_renderable( ), 9 )( this->get_client_renderable( ), flags, alpha ); - } - - vec3_t& get_render_origin( ) { - using fn = vec3_t & ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 10 )( this ); - } - - vec3_t& get_abs_origin( ) { - return call_vfunc< vec3_t&( __thiscall* )( void* ) >( this, 9 )( this ); - } - - vec3_t& get_abs_angles( ) { - return call_vfunc< vec3_t&( __thiscall* )( void* ) >( this, 10 )( this ); - } - - void* get_model( ) { - return call_vfunc< void*( __thiscall* )( void* ) >( get_client_renderable( ), 9 )( get_client_renderable( ) ); - } - - client_class_t* get_client_class( ) { - return call_vfunc< client_class_t*( __thiscall* )( void* ) >( get_client_networkable( ), 2 )( get_client_networkable( ) ); - } - - bool is_dormant( ) { - return call_vfunc< bool( __thiscall * )( void * ) >( get_client_networkable( ), 8 )( get_client_networkable( ) ); - } - - int index( ) { - return call_vfunc< int( __thiscall* )( void* ) >( get_client_networkable( ), 9 )( get_client_networkable( ) ); - } - - void update_glow_effect( ) { - //static auto fn = pattern::first_code_match< void( __thiscall* )( void* ) >( GetModuleHandleA( "client.dll" ), "8B 06 8D 4D F4 57 51 8D 4D F8", -0x2c ); - //if ( fn ) fn( this ); - return call_vfunc< void( __thiscall* )( void* ) >( this, 226 )( this ); - } - - void destroy_glow_effect( ) { - //static auto fn_offset = pattern::first_code_match< intptr_t >( GetModuleHandleA( "client.dll" ), "E8 ? ? ? ? 8B 9F ? ? ? ? 85 DB 74 3D 8B 33" ); - //static auto fn = reinterpret_cast< void( __thiscall* )( void* ) >( fn_offset + 5 + *( intptr_t* )( fn_offset + 1 ) ); - //if ( fn ) fn( this ); - return call_vfunc< void( __thiscall* )( void* ) >( this, 227 )( this ); - } - - client_class_t* GetClientClass( ) { - using fn = client_class_t* ( __thiscall* )( void* ); - return util::get_vfunc< fn >( get_client_networkable( ), 2 )( this ); - /* - try { - return get_client_networkable( )->GetClientClass( ); - } - catch( ... ) { - return 0; - }*/ - } - -public: - template< typename T = uintptr_t > - __forceinline T& get( std::ptrdiff_t offset = 0 ) { - return( *reinterpret_cast< T* >( ( uintptr_t )this + offset ) ); - } - - template< std::ptrdiff_t offset, typename T = uintptr_t > - __forceinline T& get( ) { - return( *reinterpret_cast< T* >( ( uintptr_t )this + offset ) ); - } - - template< typename T = uintptr_t > - __forceinline T at( std::ptrdiff_t offset = 0 ) { - return( reinterpret_cast< T >( uintptr_t( this ) + offset ) ); - } - - template< std::ptrdiff_t offset, typename T = uintptr_t > - __forceinline T at( ) { - return( reinterpret_cast< T >( uintptr_t( this ) + offset ) ); - } - - template < typename t > - t* as( ) { - return reinterpret_cast< t* >( this ); - } - -}; \ No newline at end of file diff --git a/tf2/IClientEntityList.h b/tf2/IClientEntityList.h deleted file mode 100644 index 18b4371..0000000 --- a/tf2/IClientEntityList.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "VFunc.h" - -class IClientEntity; -class c_base_player; -using model_t = uintptr_t; -class client_ent_list { -public: - template< typename T = IClientEntity > T* get_client_entity( int index ) { - return call_vfunc< T* ( __thiscall* )( void*, int ) >( this, 3 )( this, index ); - } - - template< typename T = IClientEntity > T* get_entity_from_handle( uintptr_t handle ) { - return call_vfunc< T*( __thiscall* )( void*, uintptr_t ) >( this, 4 )( this, handle ); - } - - int get_highest_entity_index( ) { - return call_vfunc< int( __thiscall* )( void* ) >( this, 6 )( this ); - } - - template< typename T = c_base_player > __forceinline T* get_local_player( ) { - return get_client_entity< T >( cl.m_engine( )->GetLocalPlayer( ) ); - } -}; \ No newline at end of file diff --git a/tf2/IClientMode.h b/tf2/IClientMode.h deleted file mode 100644 index f528f3d..0000000 --- a/tf2/IClientMode.h +++ /dev/null @@ -1,174 +0,0 @@ -#pragma once - -#include "checksum_crc.h" - -#include "util.hpp" -#include "vector.hpp" - -enum player_controls_t { - IN_ATTACK = 1 << 0, - IN_JUMP = 1 << 1, - IN_DUCK = 1 << 2, - IN_FORWARD = 1 << 3, - IN_BACK = 1 << 4, - IN_USE = 1 << 5, - IN_CANCEL = 1 << 6, - IN_LEFT = 1 << 7, - IN_RIGHT = 1 << 8, - IN_MOVELEFT = 1 << 9, - IN_MOVERIGHT = 1 << 10, - IN_ATTACK2 = 1 << 11, - IN_RUN = 1 << 12, - IN_RELOAD = 1 << 13, - IN_ALT1 = 1 << 14, - IN_ALT2 = 1 << 15, - IN_SCORE = 1 << 16, - IN_SPEED = 1 << 17, - IN_WALK = 1 << 18, - IN_ZOOM = 1 << 19, - IN_WEAPON1 = 1 << 20, - IN_WEAPON2 = 1 << 21, - IN_BULLRUSH = 1 << 22, - IN_GRENADE1 = 1 << 23, - IN_GRENADE2 = 1 << 24, - IN_ATTACK3 = 1 << 25, -}; - -class user_cmd_t { -public: - virtual ~user_cmd_t( ) { }; - - int m_cmd_nr; // 0x04 For matching server and client commands for debugging - int m_tick_count; // 0x08 the tick the client created this command - vec3_t m_viewangles; // 0x0C Player instantaneous view angles. - float m_forwardmove; // 0x24 - float m_sidemove; // 0x28 - float m_upmove; // 0x2C - int m_buttons; // 0x30 Attack button states - uint8_t m_impulse; // 0x34 - int m_weaponselect; // 0x38 Current weapon id - int m_weaponsubtype; // 0x3C - int m_random_seed; // 0x40 For shared random functions - short m_mousedx; // 0x44 mouse accum in x from create move - short m_mousedy; // 0x46 mouse accum in y from create move - bool m_predicted; // 0x48 Client only, tracks whether we've predicted this command at least once - vec3_t headangles; // 0x49 - vec3_t headoffset; // 0x55 - - __forceinline user_cmd_t clamp( bool angles = true ) { - if( angles ) - m_viewangles.clamp( ); - - m_forwardmove = std::clamp( m_forwardmove, -450.f, 450.f ); - m_sidemove = std::clamp( m_sidemove, -450.f, 450.f ); - m_upmove = std::clamp( m_upmove, -450.f, 450.f ); - - return *this; - } - - CRC32_t get_check_sum( ) { - CRC32_t crc; - CRC32_Init( &crc ); - - CRC32_ProcessBuffer( &crc, &m_cmd_nr, sizeof( m_cmd_nr ) ); - CRC32_ProcessBuffer( &crc, &m_tick_count, sizeof( m_tick_count ) ); - CRC32_ProcessBuffer( &crc, &m_viewangles, sizeof( m_viewangles ) ); - CRC32_ProcessBuffer( &crc, &m_forwardmove, sizeof( m_forwardmove ) ); - CRC32_ProcessBuffer( &crc, &m_sidemove, sizeof( m_sidemove ) ); - CRC32_ProcessBuffer( &crc, &m_upmove, sizeof( m_upmove ) ); - CRC32_ProcessBuffer( &crc, &m_buttons, sizeof( m_buttons ) ); - CRC32_ProcessBuffer( &crc, &m_impulse, sizeof( m_impulse ) ); - CRC32_ProcessBuffer( &crc, &m_weaponselect, sizeof( m_weaponselect ) ); - CRC32_ProcessBuffer( &crc, &m_weaponsubtype, sizeof( m_weaponsubtype ) ); - CRC32_ProcessBuffer( &crc, &m_random_seed, sizeof( m_random_seed ) ); - CRC32_ProcessBuffer( &crc, &m_mousedx, sizeof( m_mousedx ) ); - CRC32_ProcessBuffer( &crc, &m_mousedy, sizeof( m_mousedy ) ); - - CRC32_Final( &crc ); - return crc; - } - -private: - - //char pad_0x4C[ 0x18 ]; // 0x4C Current sizeof( usercmd ) = 100 = 0x64 -}; - -class CHudChat { -public: - void ChatPrintf( int iPlayerIndex, int iFilter, const char* fmt ) { - using fn = void( __cdecl* )( void*, int, int, const char* ); - util::get_vfunc< fn >( this, 26 )( this, iPlayerIndex, iFilter, fmt ); - } -}; - -class CViewSetup { -public: - int m_x; - int m_oldX; - int m_y; - int m_oldY; - int m_width; - int m_oldWidth; - int m_height; - int m_oldHeight; - - bool m_bOrtho; - float m_OrthoLeft; - float m_OrthoTop; - float m_OrthoRight; - float m_OrthoBottom; - -private: - char pad1[ 0x7C ]; - -public: - float m_flFov; - float m_flFovViewmodel; - vec3_t m_vecOrigin; - vec3_t m_vecAngles; - - float zNear; - float zFar; - float zNearViewmodel; - float zFarViewmodel; - - float m_flAspectRatio; - float m_flNearBlurDepth; - float m_flNearFocusDepth; - float m_flFarFocusDepth; - float m_flFarBlurDepth; - float m_flNearBlurRadius; - float m_flFarBlurRadius; - int m_nDoFQuality; - int m_nMotionBlurMode; - - float m_flShutterTime; - vec3_t m_vShutterOpenPosition; - vec3_t m_shutterOpenAngles; - vec3_t m_vShutterClosePosition; - vec3_t m_shutterCloseAngles; - - float m_flOffCenterTop; - float m_flOffCenterBottom; - float m_flOffCenterLeft; - float m_flOffCenterRight; - - bool m_bOffCenter : 1; - bool m_bRenderToSubrectOfLargerScreen : 1; - bool m_bDoBloomAndToneMapping : 1; - bool m_bDoDepthOfField : 1; - bool m_bHDRTarget : 1; - bool m_bDrawWorldNormal : 1; - bool m_bCullFrontFaces : 1; - bool m_bCacheFullSceneState : 1; - bool m_bRenderFlashlightDepthTranslucents : 1; -private: - char pad2[ 0x40 ]; -}; - -class IClientMode { -public: - char _pad[ 28 ]; - - CHudChat* m_pChatElement; //0x2A -}; \ No newline at end of file diff --git a/tf2/ICvar.h b/tf2/ICvar.h deleted file mode 100644 index 19cb55f..0000000 --- a/tf2/ICvar.h +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once -#include "IAppSystem.h" -#include "util.hpp" -#include "color.hpp" - -using CVarDLLIdentifier_t = int; -class IConVar; -using FnChangeCallback_t = void( *)( IConVar *var, const char *pOldValue, float flOldValue ); -class ConCommandBase; -class ConCommand; -class ICvarQuery; - -class IConsoleDisplayFunc { -public: - virtual void ColorPrint( const uint8_t* clr, const char *pMessage ) = 0; - virtual void Print( const char *pMessage ) = 0; - virtual void DPrint( const char *pMessage ) = 0; -}; - -#define FCVAR_NONE 0 - -// Command to ConVars and ConCommands -// ConVar Systems -#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. -#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined. -#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL -#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL -#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out. - -// ConVar only -#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value -#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. -#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc -#define FCVAR_NOTIFY (1<<8) // notifies players when changed -#define FCVAR_USERINFO (1<<9) // changes the client's info string -#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats - -#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). -#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log -#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar - -// It's a ConVar that's shared between the client and the server. -// At signon, the values of all such ConVars are sent from the server to the client (skipped for local -// client, of course ) -// If a change is requested it must come from the console (i.e., no remote client changes) -// If a value is changed while a server is active, it's replicated to all connected clients -#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time -#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file -#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles -#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload -#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload - -#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server -#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread -#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox - -#define FCVAR_ACCESSIBLE_FROM_THREADS (1<<25) // used as a debugging tool necessary to check material system thread convars - -#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd. -#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue). -#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command. - - -class cvar_t { -public: - void set_value( const char* value ) { - using fn = void( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 14 )( this, value ); - } - - void set_value( float value ) { - using fn = void( __thiscall* )( void*, float ); - return util::get_vfunc< fn >( this, 15 )( this, value ); - } - - void set_value( int value ) { - using fn = void( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 16 )( this, value ); - } - - char* get_name( ) { - using fn = char*( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 5 )( this ); - } - - char* get_default( ) { - return m_default; - } - - const char* get_string( ) { - return m_string; - } - - float get_float( ) { - //return call_vfunc< float( __thiscall* )( void* ) >( this, 12 )( this ); - return m_parent->m_flvalue; - } //crash no idea why - - int get_int( ) { - using fn = int( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 13 )( this ); - } - -private: - char pad_0x0000[ 0x4 ]; //0x0000 -public: - cvar_t * m_next; //0x0004 - __int32 m_registered; //0x0008 - char* m_name; //0x000C - char* m_help_str; //0x0010 - __int32 m_flags; //0x0014 -private: - char pad_0x0018[ 0x4 ]; //0x0018 -public: - cvar_t * m_parent; //0x001C - char* m_default; //0x0020 - char* m_string; //0x0024 - __int32 m_str_len; //0x0028 - float m_flvalue; //0x002C - __int32 m_nvalue; //0x0030 - __int32 m_has_min; //0x0034 - float m_min; //0x0038 - __int32 m_hax_max; //0x003C - float m_max; //0x0040 - void* m_change_callback; //0x0044 -};//Size=0x0048 - -class ICVar : public IAppSystem -{ -public: - // Allocate a unique DLL identifier - virtual CVarDLLIdentifier_t AllocateDLLIdentifier( ) = 0; - - // Register, unregister commands - virtual void RegisterConCommand( ConCommandBase *pCommandBase ) = 0; - virtual void UnregisterConCommand( ConCommandBase *pCommandBase ) = 0; - virtual void UnregisterConCommands( CVarDLLIdentifier_t id ) = 0; - - // If there is a + on the command line, this returns the value. - // Otherwise, it returns NULL. - virtual const char* GetCommandLineValue( const char *pVariableName ) = 0; - - // Try to find the cvar pointer by name - virtual ConCommandBase* FindCommandBase( const char *name ) = 0; - virtual const ConCommandBase* FindCommandBase( const char *name ) const = 0; - virtual cvar_t *FindVar( const char *var_name ) = 0; - virtual const cvar_t *FindVar( const char *var_name ) const = 0; - virtual ConCommand *FindCommand( const char *name ) = 0; - virtual const ConCommand *FindCommand( const char *name ) const = 0; - - - - // Install a global change callback (to be called when any convar changes) - virtual void InstallGlobalChangeCallback( FnChangeCallback_t callback ) = 0; - virtual void RemoveGlobalChangeCallback( FnChangeCallback_t callback ) = 0; - virtual void CallGlobalChangeCallbacks( cvar_t *var, const char *pOldString, float flOldValue ) = 0; - - // Install a console printer - virtual void InstallConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; - virtual void RemoveConsoleDisplayFunc( IConsoleDisplayFunc* pDisplayFunc ) = 0; - virtual void ConsoleColorPrintf( const clr_t& clr, const char *pFormat, ... ) const = 0; - virtual void ConsolePrintf( const char *pFormat, ... ) const = 0; - virtual void ConsoleDPrintf( const char *pFormat, ... ) const = 0; - - // Reverts cvars which contain a specific flag - virtual void RevertFlaggedConVars( int nFlag ) = 0; - - // Method allowing the engine ICvarQuery interface to take over - // A little hacky, owing to the fact the engine is loaded - // well after ICVar, so we can't use the standard connect pattern - virtual void InstallCVarQuery( ICvarQuery *pQuery ) = 0; - - - virtual void SetMaxSplitScreenSlots( int nSlots ) = 0; - virtual int GetMaxSplitScreenSlots( ) const = 0; - - virtual void AddSplitScreenConVars( ) = 0; - virtual void RemoveSplitScreenConVars( CVarDLLIdentifier_t id ) = 0; - - virtual int GetConsoleDisplayFuncCount( ) const = 0; - virtual void GetConsoleText( int nDisplayFuncIndex, char *pchText, size_t bufSize ) const = 0; - - // Utilities for convars accessed by the material system thread - virtual bool IsMaterialThreadSetAllowed( ) const = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, const char *pValue ) = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, int nValue ) = 0; - virtual void QueueMaterialThreadSetValue( cvar_t *pConVar, float flValue ) = 0; - virtual bool HasQueuedMaterialThreadConVarSets( ) const = 0; - virtual int ProcessQueuedMaterialThreadConVarSets( ) = 0; - - class ICVarIteratorInternal - { - public: - virtual void SetFirst( ) = 0; - virtual void Next( ) = 0; - virtual bool IsValid( ) = 0; - virtual ConCommandBase *Get( ) = 0; - }; - - virtual ICVarIteratorInternal* FactoryInternalIterator( ) = 0; -}; \ No newline at end of file diff --git a/tf2/IEngineTrace.h b/tf2/IEngineTrace.h deleted file mode 100644 index 7fb317d..0000000 --- a/tf2/IEngineTrace.h +++ /dev/null @@ -1,268 +0,0 @@ -#pragma once -#include "vector.hpp" -#include "VFunc.h" - -enum trace_type_t { - TRACE_EVERYTHING = 0, - TRACE_WORLD_ONLY, - TRACE_ENTITIES_ONLY, - TRACE_EVERYTHING_FILTER_PROPS, -}; - -enum SurfaceFlags_t { - DISPSURF_FLAG_SURFACE = ( 1 << 0 ), - DISPSURF_FLAG_WALKABLE = ( 1 << 1 ), - DISPSURF_FLAG_BUILDABLE = ( 1 << 2 ), - DISPSURF_FLAG_SURFPROP1 = ( 1 << 3 ), - DISPSURF_FLAG_SURFPROP2 = ( 1 << 4 ), -}; - -struct csurface_t { - const char *name; - short surfaceProps; - unsigned short flags; -}; - -struct cplane_t { - vec3_t normal; - float dist; - byte type; - byte signbits; - byte pad[ 2 ]; -}; - -class ITraceFilter { -public: - virtual bool ShouldHitEntity( void *pEntity, int contentsMask ) = 0; - virtual trace_type_t GetTraceType( ) const = 0; -}; - -class CTraceFilter : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) { - return !( pEntityHandle == pSkip ); - } - virtual trace_type_t GetTraceType( ) const { - return TRACE_EVERYTHING; - } - - void* pSkip; -}; - -class CTraceFilterWorldAndPropsOnly : public ITraceFilter { -public: - bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) override { - return false; - } - - trace_type_t GetTraceType( ) const override { - return TRACE_EVERYTHING; - } -}; - -class CTraceFilterSkipTwoEntities : public ITraceFilter { -public: - CTraceFilterSkipTwoEntities( void* pPassEnt1, void* pPassEnt2 ) - { - passentity1 = pPassEnt1; - passentity2 = pPassEnt2; - } - - virtual bool ShouldHitEntity( void* pEntityHandle, int contentsMask ) { - return !( pEntityHandle == passentity1 || pEntityHandle == passentity2 ); - } - - virtual trace_type_t GetTraceType( ) const { - return TRACE_EVERYTHING; - } - - void* passentity1; - void* passentity2; -}; - -class __declspec( align( 16 ) )VectorAligned : public vec3_t { -public: - VectorAligned& operator=( const vec3_t &vOther ) { - x = vOther.x; - y = vOther.y; - z = vOther.z; - return *this; - } - - VectorAligned& operator=( const float &other ) { - *this = { other, other, other }; - return *this; - } - float w; -}; - -struct Ray_t { - VectorAligned m_Start; - VectorAligned m_Delta; - VectorAligned m_StartOffset; - VectorAligned m_Extents; - - bool m_IsRay; - bool m_IsSwept; - - void Init( vec3_t& start, vec3_t& end ) { - m_Delta = end - start; - - m_IsSwept = ( m_Delta.lengthsqr( ) != 0 ); - - m_Extents = 0.f; - m_IsRay = true; - - m_StartOffset = 0.f; - m_Start = start; - } - - void Init( vec3_t& start, vec3_t& end, vec3_t& mins, vec3_t& maxs ) { - m_Delta = end - start; - - m_IsSwept = ( m_Delta.lengthsqr( ) != 0 ); - - m_Extents = maxs - mins; - m_Extents *= 0.5f; - m_IsRay = ( m_Extents.lengthsqr( ) < 1e-6 ); - - m_StartOffset = mins + maxs; - m_StartOffset *= 0.5f; - m_Start = start - m_StartOffset; - m_StartOffset *= -1.0f; - } -}; - -class CBaseTrace { -public: - bool IsDispSurface( void ) { return ( ( dispFlags & DISPSURF_FLAG_SURFACE ) != 0 ); } //not in csgo - bool IsDispSurfaceWalkable( void ) { return ( ( dispFlags & DISPSURF_FLAG_WALKABLE ) != 0 ); } - bool IsDispSurfaceBuildable( void ) { return ( ( dispFlags & DISPSURF_FLAG_BUILDABLE ) != 0 ); } - bool IsDispSurfaceProp1( void ) { return ( ( dispFlags & DISPSURF_FLAG_SURFPROP1 ) != 0 ); } - bool IsDispSurfaceProp2( void ) { return ( ( dispFlags & DISPSURF_FLAG_SURFPROP2 ) != 0 ); } - -public: - vec3_t startpos; - vec3_t endpos; - cplane_t plane; - - float fraction; - - int contents; - unsigned short dispFlags; - - bool allsolid; - bool startsolid; - - CBaseTrace( ) {} - -private: - CBaseTrace( const CBaseTrace& vOther ); -}; - -class CGameTrace : public CBaseTrace { -public: - bool DidHitWorld( ) const; - - bool DidHitNonWorldEntity( ) const; - - int GetEntityIndex( ) const; - - bool DidHit( ) const { - return fraction < 1 || allsolid || startsolid; - } - -public: - float fractionleftsolid; - csurface_t surface; - - int hitgroup; - - short physicsbone; - - IClientEntity* m_pEnt; - int hitbox; - - CGameTrace( ) {} - CGameTrace( const CGameTrace& vOther ); -}; - -typedef CGameTrace trace_t; - -class IEngineTrace { -public: - void clip_ray_to_ent( const Ray_t& ray, unsigned int fMask, IClientEntity* pEnt, trace_t* pTrace ) { - return call_vfunc< void( __thiscall* )( void*, const Ray_t&, unsigned int, IClientEntity*, trace_t* ) >( this, 2 )( this, ray, fMask, pEnt, pTrace ); - } - - void trace_ray( const Ray_t& ray, unsigned int fMask, ITraceFilter* pTraceFilter, trace_t* pTrace ) { - return call_vfunc< void( __thiscall* )( void*, const Ray_t&, unsigned int, ITraceFilter*, trace_t* ) >( this, 4 )( this, ray, fMask, pTraceFilter, pTrace ); - } -}; - - -#define CONTENTS_EMPTY 0 /**< No contents. */ -#define CONTENTS_SOLID 0x1 /**< an eye is never valid in a solid . */ -#define CONTENTS_WINDOW 0x2 /**< translucent, but not watery (glass). */ -#define CONTENTS_AUX 0x4 -#define CONTENTS_GRATE 0x8 /**< alpha-tested "grate" textures. Bullets/sight pass through, but solids don't. */ -#define CONTENTS_SLIME 0x10 -#define CONTENTS_WATER 0x20 -#define CONTENTS_MIST 0x40 -#define CONTENTS_OPAQUE 0x80 /**< things that cannot be seen through (may be non-solid though). */ -#define LAST_VISIBLE_CONTENTS 0x80 -#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1)) -#define CONTENTS_TESTFOGVOLUME 0x100 -#define CONTENTS_UNUSED5 0x200 -#define CONTENTS_UNUSED6 0x4000 -#define CONTENTS_TEAM1 0x800 /**< per team contents used to differentiate collisions. */ -#define CONTENTS_TEAM2 0x1000 /**< between players and objects on different teams. */ -#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 /**< ignore CONTENTS_OPAQUE on surfaces that have SURF_NODRAW. */ -#define CONTENTS_MOVEABLE 0x4000 /**< hits entities which are MOVETYPE_PUSH (doors, plats, etc) */ -#define CONTENTS_AREAPORTAL 0x8000 /**< remaining contents are non-visible, and don't eat brushes. */ -#define CONTENTS_PLAYERCLIP 0x10000 -#define CONTENTS_MONSTERCLIP 0x20000 - -/** -* @section currents can be added to any other contents, and may be mixed -*/ -#define CONTENTS_CURRENT_0 0x40000 -#define CONTENTS_CURRENT_90 0x80000 -#define CONTENTS_CURRENT_180 0x100000 -#define CONTENTS_CURRENT_270 0x200000 -#define CONTENTS_CURRENT_UP 0x400000 -#define CONTENTS_CURRENT_DOWN 0x800000 - -/** -* @endsection -*/ - -#define CONTENTS_ORIGIN 0x1000000 /**< removed before bsping an entity. */ -#define CONTENTS_MONSTER 0x2000000 /**< should never be on a brush, only in game. */ -#define CONTENTS_DEBRIS 0x4000000 -#define CONTENTS_DETAIL 0x8000000 /**< brushes to be added after vis leafs. */ -#define CONTENTS_TRANSLUCENT 0x10000000 /**< auto set if any surface has trans. */ -#define CONTENTS_LADDER 0x20000000 -#define CONTENTS_HITBOX 0x40000000 /**< use accurate hitboxes on trace. */ - -/** -* @section Trace masks. -*/ -#define MASK_ALL (0xFFFFFFFF) -#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< everything that is normally solid */ -#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< everything that blocks player movement */ -#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< blocks npc movement */ -#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) /**< water physics in these contents */ -#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) /**< everything that blocks line of sight for AI, lighting, etc */ -#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) /**< everything that blocks line of sight for AI, lighting, etc, but with monsters added. */ -#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) /**< everything that blocks line of sight for players */ -#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) /**< everything that blocks line of sight for players, but with monsters added. */ -#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) /**< bullets see these as solid */ -#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) /**< non-raycasted weapons see this as solid (includes grates) */ -#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW) /**< hits solids (not grates) and passes through everything else */ -#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) /**< everything normally solid, except monsters (world+brush only) */ -#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) /**< everything normally solid for player movement, except monsters (world+brush only) */ -#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) /**< everything normally solid for npc movement, except monsters (world+brush only) */ -#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) /**< just the world, used for route rebuilding */ -#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) /**< These are things that can split areaportals */ -#define MASK_AIM ( 0x200400B | CONTENTS_HITBOX ) //this fixes the aimbot not shooting through shit like invis gates diff --git a/tf2/IEngineVGui.h b/tf2/IEngineVGui.h deleted file mode 100644 index 091c565..0000000 --- a/tf2/IEngineVGui.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -enum VGuiPanel_t { - PANEL_ROOT = 0, - PANEL_GAMEUIDLL, - PANEL_CLIENTDLL, - PANEL_TOOLS, - PANEL_INGAMESCREENS, - PANEL_GAMEDLL, - PANEL_CLIENTDLL_TOOLS -}; - -enum PaintMode_t { - PAINT_UIPANELS = ( 1 << 0 ), - PAINT_INGAMEPANELS = ( 1 << 1 ), - PAINT_CURSOR = ( 1 << 2 ), // software cursor, if appropriate -}; - -class IEngineVGui { -public: - virtual ~IEngineVGui( void ) { } - - virtual unsigned int GetPanel( VGuiPanel_t type ) = 0; - - virtual bool IsGameUIVisible( ) = 0; -}; \ No newline at end of file diff --git a/tf2/IGameEventManager.h b/tf2/IGameEventManager.h deleted file mode 100644 index f2e7c25..0000000 --- a/tf2/IGameEventManager.h +++ /dev/null @@ -1,77 +0,0 @@ -#pragma once -#include "util.hpp" - -class IGameEvent -{ -public: - const char* GetName( ) { - return util::get_vfunc< 1, const char* >( this ); - } - - int GetInt( const char* szKeyName, int nDefault = 0 ) { - return util::get_vfunc< 6, int >( this, szKeyName, nDefault ); - } - - float GetFloat( const char* name, float default_ = 0 ) { - return util::get_vfunc< 8, float >( this, name, default_ ); - } - - const char* GetString( const char* szKeyName ) { - return util::get_vfunc< 9, const char* >( this, szKeyName, 0 ); - } - - void SetString( const char* szKeyName, const char* szValue ) { - return util::get_vfunc< 16, void >( this, szKeyName, szValue ); - } -}; - -class IGameEventListener2 { -public: - virtual ~IGameEventListener2( void ) {}; - - // FireEvent is called by EventManager if event just occured - // KeyValue memory will be freed by manager if not needed anymore - virtual void FireGameEvent( IGameEvent* event ) = 0; - - virtual int GetEventDebugID( void ) = 0; -}; - -class IGameEventManager2 { -public: - virtual ~IGameEventManager2( void ) {}; - - // load game event descriptions from a file eg "resource\gameevents.res" - virtual int LoadEventsFromFile( const char* filename ) = 0; - - // removes all and anything - virtual void Reset( ) = 0; - - // adds a listener for a particular event - virtual bool AddListener( IGameEventListener2* listener, const char* name, bool bServerSide ) = 0; - - // returns true if this listener is listens to given event - virtual bool FindListener( IGameEventListener2* listener, const char* name ) = 0; - - // removes a listener - virtual void RemoveListener( IGameEventListener2* listener ) = 0; - - // create an event by name, but doesn't fire it. returns NULL is event is not - // known or no listener is registered for it. bForce forces the creation even if no listener is active - virtual IGameEvent* CreateEvent( const char* name, bool bForce = false, int* pCookie = nullptr ) = 0; - - // fires a server event created earlier, if bDontBroadcast is set, event is not send to clients - virtual bool FireEvent( IGameEvent* event, bool bDontBroadcast = false ) = 0; - - // fires an event for the local client only, should be used only by client code - virtual bool FireEventClientSide( IGameEvent* event ) = 0; - - // create a new copy of this event, must be free later - virtual IGameEvent* DuplicateEvent( IGameEvent* event ) = 0; - - // if an event was created but not fired for some reason, it has to bee freed, same UnserializeEvent - virtual void FreeEvent( IGameEvent* event ) = 0; - - // write/read event to/from bitbuffer - virtual bool SerializeEvent( IGameEvent* event, int* buf ) = 0; - virtual IGameEvent* UnserializeEvent( void* buf ) = 0; // create new KeyValues, must be deleted -}; \ No newline at end of file diff --git a/tf2/IGameMovement.h b/tf2/IGameMovement.h deleted file mode 100644 index 26b5244..0000000 --- a/tf2/IGameMovement.h +++ /dev/null @@ -1,118 +0,0 @@ -#pragma once -#pragma once - -#include "vector.hpp" - -using CBaseEntity = uintptr_t; -class CUserCmd; - -typedef int EntityHandle_t, soundlevel_t; -class CGameTrace; - -typedef CGameTrace trace_t; - -#define MAX_CLIMB_SPEED 200.0 - -class CMoveData -{ -public: - bool m_bFirstRunOfFunctions : 1; - bool m_bGameCodeMovedPlayer : 1; - - EntityHandle_t m_nPlayerHandle; - - int m_nImpulseCommand; - vec3_t m_vecViewAngles; - vec3_t m_vecAbsViewAngles; - int m_nButtons; - int m_nOldButtons; - float m_flForwardMove; - float m_flSideMove; - float m_flUpMove; - - float m_flMaxSpeed; - float m_flClientMaxSpeed; - - vec3_t m_vecVelocity; - vec3_t m_vecAngles; - vec3_t m_vecOldAngles; - float m_outStepHeight; - vec3_t m_outWishVel; - vec3_t m_outJumpVel; - - vec3_t m_vecConstraintCenter; - float m_flConstraintRadius; - float m_flConstraintWidth; - float m_flConstraintSpeedFactor; - - vec3_t m_vecAbsOrigin; -}; - -class IGameMovement -{ -public: - virtual ~IGameMovement( void ) {} - virtual void ProcessMovement( CBaseEntity *pPlayer, CMoveData *pMove ) = 0; - virtual void StartTrackPredictionErrors( CBaseEntity *pPlayer ) = 0; - virtual void FinishTrackPredictionErrors( CBaseEntity *pPlayer ) = 0; - virtual void DiffPrint( char const *fmt, ... ) = 0; - virtual vec3_t GetPlayerMins( bool ducked ) const = 0; - virtual vec3_t GetPlayerMaxs( bool ducked ) const = 0; - virtual vec3_t GetPlayerViewOffset( bool ducked ) const = 0; -}; - -class IMoveHelper -{ -public: - virtual char const* GetName( EntityHandle_t handle ) const = 0; - virtual void ResetTouchList( void ) = 0; - virtual bool AddToTouched( const CGameTrace& tr, const vec3_t& impactvelocity ) = 0; - virtual void ProcessImpacts( void ) = 0; - virtual void Con_NPrintf( int idx, char const* fmt, ... ) = 0; - virtual void StartSound( const vec3_t& origin, int channel, char const* sample, float volume, soundlevel_t soundlevel, int fFlags, int pitch ) = 0; - virtual void StartSound( const vec3_t& origin, const char *soundname ) = 0; - virtual void PlaybackEventFull( int flags, int clientindex, unsigned short eventindex, float delay, vec3_t& origin, vec3_t& angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ) = 0; - virtual bool PlayerFallingDamage( void ) = 0; - virtual void PlayerSetAnimation( int playerAnim ) = 0; - - virtual void *GetSurfaceProps( void ) = 0; - - virtual bool IsWorldEntity( const uintptr_t &handle ) = 0; - -protected: - virtual ~IMoveHelper( ) {} -}; - -class IPrediction -{ -public: - virtual ~IPrediction( void ) {}; - - virtual void Init( void ) = 0; - virtual void Shutdown( void ) = 0; - - // Run prediction - virtual void Update - ( - int startframe, // World update ( un-modded ) most recently received - bool validframe, // Is frame data valid - int incoming_acknowledged, // Last command acknowledged to have been run by server (un-modded) - int outgoing_command // Last command (most recent) sent to server (un-modded) - ) = 0; - - // We are about to get a network update from the server. We know the update #, so we can pull any - // data purely predicted on the client side and transfer it to the new from data state. - virtual void PreEntityPacketReceived( int commands_acknowledged, int current_world_update_packet ) = 0; - virtual void PostEntityPacketReceived( void ) = 0; - virtual void PostNetworkDataReceived( int commands_acknowledged ) = 0; - - virtual void OnReceivedUncompressedPacket( void ) = 0; - - // The engine needs to be able to access a few predicted values - virtual void GetViewOrigin( vec3_t& org ) = 0; - virtual void SetViewOrigin( vec3_t& org ) = 0; - virtual void GetViewAngles( vec3_t& ang ) = 0; - virtual void SetViewAngles( vec3_t& ang ) = 0; - virtual void GetLocalViewAngles( vec3_t& ang ) = 0; - virtual void SetLocalViewAngles( vec3_t& ang ) = 0; -}; \ No newline at end of file diff --git a/tf2/IInputSystem.h b/tf2/IInputSystem.h deleted file mode 100644 index 10f8168..0000000 --- a/tf2/IInputSystem.h +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once -#include "VFunc.h" -#include "IAppSystem.h" -#include "ButtonCode_t.h" - -class IInputSystem : public IAppSystem -{ -public: - // Attach, detach input system from a particular window - // This window should be the root window for the application - // Only 1 window should be attached at any given time. - virtual void AttachToWindow( void* hWnd ) = 0; - virtual void DetachFromWindow( ) = 0; - - // Enables/disables input. PollInputState will not update current - // button/analog states when it is called if the system is disabled. - virtual void EnableInput( bool bEnable ) = 0; - - // Enables/disables the windows message pump. PollInputState will not - // Peek/Dispatch messages if this is disabled - virtual void EnableMessagePump( bool bEnable ) = 0; - - // Polls the current input state - virtual void PollInputState( ) = 0; - - // Gets the time of the last polling in ms - virtual int GetPollTick( ) const = 0; - - // Is a button down? "Buttons" are binary-state input devices (mouse buttons, keyboard keys) - virtual bool IsButtonDown( ButtonCode_t code ) const = 0; - - // Returns the tick at which the button was pressed and released - virtual int GetButtonPressedTick( ButtonCode_t code ) const = 0; - virtual int GetButtonReleasedTick( ButtonCode_t code ) const = 0; - - // Gets the value of an analog input device this frame - // Includes joysticks, mousewheel, mouse - virtual int GetAnalogValue( AnalogCode_t code ) const = 0; - - // Gets the change in a particular analog input device this frame - // Includes joysticks, mousewheel, mouse - virtual int GetAnalogDelta( AnalogCode_t code ) const = 0; - - // Returns the input events since the last poll - virtual int GetEventCount( ) const = 0; - virtual const InputEvent_t* GetEventData( ) const = 0; - -private: - //22 CInputSystem::MotionControllerActive(void)const - virtual void __pad22( ) = 0; - //23 CInputSystem::GetMotionControllerOrientation(void)const - virtual void __pad23( ) = 0; - //24 CInputSystem::GetMotionControllerPosX(void)const - virtual void __pad24( ) = 0; - //25 CInputSystem::GetMotionControllerPosY(void)const - virtual void __pad25( ) = 0; - //26 CInputSystem::GetMotionControllerDeviceStatus(void)const - virtual void __pad26( ) = 0; - //27 CInputSystem::GetMotionControllerDeviceStatusFlags(void)const - virtual void __pad27( ) = 0; - //28 CInputSystem::SetMotionControllerDeviceStatus(int) - virtual void __pad28( ) = 0; - //29 CInputSystem::SetMotionControllerCalibrationInvalid(void) - virtual void __pad29( ) = 0; - //30 CInputSystem::StepMotionControllerCalibration(void) - virtual void __pad30( ) = 0; - //31 CInputSystem::ResetMotionControllerScreenCalibration(void) - virtual void __pad31( ) = 0; - -public: - // Posts a user-defined event into the event queue; this is expected - // to be called in overridden wndprocs connected to the root panel. - virtual void PostUserEvent( const InputEvent_t &event ) = 0; - - // Returns the number of joysticks - virtual int GetJoystickCount( ) const = 0; - - // Enable/disable joystick, it has perf costs - virtual void EnableJoystickInput( int nJoystick, bool bEnable ) = 0; - - // Enable/disable diagonal joystick POV (simultaneous POV buttons down) - virtual void EnableJoystickDiagonalPOV( int nJoystick, bool bEnable ) = 0; - - // Sample the joystick and append events to the input queue - virtual void SampleDevices( ) = 0; - - // FIXME: Currently force-feedback is only supported on the Xbox 360 - virtual void SetRumble( float fLeftMotor, float fRightMotor, int userId = -1 ) = 0; - virtual void StopRumble( ) = 0; - - // Resets the input state - virtual void ResetInputState( ) = 0; - - // Convert back + forth between ButtonCode/AnalogCode + strings - virtual const char *ButtonCodeToString( ButtonCode_t code ) const = 0; - virtual const char *AnalogCodeToString( AnalogCode_t code ) const = 0; - virtual ButtonCode_t StringToButtonCode( const char *pString ) const = 0; - virtual AnalogCode_t StringToAnalogCode( const char *pString ) const = 0; - - // Sleeps until input happens. Pass a negative number to sleep infinitely - virtual void SleepUntilInput( int nMaxSleepTimeMS = -1 ) = 0; - - // Convert back + forth between virtual codes + button codes - // FIXME: This is a temporary piece of code - virtual ButtonCode_t VirtualKeyToButtonCode( int nVirtualKey ) const = 0; - virtual int ButtonCodeToVirtualKey( ButtonCode_t code ) const = 0; - virtual ButtonCode_t ScanCodeToButtonCode( int lParam ) const = 0; - - // How many times have we called PollInputState? - virtual int GetPollCount( ) const = 0; - - // Sets the cursor position - virtual void SetCursorPosition( int x, int y ) = 0; - - // Tells the input system to generate UI-related events, defined - // in inputsystem/inputenums.h (see IE_FirstUIEvent) - // We could have multiple clients that care about UI-related events - // so we refcount the clients with an Add/Remove strategy. If there - // are no interested clients, the UI events are not generated - virtual void AddUIEventListener( ) = 0; - virtual void RemoveUIEventListener( ) = 0; - - // Returns the currently attached window - virtual PlatWindow_t GetAttachedWindow( ) const = 0; - - // Creates a cursor using one of the well-known cursor icons - virtual InputCursorHandle_t GetStandardCursor( InputStandardCursor_t id ) = 0; - - // Loads a cursor defined in a file - virtual InputCursorHandle_t LoadCursorFromFile( const char *pFileName, const char *pPathID = NULL ) = 0; - - // Sets the cursor icon - virtual void SetCursorIcon( InputCursorHandle_t hCursor ) = 0; - - // Gets the cursor position - virtual void GetCursorPosition( int *pX, int *pY ) = 0; - - // Mouse capture - virtual void EnableMouseCapture( PlatWindow_t hWnd ) = 0; - virtual void DisableMouseCapture( ) = 0; - - virtual void SetMouseCursorVisible( bool bVisible ) = 0; - - virtual void DisableHardwareCursor( ) = 0; - virtual void EnableHardwareCursor( ) = 0; - virtual void ResetCursorIcon( ) = 0; - virtual bool GetRawMouseAccumulators( int& accumX, int& accumY ) = 0; - - /*64 CInputSystem::GetConnectedInputDevices(void) - 65 CInputSystem::IsInputDeviceConnected(InputDevice_t) - 66 CInputSystem::SetInputDeviceConnected(InputDevice_t,bool) - 67 CInputSystem::IsOnlySingleDeviceConnected(void) - 68 CInputSystem::GetCurrentInputDevice(void) - 69 CInputSystem::IsDeviceReadingInput(InputDevice_t)const - 70 CInputSystem::SetCurrentInputDevice(InputDevice_t) - 71 CInputSystem::ResetCurrentInputDevice(void) - 72 CInputSystem::SampleInputToFindCurrentDevice(bool) - 73 CInputSystem::IsSamplingForCurrentDevice(void) - 74 CInputSystem::IsSteamControllerActive(void)const - 75 CInputSystem::SetSteamControllerMode(char const*,void const*) - 76 CInputSystem::~CInputSystem() - 77 CInputSystem::~CInputSystem()*/ -}; \ No newline at end of file diff --git a/tf2/IMaterialSystem.hpp b/tf2/IMaterialSystem.hpp deleted file mode 100644 index a8a6a9e..0000000 --- a/tf2/IMaterialSystem.hpp +++ /dev/null @@ -1,222 +0,0 @@ -#pragma once -#include "util.hpp" -#include "ISurface.h" - -using MaterialHandle_t = unsigned short; - -enum MaterialVarFlags_t { - MATERIAL_VAR_DEBUG = 1 << 0, - MATERIAL_VAR_NO_DEBUG_OVERRIDE = 1 << 1, - MATERIAL_VAR_NO_DRAW = 1 << 2, - MATERIAL_VAR_USE_IN_FILLRATE_MODE = 1 << 3, - MATERIAL_VAR_VERTEXCOLOR = 1 << 4, - MATERIAL_VAR_VERTEXALPHA = 1 << 5, - MATERIAL_VAR_SELFILLUM = 1 << 6, - MATERIAL_VAR_ADDITIVE = 1 << 7, - MATERIAL_VAR_ALPHATEST = 1 << 8, - MATERIAL_VAR_MULTIPASS = 1 << 9, - MATERIAL_VAR_ZNEARER = 1 << 10, - MATERIAL_VAR_MODEL = 1 << 11, - MATERIAL_VAR_FLAT = 1 << 12, - MATERIAL_VAR_NOCULL = 1 << 13, - MATERIAL_VAR_NOFOG = 1 << 14, - MATERIAL_VAR_IGNOREZ = 1 << 15, - MATERIAL_VAR_DECAL = 1 << 16, - MATERIAL_VAR_ENVMAPSPHERE = 1 << 17, - MATERIAL_VAR_NOALPHAMOD = 1 << 18, - MATERIAL_VAR_ENVMAPCAMERASPACE = 1 << 19, - MATERIAL_VAR_BASEALPHAENVMAPMASK = 1 << 20, - MATERIAL_VAR_TRANSLUCENT = 1 << 21, - MATERIAL_VAR_NORMALMAPALPHAENVMAPMASK = 1 << 22, - MATERIAL_VAR_NEEDS_SOFTWARE_SKINNING = 1 << 23, - MATERIAL_VAR_OPAQUETEXTURE = 1 << 24, - MATERIAL_VAR_ENVMAPMODE = 1 << 25, - MATERIAL_VAR_SUPPRESS_DECALS = 1 << 26, - MATERIAL_VAR_HALFLAMBERT = 1 << 27, - MATERIAL_VAR_WIREFRAME = 1 << 28, -}; - -class ITexture { -public: - int GetActualWidth( ) { - return util::get_vfunc< 3, int >( this ); - } - - int GetActualHeight( ) { - return util::get_vfunc< 4, int >( this ); - } -}; - -struct MaterialVideoMode_t { - int m_width; - int m_height; - int m_format; - int m_hz; -}; - -struct IMaterialSystem_Config_t { - MaterialVideoMode_t m_vid_mode; - float m_monitor_gamma; - float m_monitor_max; - float m_monitor_min; - float m_monitor_exp; - bool m_gamma_enabled; - bool m_triple_buffer; - int m_aa_samples; - int m_force_anisotropic_level; - int m_skip_mip_levels; - int m_dx_level; - int m_flags; - bool m_edit_mode; - char m_proxy_test_mode; - bool m_compressed_textures; - bool m_filter_lightmaps; - bool m_filter_textures; - bool m_reverse_depth; - bool m_buffer_primitives; - bool m_draw_flat; - bool m_measure_fillrate; - bool m_visualize_fillrate; - bool m_no_transperacy; - bool m_software_lighting; - bool m_allow_cheats; - char m_show_mipmap; - bool m_low_res; - bool m_normal_mapping; - bool m_mipmap_textures; - char m_fullbright; - bool m_fast_nobumd; - bool m_supress_rendering; - bool m_drawgray; - bool m_show_specular; - bool m_show_diffuse; - int m_winsize_widthlimit; - int m_winsize_heightlimit; - int m_aa_quality; - bool m_shadow_depth_texture; - bool m_motion_blur; - bool m_flashlight; - bool m_paint_enabled; - char pad[ 0xC ]; -}; - -class IMaterial { - char pad[ 0x1C ]; -public: - int m_ref_count; - - auto GetName( ) { - return util::get_vfunc< 0, const char* >( this ); - } - - auto GetTextureGroupName( ) { - return util::get_vfunc< 1, const char* >( this ); - } - - void IncrementReferenceCount( ) { - return util::get_vfunc< 12, void >( this ); - } - - void DecrementReferenceCount( ) { - return util::get_vfunc< 13, void >( this ); - } - - void AlphaModulate( float alpha ) { - return util::get_vfunc< 27, void >( this, alpha ); - } - - void ColorModulate( float r, float g, float b ) { - return util::get_vfunc< 28, void >( this, r, g, b ); - } - - void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ) { - return util::get_vfunc< 29, void >( this, flag, on ); - } - - bool GetMaterialVarFlag( MaterialVarFlags_t flag ) { - return util::get_vfunc< 30, bool >( this, flag ); - } - - auto GetAlphaModulation( ) { - return util::get_vfunc< 44, float >( this ); - } - - void GetColorModulate( float* r, float* g, float* b ) { - return util::get_vfunc< 45, void >( this, r, g, b ); - } - - void Refresh( ) { - return util::get_vfunc< 37, void >( this ); - } -}; - -class IMaterialSystem -{ -public: - enum RenderTargetSizeMode_t { - RT_SIZE_NO_CHANGE = 0, // Only allowed for render targets that don't want a depth buffer - // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer). - RT_SIZE_DEFAULT = 1, // Don't play with the specified width and height other than making sure it fits in the framebuffer. - RT_SIZE_PICMIP = 2, // Apply picmip to the render target's width and height. - RT_SIZE_HDR = 3, // frame_buffer_width / 4 - RT_SIZE_FULL_FRAME_BUFFER = 4, // Same size as frame buffer, or next lower power of 2 if we can't do that. - RT_SIZE_OFFSCREEN = 5, // Target of specified size, don't mess with dimensions - RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP = 6 // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. - }; - - enum MaterialRenderTargetDepth_t { - MATERIAL_RT_DEPTH_SHARED = 0x0, - MATERIAL_RT_DEPTH_SEPARATE = 0x1, - MATERIAL_RT_DEPTH_NONE = 0x2, - MATERIAL_RT_DEPTH_ONLY = 0x3, - }; - - ImageFormat GetBackBufferFormat( ) { - return util::get_vfunc< 36, ImageFormat >( this ); - } - - IMaterial* CreateMaterial( const char* pMaterialName, void* pVMTKeyValues ) { - return util::get_vfunc< 70, IMaterial* >( this, pMaterialName, pVMTKeyValues ); - } - - IMaterial* FindMaterial( const char* pMaterialName, const char* pTextureGroupName = "Model textures", bool complain = true, const char* pComplainPrefix = nullptr ) { - return util::get_vfunc< 84, IMaterial* >( this, pMaterialName, pTextureGroupName, complain, pComplainPrefix ); - } - - MaterialHandle_t FirstMaterial( ) { - return util::get_vfunc< 86, MaterialHandle_t >( this ); - } - - MaterialHandle_t NextMaterial( MaterialHandle_t h ) { - return util::get_vfunc< 87, MaterialHandle_t >( this, h ); - } - - MaterialHandle_t InvalidMaterial( ) { - return util::get_vfunc< 88, MaterialHandle_t >( this ); - } - - IMaterial* GetMaterial( MaterialHandle_t h ) { - return util::get_vfunc< 89, IMaterial* >( this, h ); - } - - void BeginRenderTargetAllocation( ) { - return util::get_vfunc< 94, void >( this ); - } - - void EndRenderTargetAllocation( ) { - return util::get_vfunc< 95, void >( this ); - } - - ITexture* CreateNamedRenderTargetTextureEx( const char* name, int w, int h, RenderTargetSizeMode_t sizeMode, - ImageFormat format, MaterialRenderTargetDepth_t depth ) - { - const int textureFlags = 0x4 | 0x8; //TEXTUREFLAGS_CLAMPS, TEXTUREFLAGS_CLAMPT - const int renderTargetFlags = 0x1; //CREATERENDERTARGETFLAGS_HDR - return util::get_vfunc< 97, ITexture* >( this, name, w, h, sizeMode, format, depth, textureFlags, renderTargetFlags ); - } - - /*void* GetRenderContext( ) { - typedef IMatRenderContext*( __thiscall* GetRenderContextFn )( void* ); - return CallVFunction( this, 115 )( this ); - }*/ -}; \ No newline at end of file diff --git a/tf2/IPanel.h b/tf2/IPanel.h deleted file mode 100644 index 5252642..0000000 --- a/tf2/IPanel.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -class IPanel { -public: - const char* GetName( int iPanel ) { - return call_vfunc< const char*( __thiscall* )( void*, int ) >( this, 36 )( this, iPanel ); - } - - void SetMouseInputEnabled( unsigned int iPanel, bool state ) { - return call_vfunc< void( __thiscall* )( void*, unsigned int, bool ) >( this, 32 )( this, iPanel, state ); - } - -}; \ No newline at end of file diff --git a/tf2/IPlayerInfoManager.h b/tf2/IPlayerInfoManager.h deleted file mode 100644 index 13406b1..0000000 --- a/tf2/IPlayerInfoManager.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -#include "CGlobalVarsBase.h" -class IPlayerInfoManager { -public: - virtual void pad_000( ) = 0; - virtual CGlobalVarsBase* GetGlobalVars( ) = 0; -}; \ No newline at end of file diff --git a/tf2/ISurface.h b/tf2/ISurface.h deleted file mode 100644 index 3dbff15..0000000 --- a/tf2/ISurface.h +++ /dev/null @@ -1,223 +0,0 @@ -#pragma once -#include "VFunc.h" -#include "vector.hpp" -#include "color.hpp" - -enum FontDrawType_t { - FONT_DRAW_DEFAULT = 0, - FONT_DRAW_NONADDITIVE, - FONT_DRAW_ADDITIVE, - FONT_DRAW_TYPE_COUNT = 2, -}; - -enum FontFlags_t { - FONTFLAG_NONE, - FONTFLAG_ITALIC = 0x001, - FONTFLAG_UNDERLINE = 0x002, - FONTFLAG_STRIKEOUT = 0x004, - FONTFLAG_SYMBOL = 0x008, - FONTFLAG_ANTIALIAS = 0x010, - FONTFLAG_GAUSSIANBLUR = 0x020, - FONTFLAG_ROTARY = 0x040, - FONTFLAG_DROPSHADOW = 0x080, - FONTFLAG_ADDITIVE = 0x100, - FONTFLAG_OUTLINE = 0x200, - FONTFLAG_CUSTOM = 0x400, - FONTFLAG_BITMAP = 0x800, -}; - -enum ImageFormat { - IMAGE_FORMAT_UNKNOWN = -1, - IMAGE_FORMAT_RGBA8888 = 0, - IMAGE_FORMAT_ABGR8888, - IMAGE_FORMAT_RGB888, - IMAGE_FORMAT_BGR888, - IMAGE_FORMAT_RGB565, - IMAGE_FORMAT_I8, - IMAGE_FORMAT_IA88, - IMAGE_FORMAT_P8, - IMAGE_FORMAT_A8, - IMAGE_FORMAT_RGB888_BLUESCREEN, - IMAGE_FORMAT_BGR888_BLUESCREEN, - IMAGE_FORMAT_ARGB8888, - IMAGE_FORMAT_BGRA8888, - IMAGE_FORMAT_DXT1, - IMAGE_FORMAT_DXT3, - IMAGE_FORMAT_DXT5, - IMAGE_FORMAT_BGRX8888, - IMAGE_FORMAT_BGR565, - IMAGE_FORMAT_BGRX5551, - IMAGE_FORMAT_BGRA4444, - IMAGE_FORMAT_DXT1_ONEBITALPHA, - IMAGE_FORMAT_BGRA5551, - IMAGE_FORMAT_UV88, - IMAGE_FORMAT_UVWQ8888, - IMAGE_FORMAT_RGBA16161616F, - IMAGE_FORMAT_RGBA16161616, - IMAGE_FORMAT_UVLX8888, - IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point - IMAGE_FORMAT_RGB323232F, - IMAGE_FORMAT_RGBA32323232F, - - // Depth-stencil texture formats for shadow depth mapping - IMAGE_FORMAT_NV_DST16, // - IMAGE_FORMAT_NV_DST24, // - IMAGE_FORMAT_NV_INTZ, // Vendor-specific depth-stencil texture - IMAGE_FORMAT_NV_RAWZ, // formats for shadow depth mapping - IMAGE_FORMAT_ATI_DST16, // - IMAGE_FORMAT_ATI_DST24, // - IMAGE_FORMAT_NV_NULL, // Dummy format which takes no video memory - - // Compressed normal map formats - IMAGE_FORMAT_ATI2N, // One-surface ATI2N / DXN format - IMAGE_FORMAT_ATI1N, // Two-surface ATI1N format - - NUM_IMAGE_FORMATS -}; - -struct vertex_t { - vertex_t( ) {} - - vertex_t( const vec2_t& pos, const vec2_t& coord = vec2_t( 0, 0 ) ) { - m_position = pos; - m_tex_coord = coord; - } - - void init( float x, float y, const vec2_t& coord = vec2_t( 0, 0 ) ) { - m_position = vec2_t( x, y ); - m_tex_coord = coord; - } - - vec2_t m_position; - vec2_t m_tex_coord; -}; - -using HFont = unsigned long; -using VPANEL = unsigned long; -class IntRect; -class IHTMLEvents; -class IHTML; -using HCursor = unsigned long; -using HTexture = unsigned long; -class CharRenderInfo; -class IVguiMatInfo; -class IImage; -class DrawTexturedRectParms_t; -class IHTMLChromeController; - -enum GradientType_t { - GRADIENT_HORIZONTAL = 0, - GRADIENT_VERTICAL = 1 -}; - -class ISurface { -public: - void DrawSetColor( clr_t clr ) { - return call_vfunc< void( __thiscall* )( void*, int , int , int, int ) >( this, 11 )( this, clr.r( ), clr.g( ), clr.b( ), clr.a( ) ); - } - - void DrawFilledRect( int x, int y, int w, int h ) { - return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 12 )( this, x, y, w, h ); - } - - void DrawOutlinedRect( int x, int y, int w, int h ) { - return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 14 )( this, x, y, w, h ); - } - - void DrawLine( int x0, int y0, int x1, int y1 ) { - return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 15 )( this, x0, y0, x1, y1 ); - } - - void DrawPolyLine( int* x, int* y, int n ) { - return call_vfunc< void( __thiscall* )( void*, int*, int*, int ) >( this, 16 )( this, x, y, n ); - } - - void DrawSetTextFont( unsigned long index ) { - return call_vfunc< void( __thiscall* )( void*, unsigned long ) >( this, 17 )( this, index ); - } - - void DrawSetTextColor( clr_t clr ) { - return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 19 )( this, clr.r( ), clr.g( ), clr.b( ), clr.a( ) ); - } - - void DrawSetTextPos( int x, int y ) { - return call_vfunc< void( __thiscall* )( void*, int, int ) >( this, 20 )( this, x, y ); - } - - void DrawPrintText( const wchar_t* text, int length, FontDrawType_t drawtype = FontDrawType_t::FONT_DRAW_DEFAULT ) { - return call_vfunc< void( __thiscall* )( void*, const wchar_t*, int, FontDrawType_t ) >( this, 22 )( this, text, length, drawtype ); - } - - void DrawSetTextureRGBA( int id, const unsigned char* rgba, int w, int h ) { - return call_vfunc< void( __thiscall* )( void*, int, const unsigned char*, int, int, int, bool ) >( this, 31 )( this, id, rgba, w, h, 0, true ); - } - - void DrawSetTexture( int id ) { - return call_vfunc< void( __thiscall* )( void*, int ) >( this, 32 )( this, id ); - } - - int CreateNewTextureID( bool procedural ) { - return call_vfunc< int( __thiscall* )( void*, bool ) >( this, 37 )( this, procedural ); - } - - void SetCursorAlwaysVis( bool vis ) { - return call_vfunc< void( __thiscall* )( void*, bool ) >( this, 52 )( this, vis ); - } - - unsigned long CreateFnt( ) { - return call_vfunc< unsigned long( __thiscall* )( void* ) >( this, 66 )( this ); - } - - void UnlockCursor( ) { - return call_vfunc< void( __thiscall* )( void* ) >( this, 61 )( this ); - } - - void LockCursor( ) { - return call_vfunc< void( __thiscall* )( void* ) >( this, 62 )( this ); - } - - void SetFontGlyphSet( unsigned long font, const char* windowsFontName, int tall, int weight, int blur, int scanlines, int flags, int nRangeMin = 0, int nRangeMax = 0 ) { - return call_vfunc< void( __thiscall* )( void*, unsigned long, const char*, int, int, int, int, int, int, int ) >( this, 67 )( this, font, windowsFontName, tall, weight, blur, scanlines, flags, nRangeMin, nRangeMax ); - } - - void GetTextSize( unsigned long font, const wchar_t* text, int& wide, int& tall ) { - return call_vfunc< void( __thiscall* )( void*, unsigned long, const wchar_t*, int&, int& ) >( this, 75 )( this, font, text, wide, tall ); - } - - void play_sound( const char* fileName ) { - return call_vfunc< void( __thiscall* )( void*, const char* ) >( this, 82 )( this, fileName ); - } - - void GetCursorPosition( int &x, int &y ) { - return call_vfunc< void( __thiscall* )( void*, int&, int& ) >( this, 96 )( this, x, y ); - } - - void DrawOutlinedCircle( int x, int y, int radius, int segments ) { - return call_vfunc< void( __thiscall* )( void*, int, int, int, int ) >( this, 99 )( this, x, y, radius, segments ); - } - - void DrawTexturedPolygon( int n, vertex_t* pVertice, bool bClipVertices = true ) { - return call_vfunc< void( __thiscall* )( void*, int, vertex_t*, bool ) >( this, 102 )( this, n, pVertice, bClipVertices ); - } - - void DrawGradient( int x, int y, int w, int h, clr_t first, clr_t second, GradientType_t type ) - { - clr_t present_draw_clr = { }; - - auto draw_filled_rect_gradient = [ & ]( bool reversed ) -> void { - call_vfunc< void( __thiscall* )( void*, int, int, int, int, unsigned, unsigned, bool ) >( this, 118 ) - ( this, x, y, w, h, reversed ? 255 : 0, reversed ? 0 : 255, type == GRADIENT_HORIZONTAL ); - }; - - DrawSetColor( clr_t::blend( first, second, 0.5f ) ); - DrawFilledRect( x, y, w, h ); - - DrawSetColor( first ); - present_draw_clr = first; - draw_filled_rect_gradient( true ); - - DrawSetColor( second ); - present_draw_clr = second; - draw_filled_rect_gradient( false ); - } -}; \ No newline at end of file diff --git a/tf2/IVDebugOverlay.h b/tf2/IVDebugOverlay.h deleted file mode 100644 index 664b356..0000000 --- a/tf2/IVDebugOverlay.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -#include "VFunc.h" - -class vec3_t; -class IVDebugOverlay { -public: - int ScreenPosition( const vec3_t& point, vec3_t& screen ) { - return call_vfunc< int( __thiscall* )( void*, const vec3_t&, vec3_t& ) >( this, 10 )( this, point, screen ); - } -}; \ No newline at end of file diff --git a/tf2/IVEngineClient.h b/tf2/IVEngineClient.h deleted file mode 100644 index a45e839..0000000 --- a/tf2/IVEngineClient.h +++ /dev/null @@ -1,192 +0,0 @@ -#pragma once -#include "VFunc.h" - -typedef float matrix3x4[ 3 ][ 4 ]; -typedef struct player_info_s { - char name[ 32 ]; - int userID; - char guid[ 33 ]; - unsigned long friendsID; - char friendsName[ 32 ]; - bool fakeplayer; - bool ishltv; - unsigned long customFiles[ 4 ]; - byte filesDownloaded; -} player_info_t; - -class INetChannelInfo -{ -public: - - enum - { - GENERIC = 0, // must be first and is default group - LOCALPLAYER, // bytes for local player entity update - OTHERPLAYERS, // bytes for other players update - ENTITIES, // all other entity bytes - SOUNDS, // game sounds - EVENTS, // event messages - USERMESSAGES, // user messages - ENTMESSAGES, // entity messages - VOICE, // voice data - STRINGTABLE, // a stringtable update - MOVE, // client move cmds - STRINGCMD, // string command - SIGNON, // various signondata - TOTAL, // must be last and is not a real group - }; - - virtual const char *GetName( void ) const = 0; // get channel name - virtual const char *GetAddress( void ) const = 0; // get channel IP address as string - virtual float GetTime( void ) const = 0; // current net time - virtual float GetTimeConnected( void ) const = 0; // get connection time in seconds - virtual int GetBufferSize( void ) const = 0; // netchannel packet history size - virtual int GetDataRate( void ) const = 0; // send data rate in byte/sec - - virtual bool IsLoopback( void ) const = 0; // true if loopback channel - virtual bool IsTimingOut( void ) const = 0; // true if timing out - virtual bool IsPlayback( void ) const = 0; // true if demo playback - - virtual float GetLatency( int flow ) const = 0; // current latency (RTT), more accurate but jittering - virtual float GetAvgLatency( int flow ) const = 0; // average packet latency in seconds - virtual float GetAvgLoss( int flow ) const = 0; // avg packet loss[0..1] - virtual float GetAvgChoke( int flow ) const = 0; // avg packet choke[0..1] - virtual float GetAvgData( int flow ) const = 0; // data flow in bytes/sec - virtual float GetAvgPackets( int flow ) const = 0; // avg packets/sec - virtual int GetTotalData( int flow ) const = 0; // total flow in/out in bytes - virtual int GetSequenceNr( int flow ) const = 0; // last send seq number - virtual bool IsValidPacket( int flow, int frame_number ) const = 0; // true if packet was not lost/dropped/chocked/flushed - virtual float GetPacketTime( int flow, int frame_number ) const = 0; // time when packet was send - virtual int GetPacketBytes( int flow, int frame_number, int group ) const = 0; // group size of this packet - virtual bool GetStreamProgress( int flow, int *received, int *total ) const = 0; // TCP progress if transmitting - virtual float GetTimeSinceLastReceived( void ) const = 0; // get time since last recieved packet in seconds - virtual float GetCommandInterpolationAmount( int flow, int frame_number ) const = 0; - virtual void GetPacketResponseLatency( int flow, int frame_number, int *pnLatencyMsecs, int *pnChoke ) const = 0; - virtual void GetRemoteFramerate( float *pflFrameTime, float *pflFrameTimeStdDeviation ) const = 0; - - virtual float GetTimeoutSeconds( ) const = 0; -}; - -class INetChannel { -public: - char pad_0000[ 20 ]; //0x0000 - bool m_bProcessingMessages; //0x0014 - bool m_bShouldDelete; //0x0015 - char pad_0016[ 2 ]; //0x0016 - int32_t m_nOutSequenceNr; //0x0018 last send outgoing sequence number - int32_t m_nInSequenceNr; //0x001C last received incoming sequnec number - int32_t m_nOutSequenceNrAck; //0x0020 last received acknowledge outgoing sequnce number - int32_t m_nOutReliableState; //0x0024 state of outgoing reliable data (0/1) flip flop used for loss detection - int32_t m_nInReliableState; //0x0028 state of incoming reliable data - int32_t m_nChokedPackets; //0x002C number of choked packets - char pad_0030[ 1044 ]; //0x0030 - - bool transmit( bool only_reliable ) { - return util::get_vfunc< 49, bool >( this, only_reliable ); - } -}; //Size: 0x0444 - -struct INetMessage { - virtual ~INetMessage( ); -}; - -template -class CNetMessagePB : public INetMessage, public T {}; - -class CCLCMsg_Move_ { -private: - char __PAD0[ 0x8 ]; -public: - int numBackupCommands; - int numNewCommands; -}; - -using CCLCMsg_Move_t = CNetMessagePB; - -class CClientState { -public: - char pad0[ 0x9C ]; - INetChannel* netchannel; - char pad1[ 0xD4 ]; - int32_t m_nDeltaTick; //0x174 - char pad2[ 0x4B34 ]; - float m_frameTime; - int32_t lastoutgoingcommand; - int32_t chokedcommands; - int32_t last_command_ack; -}; - -class CGlobalState { -public: - uintptr_t * m_manager; - CClientState *m_def_clientstate; - - __forceinline CClientState* get_client_state( ) { - return m_def_clientstate; - } -}; - -class IVEngineClient { -public: - void GetScreenSize( int& width, int& height ) { - return call_vfunc< void( __thiscall* )( void*, int&, int& ) >( this, 5 )( this, width, height ); - } - - void ClientCmd( const char* command ) { - return call_vfunc< void( __thiscall* )( void*, const char* ) >( this, 7 )( this, command ); - } - - bool GetPlayerInfo( int index, player_info_t* info ) { - return call_vfunc< bool( __thiscall* )( void*, int, player_info_t* ) >( this, 8 )( this, index, info ); - } - - int GetPlayerForUserID( int UserID ) { - using fn = int( __thiscall* )( void*, int ); - return util::get_vfunc< fn >( this, 9 )( this, UserID ); - } - - bool Cov_IsVisible( ) { - return call_vfunc< bool( __thiscall* )( void* ) >( this, 11 )( this ); - } - - int GetLocalPlayer( ) { - return call_vfunc< int( __thiscall* )( void* ) >( this, 12 )( this ); - } - - float Time( ) { - return call_vfunc< float( __thiscall* )( void* ) >( this, 14 )( this ); - } - - void GetViewAngles( vec3_t& angles ) { - return call_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 19 )( this, angles ); - } - - void SetViewAngles( vec3_t& angles ) { - return call_vfunc< void( __thiscall* )( void*, vec3_t& ) >( this, 20 )( this, angles ); - } - - const matrix3x4& GetWorldToScreenMatrix( ) { - return call_vfunc< const matrix3x4&( __thiscall* )( void* ) >( this, 36 )( this ); - } - - int GetMaxClients( ) { - return call_vfunc< int( __thiscall* )( void* ) >( this, 21 )( this ); - } - - bool IsInGame( ) { - return call_vfunc< bool( __thiscall* )( void* ) >( this, 26 )( this ); - } - - bool IsConnected( ) { - return call_vfunc< bool( __thiscall* )( void* ) >( this, 27 )( this ); - } - - void ClientCmd_Unrestricted( const char* command ) { - return call_vfunc< void( __thiscall* )( void*, const char* ) >( this, 106 )( this, command ); - } - - INetChannelInfo* GetNetChannelInfo( ) { - using fn = INetChannelInfo * ( __thiscall* )( void* ); - return util::get_vfunc< fn >( this, 72 )( this ); - } -}; \ No newline at end of file diff --git a/tf2/IVModelInfo.h b/tf2/IVModelInfo.h deleted file mode 100644 index 08df897..0000000 --- a/tf2/IVModelInfo.h +++ /dev/null @@ -1,179 +0,0 @@ -#pragma once -#include "IVEngineClient.h" -#include "IClientEntityList.h" -class IMaterial; -struct mstudiobbox_t { - int bone; - int group; - vec3_t bbmin; - vec3_t bbmax; - int szhitboxnameindex; - int unused[8]; -}; - -enum OverrideType_t { - OVERRIDE_NORMAL = 0, - OVERRIDE_BUILD_SHADOWS, - OVERRIDE_DEPTH_WRITE, - OVERRIDE_SSAO_DEPTH_WRITE, -}; -struct DrawModelState_t; - -struct mstudiobone_t { - int sznameindex; - char* GetName( ) const { return reinterpret_cast< char* >( reinterpret_cast< uintptr_t >( this ) ) + sznameindex; } - int parent; - int bonecontroller[ 6 ]; - vec3_t pos; - float quat[ 4 ]; - vec3_t rot; - vec3_t posscale; - vec3_t rotscale; - matrix3x4 poseToBone; - float qAlignment[ 4 ]; - int flags; - int proctype; - int procindex; - mutable int physicsbone; - void* GetProcedure( ) const { return procindex == 0 ? nullptr : reinterpret_cast( reinterpret_cast( this ) + procindex ); }; - int surfacepropidx; - char* GetSurfaceProps( ) const { return reinterpret_cast( reinterpret_cast( this ) ) + surfacepropidx; } - int contents; - unsigned char pad[ 32 ]; -}; - -struct mstudiohitboxset_t { - int sznameindex; - inline char *const pszName(void) const { return ((char *)this) + sznameindex; } - int numhitboxes; - int hitboxindex; - mstudiobbox_t *pHitbox(int i) const { return (mstudiobbox_t *)(((BYTE *)this) + hitboxindex) + i; }; -}; - -struct studiohdr_t { - unsigned char pad00[12]; - char name[64]; - unsigned char pad01[80]; - int numbones; - int boneindex; - unsigned char pad02[12]; - int hitboxsetindex; - unsigned char pad03[228]; - - mstudiobone_t *GetBone( int i ) const { - return reinterpret_cast( uintptr_t( this ) + boneindex ) + i; - }; - - mstudiohitboxset_t *pHitboxSet(int i) const { - return (mstudiohitboxset_t *)(((unsigned char *)this) + hitboxsetindex) + i; - }; - - mstudiobbox_t *pHitbox(int i, int set) const { - const mstudiohitboxset_t *s = pHitboxSet(set); - if(!s) - return 0; - - return s->pHitbox(i); - }; - - int iHitboxCount(int set) const { - const mstudiohitboxset_t *s = pHitboxSet(set); - if(!s) - return 0; - - return s->numhitboxes; - }; -}; - -struct ModelRenderInfo_t { - vec3_t m_origin; - vec3_t m_angles; - char pad[ 0x4 ]; - void* m_renderable; - const model_t* m_model; - const matrix3x4* m_model2world; - const matrix3x4* m_light_offset; - const vec3_t* m_light_origin; - int m_flags; - int m_entity_index; - int m_skin; - int m_body; - int m_hitboxset; - uint16_t* m_instance; - - ModelRenderInfo_t( ) { - m_model2world = nullptr; - m_light_offset = nullptr; - m_light_origin = nullptr; - } -}; - -class IVModelInfo { -public: - int GetModelIndex( const char* name ) { - return call_vfunc< int( __thiscall* )( void*, const char* ) >( this, 2 )( this, name ); - } - - const char* GetModelName( const void* model ) { - return call_vfunc< const char*( __thiscall* )( void*, const void* ) >( this, 3 )( this, model ); - } - - studiohdr_t* GetStudioModel( const void* model ) { - return call_vfunc< studiohdr_t*( __thiscall* )( void*, const void* ) >( this, 28 )( this, model ); - } - - model_t* FindOrLoadModel( const char* name ) { - using fn = model_t * ( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 43 )( this, name ); - } -}; - -class IVModelRender { -public: - void ForcedMaterialOverride( IMaterial* newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL, int unk = 0 ) { - using fn = void( __thiscall* )( void*, IMaterial*, OverrideType_t, int ); - return util::get_vfunc< fn >( this, 1 )( this, newMaterial, nOverrideType, unk ); - } - - void DrawModelExecute( void* matctx, const DrawModelState_t& state, const ModelRenderInfo_t& pInfo, matrix3x4* pCustomBoneToWorld ) { - using fn = void( __thiscall* )( void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); - util::get_vfunc< fn >( this, 19 )( this, matctx, state, pInfo, pCustomBoneToWorld ); - } -}; - - -class INetworkStringTable { -public: - - virtual ~INetworkStringTable( void ) {}; - - // Table Info - virtual const char *GetTableName( void ) const = 0; - virtual int GetTableId( void ) const = 0; - virtual int GetNumStrings( void ) const = 0; - virtual int GetMaxStrings( void ) const = 0; - virtual int GetEntryBits( void ) const = 0; - - // Networking - virtual void SetTick( int tick ) = 0; - virtual bool ChangedSinceTick( int tick ) const = 0; - - // Accessors (length -1 means don't change user data if string already exits) - virtual int AddString( bool bIsServer, const char *value, int length = -1, const void *userdata = 0 ) = 0; - - virtual const char *GetString( int stringNumber ) = 0; - virtual void SetStringUserData( int stringNumber, int length, const void *userdata ) = 0; - virtual const void *GetStringUserData( int stringNumber, int *length ) = 0; - virtual int FindStringIndex( char const *string ) = 0; // returns INVALID_STRING_INDEX if not found - - // Callbacks - virtual void SetStringChangedCallback( void *object, void* changeFunc ) = 0; -}; - -class CStringTable { -public: - INetworkStringTable * FindTable( const char* table ) { - using fn = INetworkStringTable * ( __thiscall* )( void*, const char* ); - return util::get_vfunc< fn >( this, 3 )( this, table ); - } -}; \ No newline at end of file diff --git a/tf2/IVRenderView.h b/tf2/IVRenderView.h deleted file mode 100644 index b85b82d..0000000 --- a/tf2/IVRenderView.h +++ /dev/null @@ -1,185 +0,0 @@ -#pragma once -#include "util.hpp" - -class Beam_t; -class C_Beam; -class c_base_player; -class ITraceFilter; - - -class IVRenderView { -public: - void SetBlend( float blend ) { - return util::get_vfunc< 4, void >( this, blend ); - } - - float GetBlend( ) { - return util::get_vfunc< 5, float >( this ); - } - - void SetColorModulation( float const* blend ) { - return util::get_vfunc< 6, void >( this, blend ); - } - - void GetColorModulation( float* blend ) { - return util::get_vfunc< 7, void >( this, blend ); - } -}; - -enum beam_types { - beam_normal = 0, - beam_disk = 2, - beam_cylinder, - beam_follow, - beam_ring, - beam_spline, - beam_ring_point, - beam_laser, - beam_tesla, -}; - -enum beam_flags { - FBEAM_STARTENTITY = 0x00000001, - FBEAM_ENDENTITY = 0x00000002, - FBEAM_FADEIN = 0x00000004, - FBEAM_FADEOUT = 0x00000008, - FBEAM_SINENOISE = 0x00000010, - FBEAM_SOLID = 0x00000020, - FBEAM_SHADEIN = 0x00000040, - FBEAM_SHADEOUT = 0x00000080, - FBEAM_ONLYNOISEONCE = 0x00000100, // Only calculate our noise once - FBEAM_NOTILE = 0x00000200, - FBEAM_USE_HITBOXES = 0x00000400, // Attachment indices represent hitbox indices instead when this is set. - FBEAM_STARTVISIBLE = 0x00000800, // Has this client actually seen this beam's start entity yet? - FBEAM_ENDVISIBLE = 0x00001000, // Has this client actually seen this beam's end entity yet? - FBEAM_ISACTIVE = 0x00002000, - FBEAM_FOREVER = 0x00004000, - FBEAM_HALOBEAM = 0x00008000, // When drawing a beam with a halo, don't ignore the segments and endwidth - FBEAM_REVERSED = 0x00010000, - NUM_BEAM_FLAGS = 17 // KEEP THIS UPDATED! -}; - -struct BeamInfo_t { - beam_types m_nType; - - // Entities - IClientEntity* m_pStartEnt; - int m_nStartAttachment; - IClientEntity* m_pEndEnt; - int m_nEndAttachment; - - // Points - vec3_t m_vecStart; - vec3_t m_vecEnd; - - int m_nModelIndex; - const char *m_pszModelName; - - int m_nHaloIndex; - const char *m_pszHaloName; - float m_flHaloScale; - - float m_flLife; - float m_flWidth; - float m_flEndWidth; - float m_flFadeLength; - float m_flAmplitude; - - float m_flBrightness; - float m_flSpeed; - - int m_nStartFrame; - float m_flFrameRate; - - float m_flRed; - float m_flGreen; - float m_flBlue; - - bool m_bRenderable; - - int m_nSegments; - - int m_nFlags; - - // Rings - vec3_t m_vecCenter; - float m_flStartRadius; - float m_flEndRadius; - - BeamInfo_t( ) - { - m_nType = beam_normal; - m_nSegments = -1; - m_pszModelName = NULL; - m_pszHaloName = NULL; - m_nModelIndex = -1; - m_nHaloIndex = -1; - m_bRenderable = true; - m_nFlags = 0; - } -}; - -class IViewRenderBeams -{ -public: - // Construction -public: - IViewRenderBeams( void ); - virtual ~IViewRenderBeams( void ); - - // Implement IViewRenderBeams -public: - virtual void InitBeams( void ); - virtual void ShutdownBeams( void ); - virtual void ClearBeams( void ); - - // Updates the state of the temp ent beams - virtual void UpdateTempEntBeams( ); - - virtual void DrawBeam( Beam_t *pbeam ); - virtual void DrawBeam( C_Beam* pbeam, ITraceFilter*pEntityBeamTraceFilter = NULL ); - - virtual void KillDeadBeams( IClientEntity *pDeadEntity ); - - virtual void CreateBeamEnts( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b, int type = -1 ); - virtual Beam_t *CreateBeamEnts( BeamInfo_t &beamInfo ); - - virtual void CreateBeamEntPoint( int nStartEntity, const vec3_t *pStart, int nEndEntity, const vec3_t* pEnd, - int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b ); - virtual Beam_t *CreateBeamEntPoint( BeamInfo_t &beamInfo ); - - virtual void CreateBeamPoints( vec3_t& start, vec3_t& end, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b ); - virtual Beam_t *CreateBeamPoints( BeamInfo_t &beamInfo ); - - virtual void CreateBeamRing( int startEnt, int endEnt, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b, int flags ); - virtual Beam_t *CreateBeamRing( BeamInfo_t &beamInfo ); - - virtual void CreateBeamRingPoint( const vec3_t& center, float start_radius, float end_radius, int modelIndex, int haloIndex, float haloScale, - float life, float width, float m_nEndWidth, float m_nFadeLength, float amplitude, - float brightness, float speed, int startFrame, - float framerate, float r, float g, float b, int flags ); - virtual Beam_t *CreateBeamRingPoint( BeamInfo_t &beamInfo ); - - virtual void CreateBeamCirclePoints( int type, vec3_t& start, vec3_t& end, - int modelIndex, int haloIndex, float haloScale, float life, float width, - float endWidth, float fadeLength, float amplitude, float brightness, float speed, - int startFrame, float framerate, float r, float g, float b ); - virtual Beam_t *CreateBeamCirclePoints( BeamInfo_t &beamInfo ); - - virtual void CreateBeamFollow( int startEnt, int modelIndex, int haloIndex, float haloScale, - float life, float width, float endWidth, float fadeLength, float r, float g, float b, - float brightness ); - virtual Beam_t *CreateBeamFollow( BeamInfo_t &beamInfo ); -}; \ No newline at end of file diff --git a/tf2/KeyValues.cpp b/tf2/KeyValues.cpp deleted file mode 100644 index 16ccf6e..0000000 --- a/tf2/KeyValues.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "KeyValues.h" -#include "pattern.hpp" -#include "interfaces.h" - -void* KeyValues::key_values_ptr; - -void IKeyValuesSystem::FreeKeyValuesMemory( void* memory ) { - return util::get_vfunc< 2, void >( this, memory ); -} - -int IKeyValuesSystem::GetSymbolForString( const char* str, bool create ) { - static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), xors( "FF 15 ? ? ? ? 83 C4 08 89 06 8B C6" ) ); - using fn = int( __thiscall* )( void*, const char*, bool ); - - int symbol = ( ( fn )( offset ) )( this, str, create ); - return symbol; -} - -const char* IKeyValuesSystem::GetStringForSymbol( int symbol ) { - static auto offset = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), xors( "55 8B EC 8B 55 08 83 FA FF" ) ); - using fn = const char*( __thiscall* )( void*, int ); - - auto result = ( ( fn )( offset ) )( this, symbol ); - printf( "%d: %d\n", symbol, *( int* )( &result ) ); - - return result; -} - -//honestly keyvalues can suck my fucking cock while i force feeds that fucking whores ass rats to live in its cum infested shithole - - -KeyValues::KeyValues( const char* name ) { - static std::string fun_pattern = "E8 ? ? ? ? 80 7D 84 00"; - static uintptr_t function_offset = pattern::first_code_match( cl.m_chl.dll( ), fun_pattern ) + 0x13C; - static auto function = reinterpret_cast< void( __thiscall* )( void*, const char* ) >( function_offset ); - if( function ) function( this, name ); -} - -bool KeyValues::LoadFromBuffer( const char* resource_name, const char* buffer, void* file_system, const char* path_id ) { - static std::string fun_pattern = "55 8B EC 83 E4 F8 83 EC 34 53 8B 5D 0C 89 4C 24 04"; - static auto function = pattern::first_code_match< bool( __thiscall* )( void*, const char*, const char*, void*, const char*, void* ) >( cl.m_chl.dll( ), fun_pattern ); - if( function ) return function( this, resource_name, buffer, file_system, path_id, 0 ); - return false; -} - -void* KeyValues::operator new( size_t alloc_size ) { - if( !KeyValues::key_values_ptr ) { - static auto get_key_values = reinterpret_cast< void*( __cdecl* )( ) >( GetProcAddress( GetModuleHandleA( "vstdlib.dll" ), "KeyValuesSystem" ) ); - KeyValues::key_values_ptr = get_key_values( ); - } - - return call_vfunc< void*( __thiscall* )( void*, size_t ) >( KeyValues::key_values_ptr, 1 )( KeyValues::key_values_ptr, 32 ); -} - -void KeyValues::operator delete( void* mem ) { - if( !KeyValues::key_values_ptr ) { - static auto get_key_values = reinterpret_cast< void*( __cdecl* )( ) >( GetProcAddress( GetModuleHandleA( "vstdlib.dll" ), "KeyValuesSystem" ) ); - KeyValues::key_values_ptr = get_key_values( ); - } - - call_vfunc< void( __thiscall* )( void*, void* ) >( KeyValues::key_values_ptr, 2 )( KeyValues::key_values_ptr, mem ); -} diff --git a/tf2/KeyValues.h b/tf2/KeyValues.h deleted file mode 100644 index 1d8ed41..0000000 --- a/tf2/KeyValues.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once -#include "util.hpp" - -class IKeyValuesSystem { -public: - void FreeKeyValuesMemory( void* memory ); - int GetSymbolForString( const char* string, bool create ); - const char* GetStringForSymbol( int symbol ); -}; - -class KeyValues -{ -public: - KeyValues( const char *setName ); - //~KeyValues( ); - - bool LoadFromBuffer( char const *resourceName, const char *pBuffer, void* pFileSystem = nullptr, const char *pPathID = nullptr ); - - const char* get_string( const char* name, const char* value ); - - int m_iKeyName; - - char *m_sValue; - wchar_t *m_wsValue; - - // we don't delete these - union { - int m_iValue; - float m_flValue; - void *m_pValue; - unsigned char m_Color[ 4 ]; - }; - - void* operator new( size_t alloc ); - void operator delete( void* mem ); - - char m_iDataType; - char m_bHasEscapeSequences; - char m_bEvaluateConditionals; - static void* key_values_ptr; - KeyValues* FindKey( const char* key_name ); - - KeyValues *m_pPeer; // pointer to next key in list - KeyValues *m_pSub; // pointer to Start of a new sub key list - KeyValues *m_pChain;// Search here if it's not in our list -}; \ No newline at end of file diff --git a/tf2/README.md b/tf2/README.md deleted file mode 100644 index fa73fb9..0000000 --- a/tf2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# tf2 - -jukka = bester diff --git a/tf2/ScreenSpaceEffects.h b/tf2/ScreenSpaceEffects.h deleted file mode 100644 index ec0b6e8..0000000 --- a/tf2/ScreenSpaceEffects.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once -class KeyValues; - -class IScreenSpaceEffect { -public: - - virtual void Init( ) = 0; - virtual void Shutdown( ) = 0; - - virtual void SetParameters( KeyValues *params ) = 0; - - virtual void Render( int x, int y, int w, int h ) = 0; - - virtual void Enable( bool bEnable ) = 0; - virtual bool IsEnabled( ) = 0; -}; - -class IScreenSpaceEffectManager { -public: - - virtual void InitScreenSpaceEffects( ) = 0; - virtual void ShutdownScreenSpaceEffects( ) = 0; - - virtual IScreenSpaceEffect *GetScreenSpaceEffect( const char *pEffectName ) = 0; - - virtual void SetScreenSpaceEffectParams( const char *pEffectName, KeyValues *params ) = 0; - virtual void SetScreenSpaceEffectParams( IScreenSpaceEffect *pEffect, KeyValues *params ) = 0; - - virtual void EnableScreenSpaceEffect( const char *pEffectName ) = 0; - virtual void EnableScreenSpaceEffect( IScreenSpaceEffect *pEffect ) = 0; - - virtual void DisableScreenSpaceEffect( const char *pEffectName ) = 0; - virtual void DisableScreenSpaceEffect( IScreenSpaceEffect *pEffect ) = 0; - - virtual void DisableAllScreenSpaceEffects( ) = 0; - - virtual void RenderEffects( int x, int y, int w, int h ) = 0; -}; - -class CScreenSpaceEffectRegistration { -public: - CScreenSpaceEffectRegistration( const char *pName, IScreenSpaceEffect *pEffect ); - - const char *m_pEffectName; - IScreenSpaceEffect *m_pEffect; - - CScreenSpaceEffectRegistration *m_pNext; - - static CScreenSpaceEffectRegistration *s_pHead; -}; \ No newline at end of file diff --git a/tf2/Source.cpp b/tf2/Source.cpp deleted file mode 100644 index 3bd44af..0000000 --- a/tf2/Source.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#pragma warning (disable:4018) - -#include -#include - -#include "console.hpp" -#include "interfaces.h" -#include "search.h" -#include "hooks.h" -#include -#include "base_cheat.h" - -HMODULE g_dll; - -void main_thread( HMODULE module ) { - - cl.initialize( ); - - - - while ( !( GetAsyncKeyState( VK_END ) & 0x8000 ) ) { - std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); - } - -} - -bool __stdcall DllMain( - _In_ HINSTANCE hinstDLL, - _In_ DWORD fdwReason, - _In_ LPVOID lpvReserved ) { - if ( fdwReason == DLL_PROCESS_ATTACH /*&& ( uintptr_t )( lpvReserved ) == 20*/ ) { //nigga suck who dick? - DisableThreadLibraryCalls( hinstDLL ); - g_dll = hinstDLL; - // coca cola coca cola yayo bought me everything - - //no i did not dummy - - CreateThread( nullptr, 0, reinterpret_cast< LPTHREAD_START_ROUTINE >( main_thread ), hinstDLL, 0, nullptr ); - } - - return true; -} \ No newline at end of file diff --git a/tf2/UtlMem.h b/tf2/UtlMem.h deleted file mode 100644 index df4574f..0000000 --- a/tf2/UtlMem.h +++ /dev/null @@ -1,320 +0,0 @@ -#pragma once - -typedef intptr_t intp; -inline int UtlMemory_CalcNewAllocationCount( int nAllocationCount, int nGrowSize, int nNewSize, int nBytesItem ) -{ - if( nGrowSize ) - nAllocationCount = ( ( 1 + ( ( nNewSize - 1 ) / nGrowSize ) ) * nGrowSize ); - else - { - if( !nAllocationCount ) - nAllocationCount = ( 31 + nBytesItem ) / nBytesItem; - - while( nAllocationCount < nNewSize ) - nAllocationCount *= 2; - } - - return nAllocationCount; -} - -template< class T, class I = int > -class CUtlMemory -{ -public: - T & operator[]( I i ) - { - return m_pMemory[ i ]; - } - - explicit operator bool( ) const noexcept { - return !!( m_pMemory ); - } - - T *Base( ) - { - return m_pMemory; - } - - int NumAllocated( ) const - { - return m_nAllocationCount; - } - - void Grow( int num = 1 ) - { - if( IsExternallyAllocated( ) ) - return; - - int nAllocationRequested = m_nAllocationCount + num; - int nNewAllocationCount = UtlMemory_CalcNewAllocationCount( m_nAllocationCount, m_nGrowSize, nAllocationRequested, sizeof( T ) ); - - if( ( int )( I )nNewAllocationCount < nAllocationRequested ) - { - if( ( int )( I )nNewAllocationCount == 0 && ( int )( I )( nNewAllocationCount - 1 ) >= nAllocationRequested ) - --nNewAllocationCount; - else - { - if( ( int )( I )nAllocationRequested != nAllocationRequested ) - return; - - while( ( int )( I )nNewAllocationCount < nAllocationRequested ) - nNewAllocationCount = ( nNewAllocationCount + nAllocationRequested ) / 2; - } - } - - m_nAllocationCount = nNewAllocationCount; - - if( m_pMemory ) - m_pMemory = ( T * )realloc( m_pMemory, m_nAllocationCount * sizeof( T ) ); - else - m_pMemory = ( T * )malloc( m_nAllocationCount * sizeof( T ) ); - } - - bool IsExternallyAllocated( ) const - { - return m_nGrowSize < 0; - } - -protected: - T * m_pMemory; - int m_nAllocationCount; - int m_nGrowSize; -}; - -template -inline T *Construct( T *pMemory ) -{ - return ::new( pMemory ) T; -} - -template -inline T *CopyConstruct( T *pMemory, T const& src ) -{ - return( new( pMemory ) T( src ) ); -} - -template -inline void Destruct( T *pMemory ) -{ - pMemory->~T( ); -} - -template< class T > -class CUtlFixedMemory -{ -public: - // constructor, destructor - CUtlFixedMemory( int nGrowSize = 0, int nInitSize = 0 ); - ~CUtlFixedMemory( ); - - // Set the size by which the memory grows - void Init( int nGrowSize = 0, int nInitSize = 0 ); - - // here to match CUtlMemory, but only used by ResetDbgInfo, so it can just return NULL - T* Base( ) { return NULL; } - const T* Base( ) const { return NULL; } - -protected: - struct BlockHeader_t; - -public: - class Iterator_t - { - public: - Iterator_t( BlockHeader_t *p, int i ) : m_pBlockHeader( p ), m_nIndex( i ) {} - BlockHeader_t *m_pBlockHeader; - intp m_nIndex; - - bool operator==( const Iterator_t it ) const { return m_pBlockHeader == it.m_pBlockHeader && m_nIndex == it.m_nIndex; } - bool operator!=( const Iterator_t it ) const { return m_pBlockHeader != it.m_pBlockHeader || m_nIndex != it.m_nIndex; } - }; - Iterator_t First( ) const { return m_pBlocks ? Iterator_t( m_pBlocks, 0 ) : InvalidIterator( ); } - Iterator_t Next( const Iterator_t &it ) const - { - Assert( IsValidIterator( it ) ); - if( !IsValidIterator( it ) ) - return InvalidIterator( ); - - BlockHeader_t *pHeader = it.m_pBlockHeader; - if( it.m_nIndex + 1 < pHeader->m_nBlockSize ) - return Iterator_t( pHeader, it.m_nIndex + 1 ); - - return pHeader->m_pNext ? Iterator_t( pHeader->m_pNext, 0 ) : InvalidIterator( ); - } - intp GetIndex( const Iterator_t &it ) const - { - Assert( IsValidIterator( it ) ); - if( !IsValidIterator( it ) ) - return InvalidIndex( ); - - return ( intp )( HeaderToBlock( it.m_pBlockHeader ) + it.m_nIndex ); - } - bool IsIdxAfter( intp i, const Iterator_t &it ) const - { - Assert( IsValidIterator( it ) ); - if( !IsValidIterator( it ) ) - return false; - - if( IsInBlock( i, it.m_pBlockHeader ) ) - return i > GetIndex( it ); - - for( BlockHeader_t *pbh = it.m_pBlockHeader->m_pNext; pbh; pbh = pbh->m_pNext ) - { - if( IsInBlock( i, pbh ) ) - return true; - } - return false; - } - bool IsValidIterator( const Iterator_t &it ) const { return it.m_pBlockHeader && it.m_nIndex >= 0 && it.m_nIndex < it.m_pBlockHeader->m_nBlockSize; } - Iterator_t InvalidIterator( ) const { return Iterator_t( NULL, INVALID_INDEX ); } - - // element access - T& operator[]( intp i ); - const T& operator[]( intp i ) const; - T& Element( intp i ); - const T& Element( intp i ) const; - - // Can we use this index? - bool IsIdxValid( intp i ) const; - - // Specify the invalid ('null') index that we'll only return on failure - static const intp INVALID_INDEX = 0; // For use with COMPILE_TIME_ASSERT - static intp InvalidIndex( ) { return INVALID_INDEX; } - - // Size - int NumAllocated( ) const; - int Count( ) const { return NumAllocated( ); } - - // Grows memory by max(num,growsize), and returns the allocation index/ptr - void Grow( int num = 1 ); - - // Makes sure we've got at least this much memory - void EnsureCapacity( int num ); - - // Memory deallocation - void Purge( ); - -protected: - // Fast swap - WARNING: Swap invalidates all ptr-based indices!!! - void Swap( CUtlFixedMemory< T > &mem ); - - bool IsInBlock( intp i, BlockHeader_t *pBlockHeader ) const - { - T *p = ( T* )i; - const T *p0 = HeaderToBlock( pBlockHeader ); - return p >= p0 && p < p0 + pBlockHeader->m_nBlockSize; - } - - struct BlockHeader_t - { - BlockHeader_t *m_pNext; - intp m_nBlockSize; - }; - - const T *HeaderToBlock( const BlockHeader_t *pHeader ) const { return ( T* )( pHeader + 1 ); } - const BlockHeader_t *BlockToHeader( const T *pBlock ) const { return ( BlockHeader_t* )( pBlock )-1; } - - BlockHeader_t* m_pBlocks; - int m_nAllocationCount; - int m_nGrowSize; -}; - -template< class T, class A = CUtlMemory > -class CUtlVector -{ - typedef A CAllocator; - - typedef T *iterator; - typedef const T *const_iterator; -public: - T & operator[]( int i ) - { - return m_Memory[ i ]; - } - - explicit operator bool( ) const noexcept { - return !!( m_Memory ); - } - - T& Element( int i ) - { - return m_Memory[ i ]; - } - - T* Base( ) - { - return m_Memory.Base( ); - } - - int Count( ) const - { - return m_Size; - } - - void RemoveAll( ) - { - for( int i = m_Size; --i >= 0; ) - Destruct( &Element( i ) ); - - m_Size = 0; - } - - int AddToTail( const T& src ) - { - return InsertBefore( m_Size, src ); - } - - int AddToTail( ) - { - return InsertBefore( m_Size ); - } - - int InsertBefore( int elem, const T& src ) - { - Growvec3_t( ); - ShiftElementsRight( elem ); - CopyConstruct( &Element( elem ), src ); - return elem; - } - - int InsertBefore( int elem ) - { - Growvec3_t( ); - ShiftElementsRight( elem ); - Construct( &Element( elem ) ); - - return elem; - } - - iterator begin( ) { return Base( ); } - const_iterator begin( ) const { return Base( ); } - iterator end( ) { return Base( ) + Count( ); } - const_iterator end( ) const { return Base( ) + Count( ); } - -protected: - void Growvec3_t( int num = 1 ) - { - if( m_Size + num > m_Memory.NumAllocated( ) ) - m_Memory.Grow( m_Size + num - m_Memory.NumAllocated( ) ); - - m_Size += num; - ResetDbgInfo( ); - } - - void ShiftElementsRight( int elem, int num = 1 ) - { - int numToMove = m_Size - elem - num; - if( ( numToMove > 0 ) && ( num > 0 ) ) - memmove( &Element( elem + num ), &Element( elem ), numToMove * sizeof( T ) ); - } - - CAllocator m_Memory; - int m_Size; - - T *m_pElements; - - inline void ResetDbgInfo( ) - { - m_pElements = Base( ); - } -}; \ No newline at end of file diff --git a/tf2/VFunc.h b/tf2/VFunc.h deleted file mode 100644 index f5e09af..0000000 --- a/tf2/VFunc.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include -#include - -template < typename Fn > __forceinline Fn call_vfunc( void* classbase, int index ) { - if ( !classbase ) return Fn{ }; - return ( Fn )( ( uintptr_t* )*( uintptr_t** )classbase )[ index ]; -} - -template < typename T > __forceinline T get_ebp( ) { - __asm mov eax, ebp -} \ No newline at end of file diff --git a/tf2/aim.cpp b/tf2/aim.cpp deleted file mode 100644 index 15c5e16..0000000 --- a/tf2/aim.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#include "interfaces.h" -#include "input_system.hpp" -#include "ctx.hpp" -#include "aim.h" -#include "settings.h" -#include "math.h" - -namespace features -{ - int c_legitbot::get_aim_target( float fov ) { - float best_fov = fov ? fov : g_settings.legit.active->m_fov; - int target{ -1 }; - vec3_t aim_angle{ }; - vec3_t cur_angle{ }; - vec3_t local_pos{ }; - vec3_t aim_pos{ }; - - cl.m_engine( )->GetViewAngles( cur_angle ); - local_pos = g_ctx.m_local->get_eye_pos( ); - - for( int i{ 1 }; i <= cl.m_globals->maxclients; ++i ) { - auto entity = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - - if( !entity ) continue; - if( entity == g_ctx.m_local ) continue; - if( !entity->is_valid( ) ) continue; - int team = entity->get_team( ); - if( team == g_ctx.m_local->get_team( ) - && !g_settings.legit.friendlies( ) ) { - continue; - } - - bool visible = entity->is_visible( g_settings.legit.active->m_bone ); - if( !visible && g_settings.legit.backtracking_target( ) ) { - auto record = m_lagcomp.find_best_record( i ); - if( record ) { - visible = util::trace_ray( local_pos, record->m_position, - g_ctx.m_local->ce( ), entity->ce( ) ); - } - } - - if( !visible ) { - continue; - } - - aim_angle = math::vector_angles( local_pos, entity->get_hitbox_position( g_settings.legit.active->m_bone ) ); - aim_angle.clamp( ); - - float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); - if( fov < best_fov ) { - best_fov = fov; - target = i; - } - } - - return target; - } - - void c_legitbot::assist( c_base_player* target, float* x, float* y ) { - vec3_t aim_ang; - vec3_t move_ang; - vec3_t view_ang; - vec3_t enemy_pos; - vec3_t local_pos; - vec3_t view_delta; - vec3_t delta; - vec2_t pixels; - - local_pos = g_ctx.m_local->get_eye_pos( ); - enemy_pos = target->get_hitbox_position( g_settings.legit.active->m_bone ); - - aim_ang = math::vector_angles( local_pos, enemy_pos ); - - move_ang = pixels_to_angle( vec2_t( *x, *y ) ); - cl.m_engine( )->GetViewAngles( view_ang ); - - view_delta = ( aim_ang - view_ang ).clamp( ); - - move_ang *= g_settings.legit.active->m_assist_strength; - float delta_y = std::abs( move_ang.y ); - float delta_x = std::abs( move_ang.x ); - - delta.x = std::clamp( view_delta.x, -delta_x, delta_x ); - delta.y = std::clamp( view_delta.y, -delta_y, delta_y ); - - pixels = angle_to_pixels( delta ); - *x += pixels.x; *y += pixels.y; - } - - - - void c_legitbot::triggerbot( user_cmd_t* cmd ) { - static float time_at = 0.f; - - if( !g_settings.legit.triggerbot( ) ) - return; - - if( !g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.trigger_key( ) ) && !time_at ) // sometimes people will let go of their triggerbot key too quickly and will cause them to not shoot. - return; - - vec3_t viewangles{ }; - vec3_t forward{ }; - cl.m_engine( )->GetViewAngles( viewangles ); - - auto wep = g_ctx.m_local->get_active_weapon( ); - if( !wep ) return; - if( wep->is_non_aim( ) ) return; - - - const float length = wep->get_distance( ); - const float current_time = TICKS_TO_TIME( cl.m_globals->tickcount ); - - if( time_at && abs( current_time - time_at ) > 0.3f ) { - time_at = 0.f; // delta too big - } - - if( length > 1.0f ) { - if( !time_at ) { - - forward = math::angle_vectors( viewangles ); - forward *= length; - - vec3_t src = g_ctx.m_local->get_eye_pos( ); - vec3_t dst = src + forward; - - CTraceFilter filter{ }; - CGameTrace tr{ }; - Ray_t ray{ }; - - filter.pSkip = g_ctx.m_local; - ray.Init( src, dst ); - - cl.m_trace( )->trace_ray( ray, MASK_SHOT, &filter, &tr ); - - if( tr.m_pEnt ) { - auto ent = tr.m_pEnt->as< c_base_player >( ); - if( ent->is_valid( ) ) { - if( ent->get_team( ) != g_ctx.m_local->get_team( ) || g_settings.legit.friendlies ) { - time_at = current_time; - } - } - } - } - - if( time_at ) { - if( ( current_time - time_at ) >= g_settings.legit.trigger_delay( ) ) { - cmd->m_buttons |= IN_ATTACK; - time_at = 0.f; - } - } - } - } - - void c_legitbot::sample_angle_data( const vec3_t& cur_angles ) { - auto time = cl.m_globals->curtime; - - if( !m_aiming ) { - m_angle_samples.push_front( { cur_angles, time } ); - } - - while( m_angle_samples.size( ) > g_settings.legit.sample_size( ) ) { - m_angle_samples.pop_back( ); - } - } - - float c_legitbot::get_avg_delta( ) { - if( m_angle_samples.empty( ) ) - return 0.f; - - float avg_delta{ }; - - for( auto& it : m_angle_samples ) { - static vec3_t last_angle = it.m_viewangles; - - //doing this implements nonsticky aswell - //once you already are at the target - //after lets say a flick - //it will reduce the aim speed - //making it not "stick" to the bone - //as we dont store records when aiming - float time_delta = cl.m_globals->curtime - it.m_time; - float delta_diff = m_deltatime / ( time_delta * 2.f ); - - vec3_t angle_delta = ( last_angle - it.m_viewangles ).clamp( ); - float delta_length = angle_delta.length( ) * delta_diff; - - avg_delta += delta_length; - last_angle = it.m_viewangles; - } - - //scale the delta down - return avg_delta / float( g_settings.legit.sample_size( ) ); - } - - vec2_t c_legitbot::angle_to_pixels( const vec3_t& angle ) { - static auto m_yaw = cl.m_cvar( )->FindVar( xors( "m_yaw" ) ); - static auto m_pitch = cl.m_cvar( )->FindVar( xors( "m_pitch" ) ); - - float x = angle.x / m_pitch->get_float( ); - float y = angle.y / m_yaw->get_float( ); - - return vec2_t( -y, x ); - } - - vec3_t c_legitbot::pixels_to_angle( const vec2_t& pixel ) { - static auto m_yaw = cl.m_cvar( )->FindVar( xors( "m_yaw" ) ); - static auto m_pitch = cl.m_cvar( )->FindVar( xors( "m_pitch" ) ); - - float x = pixel.x * m_pitch->get_float( ); - float y = pixel.y * m_yaw->get_float( ); - - return vec3_t( -y, x, 0.f ).clamp( ); - } - - bool c_legitbot::update_settings( ) { - if( !g_ctx.run_frame( ) ) return false; - - auto weapon = g_ctx.m_local->get_active_weapon( ); - if( !weapon ) return false; - - if( weapon->is_non_aim( ) ) { - return false; - } - - if( weapon->is_primary( ) ) { - g_settings.legit.active = &g_settings.legit.primary; - } - else if( weapon->is_secondary( ) ) { - g_settings.legit.active = &g_settings.legit.secondary; - } - else if( weapon->is_third( ) ) { - g_settings.legit.active = &g_settings.legit.melee; - } - - - return true; - } - - void c_legitbot::aim_at_target( c_base_player* target, float* x, float* y ) { - vec3_t aim_ang; - vec3_t cur_ang; - vec3_t delta; - vec2_t pixels; - vec2_t mouse; - - cl.m_engine( )->GetViewAngles( cur_ang ); - - if( g_settings.legit.backtracking( ) && m_lagcomp.find_best_record( target->ce( )->index( ) ) ) { - aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), - m_lagcomp.get_backtracked_position( target->ce( )->index( ) ) ).clamp( ); - } - else { - aim_ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ), - target->get_hitbox_position( g_settings.legit.active->m_bone ) ).clamp( ); - } - - - delta = ( aim_ang - cur_ang ).clamp( ); - float delta_length = delta.length( ); - - if( delta_length ) { - float final_time = delta_length / ( g_settings.legit.active->m_speed( ) / 100.f ); - m_curtime += m_deltatime; - - if( m_curtime > final_time ) { - m_curtime = final_time; - } - - float aim_progress = m_curtime / final_time; - delta *= aim_progress; - aim_ang = delta; - - pixels = angle_to_pixels( delta ); - *x += pixels.x; - *y += pixels.y; - } - } - - void c_legitbot::aimbot( float* x, float* y ) { - if( !g_settings.legit.enabled( ) ) return; - if( !update_settings( ) ) return; - - m_aiming = false; - static float old_time = cl.m_globals->curtime; - float time = cl.m_globals->curtime; - - m_deltatime = time - old_time; - if( g_settings.legit.dynamic_smoothing( ) ) { - float avg_delta = get_avg_delta( ) * g_settings.legit.smooth_factor( ); - if( avg_delta > m_deltatime ) { - m_deltatime = avg_delta; - } - } - - old_time = time; - - bool in_attack = false; - if( g_settings.legit.activation_type == 0 ) - in_attack = true; - if( g_settings.legit.activation_type == 1 - && g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) { - in_attack = true; - } - - int target_index = get_aim_target( ); - auto target = cl.m_entlist( )->get_client_entity< c_base_player >( target_index ); - - if( target_index != -1 ) { - if( in_attack ) { - m_aiming = true; - aim_at_target( target, x, y ); - } - if( g_settings.legit.assist ) { - assist( target, x, y ); - } - } - else { - m_curtime = 0; - } - } -} \ No newline at end of file diff --git a/tf2/aim.h b/tf2/aim.h deleted file mode 100644 index 82e4943..0000000 --- a/tf2/aim.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once -#include -#include - -#include "sdk.h" - -namespace features -{ - class c_legitbot { - public: - void operator()( float* x, float* y ) { - aimbot( x, y ); - } - - //call once per tick - void sample_angle_data( const vec3_t& angle ); - void triggerbot( user_cmd_t* cmd ); - - private: - struct aim_record_t { - vec3_t m_viewangles; - float m_time; - }; - - struct lag_record_t { - int m_tickcount{ }; - vec3_t m_position{ }; - matrix3x4 m_matrix[ 128 ]{ }; - - bool is_valid( ); - }; - class c_lagcomp { - public: - friend class c_legitbot; - using lag_deque_t = std::deque< lag_record_t >; - - lag_record_t* find_best_record( int ent_index ); - vec3_t get_backtracked_position( int ent_index ); - auto& get_records( int ent_index ) { - return m_data[ ent_index ]; - } - - void store( ); - void operator()( user_cmd_t* cmd ); - - private: - bool backtrack_entity( int ent_index ); - bool can_backtrack_entity( int ent_index ); - void store_player( int ent_index ); - - lag_deque_t m_data[ 65 ]; - user_cmd_t* m_cmd; - }; - - vec2_t angle_to_pixels( const vec3_t& angle ); - vec3_t pixels_to_angle( const vec2_t& pixel ); - void aimbot( float* x, float* y ); - void assist( c_base_player* player, float* x, float* y ); - void aim_at_target( c_base_player*, float*, float* ); - - bool update_settings( ); - float get_avg_delta( ); - int get_aim_target( float fov = 0.f ); - - private: - float m_deltatime{ }; - float m_curtime{ }; - bool m_aiming{ }; - - std::deque< aim_record_t > m_angle_samples; - - public: - c_lagcomp m_lagcomp; - }; -} \ No newline at end of file diff --git a/tf2/aim_lagcomp.cpp b/tf2/aim_lagcomp.cpp deleted file mode 100644 index e3b5486..0000000 --- a/tf2/aim_lagcomp.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "aim.h" -#include "interfaces.h" -#include "ctx.hpp" -#include "settings.h" -#include "math.h" -#include "base_cheat.h" -#include "input_system.hpp" -#include "d3d.hpp" - -namespace features -{ - bool c_legitbot::lag_record_t::is_valid( ) { - return util::is_tick_valid( m_tickcount ); - } - - void c_legitbot::c_lagcomp::store_player( int ent_index ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( ent_index ); - vec3_t pos = ent->get_hitbox_position( 0 ); - int tickcount = TIME_TO_TICKS( ent->m_flSimulationTime( ) ); - - lag_record_t new_record; - if( ent->ce( )->setup_bones( new_record.m_matrix, 128, 0x100, 0.f ) ) { - new_record.m_position = pos; - new_record.m_tickcount = tickcount; - - m_data[ ent_index ].push_front( new_record ); - } - - while( !m_data[ ent_index ].empty( ) && - ( m_data[ ent_index ].size( ) > TIME_TO_TICKS( 1.0f ) ) ) { - m_data[ ent_index ].pop_back( ); - } - } - - bool c_legitbot::c_lagcomp::can_backtrack_entity( int ent_index ) { - if( m_data[ ent_index ].empty( ) ) { - return false; - } - - for( auto& it : m_data[ ent_index ] ) { - if( it.is_valid( ) ) return true; - } - - return false; - } - - c_legitbot::lag_record_t* c_legitbot::c_lagcomp::find_best_record( int ent_index ) { - c_legitbot::lag_record_t* best_record = nullptr; - float best_fov{ g_settings.legit.backtracking_fov( ) }; - vec3_t cur_angle; - vec3_t aim_angle; - vec3_t aim_pos; - vec3_t cur_pos; - int cur_tick; - - if( m_data[ ent_index ].empty( ) ) { - return nullptr; - } - - cl.m_engine( )->GetViewAngles( cur_angle ); - cur_pos = g_ctx.m_local->get_eye_pos( ); - cur_tick = cl.m_globals->tickcount; - - for( auto& it : m_data[ ent_index ] ) { - int delta = std::abs( cur_tick - it.m_tickcount ); - - auto nci = cl.m_engine( )->GetNetChannelInfo( ); - if( nci ) { - float max_latency = g_settings.legit.backtracking_time + nci->GetLatency( 0 ); - if( delta > TIME_TO_TICKS( max_latency ) ) - continue; - } - - - if( !it.is_valid( ) ) - continue; - - aim_pos = it.m_position; - aim_angle = math::vector_angles( cur_pos, aim_pos ).clamp( ); - - float fov = ( cur_angle - aim_angle ).clamp( ).length2d( ); - if( fov < best_fov ) { - best_fov = fov; - best_record = ⁢ - } - } - - return best_record; - } - - vec3_t c_legitbot::c_lagcomp::get_backtracked_position( int ent_index ) { - if( !m_data[ ent_index ].size( ) ) return vec3_t( ); - auto lag_record = find_best_record( ent_index ); - - vec3_t last_position{ }; - for( auto& it : util::reverse_iterator( m_data[ ent_index ] ) ) { - if( it.is_valid( ) ) last_position = it.m_position; break; - } - - return lag_record ? lag_record->m_position : last_position; - } - - void c_legitbot::c_lagcomp::store( ) { - for( int i = 1; i < 65; ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - - if( ent && ent->is_valid( ) && ent != g_ctx.m_local ) { - store_player( i ); - } - else { - m_data[ i ].clear( ); - } - } - } - - bool c_legitbot::c_lagcomp::backtrack_entity( int ent_index ) { - if( !m_cmd ) return false; - - if( !can_backtrack_entity( ent_index ) ) return false; - - auto best_record = find_best_record( ent_index ); - - if( best_record ) { - m_cmd->m_tick_count = best_record->m_tickcount; - return true; - } - - return false; - } - - void c_legitbot::c_lagcomp::operator()( user_cmd_t* cmd ) { - if( !g_settings.legit.enabled( ) || !g_settings.legit.backtracking( ) ) - return; - - m_cmd = cmd; - store( ); - - auto target = g_cheat.aim.get_aim_target( g_settings.legit.backtracking_fov( ) ); - bool active = false; - - if( g_settings.legit.activation_type( ) == 0 ) - active = true; - if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.legit.key( ) ) ) - active = true; - - if( active && target != -1 ) { - backtrack_entity( target ); - } - } -} \ No newline at end of file diff --git a/tf2/base_cheat.h b/tf2/base_cheat.h deleted file mode 100644 index 832386c..0000000 --- a/tf2/base_cheat.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once -#include "aim.h" -#include "movement.h" -#include "prediction.h" -#include "visuals.hpp" -#include "chams.h" -#include "identity.h" -#include "extra.h" -namespace tf2 { - class c_base_cheat { - public: - features::c_legitbot aim; - features::c_movement movement; - features::c_prediction prediction; - features::c_visuals visuals; - features::c_chams chams; - features::c_identity identity; - features::c_extra extra; - }; -} - -static tf2::c_base_cheat g_cheat; \ No newline at end of file diff --git a/tf2/chams.cpp b/tf2/chams.cpp deleted file mode 100644 index fc5c060..0000000 --- a/tf2/chams.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#include "chams.h" -#include "interfaces.h" -#include "d3d.hpp" -#include "ctx.hpp" -#include "hooks.h" -#include "settings.h" - -static auto chams_mat = xors_raw( ( - R"("VertexLitGeneric" -{ - "$basetexture" "vgui/white" - "$model" "1" - "$envmap" "env_cubemap" - "$envmaptint" "[.3 .3 .3]" - "$envmapcontrast" ".4" - "$envmapsaturation" "1.0" - "$flat" "0" - "$nocull" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" - "$phong" "1" - "$phongexponent" "255.0" - "$normalmapalphaenvmask" "1" - "$phongboost" "6.0" - "$phongfresnelranges" "[0 0.5 1]" - "$BasemapAlphaPhongMask" "1" -})" -) ); - -static auto chams_mat_shine = xors_raw( ( - R"("VertexLitGeneric" -{ - "$basetexture" "vgui/white" - "$envmap" "env_cubemap" - "$envmaptint" "[.3 .3 .3]" - "$reflectivity" "[1.0 1.0 1.0]" - "$envmapcontrast" ".4" - "$envmapsaturation" "1.0" - "$model" "1" - "$flat" "0" - "$nocull" "1" - "$selfillum" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" -})" -) ); - -static auto chams_mat_flat = xors_raw( ( - R"("UnlitGeneric" -{ - "$basetexture" "vgui/white" - "$model" "1" - "$flat" "1" - "$nocull" "1" - "$selfillum" "1" - "$halflambert" "1" - "$nofog" "1" - "$ignorez" "0" - "$znearer" "0" - "$wireframe" "0" -})" -) ); - -namespace features -{ - void c_materials::make_cham_buffer( char* buf, int len, int type ) { - switch( type ) { - case 1: - sprintf_s( buf, len - 1, chams_mat_flat.decrypt( ) ); - break; - case 2: - sprintf_s( buf, len - 1, chams_mat_shine.decrypt( ) ); - break; - default: - sprintf_s( buf, len - 1, chams_mat.decrypt( ) ); - } - } - - void c_material::init( const char* name, const char* buf ) { - m_keyvalues = new KeyValues( name ); - m_keyvalues->LoadFromBuffer( name, buf ); - - // CreateMaterial already increments ref counter - m_mat = cl.m_mat_system( )->CreateMaterial( name, m_keyvalues ); - } - - void c_material::destroy( ) { - if( m_mat ) { - m_mat->DecrementReferenceCount( ); - m_mat = nullptr; - } - - if( m_keyvalues ) { - delete m_keyvalues; - m_keyvalues = nullptr; - } - } - - void c_materials::force_material( IMaterial* mat, fclr_t clr ) { - if( !mat ) return; - - float col[ ] = { clr.r( ), clr.g( ), clr.b( ) }; - cl.m_render_view( )->SetBlend( clr.a( ) ); - cl.m_render_view( )->SetColorModulation( col ); - - cl.m_model_render( )->ForcedMaterialOverride( mat ); - } - - void c_materials::initialize_materials( ) { - char buffer[ 1024 ]; - - make_cham_buffer( buffer, sizeof( buffer ), 0 ); - m_chams.init( xors( "chamsmat" ), buffer ); - memset( buffer, 0, 1024 ); - - make_cham_buffer( buffer, sizeof( buffer ), 1 ); - m_chams_flat.init( xors( "chamsmat_flat" ), buffer ); - memset( buffer, 0, 1024 ); - m_initialized = true; - } - - void c_materials::destroy_materials( ) { - m_initialized = false; - - m_chams.destroy( ); - m_chams_flat.destroy( ); - } - - void c_materials::update_materials( ) { - if( !m_initialized ) return; - if( m_chams.m_mat->m_ref_count <= 0 ) return; - - static float last_reflectivity{ }; - static float last_shine{ }; - static KeyValues* reflectivity; - static KeyValues* shine; - - if( !reflectivity ) { - for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { - if( it->m_iDataType != 1 ) continue; - if( strstr( it->m_sValue, xors( "[.3 .3 .3]" ) ) ) { - reflectivity = it; - } - } - } - - if( !shine ) { - for( auto it = m_chams.m_keyvalues->m_pSub; !!it; it = it->m_pPeer ) { - if( it->m_flValue == 6.0f ) - shine = it; - } - } - - if( reflectivity ) { - if( last_reflectivity != g_settings.visuals.chams.reflectivity( ) ) { - char buf[ 32 ]; - sprintf_s< 32 >( buf, xors( "[%1.1f %1.1f %1.1f]" ), - g_settings.visuals.chams.reflectivity( ), - g_settings.visuals.chams.reflectivity( ), - g_settings.visuals.chams.reflectivity( ) ); - - strcpy( reflectivity->m_sValue, buf ); - m_chams.m_mat->Refresh( ); - } - last_reflectivity = g_settings.visuals.chams.reflectivity( ); - } - - if( shine ) { - if( last_shine != g_settings.visuals.chams.shine( ) ) { - shine->m_flValue = g_settings.visuals.chams.shine( ) * 100.f; - m_chams.m_mat->Refresh( ); - } - last_shine = g_settings.visuals.chams.shine( ); - } - } - - void c_chams::d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { - static auto d3d_draw = cl.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); - - int team = ent->m_iTeamNum( ); - clr_t visible_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_visible_friendly( ) : g_settings.visuals.chams.color_visible_enemy( ); - clr_t hidden_col = team == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.chams.color_hidden_friendly( ) : g_settings.visuals.chams.color_hidden_enemy( ); - - if( team == g_ctx.m_local->m_iTeamNum( ) && !g_settings.visuals.chams.friendlies ) - return; - - fclr_t fcol_vis = visible_col.to_fclr( ); - float value_vis[ 4 ] = { fcol_vis.r( ), fcol_vis.g( ), fcol_vis.b( ), fcol_vis.a( ) }; - - fclr_t fcol_hid = hidden_col.to_fclr( ); - float value_hid[ 4 ] = { fcol_hid.r( ), fcol_hid.g( ), fcol_hid.b( ), fcol_hid.a( ) }; - - float def[ 4 ] = { 1.f, 1.f, 1.f, 1.f }; - - IDirect3DBaseTexture9* prev_texture; - IDirect3DSurface9* prev_surface; - ulong_t z_enable; - - g_d3d.get_device( )->GetTexture( 0, &prev_texture ); - g_d3d.get_device( )->GetRenderTarget( 0, &prev_surface ); - g_d3d.get_device( )->GetRenderState( D3DRS_ZENABLE, &z_enable ); - - auto hr = g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); - - //printf( "hr: %08x\n", hr ); - - if( g_settings.visuals.chams.ignore_z ) { - g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, false ); - g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); - g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_hid, 1 ); - //g_d3d.get_device( )->SetTexture( 0, nullptr ); - d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); - } - - g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); - g_d3d.get_device( )->SetPixelShaderConstantF( 0, value_hid, 1 ); - g_d3d.get_device( )->SetPixelShaderConstantF( 1, value_vis, 1 ); - //g_d3d.get_device( )->SetTexture( 0, nullptr ); - - d3d_draw( g_d3d.get_device( ), ( D3DPRIMITIVETYPE )type, v_index, min_index, num_vert, start_index, prim_count ); - - g_d3d.get_device( )->SetPixelShaderConstantF( 0, def, 1 ); - g_d3d.get_device( )->SetPixelShaderConstantF( 1, def, 1 ); - g_d3d.get_device( )->SetRenderTarget( 0, prev_surface ); - g_d3d.get_device( )->SetRenderState( D3DRS_ZENABLE, z_enable ); - - g_d3d.get_device( )->SetTexture( 0, prev_texture ); - - if( prev_texture ) - prev_texture->Release( ); - - if( prev_surface ) - prev_surface->Release( ); - } - - void c_chams::d3d_render_textures( ) { - if( !g_d3d.m_sil_txt ) - return; - - IDirect3DSurface9* backbuffer; - D3DSURFACE_DESC desc; - - g_d3d.get_device( )->GetRenderTarget( 0, &backbuffer ); - backbuffer->GetDesc( &desc ); - //backbuffer->Release( ); - - struct tex_vertex { - float x, y, z, r, h, w; - }; - - tex_vertex v[ ] = { - { 0.f, 0.f, 0.f, 1.0f, 0.f, 0.f }, - { ( float )desc.Width, 0.f, 0.f, 1.0f, 1.0f, 0.f }, - { 0.f, ( float )desc.Height, 0.f, 1.0f, 0.0f, 1.0f }, - { ( float )desc.Width, ( float )desc.Height, 0.f, 1.0f, 1.0f, 1.0f } - }; - - void* p; - - g_d3d.m_buffer->Lock( 0, 0, &p, 0 ); - memcpy( p, v, sizeof( v ) ); - g_d3d.m_buffer->Unlock( ); - - void* pixel_shader; - void* texture; - void* stream_src; - uint32_t stride; - uint32_t offset; - ulong_t fvf; - ulong_t dest_blend; - ulong_t alpha_blend; - - g_d3d.get_device( )->GetPixelShader( ( IDirect3DPixelShader9** )&pixel_shader ); - g_d3d.get_device( )->GetTexture( 0, ( IDirect3DBaseTexture9** )&texture ); - g_d3d.get_device( )->GetStreamSource( 0, ( IDirect3DVertexBuffer9** )&stream_src, &offset, &stride ); - g_d3d.get_device( )->GetFVF( &fvf ); - g_d3d.get_device( )->GetRenderState( D3DRS_DESTBLEND, &dest_blend ); - g_d3d.get_device( )->GetRenderState( D3DRS_ALPHABLENDENABLE, &alpha_blend ); - - g_d3d.get_device( )->SetRenderTarget( 0, g_d3d.m_surface ); - g_d3d.get_device( )->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 ); - g_d3d.get_device( )->SetPixelShader( nullptr ); - g_d3d.get_device( )->SetTexture( 0, g_d3d.m_sil_txt ); - g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); - - g_d3d.get_device( )->SetStreamSource( 0, g_d3d.m_buffer, 0, sizeof( tex_vertex ) ); - g_d3d.get_device( )->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); - - //D3DXSaveSurfaceToFileA( "backbuffer_1.bmp", D3DXIFF_BMP, backbuffer, 0, 0 ); - //D3DXSaveSurfaceToFileA( "backbuffer_2.bmp", D3DXIFF_BMP, g_d3d.m_surface, 0, 0 ); - - - D3DRECT bar_rect{ }; - D3DCOLOR col{ }; - - bar_rect.x1 = 0; - bar_rect.y1 = 0; - bar_rect.x2 = desc.Width; - bar_rect.y2 = desc.Height; - - g_d3d.get_device( )->SetPixelShader( ( IDirect3DPixelShader9* )pixel_shader ); - g_d3d.get_device( )->SetTexture( 0, ( IDirect3DTexture9* )texture ); - g_d3d.get_device( )->SetRenderState( D3DRS_DESTBLEND, dest_blend ); - g_d3d.get_device( )->SetRenderState( D3DRS_ALPHABLENDENABLE, alpha_blend ); - g_d3d.get_device( )->SetStreamSource( 0, ( IDirect3DVertexBuffer9* )stream_src, offset, stride ); - g_d3d.get_device( )->SetFVF( fvf ); - - //g_d3d.get_device( )->Clear( 1, &bar_rect, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, col, 0, 0 ); - g_d3d.get_device( )->SetRenderTarget( 0, backbuffer ); - backbuffer->Release( ); - - - } -} \ No newline at end of file diff --git a/tf2/chams.h b/tf2/chams.h deleted file mode 100644 index 4fdc74b..0000000 --- a/tf2/chams.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "sdk.h" - -namespace features -{ - enum ChamBufferType_t { - TYPE_NORMAL, - TYPE_FLAT, - TYPE_SHINE - }; - - class c_material { - public: - c_material( ) = default; - - void init( const char* mat, const char* buf ); - void destroy( ); - - operator IMaterial*( ) { - return m_mat; - } - - public: - IMaterial * m_mat; - KeyValues* m_keyvalues; - }; - - class c_materials { - public: - c_material m_chams{ }; - c_material m_chams_flat{ }; - - void make_cham_buffer( char* buf, int len, int type ); //type, 0 = normal, 1 = flat, 2 = shine - public: - void initialize_materials( ); - void destroy_materials( ); - void force_material( IMaterial* material, fclr_t color ); - void update_materials( ); - bool m_initialized{ }; - }; - - class c_chams { - public: - c_materials m_materials; - void d3d_render_textures( ); - void d3d_render_chams( c_base_player* ent, int type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ); - }; -} \ No newline at end of file diff --git a/tf2/checksum_crc.cpp b/tf2/checksum_crc.cpp deleted file mode 100644 index a2ac9e8..0000000 --- a/tf2/checksum_crc.cpp +++ /dev/null @@ -1,169 +0,0 @@ -//========= Copyright Valve Corporation, All rights reserved. ============// -// -// Purpose: Generic CRC functions -// -//=============================================================================// - - -#include "checksum_crc.h" - -#define CRC32_INIT_VALUE 0xFFFFFFFFUL -#define CRC32_XOR_VALUE 0xFFFFFFFFUL - -#define NUM_BYTES 256 -static const CRC32_t pulCRCTable[ NUM_BYTES ] = -{ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, - 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, - 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, - 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, - 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, - 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, - 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, - 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, - 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, - 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, - 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, - 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, - 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, - 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, - 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, - 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, - 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, - 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -void CRC32_Init( CRC32_t *pulCRC ) { - *pulCRC = CRC32_INIT_VALUE; -} - -void CRC32_Final( CRC32_t *pulCRC ) { - *pulCRC ^= CRC32_XOR_VALUE; -} - -CRC32_t CRC32_GetTableEntry( unsigned int slot ) { - return pulCRCTable[ ( unsigned char )slot ]; -} - -void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *pBuffer, int nBuffer ) { - CRC32_t ulCrc = *pulCRC; - unsigned char *pb = ( unsigned char * )pBuffer; - unsigned int nFront; - int nMain; - -JustAfew: - - switch( nBuffer ) { - case 7: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 6: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 5: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 4: - ulCrc ^= *( CRC32_t * )pb; - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - *pulCRC = ulCrc; - return; - - case 3: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 2: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 1: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - - case 0: - *pulCRC = ulCrc; - return; - } - - // We may need to do some alignment work up front, and at the end, so that - // the main loop is aligned and only has to worry about 8 byte at a time. - // - // The low-order two bits of pb and nBuffer in total control the - // upfront work. - // - nFront = ( ( unsigned int )pb ) & 3; - nBuffer -= nFront; - switch( nFront ) { - case 3: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - case 2: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - case 1: - ulCrc = pulCRCTable[ *pb++ ^ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - } - - nMain = nBuffer >> 3; - while( nMain-- ) { - ulCrc ^= *( CRC32_t * )pb; - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc ^= *( CRC32_t * )( pb + 4 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - ulCrc = pulCRCTable[ ( unsigned char )ulCrc ] ^ ( ulCrc >> 8 ); - pb += 8; - } - - nBuffer &= 7; - goto JustAfew; -} diff --git a/tf2/checksum_crc.h b/tf2/checksum_crc.h deleted file mode 100644 index d95b4c5..0000000 --- a/tf2/checksum_crc.h +++ /dev/null @@ -1,30 +0,0 @@ -//========= Copyright Valve Corporation, All rights reserved. ============// -// -// Purpose: Generic CRC functions -// -// $NoKeywords: $ -//=============================================================================// -#ifndef CHECKSUM_CRC_H -#define CHECKSUM_CRC_H -#ifdef _WIN32 -#pragma once -#endif - -typedef unsigned int CRC32_t; - -void CRC32_Init( CRC32_t *pulCRC ); -void CRC32_ProcessBuffer( CRC32_t *pulCRC, const void *p, int len ); -void CRC32_Final( CRC32_t *pulCRC ); -CRC32_t CRC32_GetTableEntry( unsigned int slot ); - -inline CRC32_t CRC32_ProcessSingleBuffer( const void *p, int len ) { - CRC32_t crc; - - CRC32_Init( &crc ); - CRC32_ProcessBuffer( &crc, p, len ); - CRC32_Final( &crc ); - - return crc; -} - -#endif // CHECKSUM_CRC_H diff --git a/tf2/chl_createmove.cpp b/tf2/chl_createmove.cpp deleted file mode 100644 index 581ed25..0000000 --- a/tf2/chl_createmove.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include - -#include "hooks.h" -#include "mem.hpp" -#include "interfaces.h" -#include "ctx.hpp" -#include "input_system.hpp" -#include "math.h" -#include "settings.h" -#include "base_cheat.h" - -//YEA FUCK USING THIS EVEN THOUGH I HAVE IT RIGHT HERE - -//YEA VIVA LA REVOLUTION - -void __declspec( naked ) __stdcall hooks::hl_create_move_gate( int sequence_number, float input_sample_time, bool active ) { - __asm { - push ebp - mov ebp, esp - push ebx //push ebx (sendpacket) to the top of the stack - push esp //push the stack (with sendpacket on top) - push active - push input_sample_time - push sequence_number - call hl_create_move - pop ebx - pop ebp - ret 0xc - } -} - -void __fastcall hooks::hl_create_move( void* ecx_, void* edx_, int sequence_number, float input_sameple_frametime, bool active, byte& sendpacket ) { - static auto create_move_o = cl.m_chl->get_old_function< void( __fastcall* )( void*, void*, int, float, bool ) >( 21 ); - - user_cmd_t* ucmd = &cl.m_hl_input->m_pCommands[ sequence_number % MULTIPLAYER_BACKUP ]; - if( !ucmd ) - return; - - verified_cmd_t* verified_cmd = &cl.m_hl_input->m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ]; - if( !verified_cmd ) - return; - - // when switching to non automatic weapons, it will sometimes not shoot when aimbotting so we reset attack flag - bool is_switching_weapon = false; - if( cl.m_hl_input->m_hSelectedWeapon != -1 ) { - is_switching_weapon = true; - } - - cl.m_hl_input->CreateMove( sequence_number, input_sameple_frametime, active ); - //hl_create_move_o( ecx_, edx_, sequence_number, input_sample_time, active ); - - if( !ucmd->m_tick_count || !ucmd->m_cmd_nr ) - return; - - // FIX ME NAVE - // ok love - - byte* send_packet = &sendpacket; - - g_ctx.create_snapshot( ucmd ); - // soon g_cheat.m_identity( ); - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { - static int last_frame = cl.m_globals->framecount; - if( last_frame != cl.m_globals->framecount ) - g_ctx.m_has_fired_this_frame = false; - - last_frame = cl.m_globals->framecount; - - g_cheat.aim.sample_angle_data( ucmd->m_viewangles ); - g_cheat.prediction.run_prediction( ucmd ); - g_cheat.movement.update( ucmd ); - - g_cheat.aim.m_lagcomp( ucmd ); - g_cheat.aim.triggerbot( ucmd ); - - } - - - if( is_switching_weapon ) { - ucmd->m_buttons &= ~IN_ATTACK; - } - - //m_bIsValveDS - if( *( bool* )( c_base_player::get_game_rules( ) + 0x75 ) ) - g_settings.menu.anti_untrusted = true; - - ucmd->clamp( g_settings.menu.anti_untrusted ); - - // crc stuff works, no double steps coming from this - verified_cmd->m_cmd = *ucmd; - verified_cmd->m_crc = ucmd->get_check_sum( ); -} \ No newline at end of file diff --git a/tf2/clientmode_createmove.cpp b/tf2/clientmode_createmove.cpp deleted file mode 100644 index f86471e..0000000 --- a/tf2/clientmode_createmove.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "hooks.h" -#include "interfaces.h" -#include "search.h" -#include "base_cheat.h" -#include -#include "mem.hpp" -#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) -bool __fastcall hooks::create_move( void *ecx_, void *edx_, float input_sample_time, user_cmd_t *ucmd ) { - static auto create_move_o = cl.m_clientmode->get_old_function< decltype( hooks::create_move )* >( 21 ); - - if( cl.m_panic || !ucmd->m_cmd_nr || !ucmd->m_tick_count ) { - return create_move_o( ecx_, edx_, input_sample_time, ucmd ); - } - - // call from CInput::CreateMove, mimic what the engine does. - cl.m_engine( )->SetViewAngles( ucmd->m_viewangles ); - - // random_seed isn't generated in ClientMode::CreateMove yet (since CInput::CreateMove handles that), we must generate it ourselves. - ucmd->m_random_seed = math::md5_pseudorandom( ucmd->m_cmd_nr ) & 0x7fffffff; - - //get sendpacket off the stack - stack_t stack( get_baseptr( ) ); - byte *send_packet = stack.next( ).local< byte* >( 0x1C ); - - g_ctx.create_snapshot( ucmd ); - - cl.m_engine( )->SetViewAngles( ucmd->m_viewangles ); - g_ctx.calculate_tickbase( ); - - //bool* send_packet = ***get_ebp< bool**** >( ) - 0x1; - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { - static int last_frame = cl.m_globals->framecount; - if( last_frame != cl.m_globals->framecount ) - g_ctx.m_has_fired_this_frame = false; - - last_frame = cl.m_globals->framecount; - - g_cheat.aim.sample_angle_data( ucmd->m_viewangles ); - //g_cheat.prediction.run_prediction( ucmd ); - g_cheat.movement.update( ucmd ); - - g_cheat.aim.m_lagcomp( ucmd ); - g_cheat.aim.triggerbot( ucmd ); - - - - } - - - ucmd->clamp( ); - return false; -} \ No newline at end of file diff --git a/tf2/color.hpp b/tf2/color.hpp deleted file mode 100644 index 5ea9454..0000000 --- a/tf2/color.hpp +++ /dev/null @@ -1,278 +0,0 @@ -#pragma once -#include -#include - -//this is a fucking mess - -class fclr_t { - float R, G, B, A; -public: - fclr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } - - fclr_t( float r, float g, float b, float a ) : R( r ), G( g ), B( b ), A( a ) { } - - fclr_t( float r, float g, float b ) : R( r ), G( g ), B( b ), A( 255 ) { } - - float& r( ) { return R; } - float& g( ) { return G; } - float& b( ) { return B; } - float& a( ) { return A; } - - fclr_t& operator =( fclr_t& c ) { - R = c.r( ); - G = c.g( ); - B = c.b( ); - A = c.a( ); - return *this; - } - - fclr_t operator+( const fclr_t& v ) const { - return fclr_t( R + v.R, G + v.G, B + v.B, A + v.A ); - } - - explicit operator bool( ) const noexcept { - return ( R > 0 || G > 0 || B > 0 || A > 0 ); - } - - bool operator==( fclr_t& c ) const { - return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); - } -}; - -class clr_t { - uint8_t R, G, B, A; -public: - clr_t( ) : R( 0 ), G( 0 ), B( 0 ), A( 0 ) { } - - clr_t( uint8_t r, uint8_t g, uint8_t b, uint8_t a ) : R( r ), G( g ), B( b ), A( a ) { } - - clr_t( uint8_t r, uint8_t g, uint8_t b ) : R( r ), G( g ), B( b ), A( 255 ) { } - - uint8_t& r( ) { return R; } - uint8_t& g( ) { return G; } - uint8_t& b( ) { return B; } - uint8_t& a( ) { return A; } - - clr_t& operator =( clr_t& c ) { - R = c.r( ); - G = c.g( ); - B = c.b( ); - A = c.a( ); - return *this; - } - - clr_t operator+( const clr_t& v ) const { - return clr_t( R + v.R, G + v.G, B + v.B, A + v.A ); - } - - clr_t operator*( float f ) { - return clr_t( uint8_t( R * f ), uint8_t( G * f ), uint8_t( B * f ), A ); - } - - explicit operator bool( ) const noexcept { - return ( R > 0 || G > 0 || B > 0 || A > 0 ); - } - - float brightness( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - - float min = static_cast( R < G ? R : G ); - min = static_cast( min < B ? min : B ); - - float max = static_cast( R > G ? R : G ); - max = static_cast( max > B ? max : B ); - - out.v = max; - float delta = max - min; - if( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if( max > 0.0f ) { - out.s = delta / max; - } - else { - out.s = 0.0f; - out.h = NAN; - return out.h; - } - if( R >= max ) - out.h = static_cast( G - B ) / delta; - else if( G >= max ) - out.h = 2.0f + static_cast( B - R ) / delta; - else - out.h = 4.0f + static_cast( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if( out.h < 0.0f ) - out.h += 360.0f; - - return out.v; - } - - float saturation( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - - float min = static_cast( R < G ? R : G ); - min = static_cast( min < B ? min : B ); - - float max = static_cast( R > G ? R : G ); - max = static_cast( max > B ? max : B ); - - out.v = max; - float delta = max - min; - if( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if( max > 0.0f ) { - out.s = delta / max; - } - else { - out.s = 0.0f; - out.h = NAN; - return out.h; - } - if( R >= max ) - out.h = static_cast( G - B ) / delta; - else if( G >= max ) - out.h = 2.0f + static_cast( B - R ) / delta; - else - out.h = 4.0f + static_cast( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if( out.h < 0.0f ) - out.h += 360.0f; - - return out.s; - } - - static clr_t from_hsb( float hue, float saturation, float brightness ) { - float h = hue == 1.0f ? 0 : hue * 6.0f; - float f = h - ( int )h; - float p = brightness * ( 1.0f - saturation ); - float q = brightness * ( 1.0f - saturation * f ); - float t = brightness * ( 1.0f - ( saturation * ( 1.0f - f ) ) ); - - if( h < 1 ) { - return clr_t( - ( unsigned char )( brightness * 255 ), - ( unsigned char )( t * 255 ), - ( unsigned char )( p * 255 ) - ); - } - else if( h < 2 ) { - return clr_t( - ( unsigned char )( q * 255 ), - ( unsigned char )( brightness * 255 ), - ( unsigned char )( p * 255 ) - ); - } - else if( h < 3 ) { - return clr_t( - ( unsigned char )( p * 255 ), - ( unsigned char )( brightness * 255 ), - ( unsigned char )( t * 255 ) - ); - } - else if( h < 4 ) { - return clr_t( - ( unsigned char )( p * 255 ), - ( unsigned char )( q * 255 ), - ( unsigned char )( brightness * 255 ) - ); - } - else if( h < 5 ) { - return clr_t( - ( unsigned char )( t * 255 ), - ( unsigned char )( p * 255 ), - ( unsigned char )( brightness * 255 ) - ); - } - else { - return clr_t( - ( unsigned char )( brightness * 255 ), - ( unsigned char )( p * 255 ), - ( unsigned char )( q * 255 ) - ); - } - } - - static clr_t blend( clr_t first, clr_t second, float t ) { - return clr_t( - first.r( ) + static_cast< int >( t * ( second.r( ) - first.r( ) ) ), - first.g( ) + static_cast< int >( t * ( second.g( ) - first.g( ) ) ), - first.b( ) + static_cast< int >( t * ( second.b( ) - first.b( ) ) ), - first.a( ) + static_cast< int >( t * ( second.a( ) - first.a( ) ) ) - ); - } - - float hue( ) { - typedef struct { - float h, s, v; - } hsv; - hsv out; - float min, max, delta; - - min = static_cast< float >( R < G ? R : G ); - min = static_cast< float >( min < B ? min : B ); - - max = static_cast< float >( R > G ? R : G ); - max = static_cast< float >( max > B ? max : B ); - - out.v = max; - delta = max - min; - if( delta < 0.0010f ) { - out.s = 0.f; - out.h = 0.f; - return out.h; - } - if( max > 0.0f ) { - out.s = ( delta / max ); - } - else { - out.s = 0.0f; - out.h = ( float )NAN; - return out.h; - } - if( R >= max ) - out.h = static_cast< float >( G - B ) / delta; - else - if( G >= max ) - out.h = 2.0f + static_cast< float >( B - R ) / delta; - else - out.h = 4.0f + static_cast< float >( R - G ) / delta; - - out.h *= 60.0f; - out.h /= 360.f; - - if( out.h < 0.0f ) - out.h += 360.0f; - - return out.h; - } - - fclr_t to_fclr( ) { - return fclr_t{ R / 255.f, G / 255.f, B / 255.f, A / 255.f }; - } - - operator fclr_t( ) { - return this->to_fclr( ); - } - - bool operator==( clr_t& c ) const { - return ( R == c.r( ) && G == c.g( ) && B == c.b( ) ); - } -}; \ No newline at end of file diff --git a/tf2/con_alias.hpp b/tf2/con_alias.hpp deleted file mode 100644 index c943c24..0000000 --- a/tf2/con_alias.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include -#include "simple_settings.h" - -template< typename var_type = bool > -class con_alias : public ISetting { -public: - con_alias( hash_t hash, con_var< var_type >* var ) : - m_var( var ), - m_value( var_type{ } ), - m_name( hash ), - m_is_var( true ) { }; - - con_alias( hash_t hash ) : - m_name( hash ), - m_value( 0 ), - m_var( nullptr ), - m_is_var( false ) { }; - - con_alias( hash_t hash, var_type&& rhs ) : - m_name( hash ), - m_value( rhs ), - m_var( nullptr ), - m_is_var( false ) { }; - - virtual std::string get_string( ) override { - if( m_is_var ) - return m_var->get_string( ); - else - return std::to_string( m_value ); - } - - virtual void set_value( int value ) override { - set_value_internal( value ); - } - - virtual void set_value( float value ) override { - set_value_internal( value ); - } - - virtual void set_value( ulong_t value ) override { - set_value_internal( value ); - } - -private: - template < typename t > - void set_value_internal( t&& val ) { - if( m_is_var ) - m_var->set( val ); - else - m_value = ( var_type )( val ); - } - -private: - bool m_is_var; - hash_t m_name; - var_type m_value; - con_var< var_type >* m_var; -}; \ No newline at end of file diff --git a/tf2/con_fn.hpp b/tf2/con_fn.hpp deleted file mode 100644 index 3c06e9b..0000000 --- a/tf2/con_fn.hpp +++ /dev/null @@ -1,172 +0,0 @@ -#pragma once -#include - -#include "simple_settings.h" - -//KEEP THIS UP TO DATE!! -enum ConFnVarType_t { - TYPE_NULL = 0, - TYPE_FLOAT = 'F', - TYPE_STRING = 'S', - TYPE_INTEGER = 'D', - TYPE_HEX = 'X' -}; - -class con_fn_base { -public: - virtual bool execute( const char* str ) = 0; - virtual const char* get_syntax( ) = 0; - virtual hash_t get_hash( ) = 0; -}; - -class con_fn : public con_fn_base { -public: - con_fn( hash_t hash, std::function< void __cdecl( const char*, const char* ) > function, const char* syntax ) { - m_hash = hash; - m_function = function; - strcpy_s< 64 >( m_syntax, syntax ); - for( size_t i{ }; i < strlen( m_syntax ); ++i ) { - if( m_syntax[ i ] == '%' ) { - m_args++; - } - } - } - - static ConFnVarType_t get_var_type( size_t arg, const char* syntax ) { - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( syntax ); ++i ) { - if( syntax[ i ] == '%' ) { - if( cur_arg++ == arg ) { - return ( ConFnVarType_t )( syntax[ i + 1 ] ); - } - } - } - - return TYPE_NULL; - } - - template < typename t > - static t get_arg( const char* str, size_t arg_index, const char* syntax ) { - auto arg_type = get_var_type( arg_index, syntax ); - - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - if( cur_arg++ == arg_index ) { - size_t start = i + 1; - size_t end = strlen( str ); - for( size_t i2 = start; i2 < strlen( str ); ++i2 ) { - if( str[ i2 ] == ' ' ) { - end = i2; - break; - } - } - - std::string str( str + start, end - start ); - - char* end_ptr = ( char* )str.c_str( ) + end; - if constexpr( std::is_integral_v< t > ) { - auto radix = get_var_type( arg_index, syntax ) == TYPE_HEX ? 16 : 10; - return std::strtol( str.c_str( ), &end_ptr, radix ); - } - - if constexpr( std::is_floating_point_v< t > ) { - return std::strtof( str.c_str( ), &end_ptr ); - } - - return ( t )str.c_str( ); - } - } - } - - return t{ }; - } - - virtual const char* get_syntax( ) override { - return m_syntax; - } - - virtual hash_t get_hash( ) override { - return m_hash; - } - - ConFnVarType_t get_var_type( size_t arg ) { - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( m_syntax ); ++i ) { - if( m_syntax[ i ] == '%' ) { - if( cur_arg++ == arg ) { - return ( ConFnVarType_t )( m_syntax[ i + 1 ] ); - } - } - } - - return TYPE_NULL; - } - - //returns false on failed execution - virtual bool execute( const char* str ) override { - size_t arg_count{ }; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - arg_count++; - } - } - - if( arg_count != m_args ) { - return false; - } - - std::string pass_str( " " ); - - size_t cur_arg = 0; - for( size_t i{ }; i < strlen( str ); ++i ) { - if( str[ i ] == ' ' ) { - size_t end = strlen( str ); - for( size_t i2 = i + 2; i2 < strlen( str ); ++i2 ) { - if( str[ i2 ] == ' ' ) { - end = i2; - } - } - - char* end_ptr = ( char* )( str + i + end ); - switch( get_var_type( cur_arg ) ) { - case TYPE_FLOAT: { - pass_str += std::to_string( strtof( str + i, &end_ptr ) ); - break; - } - case TYPE_INTEGER: { - pass_str += std::to_string( strtol( str + i, &end_ptr, 10 ) ); - break; - } - case TYPE_HEX: { - char buf[ 10 ]; - sprintf_s< 10 >( buf, "%08x", strtol( str + i, &end_ptr, 16 ) ); - pass_str += buf; - break; - } - case TYPE_STRING: { - std::string add_str( str + i, end - i ); - pass_str += add_str; - break; - } - default: - return false; - } - - if( end != strlen( str ) ) { - pass_str += ' '; - } - ++cur_arg; - } - } - - m_function( pass_str.c_str( ), m_syntax ); - return true; - } - -private: - hash_t m_hash{ }; - size_t m_args{ }; - char m_syntax[ 64 ]{ }; - std::function< void( __cdecl )( const char*, const char* ) > m_function{ }; -}; \ No newline at end of file diff --git a/tf2/conditions.h b/tf2/conditions.h deleted file mode 100644 index 331ad6d..0000000 --- a/tf2/conditions.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once - -enum MoveType_t { - MOVETYPE_NONE = 0, - MOVETYPE_ISOMETRIC, - MOVETYPE_WALK, - MOVETYPE_STEP, - MOVETYPE_FLY, - MOVETYPE_FLYGRAVITY, - MOVETYPE_VPHYSICS, - MOVETYPE_PUSH, - MOVETYPE_NOCLIP, - MOVETYPE_LADDER, - MOVETYPE_OBSERVER, - MOVETYPE_CUSTOM, - - MOVETYPE_LAST = MOVETYPE_CUSTOM, - - MOVETYPE_MAX_BITS = 4, -}; - -enum TFConditions_t { - TFCond_Slowed = ( 1 << 0 ), - TFCond_Zoomed = ( 1 << 1 ), - TFCond_Disguising = ( 1 << 2 ), - TFCond_Disguised = ( 1 << 3 ), - TFCond_Cloaked = ( 1 << 4 ), - TFCond_Ubercharged = ( 1 << 5 ), - TFCond_TeleportedGlow = ( 1 << 6 ), - TFCond_Taunting = ( 1 << 7 ), - TFCond_UberchargeFading = ( 1 << 8 ), - TFCond_CloakFlicker = ( 1 << 9 ), - TFCond_Teleporting = ( 1 << 10 ), - TFCond_Kritzkrieged = ( 1 << 11 ), - TFCond_TmpDamageBonus = ( 1 << 12 ), - TFCond_DeadRingered = ( 1 << 13 ), - TFCond_Bonked = ( 1 << 14 ), - TFCond_Stunned = ( 1 << 15 ), - TFCond_Buffed = ( 1 << 16 ), - TFCond_Charging = ( 1 << 17 ), - TFCond_DemoBuff = ( 1 << 18 ), - TFCond_CritCola = ( 1 << 19 ), - TFCond_InHealRadius = ( 1 << 20 ), - TFCond_Healing = ( 1 << 21 ), - TFCond_OnFire = ( 1 << 22 ), - TFCond_Overhealed = ( 1 << 23 ), - TFCond_Jarated = ( 1 << 24 ), - TFCond_Bleeding = ( 1 << 25 ), - TFCond_DefenseBuffed = ( 1 << 26 ), - TFCond_Milked = ( 1 << 27 ), - TFCond_MegaHeal = ( 1 << 28 ), - TFCond_RegenBuffed = ( 1 << 29 ), - TFCond_MarkedForDeath = ( 1 << 30 ), - TFCond_NoHealingDamageBuff = ( 1 << 31 ), - - TFCondEx_SpeedBuffAlly = ( 1 << 0 ), - TFCondEx_HalloweenCritCandy = ( 1 << 1 ), - TFCondEx_CritCanteen = ( 1 << 2 ), - TFCondEx_CritDemoCharge = ( 1 << 3 ), - TFCondEx_CritHype = ( 1 << 4 ), - TFCondEx_CritOnFirstBlood = ( 1 << 5 ), - TFCondEx_CritOnWin = ( 1 << 6 ), - TFCondEx_CritOnFlagCapture = ( 1 << 7 ), - TFCondEx_CritOnKill = ( 1 << 8 ), - TFCondEx_RestrictToMelee = ( 1 << 9 ), - TFCondEx_DefenseBuffNoCritBlock = ( 1 << 10 ), - TFCondEx_Reprogrammed = ( 1 << 11 ), - TFCondEx_PyroCrits = ( 1 << 12 ), - TFCondEx_PyroHeal = ( 1 << 13 ), - TFCondEx_FocusBuff = ( 1 << 14 ), - TFCondEx_DisguisedRemoved = ( 1 << 15 ), - TFCondEx_MarkedForDeathSilent = ( 1 << 16 ), - TFCondEx_DisguisedAsDispenser = ( 1 << 17 ), - TFCondEx_Sapped = ( 1 << 18 ), - TFCondEx_UberchargedHidden = ( 1 << 19 ), - TFCondEx_UberchargedCanteen = ( 1 << 20 ), - TFCondEx_HalloweenBombHead = ( 1 << 21 ), - TFCondEx_HalloweenThriller = ( 1 << 22 ), - TFCondEx_BulletCharge = ( 1 << 26 ), - TFCondEx_ExplosiveCharge = ( 1 << 27 ), - TFCondEx_FireCharge = ( 1 << 28 ), - TFCondEx_BulletResistance = ( 1 << 29 ), - TFCondEx_ExplosiveResistance = ( 1 << 30 ), - TFCondEx_FireResistance = ( 1 << 31 ), - - TFCondEx2_Stealthed = ( 1 << 0 ), - TFCondEx2_MedigunDebuff = ( 1 << 1 ), - TFCondEx2_StealthedUserBuffFade = ( 1 << 2 ), - TFCondEx2_BulletImmune = ( 1 << 3 ), - TFCondEx2_BlastImmune = ( 1 << 4 ), - TFCondEx2_FireImmune = ( 1 << 5 ), - TFCondEx2_PreventDeath = ( 1 << 6 ), - TFCondEx2_MVMBotRadiowave = ( 1 << 7 ), - TFCondEx2_HalloweenSpeedBoost = ( 1 << 8 ), - TFCondEx2_HalloweenQuickHeal = ( 1 << 9 ), - TFCondEx2_HalloweenGiant = ( 1 << 10 ), - TFCondEx2_HalloweenTiny = ( 1 << 11 ), - TFCondEx2_HalloweenInHell = ( 1 << 12 ), - TFCondEx2_HalloweenGhostMode = ( 1 << 13 ), - TFCondEx2_Parachute = ( 1 << 16 ), - TFCondEx2_BlastJumping = ( 1 << 17 ), - - TFCond_MiniCrits = ( TFCond_Buffed | TFCond_CritCola ), - TFCond_IgnoreStates = ( TFCond_Ubercharged | TFCond_Bonked ), - TFCondEx_IgnoreStates = ( TFCondEx_PyroHeal ) -}; \ No newline at end of file diff --git a/tf2/console.cpp b/tf2/console.cpp deleted file mode 100644 index 121c57a..0000000 --- a/tf2/console.cpp +++ /dev/null @@ -1,324 +0,0 @@ -#include "console.hpp" -#include "interfaces.h" -#include "settings.h" -#include "d3d.hpp" -#include "ui_draw.h" - -std::shared_ptr< console > g_con = std::make_shared< console >( ); - - -void console::draw_text( int x, int y, bool greyed, const char* fmt, ... ) { - va_list args; - char buf[ 512 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 512 >( buf, fmt, args ); - __crt_va_end( args ); - - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, "%s", buf ); - //g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, greyed ? clr_t( 160, 160, 160 ) : clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); -} - -void console::draw_text( int x, int y, const char* fmt, ... ) { - va_list args; - char buf[ 512 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 512 >( buf, fmt, args ); - __crt_va_end( args ); - - g_d3d.draw_text< ALIGN_LEFT >( d3d::fonts.f_con, clr_t( 255, 255, 255 ), x, y, D3DFONTFLAG_DROPSHADOW, buf ); -} - -void console::draw_rect( int x, int y, int w, int h, clr_t col ) { - g_d3d.draw_filled_rect( col, x, y, w, h ); -} - -void console::register_alias( std::shared_ptr< ISetting >& alias ) { - m_aliases.push_back( alias ); -} - -void console::capture_command( ) { - float current_time = GetTickCount( ) * 0.001f; - size_t length = strlen( m_cur_cmd ); - - for( size_t i{ }; i < 0xfe; ++i ) { - if( m_input->is_key_pressed( i ) ) { - float delta_time = current_time - m_last_key_input[ i ]; - if( fabs( delta_time ) > 0.2f ) { - if( i == KEYS_BACK ) { - m_cur_cmd[ length - 1 ] = 0; - m_last_key_input[ i ] = current_time; - continue; - } - - m_key_states[ i ] = 0xf0; - wchar_t pressed_char; - const auto scan = MapVirtualKeyA( i, 2 ); - auto ret = ToAscii( i, scan, ( BYTE* )m_key_states, ( LPWORD )&pressed_char, 1 ); - - if( ret == 1 ) { - if( length < 200 ) { - m_cur_cmd[ length ] = ( char )( pressed_char ); - m_cur_cmd[ length + 1 ] = 0; - } - } - m_last_key_input[ i ] = current_time; - } - } - else { - m_last_key_input[ i ] = 0.f; - m_key_states[ i ] = 0; - } - } -} - -ISetting* console::find_var( hash_t var ) { - for( auto& it : data::holder_.get_nodes( ) ) { - auto setting = static_cast< ISetting* >( it ); - if( var == setting->get_hash( ) ) { - return setting; - } - } - - return nullptr; -} - -ISetting* console::find_alias( hash_t alias ) { - for( auto& it : m_aliases ) { - if( it->get_hash( ) == alias ) - return it.get( ); - } - - return nullptr; -} - -con_fn_base* console::find_fn( hash_t name ) { - for( auto& it : m_functions ) { - if( it->get_hash( ) == name ) { - return it; - } - } - - return nullptr; -} - -std::string console::impl_alias_str( std::string str ) { - for( size_t i{ }; i < str.length( ); ++i ) { - if( str[ i ] == ' ' && str[ i + 1 ] != ' ' ) { - size_t end = 0; - for( size_t i2{ i + 1 }; i2 < str.length( ); ++i ) { - if( str[ i2 ] == ' ' ) - end = i2; - } - - if( end ) { - std::string alias_str( str.c_str( ) + i, end - i ); - auto alias = find_alias( hash::fnv1a( alias_str ) ); - if( alias ) { - str.replace( alias_str.begin( ), alias_str.end( ), alias->get_string( ) ); - } - else { - g_con->log( xors( "couldnt find alias %s" ), alias_str.c_str( ) ); - } - } - } - } - - return str; -} - -void console::execute_command( const char* cmd ) { - if( !cmd[ 0 ] ) return; - std::string first_param( cmd, strlen( cmd ) ); - - size_t end{ }; - bool one_arg = true; - for( size_t i{ }; i < strlen( cmd ); ++i ) { - if( cmd[ i ] == ' ' ) { - first_param.resize( i ); - end = i; - one_arg = false; - break; - } - } - - if( one_arg ) { - first_param.resize( first_param.length( ) - 1 ); - } - - //find a command to execute - auto fn = find_fn( hash::fnv1a( first_param ) ); - if( fn ) { - //std::string alias_cmd = impl_alias_str( cmd ); - - if( !fn->execute( cmd ) ) { - log( xors( "invalid syntax" ) ); - } - return; - } - - //command not found, we're managing vars - if( !one_arg ) { - std::string second_param = ( cmd + end + 1 ); - bool is_floating_point = second_param.find( '.' ) != std::string::npos; - auto var = find_var( hash::fnv1a( first_param ) ); - - if( var ) { - auto setting_cast = static_cast< con_var< void* >* >( var ); - if( !setting_cast->is_integral( ) && !setting_cast->is_floating_point( ) ) { - auto value = std::strtol( second_param.c_str( ), 0, 16 ); - printf( xors( "value: %08x\n" ), value ); - var->set( value ); - } - - if( is_floating_point ) { - float value = std::strtof( second_param.c_str( ), 0 ); - var->set( value ); - } - else { - int value = std::strtol( second_param.c_str( ), 0, 10 ); - var->set( value ); - } - log( xors( "%s %s\n" ), first_param.c_str( ), second_param.c_str( ) ); - return; - } - } - - - log( xors( "unknown command: %s" ), first_param.c_str( ) ); -} - -void console::input( ) { - static int drag_x, drag_y; - int cursor_x, cursor_y; - int x = m_x, y = m_y; - bool clicked = m_input->is_key_pressed( KEYS_MOUSE1 ); - static bool is_hovered{ }; - m_input->get_cursor_pos( cursor_x, cursor_y ); - - auto is_top_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y && cursor_y < y + TOP_HEIGHT; - }; - - auto is_window_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y && cursor_y < y + HEIGHT; - }; - - auto is_bottom_hovered = [ &x, &y, - &cursor_x, &cursor_y ]( ) { - return cursor_x > x && cursor_x < x + WIDTH - && cursor_y > y + HEIGHT - TOP_HEIGHT - && cursor_y < y + HEIGHT; - }; - - if( clicked ) { - //m_consuming_input = is_window_hovered( ); - } - - if( !clicked && is_top_hovered( ) ) { - drag_x = cursor_x - m_x; - drag_y = cursor_y - m_y; - } - - if( clicked && is_hovered ) { - is_hovered = true; - m_x = cursor_x - drag_x; - m_y = cursor_y - drag_y; - } - else { - is_hovered = is_top_hovered( ); - } - - if( clicked ) { - m_active = is_bottom_hovered( ); - } - - if( m_active ) { - capture_command( ); - - static bool was_held{ }; - if( m_input->is_key_pressed( KEYS_RETURN ) ) { - if( !was_held ) { - execute_command( m_cur_cmd ); - m_cur_cmd[ 0 ] = 0; - } - was_held = true; - } - else was_held = false; - } -} - -void console::draw( ) { - if( !m_open ) { - m_consuming_input = false; - m_active = false; - return; - } - - static clr_t col = clr_t( 31, 31, 31, 255 ); - - input( ); - - RECT prev_rect{ }; - RECT new_rect{ m_x - 1, m_y - 1, - m_x + WIDTH + 1, m_y + HEIGHT + 1 }; - g_d3d.get_device( )->GetScissorRect( &prev_rect ); - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - draw_rect( m_x - 1, m_y - 1, WIDTH + 2, HEIGHT + 2, ui::ui_get_accent_col( ) ); - draw_rect( m_x, m_y, WIDTH, HEIGHT, col ); - draw_rect( m_x + 1, m_y, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); - - draw_rect( m_x + 1, m_y + HEIGHT - TOP_HEIGHT, WIDTH - 2, TOP_HEIGHT, clr_t( 41, 41, 41 ) ); - if( m_active ) { - draw_rect( m_x + 2, m_y + HEIGHT - TOP_HEIGHT + 1, WIDTH - 4, TOP_HEIGHT - 2, clr_t( 31, 31, 31 ) ); - auto fn = find_fn( hash::fnv1a( m_cur_cmd ) ); - if( fn ) { - std::string fn_str = m_cur_cmd; - fn_str += ' '; - fn_str += fn->get_syntax( ); - - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, "%s", fn_str.c_str( ) ); - } - - else { - auto var = find_var( hash::fnv1a( m_cur_cmd ) ); - if( var ) { - std::string var_str = m_cur_cmd; - var_str += ' '; - - var_str += var->get_string( ); - - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, true, var_str.c_str( ) ); - } - } - } - - std::string cur_cmd_str = m_cur_cmd; - if( m_active ) { - cur_cmd_str += '_'; - } - draw_text( m_x + 2, m_y + HEIGHT - TOP_HEIGHT / 2 - 3, cur_cmd_str.c_str( ) ); - draw_text( m_x + 3, m_y + TOP_HEIGHT / 2 - 3, xors( "console" ) ); - - int cur_y = m_y + HEIGHT - TOP_HEIGHT; - for( int i = m_logs.size( ) - 1; i >= 0; --i ) { - constexpr int LINE_HEIGHT = 14; - auto& log = m_logs.at( i ); - - if( cur_y - LINE_HEIGHT < m_y + TOP_HEIGHT ) { - m_logs.erase( m_logs.begin( ) + i ); - continue; - } - - draw_text( m_x + 2, cur_y -= LINE_HEIGHT, log.m_msg ); - } - - g_d3d.get_device( )->SetScissorRect( &prev_rect ); -} \ No newline at end of file diff --git a/tf2/console.hpp b/tf2/console.hpp deleted file mode 100644 index a16ad0f..0000000 --- a/tf2/console.hpp +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once -#include -#include -#include -#include - -#include "con_fn.hpp" -#include "con_alias.hpp" -#include "input_system.hpp" -#include "math.h" - -#pragma warning(disable: 4996) - -class console { -public: - console( ) { - m_input = std::make_shared< util::c_input_manager >( ); - } - - static constexpr size_t TOP_HEIGHT = 22; - static constexpr size_t WIDTH = 400; - static constexpr size_t HEIGHT = 450; - - bool m_consuming_input{ }; - bool m_active{ }; - bool m_open{ }; - - struct con_log { - float m_time; - char m_msg[ 128 ]; - }; - - void draw_text( int x, int y, bool greyed, const char* msg, ... ); - void draw_text( int x, int y, const char* msg, ... ); - void draw_rect( int x, int y, int w, int h, clr_t col ); - void register_fn( con_fn_base* fn ) { m_functions.push_back( fn ); } - - void input( ); - void draw( ); - - auto& get_input( ) { - return m_input; - } - - void log( const char* fmt, ... ) { - va_list args; - char buf[ 128 ]; - - __crt_va_start( args, fmt ); - vsprintf_s< 128 >( buf, fmt, args ); - __crt_va_end( args ); - - con_log log; - log.m_time = ( float )GetTickCount( ) * 0.001f; - memcpy( log.m_msg, buf, 128 ); - - print( "%s\n", buf ); - - m_logs.push_back( log ); - } - - void print( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); - } - - void create( ) { -#ifdef _DEBUG - AllocConsole( ); - freopen( xors( "CONOUT$" ), "w", stdout ); - const char* hack_names[ ] = { - xors( "dunk hack" ), - xors( "dweeb dumpster" ), - xors( "nova killER" ), - xors( "moms credit card" ), - xors( "dad hook" ), - xors( "retard remover" ), - xors( "slam hook" ), - xors( "swoosh" ), - xors( "retard remover" ), - xors( "shotgun hack" ), - }; - - SetConsoleTitleA( hack_names[ math::random_number( 0, 9 ) ] ); -#endif - game_console_print = reinterpret_cast< msg_t >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); - } - - void destroy( ) { -#ifdef _DEBUG - FreeConsole( ); - fclose( stdout ); -#endif - } - - std::vector< con_log > m_logs; - std::vector< con_fn_base* > m_functions; - std::vector< std::shared_ptr< ISetting > > m_aliases; - - void register_alias( std::shared_ptr< ISetting >& alias ); - - using msg_t = void( __cdecl* )( const char*, ... ); - msg_t game_console_print; - -private: - ISetting * find_var( hash_t name ); - ISetting* find_alias( hash_t name ); - - std::string impl_alias_str( std::string str ); - - con_fn_base* find_fn( hash_t name ); - void capture_command( ); - void execute_command( const char* cmd ); - - int m_x{ 100 }, m_y{ 100 }; - - char m_cur_cmd[ 200 ]{ }; - uint8_t m_key_states[ 256 ]{ }; - float m_last_key_input[ 256 ]{ }; - std::shared_ptr< util::c_input_manager > m_input; -}; - -extern std::shared_ptr< console > g_con; \ No newline at end of file diff --git a/tf2/console_log.hpp b/tf2/console_log.hpp deleted file mode 100644 index 4659ea1..0000000 --- a/tf2/console_log.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include -#include -#pragma warning(disable: 4996) - -class console { -public: - void create( ) { - AllocConsole( ); - freopen( "CONOUT$", "w", stdout ); - SetConsoleTitleA( "tf2internal" ); - - game_console_print = reinterpret_cast< decltype( game_console_print ) >( GetProcAddress( GetModuleHandleA( "tier0.dll" ), "Msg" ) ); - } - - void destroy( ) { - FreeConsole( ); - fclose( stdout ); - } - - __forceinline void log_function( const char* msg ) { - printf( "%s: %s", __FUNCTION__, msg ); - } - - using msg_t = void( __cdecl* )( const char*, ... ); - msg_t game_console_print; - - - static console *con( ) { - static console g_singleton_; - return &g_singleton_; - } -}; \ No newline at end of file diff --git a/tf2/ctx.cpp b/tf2/ctx.cpp deleted file mode 100644 index 37e192f..0000000 --- a/tf2/ctx.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "ctx.hpp" -#include "console.hpp" -#include "hooks.h" -#include "base_cheat.h" - -context::c_context g_ctx; - -NAMESPACE_REGION( context ) - -bool c_context::run_frame( ) { - m_local = cl.m_entlist( )->get_client_entity< c_base_player >( - cl.m_engine( )->GetLocalPlayer( ) ); - - return !!m_local; -} - - -//predicted servertime of player, use this for breaking lby etc -float c_context::pred_time( ) { - calculate_tickbase( ); - - return m_tickbase * cl.m_globals->interval_per_tick; -} - -//calculate tickbase depending on whether last ucmd was predicted -bool c_context::calculate_tickbase( ) { - if( !m_local ) { - return false; - } - - //get current tickbase - auto player_tickbase = m_local->get_tick_base( ); - - //disabled due to our engine pred being shit - m_tickbase = player_tickbase; - return true; - - if( m_snapshot.empty( ) ) { - m_tickbase = player_tickbase; - return false; - } - - //if cmd wasnt predicted increment tickbase - auto snap_cmd = &m_snapshot.front( ); - if( !snap_cmd->m_predicted ) { - if( !m_tickbase ) { - m_tickbase = player_tickbase; - } - - m_tickbase++; - snap_cmd->m_predicted = true; - } - else { - m_tickbase = player_tickbase; - } - - return true; -} - -bool c_context::precache_model( const char* model ) { - - auto cache_table = cl.m_string_table( )->FindTable( "modelprecache" ); - - if( !cache_table ) - return true; - - cl.m_modelinfo( )->FindOrLoadModel( model ); - - int string_index = cache_table->AddString( false, model ); - - if( string_index == -1 ) - return false; - - return true; -} - -//save snapshots of usercommands -bool c_context::create_snapshot( user_cmd_t* ucmd ) { - user_cmd_t ucmd_copy; - - while( m_snapshot.size( ) >= 64 ) { - m_snapshot.pop_back( ); - } - - if( !ucmd ) { - return false; - } - - memcpy( &ucmd_copy, - ucmd, - sizeof( ucmd_copy ) ); - - m_snapshot.push_front( ucmd_copy ); - return true; -} - -END_REGION \ No newline at end of file diff --git a/tf2/ctx.hpp b/tf2/ctx.hpp deleted file mode 100644 index 8243a19..0000000 --- a/tf2/ctx.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include - -#include "util.hpp" -#include "sdk.h" -NAMESPACE_REGION( context ) - -struct shot_data_t { - vec3_t m_local_pos; - vec3_t m_angle; - vec3_t m_enemy_pos; - int m_enemy_index; - int m_resolver_shots; - bool m_resolver_state; - bool m_missed{ true }; - struct { - vec3_t min; - vec3_t max; - float radius; - } m_hitbox; - int m_hitgroup; -}; - -//replacement to the old global:: namespace -class c_context { -public: - //run localplayer check, pointer, is valid etc - bool run_frame( ); - float pred_time( ); - - bool create_snapshot( user_cmd_t* ); - //calculate accurate tickbase - bool calculate_tickbase( ); - - user_cmd_t* get_last_cmd( ) { - return m_snapshot.empty( ) ? nullptr : &m_snapshot.front( ); - } - - bool precache_model( const char* model ); - -public: - c_base_player * m_local{ }; - int m_stage{ }; - //accurate tickbase - int m_tickbase{ }; - - bool m_drawing_postscreenspace{ }; - bool m_drawing_screneend{ }; - - bool m_has_fired_this_frame{ }; - - vec3_t m_thirdperson_angle{ }; - vec3_t m_last_origin{ }; - - float m_fov{ 90.f }; - -public: - - int m_last_shot_ack; - int m_last_shot; - std::array< shot_data_t, 128 > m_shot_data; -private: - std::deque< user_cmd_t > m_snapshot; -}; - -END_REGION - -extern context::c_context g_ctx; \ No newline at end of file diff --git a/tf2/d3d.cpp b/tf2/d3d.cpp deleted file mode 100644 index a35f613..0000000 --- a/tf2/d3d.cpp +++ /dev/null @@ -1,367 +0,0 @@ -#include "d3d.hpp" -#include "interfaces.h" -#include "math.h" -#include "d3d_sprite.hpp" - -d3d::c_renderer g_d3d; -d3d::d3d_fonts_t d3d::fonts; - - -//theres shit still left to add like drawrect etc but thats really simple -//this is the base and it works so thats ok -//love -// - nave - -// note - dex; probably better idea to batch all calls up into one DrawPrimitive / DrawIndexedPrimitive call each (if you want to have index buffers too) -// DrawPrimitiveUP for each object will slow stuff down eventually -// dont know much about DrawIndexedPrimitive myself but msdn suggests to use strips over anything else - -namespace d3d -{ - void d3d_fonts_t::release( ) { - if( f_12 ) f_12->Release( ); - if( f_esp_small ) f_esp_small->Release( ); - if( f_16 ) f_16->Release( ); - if( f_18 ) f_18->Release( ); - if( f_menu ) f_menu->Release( ); - if( f_con ) f_con->Release( ); - - f_12 = f_esp_small = f_16 = f_18 = f_menu = f_con = nullptr; - } - - void d3d_fonts_t::create( IDirect3DDevice9* device ) { - auto create_font = [ & ]( ID3DXFont** font, const char* font_name, int width, int size, int weight ) { - //auto wide_str = util::ascii_to_unicode( std::string( font_name ) ); - - auto code = D3DXCreateFontA( device, size, width, weight, 0, false, DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, font_name, font ); - - if( code < 0 ) throw xors( "fuck d3d" ); - }; - - create_font( &f_12, xors( "Verdana" ), 0, 12, 0 ); //change this idc - create_font( &f_esp_small, xors( "Tahoma" ), 0, 11, 500 ); - create_font( &f_16, xors( "Verdana" ), 0, 16, 0 ); - create_font( &f_18, xors( "Verdana" ), 0, 18, 900 ); - create_font( &f_menu, xors( "Tahoma" ), 0, 12, 300 ); - create_font( &f_con, xors( "Consolas" ), 6, 12, 300 ); - } - - - c_renderer::c_renderer( IDirect3DDevice9* device ) : m_device( device ) { - create_objects( ); - } - - bool c_renderer::run_frame( IDirect3DDevice9* device ) { - if( cl.m_panic ) { - return false; - } - - if( !m_device ) { - m_device = device; - create_objects( ); - return false; - } - - return true; - } - - c_renderer::~c_renderer( ) { - if( !m_device ) - return; - - invalidate_objects( ); - } - - void c_renderer::on_device_lost( ) { - if( !m_device ) - return; - - invalidate_objects( ); - } - - void c_renderer::on_device_reset( ) { - if( !m_device ) - return; - - create_objects( ); - } - - void c_renderer::invalidate_objects( ) { - if( m_block ) m_block->Release( ); - fonts.release( ); - //m_buffer->Release( ); - //m_sil_txt->Release( ); - //m_surface->Release( ); - } - - void c_renderer::create_objects( ) { - D3DVIEWPORT9 viewport; - - if( !m_device ) return; - - if( m_device->GetViewport( &viewport ) < 0 ) { - return; - } - - if( m_device->CreateStateBlock( D3DSBT_ALL, &m_block ) < 0 ) { - return; - } - - if( !m_block ) { - return; - } - - // get display size. - m_width = viewport.Width; - m_height = viewport.Height; - - fonts.create( m_device ); - - /*IDirect3DSurface9* backbuffer; - D3DSURFACE_DESC desc; - - m_device->GetRenderTarget( 0, &backbuffer ); - backbuffer->GetDesc( &desc ); - backbuffer->Release( ); - - m_device->CreateTexture( desc.Width, desc.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_sil_txt, 0 ); - m_sil_txt->GetSurfaceLevel( 0, &m_surface ); - - m_device->CreateVertexBuffer( 4 * 24, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &m_buffer, nullptr );*/ - } - - void c_renderer::begin( ) { - if( !m_device ) return; - - D3DVIEWPORT9 vp{ 0, 0, m_width, m_height, 0.f, 1.f }; - - m_device->SetViewport( &vp ); - - //m_sil_txt->GetSurfaceLevel( 0, &m_surface ); - - // set vertex stream declaration. - m_device->SetVertexShader( nullptr ); - m_device->SetPixelShader( nullptr ); - m_device->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE ); - m_block->Capture( ); - - m_device->SetRenderState( D3DRS_LIGHTING, false ); - m_device->SetRenderState( D3DRS_FOGENABLE, false ); - m_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); - m_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID ); - - m_device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); - m_device->SetRenderState( D3DRS_SCISSORTESTENABLE, true ); - m_device->SetRenderState( D3DRS_ZWRITEENABLE, false ); - m_device->SetRenderState( D3DRS_STENCILENABLE, false ); - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - m_device->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE, true ); - - m_device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); - m_device->SetRenderState( D3DRS_ALPHATESTENABLE, false ); - m_device->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, true ); - - //m_device->SetTexture( 0, nullptr ); - //m_device->SetTexture( 1, nullptr ); - //m_device->SetTexture( 2, nullptr ); - //m_device->SetTexture( 3, nullptr ); - m_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); - m_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); - m_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); - m_device->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); - m_device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); - m_device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); - m_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); - m_device->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - - m_device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); - m_device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_INVDESTALPHA ); - m_device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - m_device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE ); - m_device->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ); - - m_device->SetRenderState( D3DRS_SRGBWRITEENABLE, false ); - m_device->SetRenderState( D3DRS_COLORWRITEENABLE, 0xffffffff ); - /* commented out until further notice */ - //m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); - //m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); - // todo - dex; if we use textures, need to set those rendering states too - } - - void c_renderer::end( ) { - m_device->SetTexture( 0, nullptr ); - //m_device->SetTexture( 1, nullptr ); - //m_device->SetTexture( 2, nullptr ); - //m_device->SetTexture( 3, nullptr ); - m_block->Apply( ); - //m_block->Release( ); - } - - void c_renderer::draw_line( clr_t color, int x0, int y0, int x1, int y1 ) { - d3d_vertex_t v[ 2 ] = { - d3d_vertex_t( float( x0 ), float( y0 ), 1.0f, color ), //because fuck you thats why - d3d_vertex_t( float( x1 ), float( y1 ), 1.0f, color ) - }; //edit: do we wanna use z for shit? i mean we could for like menu stuff - //so it renders above other stuff - - m_device->DrawPrimitiveUP( D3DPT_LINELIST, 1, v, VERTEX_SIZE ); - } - - void c_renderer::draw_rect( clr_t color, int x, int y, int w, int h ) { - d3d_vertex_t v[ 5 ] = { - d3d_vertex_t( float( x ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y ), 1.0f, color ) - }; - - m_device->DrawPrimitiveUP( D3DPT_LINESTRIP, 4, v, VERTEX_SIZE ); - } - - void c_renderer::draw_filled_rect( clr_t color, int x, int y, int w, int h ) { - d3d_vertex_t v[ 6 ] = { - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y ), 1.0f, color ), - d3d_vertex_t( float( x ), float( y + h ), 1.0f, color ), - d3d_vertex_t( float( x + w ), float( y ), 1.0f, color ) - }; - - m_device->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 2, v, VERTEX_SIZE ); - } - - void c_renderer::draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ) { - d3d_vertex_t v[ 4 ]; - - switch( type ) { - case GRADIENT_VERTICAL: - v[ 0 ] = { float( x ), float( y ), 1.0f, start }; - v[ 1 ] = { float( x + w ), float( y ), 1.0f, start }; - v[ 2 ] = { float( x ), float( y + h ), 1.0f, end }; - v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; - break; - case GRADIENT_HORIZONTAL: - v[ 0 ] = { float( x ), float( y ), 1.0f, start }; - v[ 1 ] = { float( x + w ), float( y ), 1.0f, end }; - v[ 2 ] = { float( x ), float( y + h ), 1.0f, start }; - v[ 3 ] = { float( x + w ), float( y + h ), 1.0f, end }; - break; - } - - //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, &v, VERTEX_SIZE ); - //m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_circle( clr_t color, int x, int y, int r, int res ) { - constexpr float PI = 3.1415926f; - const float step = PI * 2.0f / float( res ); - - int point_x = x + r, - point_y = y - r, - point_x_o{ }, - point_y_o{ }; - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - for( int i{ }; i <= res; i++ ) { - float theta = float( i ) * step; - - point_x = x + ( int )( r * cos( theta ) ); - point_y = y - ( int )( r * sin( theta ) ); - if( i ) draw_line( color, point_x, point_y, point_x_o, point_y_o ); - point_x_o = point_x; - point_y_o = point_y; - } - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_filled_circle( clr_t color, int x, int y, int r, int res ) { - d3d_vertex_t* v = ( d3d_vertex_t* )_alloca( VERTEX_SIZE * res ); - const float step = M_PI * 2.0f / res; - - for( size_t i{ }; i < res; ++i ) { - float theta = i * step; - float x_off = r * cos( theta ); - float y_off = r * sin( theta ); - - v[ i ] = { float( x + x_off ), float( y + y_off ), 1.0f, color }; - } - - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, true ); - m_device->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, res, v, VERTEX_SIZE ); - m_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, false ); - } - - void c_renderer::draw_text( ID3DXFont* font, clr_t color, - int x, int y, FontAlign_t align, long font_flags, const char* msg ) { - if( !msg ) return; - if( !font ) return; - - auto d3d_black = D3DCOLOR_RGBA( 0, 0, 0, color.a( ) ); - auto d3d_color = D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ); - auto buf = msg; - - if( align == ALIGN_CENTER ) x -= get_text_width( font, font_flags, msg ) / 2; - if( align == ALIGN_RIGHT ) x -= get_text_width( font, font_flags, msg ); - RECT rect{ x, y, 1000, 100 }; - - ulong_t flags = DT_NOCLIP | DT_LEFT | DT_TOP; - - if( font_flags & D3DFONTFLAG_DROPSHADOW ) { - RECT r{ rect }; - r.left++; - r.top++; - font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); - } - - if( font_flags & D3DFONTFLAG_OUTLINE ) { - for( int i = -1; i < 2; i++ ) { - if( !i ) continue; - RECT r{ rect }; - r.left += i; - r.top += i; - font->DrawTextA( 0, buf, -1, &r, flags, d3d_black ); - } - } - - font->DrawTextA( 0, buf, -1, &rect, flags, d3d_color ); - } - - int c_renderer::get_text_width( ID3DXFont* font, long flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - RECT temp{ }; - font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); - - return ( temp.right - temp.left ); - } - - int c_renderer::get_text_height( ID3DXFont* font, long flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - RECT temp{ }; - font->DrawTextA( 0, buffer, -1, &temp, DT_CALCRECT, 0x0 ); - - return ( temp.bottom - temp.top ); - } -} diff --git a/tf2/d3d.hpp b/tf2/d3d.hpp deleted file mode 100644 index a927ee3..0000000 --- a/tf2/d3d.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef D3D_HEADER //stackoverflow my niggas -#define D3D_HEADER - -#include -#include - -#pragma comment(lib, "d3d9.lib") -#pragma comment(lib, "d3dx9.lib") -#pragma warning(disable : 4838) - -#include -#include - -#include -#pragma comment(lib, "dwmapi.lib") - -#include "util.hpp" -#include "color.hpp" -#include "renderer.hpp" - -enum D3DFontFlags_t { - D3DFONTFLAG_OUTLINE = 0x10, - D3DFONTFLAG_DROPSHADOW = 0x100, -}; - -enum GradientType_t; - -namespace features { class c_chams; } - -//suck my dick -namespace d3d -{ - struct d3d_vertex_t { - d3d_vertex_t( float x, float y, float z, clr_t color ) : - m_x( x ), m_y( y ), m_z( z ), - m_clr( D3DCOLOR_RGBA( color.r( ), color.g( ), color.b( ), color.a( ) ) ) { }; - - d3d_vertex_t( ) : m_x( 0.f ), m_y( 0.f ), m_z( 0.f ), - m_clr( 0 ) { }; - - float m_x; - float m_y; - float m_z; - float m_rhw = 0.f; - D3DCOLOR m_clr; - }; - - constexpr size_t VERTEX_SIZE = sizeof( d3d_vertex_t ); - - struct d3d_fonts_t { - void release( ); - void create( IDirect3DDevice9* device ); - - ID3DXFont* f_12; - ID3DXFont* f_esp_small; - ID3DXFont* f_16; - ID3DXFont* f_18; - ID3DXFont* f_menu; - ID3DXFont* f_con; - }; - - class c_renderer { - private: - friend class features::c_chams; - - IDirect3DDevice9* m_device; - IDirect3DStateBlock9* m_block; - IDirect3DTexture9* m_chams; - IDirect3DTexture9* m_sil_txt; - IDirect3DVertexBuffer9* m_buffer; - IDirect3DSurface9* m_surface; - public: - ulong_t m_width; - ulong_t m_height; - - c_renderer( ) { }; - c_renderer( IDirect3DDevice9* device ); - ~c_renderer( ); - - void on_device_lost( ); - void on_device_reset( ); - auto get_device( ) { - return m_device; - } - - bool run_frame( IDirect3DDevice9* device ); - void begin( ); - void end( ); - - void draw_line( clr_t color, int x0, int y0, int x1, int y1 ); - void draw_rect( clr_t color, int x, int y, int w, int h ); - void draw_filled_rect( clr_t color, int x, int y, int w, int h ); - void draw_circle( clr_t color, int x, int y, int r, int steps = 48 ); - void draw_filled_circle( clr_t color, int x, int y, int r, int steps = 48 ); - void draw_gradient( clr_t start, clr_t end, int x, int y, int w, int h, GradientType_t type ); - - void draw_text( ID3DXFont* font, clr_t color, int x, int y, FontAlign_t align, long font_flags, const char* msg ); - - template < FontAlign_t align = ALIGN_CENTER > - void draw_text( ID3DXFont* font, clr_t color, int x, int y, long font_flags, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 2048 ); - va_list list{ }; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 2048, msg, list ); - __crt_va_end( list ); - - draw_text( font, color, x, y, align, font_flags, buffer ); - } - - int get_text_width( ID3DXFont* font, long font_flags, const char* msg, ... ); - int get_text_height( ID3DXFont* font, long font_flags, const char* msg, ... ); - - private: - void invalidate_objects( ); - void create_objects( ); - }; - - extern d3d::d3d_fonts_t fonts; -} - -extern d3d::c_renderer g_d3d; - -#endif \ No newline at end of file diff --git a/tf2/d3d_sprite.cpp b/tf2/d3d_sprite.cpp deleted file mode 100644 index 37bbde1..0000000 --- a/tf2/d3d_sprite.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "d3d_sprite.hpp" - -std::vector< d3d::c_sprite* > d3d::sprites; - -namespace icons -{ - d3d::c_sprite sprite_legit; - d3d::c_sprite sprite_rage; - d3d::c_sprite sprite_visuals; - d3d::c_sprite sprite_misc; - d3d::c_sprite sprite_config; -} \ No newline at end of file diff --git a/tf2/d3d_sprite.hpp b/tf2/d3d_sprite.hpp deleted file mode 100644 index 0d26f4c..0000000 --- a/tf2/d3d_sprite.hpp +++ /dev/null @@ -1,159 +0,0 @@ -#pragma once -#include "d3d.hpp" -#include "console.hpp" - - -namespace d3d -{ - class c_sprite; - - extern std::vector< c_sprite* > sprites; - - class c_sprite { - public: - size_t m_width{ }; - size_t m_height{ }; - - IDirect3DDevice9* m_device{ }; - ID3DXSprite* m_sprite{ }; - IDirect3DTexture9* m_texture{ }; - const byte* m_image{ }; - size_t m_image_size{ }; - - - public: - c_sprite::c_sprite( ) { - sprites.push_back( this ); - } - - c_sprite::~c_sprite( ) { - on_reset( ); - } - - void init( IDirect3DDevice9* device, const byte* file, size_t img_size, size_t width, size_t height ) { - m_width = width; - m_height = height; - - m_device = device; - m_image = file; - m_image_size = img_size; - } - - void begin( IDirect3DDevice9* device ) { - m_device = device; - - if( !m_device ) { - return; - } - - if( !m_sprite ) - D3DXCreateSprite( m_device, &m_sprite ); - - if( !m_texture ) { - auto hr = D3DXCreateTextureFromFileInMemoryEx( - m_device, m_image, m_image_size, - m_width, m_height, D3DX_DEFAULT, 0, D3DFMT_A8B8G8R8, - D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, - 0, 0, &m_texture ); - } - - if( m_sprite ) - m_sprite->Begin( D3DXSPRITE_DONOTMODIFY_RENDERSTATE ); - } - - void end( ) { - if( !m_device || !m_sprite || !m_texture ) return; - m_sprite->End( ); - } - - void on_reset( ) { - if( m_sprite && m_device && m_texture ) { - m_sprite->OnLostDevice( ); - m_texture->Release( ); - m_texture = nullptr; - } - } - - void on_reset_end( ) { - if( m_sprite && m_device ) - m_sprite->OnResetDevice( ); - } - - void draw( int x, int y, clr_t color ) { - if( !m_device || !m_texture || !m_sprite ) { - return; - } - - const float scale = 0.8f; - - ulong_t - fill_mode, - adaptive_tess, - dest_blend, - cull, - stencil, - vertex_blend, - alpha_test; - - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, &fill_mode ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, &adaptive_tess ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, &dest_blend ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, &cull ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, &stencil ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, &vertex_blend ); - m_device->GetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, &alpha_test ); - - ulong_t mag_filter; - ulong_t min_filter; - m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, &mag_filter ); - m_device->GetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, &min_filter ); - - m_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC ); - m_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC ); - - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, D3DFILL_SOLID ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, D3DCULL_NONE ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, D3DLINECAPS_ALPHACMP ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, D3DMULTISAMPLE_4_SAMPLES ); - - - ulong_t hr; - D3DXVECTOR2 center = D3DXVECTOR2( ( m_width * scale ) * 0.5f, ( m_height * scale ) * 0.5f ); - D3DXVECTOR2 trans = D3DXVECTOR2( x - center.x, y - center.y ); - D3DXMATRIX matrix; - D3DXVECTOR2 scale_vec( scale, scale ); - D3DXMatrixTransformation2D( &matrix, 0, 0.f, &scale_vec, ¢er, 0.f, &trans ); - - hr = m_sprite->SetTransform( &matrix ); - - auto d3dcolor = D3DCOLOR_RGBA( color.r( ), - color.g( ), color.b( ), color.a( ) ); - hr = m_sprite->Draw( m_texture, 0, 0, 0, d3dcolor ); - - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_MULTISAMPLEANTIALIAS, false ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_FILLMODE, fill_mode ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ENABLEADAPTIVETESSELLATION, adaptive_tess ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_DESTBLEND, dest_blend ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_CULLMODE, cull ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_STENCILENABLE, stencil ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_VERTEXBLEND, vertex_blend ); - m_device->SetRenderState( D3DRENDERSTATETYPE::D3DRS_ALPHATESTENABLE, alpha_test ); - - m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MAGFILTER, mag_filter ); - //m_device->SetSamplerState( 0, D3DSAMPLERSTATETYPE::D3DSAMP_MINFILTER, min_filter ); - } - }; -} - -namespace icons -{ - extern d3d::c_sprite sprite_legit; - extern d3d::c_sprite sprite_rage; - extern d3d::c_sprite sprite_visuals; - extern d3d::c_sprite sprite_misc; - extern d3d::c_sprite sprite_config; -} \ No newline at end of file diff --git a/tf2/directx.cpp b/tf2/directx.cpp deleted file mode 100644 index db2d62f..0000000 --- a/tf2/directx.cpp +++ /dev/null @@ -1,233 +0,0 @@ -#include - -#include "settings.h" -#include "hooks.h" -#include "ui.h" -#include "base_cheat.h" -#include "ctx.hpp" -#include "mem.hpp" - -//this shit prolly barely working rn like a toddler trying to walk but hes actually mentally slow and 25 - -using namespace d3d; - -float ui::get_tf2_frametime( ) { - return cl.m_frametime; -} - -void on_d3d( IDirect3DDevice9* device ) { - constexpr float step = 1.0f / 2.f; - constexpr float fade_step = 1.0f / 7.f; - static float anim_time{ }; - static bool flip{ }; - static int anim_progress{ }; - - static bool sprites_init{ }; - if( !sprites_init ) { - ui::setup_sprites( device ); - sprites_init = true; - } - - if( g_settings.misc.hide_from_obs ) - g_cheat.visuals( ); - - if( g_settings.menu.open ) { - if( anim_time >= 0.95f ) { - flip = true; - } - if( anim_time <= 0.05f ) { - flip = false; - } - - if( flip ) - anim_time -= fade_step * ui::ui_get_frametime( ); - else - anim_time += fade_step * ui::ui_get_frametime( ); - - anim_time = std::clamp( anim_time, 0.f, 1.0f ); - - ui::set_animtime( anim_time ); - - anim_progress += ui::ui_get_frametime( ) * step * 255; - anim_progress = std::clamp( anim_progress, 0, 50 ); - g_d3d.draw_filled_rect( clr_t( 0, 0, 0, anim_progress ), - 0, 0, g_d3d.m_width, g_d3d.m_height ); - - ui::render( ); - } - else { - anim_progress = 0; - } -} - -long __stdcall hooks::d3d::draw( IDirect3DDevice9* device, D3DPRIMITIVETYPE type, int v_index, uint32_t min_index, uint32_t num_vert, uint32_t start_index, uint32_t prim_count ) { - static auto draw_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::draw ) >( 82 ); - - static auto ret_addr = pattern::first_code_match( GetModuleHandleA( xors( "studiorender.dll" ) ), xors( "EB 1F FF 75 F0" ), -8 ); - - std::function< void*( void** ) > find_ent; - find_ent = [ & ]( void** ebp ) -> void* { - if( !ebp ) - return nullptr; - - void** next = *( void*** )( ebp ); - if( ( uintptr_t )( ebp[ 1 ] ) == ret_addr ) - return next[ 4 ]; - - return find_ent( next ); - }; - - c_base_player* ent = ( c_base_player* )( find_ent( ( void** )( get_baseptr( ) ) ) ); - if( g_ctx.m_local && !!ent && ent->m_iHealth( ) > 0 && ent->m_iTeamNum( ) > 1 && g_settings.visuals.chams.enabled( ) && g_settings.misc.hide_from_obs ) { - //g_cheat.chams.d3d_render_chams( ent, type, v_index, min_index, num_vert, start_index, prim_count ); - return true; - } - - auto result = draw_o( device, type, v_index, min_index, num_vert, start_index, prim_count ); - return result; -} - -long __stdcall hooks::d3d::end_scene( IDirect3DDevice9* device ) { - static auto end_scene_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::end_scene ) >( 42 ); - if( cl.m_panic ) return end_scene_o( device ); - - static uintptr_t return_address = 0; - static uintptr_t gameoverlay_return_address = 0; - - if( !return_address ) { - return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( !gameoverlay_return_address ) { - MEMORY_BASIC_INFORMATION info; - VirtualQuery( _ReturnAddress( ), &info, sizeof( MEMORY_BASIC_INFORMATION ) ); - - char mod[ MAX_PATH ]; - GetModuleFileNameA( ( HMODULE )info.AllocationBase, mod, MAX_PATH ); - - if( strstr( mod, xors( "gameoverlay" ) ) ) - gameoverlay_return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( return_address != ( uintptr_t )( _ReturnAddress( ) ) && !g_settings.misc.hide_from_obs ) - return end_scene_o( device ); - - if( gameoverlay_return_address != ( uintptr_t )( _ReturnAddress( ) ) && g_settings.misc.hide_from_obs ) - return end_scene_o( device ); - - if( !cl.m_panic && g_d3d.run_frame( device ) ) { - for( auto& it : ::d3d::sprites ) - it->begin( device ); - g_d3d.begin( ); - - //if( g_settings.misc.hide_from_obs ) - //g_cheat.m_chams.d3d_render_textures( ); - - on_d3d( device ); - - std::chrono::high_resolution_clock timer; - static auto last = timer.now( ); - auto now = timer.now( ); - - std::chrono::duration< double > delta = now - last; - last = timer.now( ); - - cl.m_frametime = delta.count( ); - - if( !g_con->m_logs.empty( ) && g_settings.menu.logs_enable ) { - auto& logs = g_con->m_logs; - float time = ( float )GetTickCount( ) * 0.001f; - - auto data = logs.data( ); - - int cur_pos = 2; - for( int i = logs.size( ) - 1; i >= 0; --i ) { - if( cur_pos > g_d3d.m_height - 200 ) { - cur_pos -= 8; - break; - } - - float delta = time - data[ i ].m_time; - if( delta >= 5.0f ) { - break; - } - - clr_t col( 255, 255, 255 ); - if( delta > 4.f ) col.a( ) *= ( 6.f - delta ); - - g_d3d.draw_text< ALIGN_RIGHT >( fonts.f_con, col, g_d3d.m_width - 5, cur_pos, D3DFONTFLAG_DROPSHADOW, data[ i ].m_msg ); - cur_pos += 10; - } - } - - if( g_settings.menu.open || g_con->m_open ) { - ui::ui_draw_cursor( ); - } - - for( auto& it : ::d3d::sprites ) - it->end( ); - g_d3d.end( ); - } - - return end_scene_o( device ); -} - -long __stdcall hooks::d3d::present( IDirect3DDevice9* device, RECT* source, RECT* dest, HWND wnd_override, RGNDATA* reg ) { - static auto present_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::present ) >( 17 ); - - static uintptr_t return_address = 0; - if( !return_address ) { - return_address = ( uintptr_t )( _ReturnAddress( ) ); - } - - if( return_address && return_address != ( uintptr_t )( _ReturnAddress( ) ) ) - return present_o( device, source, dest, wnd_override, reg ); - - if( g_d3d.run_frame( device ) ) { - g_d3d.begin( ); - if( g_settings.misc.watermark ) { - static std::string str( xors( "moneybot | " ) ); - static bool transform = false; - if( !transform ) { - str += __DATE__; - str += ", "; - str += __TIME__; - - std::transform( str.begin( ), str.end( ), str.begin( ), - [ ]( char c ) { return ::tolower( c ); } ); - transform = true; - } - - g_d3d.draw_text< ALIGN_RIGHT >( ::d3d::fonts.f_menu, - ui::ui_get_text_col( ), g_d3d.m_width - 10, 8, - D3DFONTFLAG_DROPSHADOW, str.c_str( ) ); - } - - g_con->draw( ); - if( ( g_settings.menu.open || g_con->m_open ) && !g_settings.misc.hide_from_obs ) { - ui::ui_draw_cursor( ); - } - g_d3d.end( ); - } - - return present_o( device, source, dest, wnd_override, reg ); -} - -long __stdcall hooks::d3d::reset( IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params ) { - static auto reset_o = cl.m_d3d->get_old_function< decltype( &hooks::d3d::reset ) >( 16 ); - if( cl.m_panic ) { - return reset_o( device, params ); - } - - for( auto& sprite : ::d3d::sprites ) - sprite->on_reset( ); - - g_d3d.on_device_lost( ); - long result = reset_o( device, params ); - g_d3d.on_device_reset( ); - - for( auto& sprite : ::d3d::sprites ) - sprite->on_reset_end( ); - - return result; -} \ No newline at end of file diff --git a/tf2/do_post_screen_space_effects.cpp b/tf2/do_post_screen_space_effects.cpp deleted file mode 100644 index 401b05e..0000000 --- a/tf2/do_post_screen_space_effects.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "hooks.h" -#include "base_cheat.h" -#include "ctx.hpp" -//whore? -bool __fastcall hooks::do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ) { - static auto old_fn = cl.m_clientmode->get_old_function< decltype( &do_post_screen_space_effects ) >( 39 ); - - g_ctx.m_drawing_postscreenspace = true; - if( cl.m_engine( )->IsInGame( ) && g_ctx.m_local ) { - } - - bool ret = old_fn( ecx_, 0, setup ); - g_ctx.m_drawing_postscreenspace = false; - - return ret; -} \ No newline at end of file diff --git a/tf2/draw_model_execute.cpp b/tf2/draw_model_execute.cpp deleted file mode 100644 index 1191a90..0000000 --- a/tf2/draw_model_execute.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include "hooks.h" -#include "base_cheat.h" -#include "ctx.hpp" -#include "util.hpp" -#include "settings.h" -//this is so ugly dont even look at it - -//gets called once per frame for every entity -void __fastcall hooks::draw_model_execute( IVModelInfo* ecx_, void* edx_, void* render_ctx, const DrawModelState_t& state, const ModelRenderInfo_t& info, matrix3x4* bone_to_world ) { - static auto dme_o = cl.m_model_render->get_old_function< decltype( &hooks::draw_model_execute ) >( 19 ); - - if( cl.m_panic || g_ctx.m_drawing_postscreenspace || g_settings.misc.hide_from_obs ) - return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - - bool draw = true; - IMaterial* mat = g_settings.visuals.chams.flat( ) ? g_cheat.chams.m_materials.m_chams_flat : g_cheat.chams.m_materials.m_chams; - auto model_name = cl.m_modelinfo( )->GetModelName( info.m_model ); - auto local_index = cl.m_engine( )->GetLocalPlayer( ); - int local_team = 0; - if( g_ctx.m_local ) - local_team = g_ctx.m_local->m_iTeamNum( ); - int team = 0; - bool is_player = false; - - if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index == local_index ) { - if( g_settings.misc.thirdperson( ) && g_ctx.m_local && g_ctx.m_local->is_valid( ) - && g_ctx.m_local->m_bIsScoped( ) ) { - float clr[ ] = { 1.0f, 1.0f, 1.0f }; - cl.m_render_view( )->SetColorModulation( clr ); - cl.m_render_view( )->SetBlend( 0.5f ); - return dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - } - } - - if( strstr( model_name, xors( "models/player" ) ) && info.m_entity_index ) { - auto player = cl.m_entlist( )->get_client_entity< c_base_player >( info.m_entity_index ); - - if( player && player->is_valid( ) ) { - is_player = true; - team = player->m_iTeamNum( ); - - if( g_settings.visuals.chams.enabled ) { - if( g_settings.visuals.chams.ignore_z && !g_ctx.m_drawing_screneend && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) - draw = false; - else if( !g_settings.visuals.chams.ignore_z && ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ) { - fclr_t clr = team != local_team ? g_settings.visuals.chams.color_visible_enemy( ) : g_settings.visuals.chams.color_visible_friendly( ); - - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - g_cheat.chams.m_materials.force_material( mat, clr ); - dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); - cl.m_model_render( )->ForcedMaterialOverride( nullptr ); - cl.m_render_view( )->SetBlend( 1.0f ); - draw = false; - } - } - - } - } - - if( g_settings.misc.transparent_vm && strstr( model_name, xors( "weapon" ) ) ) { - if( strstr( model_name, xors( "arms" ) ) ) { - cl.m_render_view( )->SetBlend( 0.6f ); - } - } - - if( is_player ) { - - if( g_settings.legit.backtracking_visualize( ) && ( team != local_team || g_settings.legit.friendlies( ) ) ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( info.m_entity_index ); - auto record = g_cheat.aim.m_lagcomp.find_best_record( info.m_entity_index ); - { //idk - auto records = g_cheat.aim.m_lagcomp.get_records( info.m_entity_index ); - if( records.size( ) ) { - for( auto& it : util::reverse_iterator( records ) ) { - if( it.is_valid( ) ) { - record = ⁢ - break; - } - } - } - } - - if( record && record->is_valid( ) && record->m_position.dist_to( ent->get_hitbox_position( 0 ) ) > 5.f ) { - fclr_t clr_hid = team != local_team ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); - - float backup_modulation[ 3 ]{ }; - bool backup_ignorez = false; - float backup_blend = 1.0f; - - backup_blend = cl.m_render_view( )->GetBlend( ); - cl.m_render_view( )->GetColorModulation( backup_modulation ); - - //BIG ROFL - if( backup_modulation[ 0 ] == clr_hid.r( ) && backup_modulation[ 1 ] == clr_hid.g( ) && backup_modulation[ 2 ] == clr_hid.b( ) - && backup_blend == clr_hid.a( ) ) { - backup_ignorez = true; - } - - if( !backup_ignorez ) { - auto flat_mat = g_cheat.chams.m_materials.m_chams_flat.m_mat; - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, g_settings.visuals.chams.ignore_z && g_settings.visuals.chams.enabled ); - g_cheat.chams.m_materials.force_material( g_cheat.chams.m_materials.m_chams_flat, g_settings.legit.backtracking_col( ) ); - dme_o( ecx_, edx_, render_ctx, state, info, record->m_matrix ); - flat_mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - } - - cl.m_render_view( )->SetBlend( backup_blend ); - cl.m_render_view( )->SetColorModulation( backup_modulation ); - cl.m_model_render( )->ForcedMaterialOverride( g_settings.visuals.chams.enabled( ) && - ( team != local_team || g_settings.visuals.chams.friendlies( ) ) ? mat : nullptr ); - - if( draw ) { - dme_o( ecx_, edx_, render_ctx, state, info, bone_to_world ); - draw = false; - } - } - } - } - - if( draw ) { - dme_o( ecx_, 0, render_ctx, state, info, bone_to_world ); - } - - cl.m_model_render( )->ForcedMaterialOverride( nullptr ); -} \ No newline at end of file diff --git a/tf2/dt_common.h b/tf2/dt_common.h deleted file mode 100644 index 7f86418..0000000 --- a/tf2/dt_common.h +++ /dev/null @@ -1,127 +0,0 @@ -#pragma once - -#define MAX_DATATABLES 1024 // must be a power of 2. -#define MAX_DATATABLE_PROPS 4096 -#define MAX_ARRAY_ELEMENTS 2048 // a network array should have more that 1024 elements - -#define HIGH_DEFAULT -121121.121121f - -#define BITS_FULLRES -1 // Use the full resolution of the type being encoded. -#define BITS_WORLDCOORD -2 // Encode as a world coordinate. - -#define DT_MAX_STRING_BITS 9 -#define DT_MAX_STRING_BUFFERSIZE (1 << DT_MAX_STRING_BITS) // Maximum length of a string that can be sent. - -#define STRINGBUFSIZE(className, varName) sizeof(((className*)0)->varName) - -// Gets the size of a variable in a class. -#define PROPSIZEOF(className, varName) sizeof(((className*)0)->varName) - -// SendProp::m_Flags. -enum SPROP_FLAGS -{ - SPROP_UNSIGNED = (1<<0), // Unsigned integer data. - SPROP_COORD = (1<<1), // If this is set, the float/vector is treated like a world coordinate. - // Note that the bit count is ignored in this case. - SPROP_NOSCALE = (1<<2), // For floating point, don't scale into range, just take value as is. - SPROP_ROUNDDOWN = (1<<3), // For floating point, limit high value to range minus one bit unit - SPROP_ROUNDUP = (1<<4), // For floating point, limit low value to range minus one bit unit - SPROP_NORMAL = (1<<5), // If this is set, the vector is treated like a normal (only valid for vectors), - SPROP_EXCLUDE = (1<<6), // This is an exclude prop (not excludED, but it points at another prop to be excluded),. - SPROP_XYZE = (1<<7), // Use XYZ/Exponent encoding for vectors. - SPROP_INSIDEARRAY = (1<<8), // This tells us that the property is inside an array, so it shouldn't be put into the - // flattened property list. Its array will point at it when it needs to. - SPROP_PROXY_ALWAYS_YES = (1<<9), // Set for datatable props using one of the default datatable proxies like - // SendProxy_DataTableToDataTable that always send the data to all clients. - SPROP_CHANGES_OFTEN = (1<<10), // this is an often changed field, moved to head of sendtable so it gets a small index - SPROP_IS_A_VECTOR_ELEM = (1<<11), // Set automatically if SPROP_VECTORELEM is used. - SPROP_COLLAPSIBLE = (1<<12), // Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer - // (ie: for all automatically-chained base classes),. - // In this case, it can get rid of this SendPropDataTable altogether and spare the - // trouble of walking the hierarchy more than necessary. - SPROP_COORD_MP = (1<<13), // Like SPROP_COORD, but special handling for multiplayer games - SPROP_COORD_MP_LOWPRECISION = (1<<14), // Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5 - SPROP_COORD_MP_INTEGRAL = (1<<15), // SPROP_COORD_MP, but coordinates are rounded to integral boundaries - - // This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are - // m_flAnimTime and m_flSimulationTime. MODs shouldn't need to mess with this probably - SPROP_ENCODED_AGAINST_TICKCOUNT = (1<<16), -}; - -#define SPROP_NUMFLAGBITS_NETWORKED 16 - -#define SPROP_NUMFLAGBITS 17 - -// Used by the SendProp and RecvProp functions to disable debug checks on type sizes. -#define SIZEOF_IGNORE -1 - -// Use this to extern send and receive datatables, and reference them. -#define EXTERN_SEND_TABLE(tableName) namespace tableName {extern SendTable g_SendTable;} -#define EXTERN_RECV_TABLE(tableName) namespace tableName {extern RecvTable g_RecvTable;} - -#define REFERENCE_SEND_TABLE(tableName) tableName::g_SendTable -#define REFERENCE_RECV_TABLE(tableName) tableName::g_RecvTable - -class SendProp; - -typedef enum -{ - DPT_Int = 0, - DPT_Float, - DPT_Vector, - DPT_VectorXY, - DPT_String, - DPT_Array, // An array of the base types (can't be of datatables). - DPT_DataTable, - DPT_NUMSendPropTypes -} SendPropType; - -/* -class DVariant -{ -public: - union - { - float m_Float; - long m_Int; - char* m_pString; - void* m_pData; // For DataTables. - float m_Vector[3]; - }; - - SendPropType m_Type; - - DVariant() { m_Type = DPT_Float; } - - DVariant(float val) - { - m_Type = DPT_Float; - m_Float = val; - } -}; -*/ - -struct DVariant { - union { - float m_Float; - long m_Int; - char* m_pString; - void* m_pData; - float m_Vector[3]; - __int64 m_Int64; - }; - - int m_Type; -}; - -// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1. -inline int NumBitsForCount(int nMaxElements) -{ - int nBits = 0; - while(nMaxElements > 0) - { - ++nBits; - nMaxElements >>= 1; - } - return nBits; -} diff --git a/tf2/dt_recv.h b/tf2/dt_recv.h deleted file mode 100644 index 47f945b..0000000 --- a/tf2/dt_recv.h +++ /dev/null @@ -1,479 +0,0 @@ -#pragma once - -#include "dt_common.h" - -#define ADDRESSPROXY_NONE -1 - -class RecvTable; -class RecvProp; - -/* -// This is passed into RecvProxy functions. -class CRecvProxyData -{ -public: - const RecvProp* m_pRecvProp; // The property it's receiving. - DVariant m_Value; // The value given to you to store. - int m_iElement; // Which array element you're getting. - int m_ObjectID; // The object being referred to. -}; -*/ - -struct CRecvProxyData { - const RecvProp* m_pRecvProp; - DVariant m_Value; - int m_iElement; - int m_ObjectID; -}; - -//----------------------------------------------------------------------------- -// pStruct = the base structure of the datatable this variable is in (like C_BaseEntity) -// pOut = the variable that this this proxy represents (like C_BaseEntity::m_SomeValue). -// -// Convert the network-standard-type value in m_Value into your own format in pStruct/pOut. -//----------------------------------------------------------------------------- -typedef void (*RecvVarProxyFn)(const CRecvProxyData* pData, void* pStruct, void* pOut); - -// ------------------------------------------------------------------------ // -// ArrayLengthRecvProxies are optionally used to get the length of the -// incoming array when it changes. -// ------------------------------------------------------------------------ // -typedef void (*ArrayLengthRecvProxyFn)(void* pStruct, int objectID, int currentArrayLength); - -// NOTE: DataTable receive proxies work differently than the other proxies. -// pData points at the object + the recv table's offset. -// pOut should be set to the location of the object to unpack the data table into. -// If the parent object just contains the child object, the default proxy just does *pOut = pData. -// If the parent object points at the child object, you need to dereference the pointer here. -// NOTE: don't ever return null from a DataTable receive proxy function. Bad things will happen. -typedef void (*DataTableRecvVarProxyFn)(const RecvProp* pProp, void** pOut, void* pData, int objectID); - -// This is used to fork over the standard proxy functions to the engine so it can -// make some optimizations. -class CStandardRecvProxies -{ -public: - CStandardRecvProxies(); - - RecvVarProxyFn m_Int32ToInt8; - RecvVarProxyFn m_Int32ToInt16; - RecvVarProxyFn m_Int32ToInt32; - RecvVarProxyFn m_FloatToFloat; - RecvVarProxyFn m_VectorTovec3_t; -}; - -extern CStandardRecvProxies g_StandardRecvProxies; - -class CRecvDecoder; - -class RecvProp -{ - // This info comes from the receive data table. -public: - RecvProp(); - - void InitArray(int nElements, int elementStride); - - int GetNumElements() const; - void SetNumElements(int nElements); - - int GetElementStride() const; - void SetElementStride(int stride); - - int GetFlags() const; - - const char* GetName() const; - SendPropType GetType() const; - - RecvTable* GetDataTable() const; - void SetDataTable(RecvTable* pTable); - - RecvVarProxyFn GetProxyFn() const; - void SetProxyFn(RecvVarProxyFn fn); - - DataTableRecvVarProxyFn GetDataTableProxyFn() const; - void SetDataTableProxyFn(DataTableRecvVarProxyFn fn); - - int GetOffset() const; - void SetOffset(int o); - - // Arrays only. - RecvProp* GetArrayProp() const; - void SetArrayProp(RecvProp* pProp); - - // Arrays only. - void SetArrayLengthProxy(ArrayLengthRecvProxyFn proxy); - ArrayLengthRecvProxyFn GetArrayLengthProxy() const; - - bool IsInsideArray() const; - void SetInsideArray(); - - // Some property types bind more data to the prop in here. - const void* GetExtraData() const; - void SetExtraData(const void* pData); - - // If it's one of the numbered "000", "001", etc properties in an array, then - // these can be used to get its array property name for debugging. - const char* GetParentArrayPropName(); - void SetParentArrayPropName(const char* pArrayPropName); - -public: - const char* m_pVarName; - SendPropType m_RecvType; - int m_Flags; - int m_StringBufferSize; - - bool m_bInsideArray; // Set to true by the engine if this property sits inside an array. - - // Extra data that certain special property types bind to the property here. - const void* m_pExtraData; - - // If this is an array (DPT_Array). - RecvProp* m_pArrayProp; - ArrayLengthRecvProxyFn m_ArrayLengthProxy; - - RecvVarProxyFn m_ProxyFn; - DataTableRecvVarProxyFn m_DataTableProxyFn; // For RDT_DataTable. - - RecvTable* m_pDataTable; // For RDT_DataTable. - int m_Offset; - - int m_ElementStride; - int m_nElements; - - // If it's one of the numbered "000", "001", etc properties in an array, then - // these can be used to get its array property name for debugging. - const char* m_pParentArrayPropName; -}; - -class RecvTable -{ -public: - using PropType = RecvProp; - - RecvTable(); - RecvTable(RecvProp* pProps, int nProps, const char* pNetTableName); - ~RecvTable(); - - void Construct(RecvProp* pProps, int nProps, const char* pNetTableName); - - int GetNumProps(); - RecvProp* GetProp(int i); - - const char* GetName(); - - // Used by the engine while initializing array props. - void SetInitialized(bool bInitialized); - bool IsInitialized() const; - - // Used by the engine. - void SetInMainList(bool bInList); - bool IsInMainList() const; - -public: - // Properties described in a table. - RecvProp* m_pProps; - int m_nProps; - - // The decoder. NOTE: this covers each RecvTable AND all its children (ie: its children - // will have their own decoders that include props for all their children). - CRecvDecoder* m_pDecoder; - - const char* m_pNetTableName; // The name matched between client and server. - -private: - bool m_bInitialized; - bool m_bInMainList; -}; - -inline int RecvTable::GetNumProps() -{ - return m_nProps; -} - -inline RecvProp* RecvTable::GetProp(int i) -{ - // Assert( i >= 0 && i < m_nProps ); - return &m_pProps[i]; -} - -inline const char* RecvTable::GetName() -{ - return m_pNetTableName; -} - -inline void RecvTable::SetInitialized(bool bInitialized) -{ - m_bInitialized = bInitialized; -} - -inline bool RecvTable::IsInitialized() const -{ - return m_bInitialized; -} - -inline void RecvTable::SetInMainList(bool bInList) -{ - m_bInMainList = bInList; -} - -inline bool RecvTable::IsInMainList() const -{ - return m_bInMainList; -} - -#define RECVINFO(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) -#define RECVINFO_NAME(varName, remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName) -#define RECVINFO_STRING(varName) #varName, offsetof(currentRecvDTClass, varName), STRINGBUFSIZE(currentRecvDTClass, varName) -#define RECVINFO_BASECLASS(tableName) RecvPropDataTable("this", 0, 0, &REFERENCE_RECV_TABLE(tableName)) -#define RECVINFO_ARRAY(varName) #varName, offsetof(currentRecvDTClass, varName), sizeof(((currentRecvDTClass*)0)->varName[0]), sizeof(((currentRecvDTClass*)0)->varName)/sizeof(((currentRecvDTClass*)0)->varName[0]) - -// Just specify the name and offset. Used for strings and data tables. -#define RECVINFO_NOSIZE(varName) #varName, offsetof(currentRecvDTClass, varName) -#define RECVINFO_DT(varName) RECVINFO_NOSIZE(varName) -#define RECVINFO_DTNAME(varName,remoteVarName) #remoteVarName, offsetof(currentRecvDTClass, varName) - -void RecvProxy_FloatToFloat(const CRecvProxyData* pData, void* pStruct, void* pOut); -void RecvProxy_VectorToVector(const CRecvProxyData* pData, void* pStruct, void* pOut); -void RecvProxy_QuaternionToQuaternion(const CRecvProxyData* pData, void* pStruct, void* pOut); -void RecvProxy_Int32ToInt8(const CRecvProxyData* pData, void* pStruct, void* pOut); -void RecvProxy_Int32ToInt16(const CRecvProxyData* pData, void* pStruct, void* pOut); -void RecvProxy_StringToString(const CRecvProxyData* pData, void* pStruct, void* pOut); -void RecvProxy_Int32ToInt32(const CRecvProxyData* pData, void* pStruct, void* pOut); - -// StaticDataTable does *pOut = pData. -void DataTableRecvProxy_StaticDataTable(const RecvProp* pProp, void** pOut, void* pData, int objectID); - -// PointerDataTable does *pOut = *((void**)pData) (ie: pData is a pointer to the object to decode into). -void DataTableRecvProxy_PointerDataTable(const RecvProp* pProp, void** pOut, void* pData, int objectID); - -RecvProp RecvPropFloat( - const char* pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_FloatToFloat -); - -RecvProp RecvPropVector( - const char* pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_VectorToVector -); - -// This is here so the RecvTable can look more like the SendTable. -#define RecvPropQAngles RecvPropVector - -RecvProp RecvPropInt( - const char* pVarName, - int offset, - int sizeofVar = SIZEOF_IGNORE, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. - int flags = 0, - RecvVarProxyFn varProxy = 0 -); - -RecvProp RecvPropString( - const char* pVarName, - int offset, - int bufferSize, - int flags = 0, - RecvVarProxyFn varProxy = RecvProxy_StringToString -); - -RecvProp RecvPropDataTable( - const char* pVarName, - int offset, - int flags, - RecvTable* pTable, - DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable -); - -RecvProp RecvPropArray3( - const char* pVarName, - int offset, - int sizeofVar, - int elements, - RecvProp pArrayProp, - DataTableRecvVarProxyFn varProxy = DataTableRecvProxy_StaticDataTable -); - -// Use the macro to let it automatically generate a table name. You shouldn't -// ever need to reference the table name. If you want to exclude this array, then -// reference the name of the variable in varTemplate. -RecvProp InternalRecvPropArray( - const int elementCount, - const int elementStride, - const char* pName, - ArrayLengthRecvProxyFn proxy -); - -// -// Use this if you want to completely manage the way the array data is stored. -// You'll need to provide a proxy inside varTemplate that looks for 'iElement' -// to figure out where to store the specified element. -// -#define RecvPropVirtualArray( arrayLengthProxy, maxArrayLength, varTemplate, propertyName ) \ - varTemplate, \ - InternalRecvPropArray( \ - maxArrayLength, \ - 0, \ - #propertyName, \ - arrayLengthProxy \ - ) - -// Use this and pass the array name and it will figure out the count and stride automatically. -#define RecvPropVariableLengthArray( arrayLengthProxy, varTemplate, arrayName ) \ - varTemplate, \ - InternalRecvPropArray( \ - sizeof(((currentRecvDTClass*)0)->arrayName) / PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ - PROPSIZEOF(currentRecvDTClass, arrayName[0]), \ - #arrayName, \ - arrayLengthProxy \ - ) - -// Use this and pass the array name and it will figure out the count and stride automatically. -#define RecvPropArray( varTemplate, arrayName ) \ - RecvPropVariableLengthArray( 0, varTemplate, arrayName ) - -// Use this one to specify the element count and stride manually. -#define RecvPropArray2( arrayLengthProxy, varTemplate, elementCount, elementStride, arrayName ) \ - varTemplate, \ - InternalRecvPropArray( elementCount, elementStride, #arrayName, arrayLengthProxy ) - -// ---------------------------------------------------------------------------------------- // -// Inlines. -// ---------------------------------------------------------------------------------------- // - -inline void RecvProp::InitArray(int nElements, int elementStride) -{ - m_RecvType = DPT_Array; - m_nElements = nElements; - m_ElementStride = elementStride; -} - -inline int RecvProp::GetNumElements() const -{ - return m_nElements; -} - -inline void RecvProp::SetNumElements(int nElements) -{ - m_nElements = nElements; -} - -inline int RecvProp::GetElementStride() const -{ - return m_ElementStride; -} - -inline void RecvProp::SetElementStride(int stride) -{ - m_ElementStride = stride; -} - -inline int RecvProp::GetFlags() const -{ - return m_Flags; -} - -inline const char* RecvProp::GetName() const -{ - return m_pVarName; -} - -inline SendPropType RecvProp::GetType() const -{ - return m_RecvType; -} - -inline RecvTable* RecvProp::GetDataTable() const -{ - return m_pDataTable; -} - -inline void RecvProp::SetDataTable(RecvTable* pTable) -{ - m_pDataTable = pTable; -} - -inline RecvVarProxyFn RecvProp::GetProxyFn() const -{ - return m_ProxyFn; -} - -inline void RecvProp::SetProxyFn(RecvVarProxyFn fn) -{ - m_ProxyFn = fn; -} - -inline DataTableRecvVarProxyFn RecvProp::GetDataTableProxyFn() const -{ - return m_DataTableProxyFn; -} - -inline void RecvProp::SetDataTableProxyFn(DataTableRecvVarProxyFn fn) -{ - m_DataTableProxyFn = fn; -} - -inline int RecvProp::GetOffset() const -{ - return m_Offset; -} - -inline void RecvProp::SetOffset(int o) -{ - m_Offset = o; -} - -inline RecvProp* RecvProp::GetArrayProp() const -{ - return m_pArrayProp; -} - -inline void RecvProp::SetArrayProp(RecvProp* pProp) -{ - m_pArrayProp = pProp; -} - -inline void RecvProp::SetArrayLengthProxy(ArrayLengthRecvProxyFn proxy) -{ - m_ArrayLengthProxy = proxy; -} - -inline ArrayLengthRecvProxyFn RecvProp::GetArrayLengthProxy() const -{ - return m_ArrayLengthProxy; -} - -inline bool RecvProp::IsInsideArray() const -{ - return m_bInsideArray; -} - -inline void RecvProp::SetInsideArray() -{ - m_bInsideArray = true; -} - -inline const void* RecvProp::GetExtraData() const -{ - return m_pExtraData; -} - -inline void RecvProp::SetExtraData(const void* pData) -{ - m_pExtraData = pData; -} - -inline const char* RecvProp::GetParentArrayPropName() -{ - return m_pParentArrayPropName; -} - -inline void RecvProp::SetParentArrayPropName(const char* pArrayPropName) -{ - m_pParentArrayPropName = pArrayPropName; -} diff --git a/tf2/emit_sound.cpp b/tf2/emit_sound.cpp deleted file mode 100644 index b311b84..0000000 --- a/tf2/emit_sound.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "base_cheat.h" -#include "hooks.h" -#include "settings.h" - -//eenie meenie miney moe i kepy this in here incase i wanted to ever do something with it i could fix it to match tf2's emitsound but yknow what? i prolly wont watadearhiugaer sorry i spilt water on my desk and smashed my face into the keyboard - -void __fastcall hooks::emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, - const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, - const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ) { - static auto emit_sound_o = cl.m_engine_sound->get_old_function< decltype( &hooks::emit_sound ) >( 5 ); - - if( !cl.m_panic && origin ) { - auto entity = cl.m_entlist( )->get_client_entity< c_base_player >( ent ); - if( entity && entity->is_player( ) && entity->ce( )->is_dormant( ) && - ent >= 0 && ent <= 64 ) - g_cheat.visuals.update_position( ent, *origin ); - } - - if( strstr( sample, xors( "weapon" ) ) && g_settings.misc.no_sound ) - volume = 0.f; - - emit_sound_o( ecx_, 0, filter, ent, channel, sound, hash, sample, - volume, attenuation, seed, flags, pitch, origin, direction, - origins, update_pos, sound_time, speaker_entry ); -} \ No newline at end of file diff --git a/tf2/extra.cpp b/tf2/extra.cpp deleted file mode 100644 index 894c957..0000000 --- a/tf2/extra.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "base_cheat.h" -#include "ctx.hpp" -#include "input_system.hpp" -#include "math.h" -#include "hooks.h" -#include "interfaces.h" -#undef min -#include "extra.h" -#include "settings.h" - -namespace features -{ - //crash too lazy to fix rn will do , who wants to fly out of their body and become their own guardian angel anyway? - void c_extra::thirdperson( ) { - if( !g_ctx.m_local ) - return; - - static bool enabled = false; - static bool toggle = true; - static bool key_held = false; - - - if( g_input.is_key_pressed( ( VirtualKeys_t )g_settings.misc.thirdperson_key( ) ) ) { - if( !key_held ) { - toggle ^= 1; - } - key_held = true; - } - else { - key_held = false; - } - - if( !g_settings.misc.thirdperson || !toggle ) { - if( enabled ) { - cl.m_hl_input->m_fCameraInThirdPerson = false; - enabled = false; - } - - return; - } - - vec3_t viewangles{ }; - if( g_ctx.m_local->is_alive( ) ) { - cl.m_engine( )->GetViewAngles( viewangles ); - cl.m_hl_input->m_fCameraInThirdPerson = true; - cl.m_hl_input->m_vecCameraOffset = vec3_t( viewangles.x, viewangles.y, 150.0f ); - - float cam_hull_offset{ 16.f }; - - vec3_t cam_hull_min( -cam_hull_offset, -cam_hull_offset, -cam_hull_offset ); - vec3_t cam_hull_max( cam_hull_offset, cam_hull_offset, cam_hull_offset ); - vec3_t cam_forward, origin = g_ctx.m_local->get_eye_pos( ); - - cam_forward = math::angle_vectors( vec3_t( viewangles.x, viewangles.y, 0.f ) ); - - CTraceFilterWorldAndPropsOnly filter; - Ray_t ray; - CGameTrace tr; - - ray.Init( origin, origin - ( cam_forward * 150.f ), cam_hull_min, cam_hull_max ); - - cl.m_trace( )->trace_ray( ray, MASK_SOLID & ~CONTENTS_MONSTER, &filter, &tr ); - cl.m_hl_input->m_vecCameraOffset.z = 150.f * tr.fraction; - - enabled = true; - } - else if( cl.m_entlist( )->get_entity_from_handle< c_base_player >( g_ctx.m_local->m_hObserverTarget( ) ) ) { - cl.m_hl_input->m_fCameraInThirdPerson = false; - g_ctx.m_local->m_iObserverMode( ) = 5; - } - } - - //hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh - void c_extra::float_ragdolls( ) { - for( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i ); - if( !ent ) continue; - - auto client_class = ent->get_client_class( ); - if( !client_class ) continue; - - int class_id = client_class->m_class_id; - if( class_id != CTFRagdoll ) - return; - - ent->as< c_base_player >( )->m_vecRagdollVelocity( ) *= -1; - } - } - - -} \ No newline at end of file diff --git a/tf2/extra.h b/tf2/extra.h deleted file mode 100644 index d25131c..0000000 --- a/tf2/extra.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include -#include -#include "IVEngineClient.h" -#include "vector.hpp" -#include "IClientMode.h" -namespace features -{ - class c_extra { - - public: - void thirdperson( ); - - void float_ragdolls( ); - - void disable_post_processing( ); - - private: - - }; -} \ No newline at end of file diff --git a/tf2/factory.cpp b/tf2/factory.cpp deleted file mode 100644 index f8dfd42..0000000 --- a/tf2/factory.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "factory.h" -#ifndef IFACE_DLLMAIN -#include "fnv.hpp" - -#include - -NAMESPACE_REGION( tf2 ) -NAMESPACE_REGION( interfaces ) - -//iterate all exports inside of a module and find createinterface -uintptr_t c_interface_manager::find_createinterface( void* module_ ) { - IMAGE_DOS_HEADER* dos_header; - IMAGE_NT_HEADERS* nt_headers; - uintptr_t export_address; - IMAGE_EXPORT_DIRECTORY* export_dir; - const char* export_name; - uintptr_t* names; - uintptr_t* funcs; - uint16_t* ords; - uint32_t export_hash; - - dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); - nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); - - //find addresses of functions from nt headers - export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; - export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); - - if( !export_dir->NumberOfFunctions ) - return uintptr_t{ }; - - names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); - funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); - - ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); - - if( names && funcs && ords ) { - //iterate the exports - for( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { - export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); - export_hash = hash::fnv1a( export_name ); - - if( export_hash == fnv( "CreateInterface" ) ) { - return uintptr_t( module_ ) + funcs[ ords[ i ] ]; - } - } - } - - return uintptr_t{ }; -} - -c_interface_manager::c_interface_manager( ) { - auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); - auto peb = teb->ProcessEnvironmentBlock; - - auto root = &peb->Ldr->InMemoryOrderModuleList; - //iterate module list - for( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { - PLDR_DATA_TABLE_ENTRY data_table; - HMODULE module_base; - uintptr_t create_interface_export; - uintptr_t create_interface_; - uintptr_t* list_iterator_ptr; - interface_iterator_t* list_iterator; - - data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); - module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); - create_interface_export = find_createinterface( module_base ); - - if( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { - continue; - } - - //find the createinterface function - create_interface_ = follow_createinterface_export( create_interface_export ); - if( !is_createinterface_fn( create_interface_ ) ) { - continue; - } - - //find the list iterator - list_iterator_ptr = find_list_ptr( create_interface_ ); - - //iterate the interface list - for( list_iterator = reinterpret_cast< interface_iterator_t* >( - list_iterator_ptr ); - !!list_iterator; - list_iterator = list_iterator->m_next - ) { - std::string name( list_iterator->m_name ); - std::string module_name( util::unicode_to_ascii( - std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); - - uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); - - size_t version = [ & ]( ) { - std::string ret( name ); - ret.erase( std::remove_if( ret.begin( ), ret.end( ), - [ & ]( int i ) { return !::isdigit( i ); } - ), ret.end( ) ); - return atoi( ret.c_str( ) ); - }( ); - - m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); - } - } -} - -END_REGION -END_REGION -#endif \ No newline at end of file diff --git a/tf2/factory.h b/tf2/factory.h deleted file mode 100644 index d1e8027..0000000 --- a/tf2/factory.h +++ /dev/null @@ -1,155 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include "vmt.h" -#include "util.hpp" -#include "x86.hpp" -#include "console.hpp" -#include "strings.hpp" -//IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran -#ifndef _DEBUG -#define IFACE_DLLMAIN -#endif - -#ifdef IFACE_DLLMAIN -#include "iface_dllmain_impl.hpp" -#else - -NAMESPACE_REGION( tf2 ) - -namespace interfaces -{ - struct interface_iterator_t { - void* m_create_fn; - char* m_name; - - interface_iterator_t* m_next; - }; - - inline auto follow_createinterface_export( uintptr_t export_ ) { - /* - .text:006F5F00 CreateInterface proc near - .text:006F5F00 push ebp - .text:006F5F01 mov ebp, esp - .text:006F5F03 pop ebp - .text:006F5F04 jmp sub_6F5E90 - */ - uintptr_t jmp = export_ + 0x4; - uintptr_t jmp_target = jmp + *( uintptr_t* )( jmp + 0x1 ) + 0x5; - - return jmp_target; - } - - inline auto find_list_ptr( uintptr_t createinterface ) { - /* - .text:006F5E90 push ebp - .text:006F5E91 mov ebp, esp - .text:006F5E93 push esi - .text:006F5E94 mov esi, dword_2EEFDE4 - .text:006F5E9A push edi - */ - auto iterator_ptr = **( uintptr_t*** )( createinterface + 0x6 ); - - return iterator_ptr; - } - - inline bool is_createinterface_export( uintptr_t export_ ) { - return *( uint8_t* )( export_ ) == x86::encode_push_reg( x86::reg::ebp ) - && *( uint8_t* )( export_ + 4 ) == 0xe9 - && *( uint8_t* )( export_ + 9 ) == 0xcc - && *( uint8_t* )( export_ + 10 ) == 0xcc; - } - - inline bool is_createinterface_fn( uintptr_t fn_ ) { - return *( uint8_t* )( fn_ ) == x86::encode_push_reg( x86::reg::ebp ) - && *( uint8_t* )( fn_ + 4 ) == 0x8b - && *( uint8_t* )( fn_ + 10 ) == x86::encode_push_reg( x86::reg::edi ); - } - - class c_interface_manager { - public: - struct interface_data_t { - std::string m_name; - std::string m_module; - size_t m_version; - uintptr_t m_ptr; - - template < typename t > __forceinline t get( ) { - return reinterpret_cast< t >( m_ptr ); - } - }; - - c_interface_manager( ); - - //iterate the interface list to find our desired version - template < typename t = void* > - t find_interface( const std::string& module_, std::string name ) { - //avoid finding interfaces with matching names - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += "0"; - - for( auto& it : m_interfaces ) { - if( !it.m_module.compare( module_ ) - && !it.m_name.compare( name ) ) { - g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), - name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - - return it.get< t >( ); - } - } - - g_con->print( xors( "%s not found\n" ), name.c_str( ) ); - - return t{ }; - } - - template < typename t = void* > - t find_interface( std::string name ) { - //avoid finding interfaces with matching names - if( !::isdigit( name[ name.length( ) - 1 ] ) ) - name += '0'; - - for( auto& it : m_interfaces ) { - if( strstr( it.m_name.c_str( ), name.c_str( ) ) ) { - g_con->print( xors( "%s version %u found in %s at 0x%08x\n" ), - name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - - return it.get< t >( ); - } - } - - g_con->print( xors( "%s not found\n" ), name.c_str( ) ); - - return t{ }; - } - - void dump_interface_list( ) { - for( auto& it : m_interfaces ) { - g_con->print( xors( "%s version %u in %s at 0x%08x\n" ), - it.m_name.c_str( ), - it.m_version, - it.m_module.c_str( ), - it.m_ptr ); - } - } - - private: - uintptr_t find_createinterface( void* module_ ); - - std::vector< interface_data_t > m_interfaces; - }; -} - -END_REGION -#endif - -extern HMODULE g_dll; -extern tf2::interfaces::c_interface_manager g_factory; \ No newline at end of file diff --git a/tf2/factory.hpp b/tf2/factory.hpp deleted file mode 100644 index 4615c34..0000000 --- a/tf2/factory.hpp +++ /dev/null @@ -1,190 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace tf2 -{ - namespace interfaces - { - // this interface linked list iteration code is tf2 specific ! - // in the future i will write it game/engine version independent - // using a disassembly engine - - struct regs { - void *( *m_CreateFn )( ); - const char *m_pName; - regs *m_pNext; - }; - - static inline bool is_create_fn( uintptr_t m_createfn ) { - return( *( uint8_t * )( m_createfn ) == 0xB8 - && *( uint8_t * )( m_createfn + 5 ) == 0xC3 ); - } - - static inline bool is_createinterface_fn( uintptr_t m_createfn ) { - return( *( uint8_t * )( m_createfn + 4 ) == 0xE9 - && *( uint8_t * )( m_createfn + 9 ) == 0xCC ); - } - - static inline uintptr_t follow_createinterface_export( uintptr_t export_ ) { - if ( *( uint8_t * )( export_ + 4 ) != 0xE9 ) return 0; - - return( export_ + 4 + *( uintptr_t * )( export_ + 5 ) + 5 ); - } - - static inline regs *reg_from_createinterface( uintptr_t ci ) { - if ( *( short * )( ci + 4 ) != 0x358B ) return nullptr; - - return( **( regs *** )( ci + 6 ) ); - } - - static inline uintptr_t interface_from_reg( regs *reg ) { - uintptr_t reg_func = *( uintptr_t * )reg; - - if ( is_create_fn( reg_func ) ) { - return( *( uintptr_t * )( reg_func + 1 ) ); - } - - return( 0 ); - } - - - class interface_manager { - public: - struct interface_data { - public: - std::string name; - std::string module; - int version; - void *ptr; - - template< typename T > inline T get( ) { return reinterpret_cast< T >( ptr ); } - - interface_data( std::string name_T, std::string module_T, void *ptr_T, int version_T = 0 ) - : name( name_T ), module( module_T ), ptr( ptr_T ), version( version_T ) {} - }; - - interface_manager() { - auto root = &get_peb( )->Ldr->InMemoryOrderModuleList; - - for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { - auto data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); - auto module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); - auto export_ = reinterpret_cast< uintptr_t >( ::GetProcAddress( module_base, "CreateInterface" ) ); - - if ( !export_ || !interfaces::is_createinterface_fn( export_ ) ) { - continue; - } - - auto CreateInterface = interfaces::follow_createinterface_export( export_ ); - - if ( !CreateInterface ) { - continue; - } - - auto regs = interfaces::reg_from_createinterface( CreateInterface ); - - while ( regs ) { - std::string name( regs->m_pName ), temp_version( name ); - - name.erase( std::remove_if( name.begin( ), name.end( ), &isdigit ), name.end( ) ); - - temp_version.erase( - std::remove_if( temp_version.begin( ), temp_version.end( ), - [ ]( int i ) { return !isdigit( i ); } - ), temp_version.end( ) - ); - - unsigned int version{ }; - std::stringstream( temp_version ) >> version; - - sorted_list.push_back( interface_data( name, unicode_to_string( data_table->FullDllName ), reinterpret_cast< void * >( interfaces::interface_from_reg( regs ) ), version ) ); - - regs = regs->m_pNext; - } - } - - std::sort( sorted_list.begin( ), sorted_list.end( ), [ ]( const interface_data &lhs, const interface_data &rhs ) { - return( lhs.version > rhs.version ); - } ); - } - public: - template< typename T = void * > T create( std::string name ) { - std::vector< interface_data >::iterator it = std::find_if( sorted_list.begin( ), sorted_list.end( ), [ & ]( const interface_data &data ) { - return ( !data.name.compare( name ) ); - } ); - - if ( it == sorted_list.end( ) || !it->ptr ) { - return T{ }; - } - - printf( "%s\n -> 0x%X\n -> module: %s \n", name.c_str( ), reinterpret_cast< uintptr_t >( it->ptr ), it->module.c_str( ) ); - - return( ( T )( it->ptr ) ); - } - - template< typename T = void* > T create( std::string name, std::string module ) { - std::vector< interface_data >::iterator it = std::find_if( sorted_list.begin( ), sorted_list.end( ), [ & ]( const interface_data &data ) { - return ( !data.name.compare( name ) && data.module.find( module ) != std::string::npos ); - } ); - - - if ( it == sorted_list.end( ) || !it->ptr ) { - return T{ }; - } - - //#ifdef DEBUG_PRINT - printf( "%s\n -> 0x%x\n -> module: %s \n", name.c_str( ), reinterpret_cast< uintptr_t >( it->ptr ), it->module.c_str( ) ); - //#endif - - return( static_cast< T >( it->ptr ) ); - } - - template< typename T = void * > T create_from_hash( uint32_t hash ) { - std::vector< interface_data >::iterator it = std::find_if( sorted_list.begin( ), sorted_list.end( ), [ & ]( const interface_data &data ) - { - return ( !data.name.compare( name ) ); - } ); - - if ( it == sorted_list.end( ) || !it->ptr ) { - return T{ }; - } - - return( ( T )( it->ptr ) ); - } - protected: - static inline PTEB get_teb( ) { -#if defined( _M_X64 ) - auto teb = reinterpret_cast< PTEB >( __readgsqword( reinterpret_cast< uintptr_t >( &static_cast< NT_TIB * >( nullptr )->Self ) ) ); -#else - auto teb = reinterpret_cast< PTEB >( __readfsdword( reinterpret_cast< uintptr_t >( &static_cast< NT_TIB * >( nullptr )->Self ) ) ); -#endif - - - return teb; - } - - static inline PPEB get_peb( ) { - return( get_teb( )->ProcessEnvironmentBlock ); - } - - static inline std::string unicode_to_string( UNICODE_STRING wide ) { - std::wstring wide_str( wide.Buffer, wide.Length ); - return std::string( wide_str.begin( ), wide_str.end( ) ); - } - - std::vector< interface_data > sorted_list{ }; - }; - }; -} \ No newline at end of file diff --git a/tf2/fnv.hpp b/tf2/fnv.hpp deleted file mode 100644 index a3f2dc9..0000000 --- a/tf2/fnv.hpp +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#pragma warning( disable : 4307 ) // '*': integral constant overflow -#pragma warning( disable : 4244 ) // possible loss of data - -#include -#include - -using hash_t = unsigned int; - -// used for compile-time FNV-1a 32bit hashes. -#define fnv( str ) \ - [&]() { \ - constexpr hash_t out = hash::fnv1a( str ); \ - \ - return out; \ - }() - -// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. -#define fnv_const( str ) Hash::fnv1a_32( str ) - -namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). -{ - // FNV-1a constants. - enum : hash_t { - FNV1A_PRIME = 0x1000193, - FNV1A_BASIS = 0x811C9DC5 - }; - - // compile-time strlen. - __forceinline constexpr size_t ct_strlen( const char *str ) { - size_t out = 1; - - for( ; str[ out ] != '\0'; ++out ); - - return out; - } - - // hash data. - __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { - hash_t out = FNV1A_BASIS; - - for( size_t i = 0; i < len; ++i ) - out = ( out ^ data[ i ] ) * FNV1A_PRIME; - - return out; - } - - // hash c-style string. - __forceinline constexpr hash_t fnv1a( const char *str ) { - hash_t out = FNV1A_BASIS; - size_t len = ct_strlen( str ); - - for( size_t i = 0; i < len; ++i ) - out = ( out ^ str[ i ] ) * FNV1A_PRIME; - - return out; - } - - // hash C++-style string ( runtime only ). - __forceinline hash_t fnv1a( const std::string &str ) { - return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); - } -} \ No newline at end of file diff --git a/tf2/framestagenotify.cpp b/tf2/framestagenotify.cpp deleted file mode 100644 index 87e91d9..0000000 --- a/tf2/framestagenotify.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "hooks.h" -#include "interfaces.h" -#include "base_cheat.h" - -void __fastcall hooks::frame_stage_notify( void* ecx_, void* edx_, frame_stages_t stage ) { - static auto fsn_o = cl.m_chl->get_old_function< decltype( hooks::frame_stage_notify )* >( 35 ); //35 - - g_ctx.m_stage = stage; - - if ( cl.m_panic ) { - return fsn_o( ecx_, edx_, stage ); - } - - switch( stage ) { - case FRAME_NET_UPDATE_START: - g_ctx.run_frame( ); - fsn_o( ecx_, 0, stage ); - - return; - - case FRAME_NET_UPDATE_POSTDATAUPDATE_START: - g_cheat.extra.float_ragdolls( ); - //g_cheat.m_skins( ); - g_cheat.visuals.update_glow( ); - fsn_o( ecx_, 0, stage ); - - return; - - case FRAME_RENDER_START: - //g_cheat.extra.disable_post_processing( ); - util::disable_pvs( ); - break; - - case FRAME_RENDER_END: - fsn_o( ecx_, 0, stage ); - //g_cheat.chams.m_materials.update_materials( ); - return; - } - - return fsn_o( ecx_, edx_, stage ); -} diff --git a/tf2/get_viewmodel_fov.cpp b/tf2/get_viewmodel_fov.cpp deleted file mode 100644 index 96c4a1e..0000000 --- a/tf2/get_viewmodel_fov.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "hooks.h" -#include "settings.h" - -float __fastcall hooks::get_viewmodel_fov( void* ecx, void* edx ) { - static auto get_viewmodel_fov_o = cl.m_clientmode->get_old_function< decltype( &hooks::get_viewmodel_fov ) >( 32 ); - - return get_viewmodel_fov_o( ecx, nullptr ) + float( g_settings.misc.viewmodel_fov ); -} diff --git a/tf2/graphics.cpp b/tf2/graphics.cpp deleted file mode 100644 index 9670bf9..0000000 --- a/tf2/graphics.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "graphics.h" - -tf2::c_fonts fonts; -tf2::c_graphics graphics; - -namespace tf2 -{ - void c_graphics::draw_line( int x, int y, int x1, int y1, clr_t clr ) { - cl.m_surface( )->DrawSetColor( clr ); - cl.m_surface( )->DrawLine( x, y, x1, y1 ); - } - - void c_graphics::draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::string msg ) { - std::wstring a( msg.begin( ), msg.end( ) ); - const wchar_t* wbuf = a.c_str( ); - - int w, h; get_text_size( font, msg, w, h ); - - if ( f_alignment == alignment::right ) x -= w; - - if ( f_alignment == alignment::center ) x -= w / 2; - - cl.m_surface( )->DrawSetTextFont( font ); - cl.m_surface( )->DrawSetTextColor( clr ); - cl.m_surface( )->DrawSetTextPos( x, y - h / 2 ); - cl.m_surface( )->DrawPrintText( ( wchar_t* )wbuf, wcslen( wbuf ) ); - } - - void c_graphics::draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::wstring msg ) { - int w, h; get_text_size( font, msg, w, h ); - - if ( f_alignment == alignment::right ) x -= w; - - if ( f_alignment == alignment::center ) x -= w / 2; - - cl.m_surface( )->DrawSetTextFont( font ); - cl.m_surface( )->DrawSetTextColor( clr ); - cl.m_surface( )->DrawSetTextPos( x, y - h / 2 ); - cl.m_surface( )->DrawPrintText( ( wchar_t* )msg.c_str( ), wcslen( msg.c_str( ) ) ); - } - - void c_graphics::draw_rect( int x, int y, int w, int h, clr_t clr ) { - cl.m_surface( )->DrawSetColor( clr ); - cl.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); - } - - void c_graphics::draw_rect_outlined( int x, int y, int w, int h, clr_t clr ) { - cl.m_surface( )->DrawSetColor( clr ); - cl.m_surface( )->DrawOutlinedRect( x, y, x + w, y + h ); - } - - void c_graphics::draw_circle_outlined( int x, int y, int r, clr_t clr ) { - cl.m_surface( )->DrawSetColor( clr ); - cl.m_surface( )->DrawOutlinedCircle( x, y, r, 48 ); - } - - void c_graphics::get_text_size( HFont font, std::string text, int& w, int& h ) { - std::wstring a( text.begin( ), text.end( ) ); - const wchar_t* wstr = a.c_str( ); - - cl.m_surface( )->GetTextSize( font, wstr, w, h ); - } - - void c_graphics::get_text_size( HFont font, std::wstring text, int& w, int& h ) { - const wchar_t* wstr = text.c_str( ); - - cl.m_surface( )->GetTextSize( font, wstr, w, h ); - } - - void c_graphics::draw_polygon( int count, vertex_t* vertexs, clr_t clr_t ) { - static int texture = cl.m_surface( )->CreateNewTextureID( true ); - if ( !texture ) texture = cl.m_surface( )->CreateNewTextureID( true ); - - byte buffer[ 4 ] = { 255, 255, 255, 255 }; - - cl.m_surface( )->DrawSetTextureRGBA( texture, buffer, 1, 1 ); - cl.m_surface( )->DrawSetColor( clr_t ); - cl.m_surface( )->DrawSetTexture( texture ); - - cl.m_surface( )->DrawTexturedPolygon( count, vertexs ); - } - - void c_graphics::draw_filled_circle( int x, int y, int r, clr_t clr_t ) { - static vertex_t shape[ 24 ]; - static float step = M_PI * 2.0f / 24; - - for ( int i{ }; i < 24; i++ ) { - float theta = i * step; - float x1 = x + r * cos( theta ); - float y1 = y + r * sin( theta ); - shape[ i ].init( x1, y1 ); - } - draw_polygon( 24, shape, clr_t ); - } - - vec2_t c_graphics::world_to_screen( vec3_t world_pos ) { - vec3_t tmp; cl.m_overlay( )->ScreenPosition( world_pos, tmp ); - const matrix3x4& w2s_matrix = cl.m_engine( )->GetWorldToScreenMatrix( ); - float w = w2s_matrix[ 3 ][ 3 ]; - for ( int i{ }; i < 3; i++ ) { - w += w2s_matrix[ 3 ][ i ] * world_pos[ i ]; - } - if ( w < 0.001f ) return{ 10000.f, 10000.f }; - - return{ tmp.x, tmp.y }; - } -} \ No newline at end of file diff --git a/tf2/graphics.h b/tf2/graphics.h deleted file mode 100644 index c9c2ef7..0000000 --- a/tf2/graphics.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once -#include "color.hpp" -#include "interfaces.h" -#include "math.h" -typedef unsigned long HFont; - -enum alignment { - left, - right, - center -}; - -enum alignment_vertical { - top, - bottom -}; - -enum fontflag : long { - none, - italic = 0x001, - underline = 0x002, - strikeout = 0x004, - symbol = 0x008, - antialias = 0x010, - blur = 0x020, - rotary = 0x040, - dropshadow = 0x080, - additive = 0x100, - outline = 0x200, - custom = 0x400, - bitmap = 0x800, -}; - -namespace tf2 -{ - class c_fonts { - public: - c_fonts( ) { - } - - void init( ) { - f_12 = cl.m_surface( )->CreateFnt( ); - f_14 = cl.m_surface( )->CreateFnt( ); - f_16 = cl.m_surface( )->CreateFnt( ); - f_18 = cl.m_surface( )->CreateFnt( ); - f_esp = cl.m_surface( )->CreateFnt( ); - - cl.m_surface( )->SetFontGlyphSet( f_12, "Tahoma", 12, 300, 0, 0, fontflag::outline ); - cl.m_surface( )->SetFontGlyphSet( f_14, "Tahoma", 14, 300, 0, 0, fontflag::outline ); - cl.m_surface( )->SetFontGlyphSet( f_16, "Tahoma", 16, 300, 0, 0, fontflag::outline ); - cl.m_surface( )->SetFontGlyphSet( f_18, "Tahoma", 18, 300, 0, 0, fontflag::outline ); - cl.m_surface( )->SetFontGlyphSet( f_esp, "Verdana", 13, 550, 0, 0, fontflag::dropshadow ); - } - - HFont f_12; - HFont f_14; - HFont f_16; - HFont f_18; - - HFont f_esp; - }; - - class c_graphics { - public: - void draw_line( int x, int y, int x1, int y1, clr_t clr ); - void draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::string msg ); - void draw_string( HFont font, int x, int y, clr_t clr, alignment f_alignment, std::wstring msg ); - void draw_rect( int x, int y, int w, int h, clr_t clr ); - void draw_rect_outlined( int x, int y, int w, int h, clr_t clr ); - void draw_circle_outlined( int x, int y, int r, clr_t clr ); - void get_text_size( HFont font, std::string text, int& w, int& h ); - void get_text_size( HFont font, std::wstring text, int& w, int& h ); - void draw_polygon( int count, vertex_t* vertexs, clr_t clr_t ); - void draw_filled_circle( int x, int y, int r, clr_t clr_t ); - vec2_t world_to_screen( vec3_t world_pos ); - }; -} - -extern tf2::c_graphics graphics; -extern tf2::c_fonts fonts; \ No newline at end of file diff --git a/tf2/hooks.cpp b/tf2/hooks.cpp deleted file mode 100644 index 0472c6e..0000000 --- a/tf2/hooks.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "hooks.h" -#include "interfaces.h" -#include "netvars.h" - - -bool hooks::commit( tf2::client* instance ) { - while( !( instance->m_hwnd = FindWindowA( xors( "Valve001" ), 0 ) ) ) - Sleep( 100 ); - - window_procedure_o = reinterpret_cast< decltype( window_procedure_o ) >( - SetWindowLongA( instance->m_hwnd, GWLP_WNDPROC, - ( long )window_procedure ) - ); - - instance->m_clientmode->hook( 20, &hooks::override_mouse_input );//n - instance->m_clientmode->hook( 32, &hooks::get_viewmodel_fov );//n - instance->m_clientmode->hook( 39, &hooks::do_post_screen_space_effects ); //n - instance->m_clientmode->hook( 16, &hooks::override_view ); //n - instance->m_clientmode->hook( 21, &hooks::create_move ); //y - instance->m_chl->hook( 35, &hooks::frame_stage_notify ); //y - instance->m_chl->hook( 3, &hooks::shut_down ); //n - - //honestly fuck chams and keyvalues they can lick my mothers toes - - //instance->m_model_render->hook( 19, &hooks::draw_model_execute ); //n - //instance->m_render_view->hook( 9, &hooks::scene_end ); //n - - - instance->m_movement->hook( 1, &hooks::process_movement ); //y - instance->m_d3d->hook( 42, &hooks::d3d::end_scene ); //y - instance->m_d3d->hook( 16, &hooks::d3d::reset );//y - instance->m_d3d->hook( 17, &hooks::d3d::present );//y - instance->m_panel->hook( 41, &hooks::paint_traverse ); //y - - instance->m_vgui->hook( 13, &hooks::paint ); //y - - instance->m_surface->hook( 116, &hooks::on_screen_size_changed ); //n - //instance->m_engine_sound->hook( 5, &hooks::emit_sound ); //n - - return true; -} diff --git a/tf2/hooks.h b/tf2/hooks.h deleted file mode 100644 index c34d71f..0000000 --- a/tf2/hooks.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once -#include - -#include "util.hpp" -#include "d3d.hpp" -#include "interfaces.h" -#include "netvar_proxy.hpp" - -namespace hooks -{ - //hook like the hooker that u are - - void __fastcall paint( void* ecx_, void* edx_, int mode ); - long __stdcall window_procedure( HWND, uint32_t, uint32_t, long ); - extern decltype( &window_procedure ) window_procedure_o; - void __fastcall process_movement( void*, void*, c_base_player*, CMoveData* ); - void __fastcall paint_traverse( void*, void*, unsigned int, bool, bool ); - bool __fastcall create_move( void*, void*, float, user_cmd_t* ); - void __stdcall hl_create_move_gate( int sequence_number, float input_sample_time, bool active ); - void __fastcall hl_create_move( void*, void*, int, float, bool, byte& ); - void __fastcall frame_stage_notify( void*, void*, frame_stages_t ); - void __fastcall override_mouse_input( void*, void*, float*, float* ); - void __fastcall draw_model_execute( IVModelInfo*, void*, void*, const DrawModelState_t&, const ModelRenderInfo_t&, matrix3x4* ); - void __fastcall scene_end( void*, void* ); - float __fastcall get_viewmodel_fov( void*, void* ); - void __fastcall override_view( void* ecx_, void* edx_, CViewSetup* setup ); - void __fastcall emit_sound( void* ecx_, void* edx_, void* filter, int ent, int channel, const char* sound, uint32_t hash, - const char* sample, float volume, float attenuation, int seed, int flags, int pitch, const vec3_t* origin, - const vec3_t* direction, vec3_t* origins, bool update_pos, float sound_time, int speaker_entry ); - void __fastcall shut_down( void* ecx_, void* edx_ ); - - bool __fastcall is_connected( void* ecx_, void* edx_ ); - - bool __fastcall in_prediction( void* ecx_, void* edx_ ); - int __fastcall send_datagram( INetChannel* channel, void* edx, void* datagram ); - bool __fastcall do_post_screen_space_effects( void* ecx_, void* edx_, CViewSetup* setup ); - void __fastcall on_screen_size_changed( void* ecx_, void* edx_, int old_h, int old_w ); - - - - //do we wanna only run menu in d3d or visuals too? - namespace d3d { - long __stdcall end_scene( IDirect3DDevice9* ); - long __stdcall reset( IDirect3DDevice9*, D3DPRESENT_PARAMETERS* ); - long __stdcall present( IDirect3DDevice9*, RECT*, RECT*, HWND, RGNDATA* ); - long __stdcall draw( IDirect3DDevice9*, D3DPRIMITIVETYPE, int, uint32_t, uint32_t, uint32_t, uint32_t ); - } - - extern bool commit( tf2::client* ); -} \ No newline at end of file diff --git a/tf2/icons.hpp b/tf2/icons.hpp deleted file mode 100644 index bffd94e..0000000 --- a/tf2/icons.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "icons/legit.hpp" -#include "icons/rage.hpp" -#include "icons/visuals.hpp" -#include "icons/misc.hpp" -#include "icons/config.hpp" \ No newline at end of file diff --git a/tf2/icons/config.hpp b/tf2/icons/config.hpp deleted file mode 100644 index e47c75b..0000000 --- a/tf2/icons/config.hpp +++ /dev/null @@ -1,1297 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\config.png (1/26/2018 4:19:12 AM) - StartOffset: 00000000, EndOffset: 00003C3C, Length: 00003C3D */ - -namespace icons { -static const size_t config_size = 15421; -namespace raw { -static const unsigned char config_raw[15421] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, - 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, - 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, - 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, - 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, - 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, - 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, - 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, - 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, - 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, - 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, - 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, - 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, - 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, - 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, - 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, - 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, - 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, - 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, - 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, - 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, - 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, - 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, - 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, - 0x31, 0x39, 0x3A, 0x30, 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x39, - 0x3A, 0x30, 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, - 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, - 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x39, 0x3A, 0x30, - 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, - 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, - 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, - 0x34, 0x30, 0x32, 0x65, 0x31, 0x36, 0x64, 0x39, 0x2D, 0x37, 0x38, 0x63, - 0x30, 0x2D, 0x61, 0x32, 0x34, 0x33, 0x2D, 0x39, 0x63, 0x63, 0x62, 0x2D, - 0x37, 0x32, 0x66, 0x30, 0x65, 0x38, 0x35, 0x36, 0x33, 0x65, 0x62, 0x33, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, - 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, - 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x61, 0x63, 0x34, - 0x61, 0x35, 0x32, 0x38, 0x31, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, - 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, - 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, - 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, - 0x61, 0x30, 0x31, 0x35, 0x36, 0x63, 0x64, 0x31, 0x2D, 0x34, 0x62, 0x37, - 0x62, 0x2D, 0x36, 0x31, 0x34, 0x37, 0x2D, 0x62, 0x33, 0x31, 0x64, 0x2D, - 0x35, 0x36, 0x63, 0x33, 0x63, 0x36, 0x64, 0x31, 0x34, 0x38, 0x66, 0x32, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, - 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, - 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, - 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, - 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x61, 0x30, 0x31, 0x35, 0x36, - 0x63, 0x64, 0x31, 0x2D, 0x34, 0x62, 0x37, 0x62, 0x2D, 0x36, 0x31, 0x34, - 0x37, 0x2D, 0x62, 0x33, 0x31, 0x64, 0x2D, 0x35, 0x36, 0x63, 0x33, 0x63, - 0x36, 0x64, 0x31, 0x34, 0x38, 0x66, 0x32, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, - 0x39, 0x3A, 0x30, 0x39, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, - 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, - 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, - 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, - 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, - 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, - 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, - 0x64, 0x3A, 0x34, 0x30, 0x32, 0x65, 0x31, 0x36, 0x64, 0x39, 0x2D, 0x37, - 0x38, 0x63, 0x30, 0x2D, 0x61, 0x32, 0x34, 0x33, 0x2D, 0x39, 0x63, 0x63, - 0x62, 0x2D, 0x37, 0x32, 0x66, 0x30, 0x65, 0x38, 0x35, 0x36, 0x33, 0x65, - 0x62, 0x33, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, - 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, - 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, - 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x39, 0x3A, 0x30, 0x39, 0x2B, - 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, - 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, - 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, - 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, - 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, - 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, - 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, - 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, - 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, - 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, - 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, - 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, - 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, - 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, - 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, - 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, - 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, - 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, - 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, - 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, - 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, - 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x8F, 0x3F, - 0x33, 0x69, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, - 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, - 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, - 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, - 0x01, 0xCB, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0xD9, 0x3F, 0x4A, - 0x03, 0x41, 0x14, 0xC7, 0xF1, 0xEF, 0xC6, 0x44, 0x08, 0x98, 0x28, 0x2A, - 0xA6, 0xB1, 0xB1, 0x13, 0x8B, 0x94, 0xA2, 0x17, 0xB0, 0x14, 0x2C, 0xBC, - 0x82, 0xB5, 0x8D, 0x37, 0xB0, 0x14, 0x53, 0xD8, 0x08, 0xE2, 0x01, 0xB4, - 0x50, 0x04, 0x2F, 0x60, 0x23, 0x01, 0x0B, 0x49, 0x29, 0xD6, 0x16, 0xDA, - 0x28, 0x0A, 0x2A, 0x89, 0x1A, 0x8B, 0xAC, 0x10, 0x06, 0x12, 0x77, 0xB3, - 0x33, 0xC9, 0xCE, 0xF2, 0x7B, 0xB0, 0x84, 0xB7, 0xB0, 0x84, 0xF9, 0xEC, - 0xCC, 0x9B, 0x3F, 0x1B, 0xB4, 0xDB, 0x6D, 0x14, 0x90, 0x13, 0x81, 0x20, - 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, - 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0xC3, 0x8A, 0x7C, 0x82, 0x67, 0xA7, - 0x80, 0x95, 0xF0, 0xB7, 0x57, 0x3C, 0x00, 0x75, 0xA0, 0x95, 0x45, 0x88, - 0x6D, 0xA0, 0x36, 0xC0, 0x73, 0xF3, 0x21, 0x4C, 0x2A, 0x23, 0x88, 0x79, - 0x42, 0x75, 0x0A, 0x6C, 0x26, 0xF8, 0xBF, 0x45, 0xE0, 0x2E, 0x0B, 0x10, - 0x36, 0xCE, 0xF5, 0x02, 0xDF, 0x8B, 0xE5, 0xB1, 0x91, 0xDF, 0x84, 0x8D, - 0xEA, 0x77, 0xE5, 0x80, 0x17, 0xE3, 0xB9, 0x1A, 0x50, 0x70, 0x78, 0x8D, - 0xB9, 0xEE, 0x11, 0x8F, 0xC0, 0xDC, 0x80, 0x6F, 0x76, 0x54, 0x27, 0xC4, - 0x5B, 0xC0, 0x91, 0x6D, 0x88, 0x67, 0x63, 0x86, 0xF0, 0x01, 0x02, 0xE0, - 0x09, 0xA8, 0x68, 0x1D, 0xD1, 0xE9, 0xC5, 0x7B, 0x69, 0xE9, 0x11, 0xB3, - 0x43, 0x6C, 0xF8, 0x04, 0x70, 0x01, 0x54, 0xE3, 0x14, 0xE9, 0x61, 0x41, - 0x8C, 0x22, 0xCE, 0x80, 0x8D, 0xAE, 0xBC, 0x00, 0x7C, 0xB9, 0x58, 0x59, - 0x36, 0x80, 0xE9, 0x94, 0x22, 0xB4, 0x80, 0xB2, 0x71, 0x6F, 0x01, 0xB8, - 0x77, 0x01, 0x51, 0xF5, 0xAC, 0x56, 0x94, 0x6C, 0x15, 0xCB, 0x62, 0x06, - 0x8A, 0xA6, 0x95, 0x1A, 0xE1, 0xFB, 0xD7, 0xE2, 0xBE, 0xD3, 0x68, 0x54, - 0x88, 0x22, 0xF0, 0x6E, 0xDC, 0x3B, 0x04, 0x4E, 0x80, 0x66, 0x0A, 0x1B, - 0x5D, 0x01, 0x76, 0x81, 0xA5, 0xA8, 0x33, 0x47, 0xD4, 0x1A, 0xB1, 0xEF, - 0xC3, 0x7E, 0xC1, 0x88, 0xF3, 0x70, 0x1A, 0x5D, 0xB7, 0xB9, 0xB2, 0x6C, - 0x18, 0xC5, 0x31, 0xF0, 0x64, 0x38, 0x94, 0x80, 0xD7, 0xAE, 0x7C, 0xBC, - 0xD7, 0xD9, 0x48, 0xD4, 0x62, 0x99, 0xF7, 0xB4, 0x2E, 0x7C, 0xBA, 0xD8, - 0x7D, 0x66, 0x3A, 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x16, 0x21, - 0x3E, 0x3C, 0x6D, 0xDF, 0xA4, 0x91, 0xFF, 0x24, 0x85, 0xB8, 0x34, 0xF2, - 0xB2, 0x27, 0x10, 0xD7, 0x46, 0xFE, 0xED, 0x62, 0xD3, 0xB5, 0x03, 0x1C, - 0xF4, 0x53, 0x1E, 0x71, 0x4F, 0xB8, 0x8A, 0xB3, 0xD7, 0x88, 0x03, 0xF1, - 0x46, 0xE7, 0x18, 0xCC, 0xD7, 0x58, 0xA6, 0xF3, 0x09, 0x22, 0x31, 0xC4, - 0xDF, 0x18, 0x0B, 0x3C, 0x44, 0xA8, 0x03, 0xAB, 0x36, 0x67, 0x8D, 0x1C, - 0x70, 0xEB, 0x19, 0xC2, 0xDA, 0x7F, 0x08, 0x83, 0xF4, 0x08, 0x73, 0xBC, - 0xCD, 0xA4, 0xB4, 0xF1, 0x4D, 0x63, 0xD7, 0x89, 0x4B, 0x08, 0x2D, 0xA8, - 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x42, 0x10, - 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, - 0xB0, 0x16, 0xBF, 0x03, 0x00, 0xF4, 0xAF, 0x63, 0xB0, 0x6A, 0xED, 0xB9, - 0x23, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, - 0x82 -}; -} -static const unsigned char* config_icon = raw::config_raw; -} \ No newline at end of file diff --git a/tf2/icons/legit.hpp b/tf2/icons/legit.hpp deleted file mode 100644 index 8e5523e..0000000 --- a/tf2/icons/legit.hpp +++ /dev/null @@ -1,1316 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\legit.png (1/26/2018 4:18:16 AM) - StartOffset: 00000000, EndOffset: 00003D23, Length: 00003D24 */ - -namespace icons { -static const size_t legit_size = 15652; -namespace raw { -static const unsigned char legit_raw[15652] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, - 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, - 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, - 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, - 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, - 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, - 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, - 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, - 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, - 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, - 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, - 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, - 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, - 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, - 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, - 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, - 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, - 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, - 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, - 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, - 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, - 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, - 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, - 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, - 0x31, 0x38, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, - 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, - 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, - 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x31, - 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, - 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, - 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, - 0x65, 0x39, 0x33, 0x64, 0x37, 0x33, 0x38, 0x37, 0x2D, 0x31, 0x30, 0x36, - 0x39, 0x2D, 0x35, 0x64, 0x34, 0x32, 0x2D, 0x38, 0x66, 0x38, 0x63, 0x2D, - 0x63, 0x33, 0x34, 0x33, 0x37, 0x39, 0x35, 0x36, 0x35, 0x65, 0x30, 0x63, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, - 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, - 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x38, 0x62, 0x66, - 0x62, 0x37, 0x35, 0x37, 0x35, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, - 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, - 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, - 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, - 0x32, 0x35, 0x33, 0x61, 0x62, 0x33, 0x39, 0x61, 0x2D, 0x33, 0x37, 0x31, - 0x31, 0x2D, 0x35, 0x64, 0x34, 0x64, 0x2D, 0x62, 0x63, 0x33, 0x38, 0x2D, - 0x62, 0x36, 0x66, 0x30, 0x34, 0x36, 0x62, 0x62, 0x30, 0x31, 0x66, 0x34, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, - 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, - 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, - 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, - 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x32, 0x35, 0x33, 0x61, 0x62, - 0x33, 0x39, 0x61, 0x2D, 0x33, 0x37, 0x31, 0x31, 0x2D, 0x35, 0x64, 0x34, - 0x64, 0x2D, 0x62, 0x63, 0x33, 0x38, 0x2D, 0x62, 0x36, 0x66, 0x30, 0x34, - 0x36, 0x62, 0x62, 0x30, 0x31, 0x66, 0x34, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, - 0x38, 0x3A, 0x31, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, - 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, - 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, - 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, - 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, - 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, - 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, - 0x64, 0x3A, 0x65, 0x39, 0x33, 0x64, 0x37, 0x33, 0x38, 0x37, 0x2D, 0x31, - 0x30, 0x36, 0x39, 0x2D, 0x35, 0x64, 0x34, 0x32, 0x2D, 0x38, 0x66, 0x38, - 0x63, 0x2D, 0x63, 0x33, 0x34, 0x33, 0x37, 0x39, 0x35, 0x36, 0x35, 0x65, - 0x30, 0x63, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, - 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, - 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, - 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x31, 0x34, 0x2B, - 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, - 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, - 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, - 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, - 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, - 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, - 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, - 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, - 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, - 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, - 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, - 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, - 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, - 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, - 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, - 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, - 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, - 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, - 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, - 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, - 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, - 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x56, 0x82, - 0xD6, 0xC2, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, - 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, - 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, - 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, - 0x02, 0xB2, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9B, 0x3D, 0x68, - 0x14, 0x41, 0x14, 0x80, 0xBF, 0x4D, 0x2E, 0xE4, 0x40, 0x51, 0x8C, 0x10, - 0x83, 0x0A, 0x11, 0xB4, 0x51, 0x2C, 0x44, 0xAB, 0xA4, 0x31, 0x9D, 0xD8, - 0x89, 0x60, 0x61, 0x44, 0xC4, 0x46, 0x6B, 0x8B, 0x34, 0x22, 0xD8, 0x88, - 0x82, 0x60, 0x2F, 0xDA, 0x58, 0x18, 0x41, 0x2C, 0x44, 0x84, 0x80, 0x9D, - 0x29, 0x4C, 0xA9, 0x85, 0x28, 0x41, 0x2D, 0xD4, 0xA8, 0x10, 0x11, 0x7F, - 0x88, 0x62, 0x40, 0x93, 0xB5, 0xB8, 0x39, 0x0C, 0xC3, 0xDB, 0xDC, 0xCE, - 0xDE, 0xEC, 0xEE, 0x8C, 0xBE, 0x07, 0x03, 0xB7, 0x6F, 0x6F, 0x96, 0xD9, - 0x6F, 0xDF, 0x7B, 0xF3, 0xDE, 0xDB, 0xBB, 0x24, 0x4D, 0x53, 0x54, 0xA0, - 0x47, 0x11, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, 0x10, - 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, - 0x10, 0xFF, 0x1B, 0x88, 0x8B, 0xC0, 0x1D, 0x20, 0xA9, 0x6B, 0x01, 0x8D, - 0x00, 0x20, 0xFC, 0x04, 0x9A, 0xE6, 0xF3, 0x72, 0x5D, 0x30, 0x92, 0x00, - 0x3A, 0x54, 0xF6, 0x02, 0x12, 0x8D, 0x11, 0x91, 0xC7, 0x88, 0x8D, 0xC0, - 0x4B, 0xF3, 0x64, 0x8B, 0x0C, 0xC9, 0x42, 0x8A, 0x8C, 0x2B, 0x75, 0xB9, - 0xC6, 0x0E, 0x03, 0x20, 0x34, 0x79, 0x03, 0x6C, 0xAB, 0xCA, 0x22, 0xDE, - 0x07, 0x0A, 0x01, 0x60, 0xD8, 0x58, 0xC8, 0x48, 0xD9, 0x20, 0x52, 0x60, - 0x73, 0x04, 0x6E, 0x3F, 0x03, 0x5C, 0x2E, 0x0B, 0xC4, 0x6A, 0x7E, 0xF4, - 0xC8, 0x98, 0x64, 0x52, 0xE1, 0x68, 0x00, 0x47, 0x80, 0xC5, 0x8C, 0x35, - 0x4D, 0x00, 0x67, 0x7C, 0xC7, 0x88, 0x4F, 0x26, 0x30, 0xDA, 0x72, 0x09, - 0x38, 0x1B, 0x80, 0x05, 0x34, 0x0C, 0x90, 0x5E, 0xE1, 0xDC, 0x16, 0xE0, - 0x83, 0x0F, 0x10, 0x7B, 0x80, 0x27, 0x82, 0x7E, 0x1D, 0xB0, 0x10, 0x98, - 0x4B, 0x4C, 0x02, 0xE3, 0xD2, 0xBD, 0xFA, 0x70, 0x0D, 0x09, 0xC2, 0x5A, - 0x4F, 0x10, 0x3A, 0x6D, 0xA7, 0xAE, 0x72, 0x0C, 0x98, 0x16, 0xF4, 0xE7, - 0xBB, 0xB5, 0x88, 0x5D, 0xC0, 0x33, 0x4B, 0x77, 0x1C, 0xB8, 0x19, 0x78, - 0x66, 0x99, 0xBA, 0x58, 0x45, 0x1E, 0x10, 0x0B, 0xE6, 0xE9, 0x97, 0x95, - 0x06, 0x97, 0x05, 0x62, 0x2B, 0x30, 0x67, 0xE9, 0x06, 0x80, 0x2F, 0x45, - 0x5D, 0xC3, 0x86, 0x70, 0x2E, 0x92, 0xAC, 0xF9, 0x5D, 0x46, 0xFC, 0x28, - 0x6C, 0x11, 0xA9, 0x00, 0x2F, 0xCD, 0x28, 0xA5, 0xF7, 0x16, 0x58, 0xF0, - 0x01, 0xEB, 0xF8, 0x81, 0xE3, 0xFC, 0x5F, 0x66, 0x9B, 0x9C, 0x15, 0xCE, - 0x3D, 0x05, 0x76, 0xAF, 0x38, 0xFE, 0x0D, 0xF4, 0x15, 0x01, 0xB1, 0x01, - 0xF8, 0x9C, 0xC3, 0x74, 0x43, 0xF8, 0x91, 0xC5, 0x29, 0xE0, 0xBA, 0xA5, - 0x3B, 0x01, 0xDC, 0xC8, 0xE3, 0x7A, 0x9D, 0x5C, 0xA3, 0x19, 0x51, 0x01, - 0x79, 0x55, 0xD0, 0xBD, 0xF0, 0x95, 0x59, 0x2E, 0x45, 0x04, 0xE2, 0xBE, - 0xA0, 0x1B, 0xF4, 0x59, 0x7D, 0xE6, 0x89, 0xEA, 0x6B, 0x80, 0xD7, 0xC6, - 0x95, 0x5C, 0xA5, 0xB7, 0x4B, 0xF8, 0xCB, 0x26, 0x08, 0x9E, 0x14, 0xCE, - 0x3D, 0x04, 0xF6, 0x5B, 0xF7, 0xD2, 0xE3, 0x0B, 0xC4, 0x21, 0xE0, 0x5E, - 0x04, 0xDB, 0xA7, 0x74, 0xED, 0xC7, 0xC0, 0xBE, 0xA2, 0x20, 0xA4, 0x3E, - 0x62, 0x0C, 0x79, 0x44, 0x93, 0x56, 0x3F, 0x74, 0xA5, 0xEC, 0xCC, 0xD8, - 0x5D, 0x72, 0xE5, 0x11, 0x47, 0x05, 0xDD, 0xF6, 0x08, 0x62, 0xC6, 0x57, - 0x41, 0x37, 0xDB, 0x4D, 0xAD, 0x71, 0x5B, 0xD0, 0xBD, 0x0A, 0x1C, 0xC2, - 0x38, 0xD0, 0x6F, 0xE9, 0xA6, 0x7D, 0x54, 0x9F, 0x13, 0x19, 0x4D, 0x0E, - 0x1F, 0x66, 0x3C, 0x60, 0x25, 0x39, 0xF3, 0x5D, 0x5E, 0x6F, 0xC4, 0x34, - 0x65, 0x9C, 0xD6, 0xEA, 0xD2, 0x8F, 0xC8, 0xFA, 0xE2, 0x30, 0xF0, 0x36, - 0x10, 0x4B, 0x98, 0x02, 0x0E, 0x0A, 0xFA, 0xC3, 0xC0, 0x5D, 0x1F, 0x65, - 0x38, 0x59, 0xA9, 0x29, 0xAD, 0x66, 0xE9, 0x12, 0x30, 0x56, 0x63, 0x43, - 0x66, 0xD2, 0x3C, 0x28, 0x09, 0xC2, 0xF3, 0x4E, 0x10, 0x5C, 0x2D, 0xA2, - 0x9D, 0x2F, 0x7C, 0x8F, 0x28, 0xC9, 0x9A, 0x07, 0x86, 0x7C, 0x64, 0x96, - 0xB6, 0xFC, 0x58, 0xC5, 0x32, 0x42, 0x93, 0x5B, 0x79, 0x21, 0x14, 0x01, - 0xD1, 0xAE, 0xE0, 0x12, 0xE0, 0x5A, 0xC0, 0x10, 0x36, 0xD1, 0xEA, 0x54, - 0x51, 0x26, 0x88, 0xB6, 0x9C, 0x36, 0x40, 0x2E, 0x04, 0x72, 0xF3, 0xDF, - 0xF8, 0xDB, 0x45, 0xFF, 0xE8, 0x3A, 0xD9, 0xF7, 0x4B, 0xE0, 0x7E, 0x93, - 0x6C, 0xAD, 0x77, 0x98, 0x63, 0x6F, 0x75, 0xA3, 0x0E, 0x73, 0xE7, 0x32, - 0x1A, 0x30, 0xD4, 0x0D, 0x22, 0xB4, 0x5A, 0xA3, 0x12, 0xD7, 0xF8, 0xA7, - 0x24, 0x04, 0x10, 0x7D, 0xB4, 0x1A, 0xAA, 0x8B, 0xC8, 0x2F, 0x90, 0x2A, - 0x91, 0x44, 0xFF, 0xCA, 0xA4, 0xAE, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, - 0x10, 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, - 0x50, 0x10, 0x0A, 0xA2, 0x2A, 0xF9, 0x33, 0x00, 0x85, 0x3D, 0xBB, 0x66, - 0xA5, 0x18, 0xA1, 0xED, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, - 0xAE, 0x42, 0x60, 0x82 -}; -} -static const unsigned char* legit_icon = raw::legit_raw; -} \ No newline at end of file diff --git a/tf2/icons/misc.hpp b/tf2/icons/misc.hpp deleted file mode 100644 index d15e736..0000000 --- a/tf2/icons/misc.hpp +++ /dev/null @@ -1,1313 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\misc.png (1/26/2018 4:19:00 AM) - StartOffset: 00000000, EndOffset: 00003CFF, Length: 00003D00 */ - -namespace icons { -static const size_t misc_size = 15616; -namespace raw { -static const unsigned char misc_raw[15616] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, - 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, - 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, - 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, - 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, - 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, - 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, - 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, - 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, - 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, - 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, - 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, - 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, - 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, - 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, - 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, - 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, - 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, - 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, - 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, - 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, - 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, - 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, - 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, - 0x31, 0x38, 0x3A, 0x35, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, - 0x3A, 0x35, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, - 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, - 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x35, - 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, - 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, - 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, - 0x63, 0x36, 0x30, 0x66, 0x62, 0x37, 0x34, 0x35, 0x2D, 0x30, 0x38, 0x61, - 0x63, 0x2D, 0x35, 0x64, 0x34, 0x38, 0x2D, 0x38, 0x65, 0x39, 0x33, 0x2D, - 0x39, 0x65, 0x62, 0x38, 0x39, 0x65, 0x31, 0x32, 0x30, 0x63, 0x64, 0x35, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, - 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, - 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x39, 0x61, 0x63, - 0x30, 0x38, 0x39, 0x32, 0x64, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, - 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, - 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, - 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, - 0x38, 0x30, 0x61, 0x38, 0x30, 0x31, 0x39, 0x38, 0x2D, 0x30, 0x62, 0x66, - 0x32, 0x2D, 0x37, 0x64, 0x34, 0x62, 0x2D, 0x39, 0x65, 0x32, 0x36, 0x2D, - 0x62, 0x66, 0x39, 0x36, 0x37, 0x34, 0x36, 0x39, 0x63, 0x65, 0x34, 0x66, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, - 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, - 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, - 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, - 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x38, 0x30, 0x61, 0x38, 0x30, - 0x31, 0x39, 0x38, 0x2D, 0x30, 0x62, 0x66, 0x32, 0x2D, 0x37, 0x64, 0x34, - 0x62, 0x2D, 0x39, 0x65, 0x32, 0x36, 0x2D, 0x62, 0x66, 0x39, 0x36, 0x37, - 0x34, 0x36, 0x39, 0x63, 0x65, 0x34, 0x66, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, - 0x38, 0x3A, 0x35, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, - 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, - 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, - 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, - 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, - 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, - 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, - 0x64, 0x3A, 0x63, 0x36, 0x30, 0x66, 0x62, 0x37, 0x34, 0x35, 0x2D, 0x30, - 0x38, 0x61, 0x63, 0x2D, 0x35, 0x64, 0x34, 0x38, 0x2D, 0x38, 0x65, 0x39, - 0x33, 0x2D, 0x39, 0x65, 0x62, 0x38, 0x39, 0x65, 0x31, 0x32, 0x30, 0x63, - 0x64, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, - 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, - 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, - 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x35, 0x37, 0x2B, - 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, - 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, - 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, - 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, - 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, - 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, - 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, - 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, - 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, - 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, - 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, - 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, - 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, - 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, - 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, - 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, - 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, - 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, - 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, - 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, - 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, - 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0xE2, 0x3E, - 0xB4, 0x34, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, - 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, - 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, - 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, - 0x02, 0x8E, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0xDB, 0xBF, 0x6B, - 0x14, 0x41, 0x18, 0xC6, 0xF1, 0xEF, 0xC6, 0x5C, 0xCE, 0xC3, 0x93, 0xA0, - 0x48, 0xF0, 0x07, 0x6A, 0x0A, 0x15, 0x31, 0x8D, 0x55, 0x40, 0xB0, 0xB4, - 0xD0, 0x42, 0xD0, 0xCE, 0x7F, 0x40, 0x41, 0x11, 0x04, 0x5B, 0x7B, 0x3B, - 0x11, 0xC4, 0x42, 0x05, 0xB1, 0x13, 0x04, 0x1B, 0x41, 0xAC, 0x6D, 0xAD, - 0x04, 0x41, 0xC4, 0x46, 0xB0, 0x88, 0x12, 0x41, 0xD0, 0x80, 0x07, 0x31, - 0xB9, 0x5B, 0x8B, 0x4C, 0x40, 0xD6, 0x99, 0xDD, 0xD9, 0x99, 0x59, 0xDD, - 0x95, 0x67, 0xE0, 0x8A, 0x5B, 0xDE, 0xEC, 0xED, 0x7C, 0xF6, 0x9D, 0x99, - 0x77, 0xF6, 0x72, 0x59, 0x9E, 0xE7, 0xA8, 0xC1, 0x94, 0x08, 0x04, 0x21, - 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, - 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x88, 0xFF, - 0x09, 0xE2, 0x3C, 0xB0, 0x02, 0xE4, 0xFF, 0xE8, 0xB5, 0x0A, 0xDC, 0x88, - 0xE9, 0x40, 0x16, 0xF9, 0xF0, 0xF6, 0x15, 0xB0, 0xD8, 0xB2, 0x9B, 0xFB, - 0x09, 0x38, 0x00, 0x8C, 0xFF, 0x46, 0x46, 0x1C, 0x37, 0x77, 0x62, 0xB1, - 0x85, 0x59, 0xBE, 0x17, 0x58, 0x07, 0x2E, 0x36, 0x0D, 0x71, 0x0B, 0x78, - 0xDD, 0x81, 0x61, 0xFF, 0x00, 0x78, 0xD7, 0x14, 0xC4, 0x4D, 0xE0, 0x7A, - 0xC5, 0x87, 0x1F, 0x06, 0xB6, 0x02, 0x7D, 0x8F, 0xD7, 0x7C, 0xC9, 0xB9, - 0x06, 0x85, 0xD8, 0x61, 0x49, 0xAC, 0x6B, 0x7C, 0x1F, 0x05, 0xDE, 0xA7, - 0x9E, 0x23, 0x8E, 0x94, 0x9C, 0x74, 0x1B, 0x30, 0xAA, 0x89, 0xDA, 0x03, - 0x7E, 0xBA, 0xAE, 0xAB, 0x46, 0x67, 0x67, 0x80, 0x35, 0x60, 0x1A, 0xF8, - 0x02, 0xEC, 0xB0, 0xC4, 0x5C, 0x03, 0xEE, 0xA4, 0x82, 0xB0, 0x05, 0x3E, - 0x01, 0x2E, 0x04, 0xA4, 0x6D, 0x2A, 0x84, 0x21, 0xF0, 0xC3, 0x33, 0xB6, - 0x67, 0xE6, 0x8E, 0xA8, 0xA1, 0xF1, 0xC2, 0x72, 0xEC, 0x69, 0x87, 0x10, - 0x00, 0xBE, 0xA5, 0xC8, 0x88, 0xDC, 0xF3, 0xA2, 0xDB, 0x8A, 0xB0, 0xD9, - 0xB6, 0x00, 0x93, 0xD0, 0x8C, 0x38, 0xE1, 0x98, 0x13, 0xBA, 0x86, 0x00, - 0xF0, 0x38, 0x26, 0x23, 0x96, 0xCC, 0xDA, 0x1C, 0x93, 0x0D, 0x53, 0x25, - 0x05, 0x4E, 0x53, 0x08, 0x43, 0xB3, 0x7C, 0xEE, 0xF7, 0xB9, 0x76, 0x9F, - 0x8C, 0x28, 0x22, 0xDC, 0x4D, 0x88, 0x60, 0xFB, 0xFC, 0x89, 0x23, 0x76, - 0xA7, 0x05, 0x61, 0x52, 0x01, 0x76, 0x3A, 0x65, 0x89, 0x5D, 0x0C, 0xD8, - 0x67, 0xCA, 0xD8, 0x58, 0x04, 0xDB, 0x78, 0x9D, 0x38, 0xEE, 0xD8, 0x2E, - 0xE0, 0x6B, 0x60, 0x6C, 0xEE, 0x93, 0x11, 0x21, 0x10, 0xFD, 0x92, 0xB1, - 0xDE, 0x36, 0x04, 0x6F, 0x88, 0x90, 0x12, 0xBB, 0xD7, 0x21, 0x84, 0x46, - 0xF7, 0x1A, 0xA7, 0x3A, 0x84, 0xD0, 0x4F, 0x09, 0x51, 0xEC, 0xD4, 0xBD, - 0x9A, 0xF1, 0x65, 0x08, 0xAB, 0x35, 0x3A, 0xB6, 0x1E, 0x90, 0x09, 0xB7, - 0x53, 0x42, 0x3C, 0x2C, 0xBC, 0xDF, 0x1D, 0xB0, 0xF9, 0x99, 0xB1, 0x20, - 0x8C, 0xCC, 0xF1, 0x62, 0x9B, 0xB7, 0x74, 0x6C, 0x64, 0x20, 0x7D, 0x62, - 0x7F, 0x6F, 0x97, 0x0B, 0xEF, 0x97, 0x63, 0x20, 0xAE, 0x58, 0x8E, 0x3D, - 0x0A, 0xD8, 0x14, 0x15, 0x3B, 0x36, 0x70, 0x74, 0xEC, 0x63, 0x44, 0x6C, - 0x55, 0x21, 0x78, 0x32, 0xB6, 0xC4, 0x1E, 0x5B, 0xD0, 0x66, 0xD9, 0x78, - 0x3C, 0xD7, 0x46, 0x84, 0xCC, 0x51, 0x63, 0x64, 0xB1, 0x93, 0xE5, 0x9C, - 0xE5, 0xD8, 0x77, 0x53, 0x6A, 0xB7, 0x0D, 0xC1, 0x55, 0x68, 0x9D, 0x4B, - 0xB5, 0x0D, 0x7F, 0x0B, 0x1C, 0xF3, 0x8C, 0xB5, 0x21, 0xAC, 0x00, 0xDB, - 0x1B, 0x46, 0x98, 0x73, 0xCC, 0x03, 0x79, 0xD5, 0x4D, 0xAF, 0xB3, 0x7C, - 0x2E, 0x78, 0xC6, 0x0D, 0x2C, 0x08, 0x4B, 0x0E, 0x84, 0x05, 0x4B, 0xC7, - 0x3E, 0x3B, 0x10, 0x0E, 0x95, 0x20, 0xEC, 0x31, 0x25, 0xF5, 0x72, 0xC9, - 0x8A, 0x95, 0xEC, 0x09, 0x55, 0xD9, 0xD8, 0x6B, 0x73, 0xB3, 0x6D, 0xD4, - 0xFE, 0x68, 0xD3, 0x35, 0x4F, 0x9A, 0x1B, 0x8C, 0x31, 0xDD, 0xF8, 0x72, - 0xC8, 0x36, 0x44, 0x93, 0x55, 0x96, 0x9B, 0xA9, 0x76, 0xB5, 0xC5, 0x00, - 0xCF, 0xCC, 0x0D, 0x5B, 0xF3, 0x4E, 0xF5, 0x04, 0xFF, 0x9D, 0x7F, 0x1F, - 0xB8, 0xD4, 0x12, 0x80, 0xE7, 0xC0, 0xD9, 0x90, 0x3F, 0xCC, 0x12, 0xFF, - 0x4C, 0xE1, 0x20, 0x70, 0x86, 0x8D, 0xC7, 0xE8, 0x31, 0x6D, 0xD6, 0x2C, - 0xCF, 0x55, 0xED, 0x03, 0xF0, 0x12, 0x78, 0x13, 0x7B, 0xE1, 0x99, 0x7E, - 0xAF, 0x11, 0x37, 0x47, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, - 0x21, 0x08, 0x35, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, - 0x21, 0x08, 0x41, 0x44, 0xB6, 0x5F, 0x03, 0x00, 0xB0, 0xEE, 0xE7, 0x04, - 0x67, 0x01, 0x94, 0x88, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, - 0xAE, 0x42, 0x60, 0x82 -}; -} -static const unsigned char* misc_icon = raw::misc_raw; -} \ No newline at end of file diff --git a/tf2/icons/rage.hpp b/tf2/icons/rage.hpp deleted file mode 100644 index 00dff07..0000000 --- a/tf2/icons/rage.hpp +++ /dev/null @@ -1,1293 +0,0 @@ -/* E:\Users\admin\Desktop\stuff\icons\rage.png (1/26/2018 4:18:26 AM) - StartOffset: 00000000, EndOffset: 00003C11, Length: 00003C12 */ - -namespace icons { -static const size_t rage_size = 15378; -namespace raw { -static const unsigned char rage_raw[15378] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, - 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, - 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, - 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, - 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, - 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, - 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, - 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, - 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, - 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, - 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, - 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, - 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, - 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, - 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, - 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, - 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, - 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, - 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, - 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, - 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, - 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, - 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, - 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, - 0x31, 0x38, 0x3A, 0x32, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, - 0x3A, 0x32, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, - 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, - 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x32, - 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, - 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, - 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, - 0x39, 0x61, 0x36, 0x38, 0x61, 0x33, 0x31, 0x37, 0x2D, 0x37, 0x65, 0x39, - 0x34, 0x2D, 0x37, 0x30, 0x34, 0x31, 0x2D, 0x38, 0x63, 0x62, 0x30, 0x2D, - 0x61, 0x39, 0x35, 0x63, 0x62, 0x61, 0x33, 0x33, 0x39, 0x66, 0x34, 0x65, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, - 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, - 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x39, 0x31, 0x65, - 0x62, 0x39, 0x62, 0x37, 0x65, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, - 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, - 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, - 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, - 0x33, 0x62, 0x30, 0x66, 0x31, 0x39, 0x37, 0x63, 0x2D, 0x32, 0x35, 0x66, - 0x66, 0x2D, 0x30, 0x66, 0x34, 0x63, 0x2D, 0x61, 0x62, 0x66, 0x36, 0x2D, - 0x33, 0x66, 0x33, 0x30, 0x39, 0x30, 0x65, 0x33, 0x32, 0x31, 0x63, 0x62, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, - 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, - 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, - 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, - 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x33, 0x62, 0x30, 0x66, 0x31, - 0x39, 0x37, 0x63, 0x2D, 0x32, 0x35, 0x66, 0x66, 0x2D, 0x30, 0x66, 0x34, - 0x63, 0x2D, 0x61, 0x62, 0x66, 0x36, 0x2D, 0x33, 0x66, 0x33, 0x30, 0x39, - 0x30, 0x65, 0x33, 0x32, 0x31, 0x63, 0x62, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, - 0x38, 0x3A, 0x32, 0x34, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, - 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, - 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, - 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, - 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, - 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, - 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, - 0x64, 0x3A, 0x39, 0x61, 0x36, 0x38, 0x61, 0x33, 0x31, 0x37, 0x2D, 0x37, - 0x65, 0x39, 0x34, 0x2D, 0x37, 0x30, 0x34, 0x31, 0x2D, 0x38, 0x63, 0x62, - 0x30, 0x2D, 0x61, 0x39, 0x35, 0x63, 0x62, 0x61, 0x33, 0x33, 0x39, 0x66, - 0x34, 0x65, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, - 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, - 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, - 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x32, 0x34, 0x2B, - 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, - 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, - 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, - 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, - 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, - 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, - 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, - 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, - 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, - 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, - 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, - 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, - 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, - 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, - 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, - 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, - 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, - 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, - 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, - 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, - 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, - 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x2C, 0xB7, - 0x84, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, - 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, - 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, - 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, - 0x01, 0xA0, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0xDA, 0x3F, 0x4B, - 0xC3, 0x40, 0x18, 0xC7, 0xF1, 0x6F, 0xFC, 0x8B, 0xA2, 0xB3, 0x48, 0x07, - 0x37, 0x11, 0x1C, 0xEC, 0x24, 0x3A, 0x14, 0xC1, 0xC5, 0x97, 0xE0, 0x24, - 0x4E, 0xBE, 0x0B, 0x57, 0x75, 0x76, 0x12, 0x9C, 0x1C, 0xC4, 0xD1, 0x17, - 0xE0, 0x20, 0x4E, 0x8A, 0x20, 0xBA, 0x15, 0xD1, 0x41, 0x57, 0x9D, 0x05, - 0x07, 0x5B, 0xCF, 0x21, 0x05, 0xCB, 0x79, 0x36, 0x09, 0xB4, 0x49, 0x9B, - 0xE7, 0xF7, 0xC0, 0x0D, 0xF7, 0x5C, 0x2E, 0x21, 0x9F, 0x34, 0x77, 0xD7, - 0x6B, 0x23, 0xE7, 0x1C, 0x0A, 0x18, 0x12, 0x81, 0x20, 0x04, 0x21, 0x08, - 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, 0x41, - 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x31, 0x28, 0x10, 0x93, - 0x80, 0x6B, 0x2B, 0x7E, 0x34, 0xBC, 0xF6, 0xA2, 0xCA, 0x2B, 0x50, 0xED, - 0x25, 0xC4, 0x47, 0x42, 0xFB, 0x70, 0x9F, 0x3C, 0xD4, 0x39, 0xE0, 0xA1, - 0x85, 0xB2, 0x93, 0xB5, 0x73, 0x94, 0x62, 0x17, 0xDB, 0x3F, 0x20, 0x4A, - 0x68, 0xEF, 0xA7, 0x88, 0x34, 0x46, 0xFC, 0x3E, 0xA4, 0x54, 0xF7, 0x38, - 0xD2, 0x83, 0x8B, 0x9F, 0x01, 0x17, 0x5D, 0x3C, 0xDF, 0x89, 0x57, 0x7F, - 0x02, 0xF6, 0xDB, 0xEA, 0x53, 0xC0, 0x26, 0x50, 0xFB, 0xA7, 0x7F, 0x33, - 0xD5, 0x27, 0xC3, 0x39, 0x97, 0x54, 0xFC, 0x48, 0x6A, 0x9F, 0x4D, 0x71, - 0xCE, 0x2C, 0xC5, 0x8F, 0xED, 0x0E, 0xC7, 0xAE, 0xBB, 0x70, 0x5C, 0x25, - 0x5D, 0xA7, 0x6C, 0xAF, 0xC6, 0x25, 0x30, 0x16, 0xC8, 0xAF, 0x01, 0xA3, - 0xD6, 0xC6, 0x88, 0x2F, 0x60, 0x26, 0x90, 0x7F, 0xB1, 0x38, 0x58, 0xBE, - 0x03, 0x8F, 0x5E, 0xAE, 0x62, 0x75, 0xD6, 0x58, 0x0C, 0xE4, 0x16, 0x2C, - 0x42, 0x7C, 0x07, 0x72, 0xC7, 0x56, 0xD7, 0x11, 0xF7, 0x5E, 0x7D, 0xD9, - 0x2A, 0xC4, 0xB5, 0x57, 0x1F, 0xB7, 0x0A, 0xF1, 0xAC, 0x25, 0x76, 0x1C, - 0x35, 0x41, 0xC4, 0xB1, 0xE1, 0xD5, 0xDF, 0xAC, 0x42, 0x4C, 0x7B, 0xF5, - 0x23, 0x8B, 0x10, 0xA1, 0x19, 0x62, 0xCF, 0x22, 0xC4, 0x6D, 0x20, 0xD7, - 0xB0, 0x06, 0x71, 0x13, 0xC8, 0x6D, 0x59, 0x1B, 0x2C, 0xCF, 0x81, 0x95, - 0x40, 0xFE, 0x34, 0xEF, 0x8D, 0x99, 0xA2, 0xA2, 0x4A, 0xBC, 0x67, 0x19, - 0x8A, 0x4A, 0x52, 0xE7, 0xB2, 0xEF, 0x59, 0x02, 0xEC, 0x76, 0x1A, 0x24, - 0xAD, 0x4C, 0x9F, 0x07, 0x69, 0x10, 0xCA, 0xF6, 0x6A, 0x84, 0xBE, 0x86, - 0xD7, 0xBB, 0xB9, 0xB2, 0x5C, 0x1A, 0x30, 0x80, 0xC3, 0xD6, 0xEB, 0x5B, - 0xCF, 0xD2, 0x29, 0xEA, 0xC2, 0xBF, 0xF3, 0x57, 0x81, 0xF9, 0x9C, 0x6E, - 0x72, 0x02, 0xF8, 0xF4, 0x72, 0x4D, 0xE0, 0x8E, 0xBF, 0x3B, 0x52, 0xE4, - 0x0D, 0x51, 0x8A, 0xD0, 0x8F, 0xC0, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, - 0x08, 0x41, 0x08, 0x42, 0x10, 0x82, 0x10, 0x84, 0x20, 0x04, 0x21, 0x08, - 0x41, 0x08, 0x42, 0x10, 0x82, 0x28, 0x36, 0x7E, 0x06, 0x00, 0x5C, 0x33, - 0x34, 0xCB, 0x4C, 0x00, 0x5F, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, - 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static const unsigned char* rage_icon = raw::rage_raw; -} \ No newline at end of file diff --git a/tf2/icons/visuals.hpp b/tf2/icons/visuals.hpp deleted file mode 100644 index 4d50ae3..0000000 --- a/tf2/icons/visuals.hpp +++ /dev/null @@ -1,1318 +0,0 @@ -namespace icons { -constexpr size_t visuals_size = 15715; -namespace raw { -constexpr unsigned char visuals_raw[15715] = { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xE3, 0x54, 0x00, 0xE8, 0x00, 0x00, 0x00, - 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, - 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x39, 0xEC, 0x69, 0x54, - 0x58, 0x74, 0x58, 0x4D, 0x4C, 0x3A, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x78, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x20, 0x62, 0x65, - 0x67, 0x69, 0x6E, 0x3D, 0x22, 0xEF, 0xBB, 0xBF, 0x22, 0x20, 0x69, 0x64, - 0x3D, 0x22, 0x57, 0x35, 0x4D, 0x30, 0x4D, 0x70, 0x43, 0x65, 0x68, 0x69, - 0x48, 0x7A, 0x72, 0x65, 0x53, 0x7A, 0x4E, 0x54, 0x63, 0x7A, 0x6B, 0x63, - 0x39, 0x64, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x78, 0x3A, 0x78, 0x6D, 0x70, - 0x6D, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x3D, 0x22, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x6E, 0x73, 0x3A, 0x6D, - 0x65, 0x74, 0x61, 0x2F, 0x22, 0x20, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x74, - 0x6B, 0x3D, 0x22, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x58, 0x4D, 0x50, - 0x20, 0x43, 0x6F, 0x72, 0x65, 0x20, 0x35, 0x2E, 0x36, 0x2D, 0x63, 0x31, - 0x33, 0x38, 0x20, 0x37, 0x39, 0x2E, 0x31, 0x35, 0x39, 0x38, 0x32, 0x34, - 0x2C, 0x20, 0x32, 0x30, 0x31, 0x36, 0x2F, 0x30, 0x39, 0x2F, 0x31, 0x34, - 0x2D, 0x30, 0x31, 0x3A, 0x30, 0x39, 0x3A, 0x30, 0x31, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x72, 0x64, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x33, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x31, 0x39, 0x39, 0x39, 0x2F, 0x30, 0x32, 0x2F, 0x32, 0x32, 0x2D, - 0x72, 0x64, 0x66, 0x2D, 0x73, 0x79, 0x6E, 0x74, 0x61, 0x78, 0x2D, 0x6E, - 0x73, 0x23, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x72, 0x64, 0x66, 0x3A, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x61, 0x62, 0x6F, 0x75, - 0x74, 0x3D, 0x22, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x78, - 0x6D, 0x70, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, - 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, - 0x6C, 0x6E, 0x73, 0x3A, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3D, 0x22, 0x68, - 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, - 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, - 0x2E, 0x30, 0x2F, 0x6D, 0x6D, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, - 0x73, 0x3A, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x78, 0x61, 0x70, 0x2F, 0x31, 0x2E, 0x30, - 0x2F, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2F, 0x52, 0x65, 0x73, 0x6F, 0x75, - 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x23, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, - 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x64, 0x63, 0x3D, 0x22, 0x68, 0x74, 0x74, - 0x70, 0x3A, 0x2F, 0x2F, 0x70, 0x75, 0x72, 0x6C, 0x2E, 0x6F, 0x72, 0x67, - 0x2F, 0x64, 0x63, 0x2F, 0x65, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x73, - 0x2F, 0x31, 0x2E, 0x31, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x68, 0x6F, 0x74, - 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3A, 0x74, 0x69, 0x66, 0x66, 0x3D, 0x22, - 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, - 0x6F, 0x62, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x74, 0x69, 0x66, 0x66, - 0x2F, 0x31, 0x2E, 0x30, 0x2F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, - 0x3A, 0x65, 0x78, 0x69, 0x66, 0x3D, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, - 0x2F, 0x2F, 0x6E, 0x73, 0x2E, 0x61, 0x64, 0x6F, 0x62, 0x65, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x2F, 0x31, 0x2E, 0x30, 0x2F, - 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6F, 0x72, - 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, - 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, - 0x73, 0x29, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x6F, 0x72, 0x54, 0x6F, 0x6F, 0x6C, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, - 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, - 0x31, 0x38, 0x3A, 0x33, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, - 0x2F, 0x78, 0x6D, 0x70, 0x3A, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, - 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, - 0x3A, 0x33, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x3A, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, - 0x61, 0x74, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, - 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, - 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x33, - 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x78, 0x6D, 0x70, - 0x3A, 0x4D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x44, 0x61, 0x74, 0x65, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, - 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, - 0x32, 0x39, 0x31, 0x35, 0x36, 0x62, 0x33, 0x33, 0x2D, 0x65, 0x62, 0x62, - 0x31, 0x2D, 0x63, 0x39, 0x34, 0x36, 0x2D, 0x38, 0x62, 0x33, 0x34, 0x2D, - 0x30, 0x39, 0x32, 0x39, 0x31, 0x63, 0x62, 0x31, 0x34, 0x65, 0x36, 0x35, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x49, 0x6E, 0x73, 0x74, - 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, - 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x49, 0x44, 0x3E, 0x61, - 0x64, 0x6F, 0x62, 0x65, 0x3A, 0x64, 0x6F, 0x63, 0x69, 0x64, 0x3A, 0x70, - 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, 0x39, 0x33, 0x30, - 0x65, 0x35, 0x38, 0x62, 0x39, 0x2D, 0x30, 0x32, 0x34, 0x37, 0x2D, 0x31, - 0x31, 0x65, 0x38, 0x2D, 0x61, 0x33, 0x38, 0x37, 0x2D, 0x38, 0x65, 0x34, - 0x32, 0x36, 0x32, 0x63, 0x35, 0x34, 0x30, 0x63, 0x32, 0x3C, 0x2F, 0x78, - 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, - 0x67, 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x64, 0x69, 0x64, 0x3A, - 0x62, 0x64, 0x62, 0x35, 0x39, 0x65, 0x61, 0x36, 0x2D, 0x37, 0x63, 0x63, - 0x30, 0x2D, 0x65, 0x65, 0x34, 0x34, 0x2D, 0x39, 0x33, 0x61, 0x66, 0x2D, - 0x32, 0x64, 0x33, 0x62, 0x38, 0x30, 0x39, 0x32, 0x31, 0x35, 0x33, 0x39, - 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x4F, 0x72, 0x69, 0x67, - 0x69, 0x6E, 0x61, 0x6C, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, - 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x78, 0x6D, 0x70, 0x4D, 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, - 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, - 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, - 0x69, 0x20, 0x72, 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, - 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, - 0x6D, 0x70, 0x2E, 0x69, 0x69, 0x64, 0x3A, 0x62, 0x64, 0x62, 0x35, 0x39, - 0x65, 0x61, 0x36, 0x2D, 0x37, 0x63, 0x63, 0x30, 0x2D, 0x65, 0x65, 0x34, - 0x34, 0x2D, 0x39, 0x33, 0x61, 0x66, 0x2D, 0x32, 0x64, 0x33, 0x62, 0x38, - 0x30, 0x39, 0x32, 0x31, 0x35, 0x33, 0x39, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, - 0x44, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, - 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, - 0x38, 0x2D, 0x30, 0x31, 0x2D, 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, - 0x38, 0x3A, 0x33, 0x37, 0x2B, 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, - 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, - 0x6E, 0x74, 0x3E, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, - 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, - 0x31, 0x37, 0x20, 0x28, 0x57, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, - 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3C, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x20, 0x72, - 0x64, 0x66, 0x3A, 0x70, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x3D, 0x22, 0x52, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3E, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, - 0x74, 0x3A, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x73, 0x61, 0x76, - 0x65, 0x64, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x78, 0x6D, 0x70, 0x2E, 0x69, 0x69, - 0x64, 0x3A, 0x32, 0x39, 0x31, 0x35, 0x36, 0x62, 0x33, 0x33, 0x2D, 0x65, - 0x62, 0x62, 0x31, 0x2D, 0x63, 0x39, 0x34, 0x36, 0x2D, 0x38, 0x62, 0x33, - 0x34, 0x2D, 0x30, 0x39, 0x32, 0x39, 0x31, 0x63, 0x62, 0x31, 0x34, 0x65, - 0x36, 0x35, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x69, 0x6E, - 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x77, - 0x68, 0x65, 0x6E, 0x3E, 0x32, 0x30, 0x31, 0x38, 0x2D, 0x30, 0x31, 0x2D, - 0x32, 0x36, 0x54, 0x31, 0x31, 0x3A, 0x31, 0x38, 0x3A, 0x33, 0x37, 0x2B, - 0x30, 0x38, 0x3A, 0x30, 0x30, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, - 0x3A, 0x77, 0x68, 0x65, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x41, 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x41, 0x64, - 0x6F, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, - 0x70, 0x20, 0x43, 0x43, 0x20, 0x32, 0x30, 0x31, 0x37, 0x20, 0x28, 0x57, - 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x29, 0x3C, 0x2F, 0x73, 0x74, 0x45, - 0x76, 0x74, 0x3A, 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x41, - 0x67, 0x65, 0x6E, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, 0x63, 0x68, 0x61, 0x6E, 0x67, - 0x65, 0x64, 0x3E, 0x2F, 0x3C, 0x2F, 0x73, 0x74, 0x45, 0x76, 0x74, 0x3A, - 0x63, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x6C, 0x69, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, - 0x72, 0x64, 0x66, 0x3A, 0x53, 0x65, 0x71, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x78, 0x6D, 0x70, 0x4D, - 0x4D, 0x3A, 0x48, 0x69, 0x73, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x63, 0x3A, - 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x3E, 0x69, 0x6D, 0x61, 0x67, 0x65, - 0x2F, 0x70, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x63, 0x3A, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, - 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x33, - 0x3C, 0x2F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F, 0x70, 0x3A, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x6F, 0x64, 0x65, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x4F, 0x72, 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x31, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x4F, 0x72, - 0x69, 0x65, 0x6E, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, - 0x66, 0x3A, 0x58, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, - 0x6E, 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, - 0x30, 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x58, 0x52, 0x65, - 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, - 0x3A, 0x59, 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, - 0x3E, 0x37, 0x32, 0x30, 0x30, 0x30, 0x30, 0x2F, 0x31, 0x30, 0x30, 0x30, - 0x30, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x59, 0x52, 0x65, 0x73, - 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x74, 0x69, 0x66, 0x66, 0x3A, - 0x52, 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, - 0x69, 0x74, 0x3E, 0x32, 0x3C, 0x2F, 0x74, 0x69, 0x66, 0x66, 0x3A, 0x52, - 0x65, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x55, 0x6E, 0x69, - 0x74, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, - 0x70, 0x61, 0x63, 0x65, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C, 0x2F, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x53, 0x70, - 0x61, 0x63, 0x65, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3C, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, - 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, - 0x36, 0x36, 0x3C, 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, - 0x65, 0x6C, 0x58, 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, - 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, - 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, 0x44, - 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x36, 0x36, 0x3C, - 0x2F, 0x65, 0x78, 0x69, 0x66, 0x3A, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x59, - 0x44, 0x69, 0x6D, 0x65, 0x6E, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0A, - 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x72, 0x64, 0x66, 0x3A, 0x52, 0x44, 0x46, - 0x3E, 0x0A, 0x3C, 0x2F, 0x78, 0x3A, 0x78, 0x6D, 0x70, 0x6D, 0x65, 0x74, - 0x61, 0x3E, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x0A, 0x3C, 0x3F, 0x78, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x74, - 0x20, 0x65, 0x6E, 0x64, 0x3D, 0x22, 0x77, 0x22, 0x3F, 0x3E, 0x20, 0x2B, - 0x35, 0xED, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, - 0x7A, 0x25, 0x00, 0x00, 0x80, 0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, - 0x80, 0xE9, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, - 0x3A, 0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00, 0x00, - 0x02, 0xF1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xEC, 0x9B, 0xBD, 0x6B, - 0x14, 0x41, 0x18, 0x87, 0x9F, 0xBD, 0xDC, 0x25, 0x31, 0x41, 0x31, 0x11, - 0x4E, 0x05, 0x25, 0x48, 0x48, 0x2C, 0x04, 0x2B, 0x15, 0x14, 0x84, 0x60, - 0x6C, 0xAC, 0xFC, 0x28, 0x44, 0xD2, 0x89, 0xA8, 0x85, 0x85, 0x58, 0xD9, - 0x08, 0xFE, 0x01, 0x82, 0xFD, 0x89, 0x85, 0x8D, 0x60, 0x17, 0x45, 0x10, - 0x8D, 0x85, 0x96, 0x36, 0x62, 0x65, 0x21, 0x58, 0x84, 0x53, 0x50, 0xB9, - 0x22, 0x28, 0x1A, 0xF5, 0x72, 0xB9, 0xD7, 0xC2, 0x0D, 0x1C, 0xCB, 0x7C, - 0xEC, 0xEC, 0xEE, 0x7D, 0x04, 0xDE, 0x1F, 0x6C, 0xB1, 0x33, 0xF3, 0x9B, - 0xF7, 0xE6, 0xB9, 0x77, 0x67, 0x67, 0xE6, 0xB8, 0x48, 0x44, 0x50, 0x41, - 0x49, 0x11, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, 0x10, - 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, 0x50, - 0x10, 0x0A, 0x42, 0x41, 0x28, 0x88, 0xBE, 0xAA, 0x5C, 0x70, 0x7F, 0x3B, - 0x81, 0x79, 0x60, 0x06, 0x98, 0x08, 0xF4, 0x0E, 0x03, 0xCD, 0x80, 0xF6, - 0x4D, 0xE0, 0x3D, 0xF0, 0x0A, 0xA8, 0x0F, 0x02, 0x88, 0x1B, 0xC0, 0xDD, - 0x01, 0xF9, 0x62, 0x1F, 0x00, 0x17, 0xB3, 0x18, 0xA3, 0x1C, 0x87, 0xB7, - 0x0B, 0xC0, 0xC3, 0x01, 0xCD, 0xF4, 0x60, 0x20, 0x59, 0x41, 0xFC, 0x8D, - 0x53, 0x79, 0xD0, 0x55, 0x01, 0x5A, 0xDD, 0x9A, 0x2C, 0x65, 0x93, 0x40, - 0x00, 0x58, 0x03, 0x46, 0xBB, 0x01, 0xC2, 0x95, 0x3E, 0xF3, 0x40, 0x94, - 0xB8, 0x86, 0x3C, 0xFD, 0xDD, 0x01, 0xB6, 0x74, 0xB4, 0xAF, 0x00, 0x97, - 0x3C, 0x9E, 0x49, 0x43, 0x9C, 0x99, 0x38, 0x4B, 0x4D, 0xFA, 0x1D, 0xB7, - 0xF1, 0x8C, 0x4C, 0x24, 0xED, 0xF5, 0x56, 0xCC, 0x3A, 0xEE, 0xF0, 0xD8, - 0x74, 0x28, 0x45, 0xBC, 0xAA, 0xC3, 0x6F, 0xF3, 0xEC, 0xB1, 0xB4, 0x6F, - 0xF9, 0xE2, 0xA5, 0x85, 0xB0, 0xDD, 0x12, 0x60, 0xDC, 0xE1, 0xB9, 0x66, - 0xF1, 0x44, 0x01, 0xF0, 0x89, 0x07, 0x91, 0xD4, 0x3B, 0x47, 0xFB, 0xC8, - 0x12, 0xF7, 0x84, 0x2B, 0x4E, 0xDA, 0xC9, 0xB2, 0x65, 0x48, 0xF3, 0x49, - 0x60, 0x25, 0xF0, 0x31, 0x2A, 0x79, 0x1E, 0xAF, 0x90, 0xBE, 0x86, 0x80, - 0xB6, 0xE3, 0x91, 0x5F, 0x37, 0xBD, 0x1C, 0xF2, 0xCC, 0x11, 0x25, 0x03, - 0x84, 0x27, 0x1E, 0x08, 0xA7, 0x0D, 0x65, 0xFB, 0x33, 0x42, 0x00, 0x18, - 0x31, 0x94, 0xBD, 0x70, 0xB4, 0x6F, 0xC7, 0x73, 0x56, 0x52, 0xD3, 0x79, - 0x5E, 0x9F, 0x35, 0xE0, 0x4A, 0x5A, 0xB2, 0x1D, 0xB3, 0x75, 0x39, 0xD0, - 0xE3, 0x53, 0x1D, 0xD8, 0x1B, 0xD8, 0x67, 0x72, 0x70, 0x5F, 0x81, 0xDD, - 0x59, 0x33, 0x22, 0x39, 0x8B, 0x7F, 0xCB, 0xB0, 0x62, 0xBD, 0x50, 0xC0, - 0xAB, 0xF0, 0x40, 0x06, 0xCF, 0xBD, 0xC4, 0xFD, 0xAE, 0x3C, 0x19, 0x91, - 0x6C, 0x70, 0x0E, 0x58, 0x0C, 0xF4, 0x44, 0x14, 0xA3, 0x64, 0xBF, 0x53, - 0x9E, 0x7D, 0xC6, 0x18, 0xF0, 0x2B, 0xCD, 0x67, 0xC9, 0xB2, 0xA0, 0x5A, - 0xF2, 0xD4, 0x8F, 0xD2, 0x3B, 0x1D, 0xF1, 0xD4, 0xAF, 0x76, 0x73, 0x1B, - 0xBE, 0xE6, 0xA9, 0x1F, 0xEF, 0x21, 0x88, 0xC2, 0x62, 0x65, 0x01, 0xB1, - 0xC3, 0x53, 0xFF, 0xBD, 0x87, 0x20, 0x3E, 0xF5, 0x13, 0xC4, 0xCD, 0x14, - 0x6B, 0x8E, 0x5E, 0x3D, 0x2E, 0x6F, 0x3C, 0xF5, 0xB3, 0x45, 0x82, 0x68, - 0x24, 0xEE, 0xAF, 0x67, 0xF8, 0xC0, 0x8F, 0x0A, 0x18, 0xF4, 0xC9, 0x0C, - 0x73, 0xC0, 0x52, 0x91, 0x20, 0xCE, 0x5B, 0x66, 0x63, 0x97, 0x3E, 0xA6, - 0x58, 0x60, 0x85, 0xEA, 0x65, 0x06, 0xCF, 0x54, 0xE2, 0x7E, 0x31, 0x0F, - 0x88, 0xD7, 0x86, 0xB2, 0x9F, 0x1E, 0xCF, 0x61, 0x43, 0xD9, 0xD3, 0x1C, - 0x10, 0xCE, 0x1A, 0xCA, 0xCE, 0x78, 0x3C, 0x1F, 0x52, 0x7E, 0xA9, 0x41, - 0xBB, 0xCF, 0xE7, 0x86, 0x4D, 0x4C, 0xCD, 0xE3, 0x31, 0xE9, 0x68, 0xE0, - 0x86, 0x0B, 0x11, 0x99, 0x08, 0xDC, 0x81, 0x22, 0x22, 0x73, 0x86, 0xF6, - 0xAB, 0x45, 0xEC, 0x3E, 0x6D, 0x03, 0x73, 0xC1, 0xD8, 0x6A, 0xF1, 0x2C, - 0x04, 0xC4, 0x9C, 0xB6, 0xF4, 0x31, 0xE7, 0xF0, 0x9C, 0xB2, 0x78, 0x2A, - 0x45, 0x81, 0x38, 0x68, 0x09, 0xB0, 0x2E, 0x22, 0xC3, 0x16, 0xCF, 0x7D, - 0x8B, 0xA7, 0x29, 0x22, 0x63, 0x8E, 0x58, 0x65, 0x11, 0x59, 0xB6, 0x78, - 0x1B, 0x16, 0x4F, 0x49, 0x44, 0xBE, 0x58, 0x3C, 0xB7, 0x8B, 0x3A, 0x8F, - 0xD8, 0xB8, 0x6A, 0x8E, 0xC3, 0x92, 0x76, 0x1C, 0xB0, 0x1A, 0x83, 0xD9, - 0xB8, 0x7E, 0x88, 0x5B, 0x0D, 0x11, 0x79, 0x26, 0x22, 0x8F, 0x45, 0xE4, - 0xB3, 0xF8, 0x35, 0xD2, 0xD1, 0xF7, 0x36, 0x11, 0xB9, 0x1C, 0xA7, 0xBD, - 0x4D, 0xF5, 0x34, 0x63, 0xCB, 0x72, 0x78, 0x6B, 0xDA, 0x8D, 0x0E, 0xAA, - 0x96, 0x81, 0x7D, 0xDD, 0x5A, 0x50, 0x5D, 0x05, 0x8E, 0x6D, 0x02, 0x08, - 0xB7, 0xD2, 0x42, 0xC8, 0x73, 0x9C, 0xDF, 0xF9, 0x8A, 0x9A, 0x1D, 0x30, - 0x00, 0x2B, 0x40, 0x35, 0xED, 0x31, 0x7E, 0x9E, 0x8C, 0x48, 0x9E, 0x3A, - 0x45, 0xF1, 0xA3, 0xF2, 0xA7, 0x8F, 0x83, 0x6F, 0xF3, 0xFF, 0xD7, 0xB6, - 0x52, 0x7C, 0x84, 0xD8, 0x0A, 0xED, 0x20, 0xD2, 0xBF, 0x29, 0x14, 0x93, - 0x11, 0x0A, 0x42, 0x41, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, 0x82, - 0x50, 0x10, 0x0A, 0x42, 0x11, 0x28, 0x08, 0x05, 0xA1, 0x20, 0x14, 0x84, - 0x82, 0x50, 0x10, 0x0A, 0x42, 0x41, 0xE4, 0xD3, 0xBF, 0x01, 0x00, 0x36, - 0xC5, 0x99, 0x33, 0xE0, 0x8B, 0x14, 0x09, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 -}; -} -static const unsigned char* visuals_icon = raw::visuals_raw; -} diff --git a/tf2/identity.h b/tf2/identity.h deleted file mode 100644 index 0b3906a..0000000 --- a/tf2/identity.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "sdk.h" -//kept incase i wanna do shit here fuck you -namespace features -{ - class c_identity { - private: - public: - void operator()( ) { - } - }; -} \ No newline at end of file diff --git a/tf2/input_system.cpp b/tf2/input_system.cpp deleted file mode 100644 index 881fa02..0000000 --- a/tf2/input_system.cpp +++ /dev/null @@ -1,527 +0,0 @@ -#include - -#include "input_system.hpp" -#include "util.hpp" - -util::c_input_manager g_input; - -NAMESPACE_REGION( util ) - -const char* const key_names_short[] = { - "unk", - "m1", - "m2", - "can", - "m3", - "m4", - "m5", - "unk", - "back", - "tab", - "unk", - "unk", - "clr", - "ret", - "unk", - "unk", - "shift", - "ctrl", - "alt", - "pause", - "caps", - "kana", - "unk", - "junja", - "final", - "kanji", - "unk", - "esc", - "convert", - "nonconvert", - "accept", - "modechange", - " ", - "prior", - "next", - "end", - "home", - "left", - "up", - "right", - "down", - "slct", - "prnt", - "execute", - "snapshot", - "ins", - "del", - "help", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "lwin", - "rwin", - "apps", - "unk", - "unk", - "num0", - "num1", - "num2", - "num3", - "num4", - "num5", - "num6", - "num7", - "num8", - "num9", - "*", - "+", - "sep", - "-", - ",", - "/", - "f1", - "f2", - "f3", - "f4", - "f5", - "f6", - "f7", - "f8", - "f9", - "f10", - "f11", - "f12", - "f13", - "f14", - "f15", - "f16", - "f17", - "f18", - "f19", - "f20", - "f21", - "f22", - "f23", - "f24", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "numlock", - "scroll", - "oem_nec_equal", - "oem_fj_masshou", - "oem_fj_touroku", - "oem_fj_loya", - "oem_fj_roya", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "unk", - "lshift", - "rshift", - "lctrl", - "rctrl", - "lalt", - "ralt", -}; - -const char* const key_names[] = { - "unknown", - "mouse_1", - "mouse_2", - "cancel", - "mouse_3", - "mouse_4", - "mouse_5", - "unknown", - "back", - "tab", - "unknown", - "unknown", - "clear", - "return", - "unknown", - "unknown", - "shift", - "control", - "alt", - "pause", - "capital", - "kana", - "unknown", - "junja", - "final", - "kanji", - "unknown", - "escape", - "convert", - "nonconvert", - "accept", - "modechange", - "space", - "prior", - "next", - "end", - "home", - "left", - "up", - "right", - "down", - "select", - "print", - "execute", - "snapshot", - "insert", - "delete", - "help", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "lwin", - "rwin", - "apps", - "unknown", - "unknown", - "numpad0", - "numpad1", - "numpad2", - "numpad3", - "numpad4", - "numpad5", - "numpad6", - "numpad7", - "numpad8", - "numpad9", - "multiply", - "add", - "separator", - "subtract", - "decimal", - "divide", - "f1", - "f2", - "f3", - "f4", - "f5", - "f6", - "f7", - "f8", - "f9", - "f10", - "f11", - "f12", - "f13", - "f14", - "f15", - "f16", - "f17", - "f18", - "f19", - "f20", - "f21", - "f22", - "f23", - "f24", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "numlock", - "scroll", - "oem_nec_equal", - "oem_fj_masshou", - "oem_fj_touroku", - "oem_fj_loya", - "oem_fj_roya", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "unknown", - "lshift", - "rshift", - "lcontrol", - "rcontrol", - "lmenu", - "rmenu", -}; - -void c_input_manager::capture_mouse_move( ulong_t lparam ) { - m_mouse_pos[ 0 ] = LOWORD( lparam ); - m_mouse_pos[ 1 ] = HIWORD( lparam ); -} - -void c_input_manager::clear_keys( ) { - memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) ); -} - -bool c_input_manager::register_key_press( int key_event, int key ) -{ - switch ( key_event ) { - case KEYDOWN: { - if ( is_valid_key( key ) ) - m_pressed_keys[ key ] = true; - return true; - } - case KEYUP: { - if ( is_valid_key( key ) ) - m_pressed_keys[ key ] = false; - return true; - } - case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS? - if ( key == KEYS_ALT ) - m_pressed_keys[ key ] = true; - break; - } - case SYSKEYUP: { - if ( key == KEYS_ALT ) - m_pressed_keys[ key ] = false; - break; - } - case LBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE1 ] = true; - return true; - case LBUTTONUP: - m_pressed_keys[ KEYS_MOUSE1 ] = false; - return true; - case RBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE2 ] = true; - return true; - case RBUTTONUP: - m_pressed_keys[ KEYS_MOUSE2 ] = false; - return true; - case MBUTTONDOWN: - m_pressed_keys[ KEYS_MOUSE3 ] = true; - return true; - case MBUTTONUP: - m_pressed_keys[ KEYS_MOUSE3 ] = false; - return true; - case XBUTTONDOWN: { - bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true - m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true; - return true; - } - case XBUTTONUP: { - bool pressed_xbutton = static_cast( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true - m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false; - return true; - } - case MOUSEWHEEL: { - short scroll_input = ( short )HIWORD( key ); - m_scroll_wheel_state = scroll_input > 0 ? 1 : -1; - return true; - } - } - - return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK -} - -bool c_input_manager::is_key_pressed( int key ) { - auto k = key; - return is_valid_key( k ) && m_pressed_keys[ k ]; -} - -const char* c_input_manager::get_key_name( int key ) { - if ( !is_valid_key( key ) || key > KEYS_MAX ) - return key_names[ KEYS_NONE ]; - - return key_names[ key ]; -} - -const char* c_input_manager::get_short_name( int key ) { - return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ]; -} - -VirtualKeys_t c_input_manager::is_any_key_pressed( ) { - for ( size_t i{ }; i < KEYS_MAX; ++i ) { - if ( m_pressed_keys[ i ] ) { - return VirtualKeys_t( i ); - } - } - - return KEYS_NONE; -} - -int c_input_manager::get_scroll_state( ) { - int current_state = m_scroll_wheel_state; - m_scroll_wheel_state = 0; - return current_state; -} - -char c_input_manager::get_pressed_char( int* out ) { - size_t pressed_character{ }; - for ( size_t i{ }; i < KEYS_MAX; ++i ) { - if ( is_key_pressed( VirtualKeys_t( i ) ) ) { - if ( ( i >= KEYS_A && i <= KEYS_Z ) - || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) { - pressed_character = i; - } - } - } - - if ( pressed_character ) { - if ( out ) { - *out = int( pressed_character ); - } - - if ( is_key_pressed( KEYS_SHIFT ) ) { - if ( pressed_character >= KEYS_A - && pressed_character <= KEYS_Z ) - return char( pressed_character ); - - //gay way to shift it to symbols - if ( pressed_character >= KEYS_N0 - && pressed_character <= KEYS_N9 ) { - switch ( pressed_character ) { - case KEYS_N0: - return ')'; - case KEYS_N1: - return '!'; - case KEYS_N2: - return '@'; - case KEYS_N3: - return '#'; - case KEYS_N4: - return '$'; - case KEYS_N5: - return '%'; - case KEYS_N6: - return '^'; - case KEYS_N7: - return '&'; - case KEYS_N8: - return '*'; - case KEYS_N9: - return '('; - } - } - } - else { - if ( pressed_character >= KEYS_A - && pressed_character <= KEYS_Z ) - return char( ::tolower( pressed_character ) ); - - if ( pressed_character >= KEYS_N0 - && pressed_character <= KEYS_N9 ) - return char( pressed_character ); - } - } - else if ( is_key_pressed( KEYS_SPACE ) ) { - if ( out ) - *out = KEYS_SPACE; - - return ' '; - } - else if ( is_key_pressed( KEYS_BACK ) ) { - if ( out ) - *out = KEYS_BACK; - - return 0; - } - - if ( out ) - *out = KEYS_NONE; - - return 0; -} - -END_REGION \ No newline at end of file diff --git a/tf2/input_system.hpp b/tf2/input_system.hpp deleted file mode 100644 index 6631a09..0000000 --- a/tf2/input_system.hpp +++ /dev/null @@ -1,185 +0,0 @@ -#pragma once -#include "util.hpp" - -enum VirtualKeyEvents_t { - KEYDOWN = 0x0100, - KEYUP = 0x0101, - SYSKEYDOWN = 0x104, - SYSKEYUP = 0x105, - LBUTTONDOWN = 0x0201, - LBUTTONUP = 0x0202, - RBUTTONDOWN = 0x0204, - RBUTTONUP = 0x0205, - MBUTTONDOWN = 0x0207, - MBUTTONUP = 0x0208, - MOUSEWHEEL = 0x020A, - XBUTTONDOWN = 0x020B, - XBUTTONUP = 0x020C, -}; - -enum VirtualKeys_t { - KEYS_NONE = 0, - KEYS_MOUSE1 = 0X01, - KEYS_MOUSE2 = 0X02, - KEYS_CANCEL = 0X03, - KEYS_MOUSE3 = 0X04, - KEYS_MOUSE4 = 0X05, - KEYS_MOUSE5 = 0X06, - KEYS_BACK = 0X08, - KEYS_TAB = 0X09, - KEYS_CLEAR = 0X0C, - KEYS_RETURN = 0X0D, - KEYS_SHIFT = 0X10, - KEYS_CONTROL = 0X11, - KEYS_ALT = 0X12, - KEYS_PAUSE = 0X13, - KEYS_CAPSLOCK = 0X14, - KEYS_ESCAPE = 0X1B, - KEYS_CONVERT = 0X1C, - KEYS_NONCONVERT = 0X1D, - KEYS_ACCEPT = 0X1E, - KEYS_MODECHANGE = 0X1F, - KEYS_SPACE = 0X20, - KEYS_PRIOR = 0X21, - KEYS_NEXT = 0X22, - KEYS_END = 0X23, - KEYS_HOME = 0X24, - KEYS_LEFT = 0X25, - KEYS_UP = 0X26, - KEYS_RIGHT = 0X27, - KEYS_DOWN = 0X28, - KEYS_SELECT = 0X29, - KEYS_PRINT = 0X2A, - KEYS_EXECUTE = 0X2B, - KEYS_SNAPSHOT = 0X2C, - KEYS_INSERT = 0X2D, - KEYS_DELETE = 0X2E, - KEYS_HELP = 0X2F, - KEYS_N0 = 0X30, - KEYS_N1 = 0X31, - KEYS_N2 = 0X32, - KEYS_N3 = 0X33, - KEYS_N4 = 0X34, - KEYS_N5 = 0X35, - KEYS_N6 = 0X36, - KEYS_N7 = 0X37, - KEYS_N8 = 0X38, - KEYS_N9 = 0X39, - KEYS_A = 0X41, - KEYS_B = 0X42, - KEYS_C = 0X43, - KEYS_D = 0X44, - KEYS_E = 0X45, - KEYS_F = 0X46, - KEYS_G = 0X47, - KEYS_H = 0X48, - KEYS_I = 0X49, - KEYS_J = 0X4A, - KEYS_K = 0X4B, - KEYS_L = 0X4C, - KEYS_M = 0X4D, - KEYS_N = 0X4E, - KEYS_O = 0X4F, - KEYS_P = 0X50, - KEYS_Q = 0X51, - KEYS_R = 0X52, - KEYS_S = 0X53, - KEYS_T = 0X54, - KEYS_U = 0X55, - KEYS_V = 0X56, - KEYS_W = 0X57, - KEYS_X = 0X58, - KEYS_Y = 0X59, - KEYS_Z = 0X5A, - KEYS_LEFTWINDOWS = 0X5B, - KEYS_RIGHTWINDOWS = 0X5C, - KEYS_APPLICATION = 0X5D, - KEYS_NUMPAD0 = 0X60, - KEYS_NUMPAD1 = 0X61, - KEYS_NUMPAD2 = 0X62, - KEYS_NUMPAD3 = 0X63, - KEYS_NUMPAD4 = 0X64, - KEYS_NUMPAD5 = 0X65, - KEYS_NUMPAD6 = 0X66, - KEYS_NUMPAD7 = 0X67, - KEYS_NUMPAD8 = 0X68, - KEYS_NUMPAD9 = 0X69, - KEYS_MULTIPLY = 0X6A, - KEYS_ADD = 0X6B, - KEYS_SEPARATOR = 0X6C, - KEYS_SUBTRACT = 0X6D, - KEYS_DECIMAL = 0X6E, - KEYS_DIVIDE = 0X6F, - KEYS_F1 = 0X70, - KEYS_F2 = 0X71, - KEYS_F3 = 0X72, - KEYS_F4 = 0X73, - KEYS_F5 = 0X74, - KEYS_F6 = 0X75, - KEYS_F7 = 0X76, - KEYS_F8 = 0X77, - KEYS_F9 = 0X78, - KEYS_F10 = 0X79, - KEYS_F11 = 0X7A, - KEYS_F12 = 0X7B, - KEYS_NUMLOCK = 0X90, - KEYS_SCROLLLOCK = 0X91, - KEYS_LEFTSHIFT = 0XA0, - KEYS_RIGHTSHIFT = 0XA1, - KEYS_LEFTCONTROL = 0XA2, - KEYS_RIGHTCONTROL = 0XA3, - KEYS_LEFTMENU = 0XA4, - KEYS_RIGHTMENU = 0XA5, - KEYS_PERIOD = 0xBE, - KEYS_MAX = 0XA6, - KEYS_LAST = 0xfe -}; - -namespace util -{ - class c_input_manager { - public: - bool m_pressed_keys[ KEYS_LAST ]{ }; - int m_mouse_pos[ 2 ]{ }; - int m_scroll_wheel_state{ }; - - - c_input_manager( ) { - memset( m_pressed_keys, 0, KEYS_LAST ); - } - - void capture_mouse_move( ulong_t lparam ); - - void clear_keys( ); - - //registers a key press from wndproc - bool register_key_press( int key_event, int key ); - - //checks if the key is pressed - bool is_key_pressed( int key ); - - //returns the first found key pressed, or KEY_NONE if none are - VirtualKeys_t is_any_key_pressed( ); - - //returns the last scroll state and resets it to 0 - int get_scroll_state( ); - - //returns the key's name - const char* get_key_name( int key ); - const char* get_short_name( int key ); - - //returns the first found currently pressed key - char get_pressed_char( int* pressed_key = nullptr ); - - //check if a key is valid - inline bool is_valid_key( int key ) { return key > KEYS_NONE && key < KEYS_LAST; } - - //get cursor pos - inline void get_cursor_pos( int& x, int& y ) { - x = m_mouse_pos[ 0 ]; - y = m_mouse_pos[ 1 ]; - } - }; -} - -extern util::c_input_manager g_input; \ No newline at end of file diff --git a/tf2/interfaces.cpp b/tf2/interfaces.cpp deleted file mode 100644 index 8ca7ff3..0000000 --- a/tf2/interfaces.cpp +++ /dev/null @@ -1,241 +0,0 @@ -#include "interfaces.h" -#include "console.hpp" -#include "hooks.h" -#include "renderer.hpp" -#include "pattern.hpp" -#include "base_cheat.h" -#include "settings.h" -#include "ctx.hpp" -#include "netvars.h" -#include - -tf2::client cl; -tf2::interfaces::c_interface_manager g_factory; - -bool tf2::create_interfaces( client *instance ) -{ - if ( !instance ) { - return false; - } - - - - auto d3d_device = pattern::first_code_match( GetModuleHandleA( xors( "shaderapidx9.dll" ) ), - xors( "A1 ?? ?? ?? ?? 50 8B 08 FF 51 0C" ) ) + 0x1; - - auto move_helper = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), - xors( "8B 0D ?? ?? ?? ?? 8B 46 08 68" ) ) + 0x2; - - //sig to containing function: (+0x69) E9 ? ? ? ? CC 55 8B EC 5D - //auto beam_ptr = pattern::first_code_match( GetModuleHandleA( xors( "client.dll" ) ), xors( "" ) ); - - //g_con->print( "beam_found: 0x%08x\n", beam_ptr ); - - instance->create( &instance->m_d3d, **reinterpret_cast< uintptr_t** >( d3d_device ) ); - instance->create( &instance->m_movehelper, **reinterpret_cast< uintptr_t** >( move_helper ) ); - //instance->create( &instance->m_beams, *reinterpret_cast< uintptr_t* >( beam_ptr ) ); - - - /* - - - important - - issues: - - the background is white but so am i so really this isnt an issue - - THIS ENTIRE THING IS MESSY AND RIDDLED WITH SHIT COMMENTS AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - - chams - - fucking keyvalues - - glow count aint happy cbf looking into it - - menu goes invis because ????? gj menu - - too lazy to fix d3d - - emitsound hook is different - - aimbot is meh meh rn - - - lots of stuff not done that i want to get done, just wanna get it out there so i can keep working on it and not get harrased for the push - - - - - - */ - - //tf2::interfaces::interface_manager factory; - instance->create( &instance->m_chl, xors( "VClient" ) ); - instance->create( &instance->m_vgui, xors( "VEngineVGui" ) ); - instance->create( &instance->m_surface, xors( "VGUI_Surface" ) ); - instance->create( &instance->m_input, xors( "InputSystemVersion" ) ); - instance->create( &instance->m_panel, xors( "VGUI_Panel" ) ); - instance->create( &instance->m_engine, xors( "VEngineClient" ) ); - instance->create( &instance->m_entlist, xors( "VClientEntityList" ) ); - instance->create( &instance->m_prediction, xors( "VClientPrediction" ) ); - instance->create( &instance->m_cvar, xors( "VEngineCvar" ) ); - instance->create( &instance->m_movement, xors( "GameMovement" ) ); - instance->create( &instance->m_modelinfo, xors( "VModelInfoClient" ) ); - instance->create( &instance->m_overlay, "VDebugOverlay" ); - instance->create( &instance->m_trace, xors( "EngineTraceClient" ) ); - instance->create( &instance->m_model_render, xors( "VEngineModel" ) ); - instance->create( &instance->m_mat_system, xors( "VMaterialSystem" ) ); - instance->create( &instance->m_render_view, xors( "VEngineRenderView" ) ); - instance->create( &instance->m_engine_sound, xors( "IEngineSoundClient" ) ); - instance->create( &instance->m_event_mgr, xors( "GAMEEVENTSMANAGER002" ) ); - instance->create( &instance->m_string_table, xors( "VEngineClientStringTable" ) ); - instance->create( &instance->m_clientmode, **reinterpret_cast< uintptr_t** >( instance->m_chl->get_function( 10 ) + 5 ) ); - - instance->m_globals = *reinterpret_cast< CGlobalVarsBase** >( pattern::first_code_match( instance->m_engine.dll( ), "A1 ? ? ? ? 8B 11 68", 0x8 ) ); - - uintptr_t* input = *reinterpret_cast< uintptr_t** >( - instance->m_chl->get_old_function( 1 ) + 0x1 ); - instance->m_hl_input = reinterpret_cast< CInput* >( input ); - - auto kv_fn = ( void*( __cdecl* )( ) )( GetProcAddress( - GetModuleHandleA( xors( "vstdlib.dll" ) ), - xors( "KeyValuesSystem" ) ) ); - - instance->m_keyvalues = ( IKeyValuesSystem* )kv_fn( ); - instance->listeners.player_hurt.init( ); - - return true; -} - -con_fn clear_fn{ fnv( "clear" ), [ ]( const char*, const char* ) { g_con->m_logs.clear( ); }, "" }; -con_fn enable_logs_fn{ fnv( "log_enable" ), -[ ]( const char* a, const char* ) { - g_settings.menu.logs_enable ^= 1; - g_con->log( g_settings.menu.logs_enable ? xors( "logs enabled" ) : xors( "logs disabled" ) ); -}, -"" -}; - -con_fn fnv_fn{ fnv( "fnv" ), -[ ]( const char* a, const char* ) { - auto print = hash::fnv1a( a ); - g_con->log( "%08x", print ); -}, -"%S" -}; - -con_fn sum_fn{ fnv( "sum" ), -[ ]( const char* a, const char* syntax ) { - auto arg_1 = con_fn::get_arg< int >( a, 0, syntax ); - auto arg_2 = con_fn::get_arg< int >( a, 1, syntax ); - g_con->log( "%d + %d = %d", arg_1, arg_2, arg_1 + arg_2 ); -}, -"%D %D" -}; - -con_fn dump_cfg{ fnv( "dump_cfg" ), -[ ]( const char* , const char* ) { - for( auto& it : data::holder_.get_nodes( ) ) { - auto setting = static_cast< ISetting* >( it ); - g_con->log( "%08x: %s", setting->get_hash( ), setting->get_string( ).c_str( ) ); - } -}, -"" -}; - -con_fn retard_fn{ fnv( "retard" ), -[ ]( const char*, const char* ) { - g_con->log( "snuze" ); -}, -"" -}; - -con_fn unload_fn{ fnv( "unload" ), -[ ]( const char*, const char* ) { - cl.m_panic = true; - ExitProcess( 0 ); -}, -"" -}; - - -/*con_fn alias_fn{ fnv( "alias" ), -[ ]( const char* a, const char* b ) { -auto var_type = std::string( b ); -if( var_type.length( ) > 1 ) { -g_con->log( xors( "unknown var type: %s" ), var_type.c_str( ) ); -return; -} - -switch( b[ 0 ] ) { -case TYPE_STRING: { -std::shared_ptr< con_alias< const char* > >( fnv( ) ) -} -} -}, -"%S %S" -};*/ - -void tf2::client::initialize( ) { - //m_panic = true; - g_con->create( ); - auto now = std::chrono::high_resolution_clock::now( ); - g_con->print( xors( "hello\n" ) ); - //hi - //bye - - tf2::create_interfaces( &cl ); - g_fonts.initialize( ); - - g_netvars.init( ); - g_settings.load( ); - g_con->register_fn( &clear_fn ); - g_con->register_fn( &enable_logs_fn ); - g_con->register_fn( &fnv_fn ); - g_con->register_fn( &sum_fn ); - g_con->register_fn( &dump_cfg ); - g_con->register_fn( &retard_fn ); - g_con->register_fn( &unload_fn ); - - hooks::commit( &cl ); - - //g_cheat.chams.m_materials.initialize_materials( ); - - - auto offset = g_netvars.get_netvar( fnv( "DT_WeaponTFBaseGun" ), fnv( "m_fLastShotTime" ) ); - g_con->log( "lastshottime: %08x", offset ); - g_con->log( "prop: %08x", g_netvars.get_prop( fnv( "DT_WeaponTFBaseGun" ), fnv( "m_fLastShotTime" ) ) ); - - auto after = std::chrono::high_resolution_clock::now( ); - std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); - - std::chrono::duration< float > delta = after - now; - g_con->log( xors( "cheat initialized\n" ) ); - g_con->log( xors( "time taken: %f\n" ), delta.count( ) ); - - - - m_panic = false; -} - -void tf2::client::uninitialize( ) { - m_panic = true; - g_con->destroy( ); - - //restore wndproc - if( hooks::window_procedure_o ) { - SetWindowLongA( m_hwnd, GWLP_WNDPROC, ( long )hooks::window_procedure_o ); - } - - //unreference materials - //g_cheat.chams.m_materials.destroy_materials( ); - - //restore all interfaces - restore( ); - - Sleep( 100 ); - - //free the library - FreeLibraryAndExitThread( g_dll, 0 ); -} \ No newline at end of file diff --git a/tf2/interfaces.h b/tf2/interfaces.h deleted file mode 100644 index 96e3be1..0000000 --- a/tf2/interfaces.h +++ /dev/null @@ -1,160 +0,0 @@ -#pragma once - -#include -#include "sdk.h" -#include "vmt.h" -#include "ctx.hpp" -#include "listener.hpp" -#include "factory.h" -struct IDirect3DDevice9; -namespace tf2 -{ -template < typename t > -class interface_base { - friend class client; -public: - t* operator( )( ) { - return m_interface; - } - - //calls a virtual - template< size_t index, typename ret = void, - class... Args > - ret call( Args... args ) { - return util::get_vfunc< ret( __thiscall* )( void*, Args... ) > - ( m_interface, index )( m_interface, args... ); - } - - //also calls a virtual but you supply the typedef instead of return type - template< typename def, size_t index, class... Args > - auto call( Args... args ) { - return util::get_vfunc< def > - ( m_interface, index )( m_interface, args... ); - } - - //allows you to cast the interface - template< typename t0 = t* > - t0 get( ) { - return ( t0 )m_interface; - } - - void operator( )( t* ptr ) { - m_interface = ptr; - m_hook.reset( ); - m_hook = std::make_shared< hooks::c_vmt >( static_cast< void* >( ptr ) ); - - /*find the module the interface is located in - i know i could just pass the pointer but traps are gay*/ - MEMORY_BASIC_INFORMATION info; - VirtualQuery( ptr, &info, sizeof( MEMORY_BASIC_INFORMATION ) ); - - m_dll = static_cast< HMODULE >( info.AllocationBase ); - } - - void operator( )( void* ptr ) { - operator( )( static_cast< t* >( ptr ) ); - } - - decltype( auto ) operator->( ) { - return m_hook; - } - - template< typename t2 = decltype( m_dll ) > - t2 dll( ) { - return ( t2 )m_dll; - } - -protected: - t* m_interface; - HMODULE m_dll; - std::shared_ptr< hooks::c_vmt > m_hook; -}; - - - class client { - public: - interface_base< IEngineVGui > m_vgui; - interface_base< IClientMode > m_clientmode; - interface_base< IEngineTrace > m_trace; - interface_base< IVEngineClient > m_engine; - interface_base< IInputSystem > m_input; - interface_base< chl_client > m_chl; - interface_base< IVDebugOverlay > m_overlay; - interface_base< client_ent_list > m_entlist; - interface_base< IPlayerInfoManager > m_playerinfo; - interface_base< ISurface > m_surface; - interface_base< IPanel > m_panel; - interface_base< ICVar > m_cvar; - interface_base< IVRenderView > m_renderview; - interface_base< IPrediction > m_prediction; - interface_base< IGameMovement > m_movement; - interface_base< IVModelInfo > m_modelinfo; - interface_base< uintptr_t > m_d3d; - interface_base< IVModelRender > m_model_render; - interface_base< IVRenderView > m_render_view; - interface_base< uintptr_t > m_engine_sound; - interface_base< IGameEventManager2 > m_event_mgr; - interface_base< IMaterialSystem > m_mat_system; - interface_base< CStringTable > m_string_table; - interface_base< IViewRenderBeams > m_beams; - IKeyValuesSystem* m_keyvalues; - CGlobalVarsBase* m_globals; - IMoveHelper* m_movehelper; - CInput* m_hl_input; - bool m_panic; - HWND m_hwnd{ }; - float m_frametime; - - struct { - generic_listener_t player_hurt{ xors( "player_hurt" ), &listeners::player_hurt }; - } listeners; - - public: - //find the interface inside of the module - void create( void* iface, const std::string& name, const std::string& mod ) { - auto* interface_ = static_cast< interface_base< uintptr_t >* >( iface ); - auto ptr = g_factory.find_interface( mod, name ); - if( !ptr ) - return; - - ( *interface_ )( ptr ); - m_container.push_back( interface_ ); - } - - void create( void* iface, uintptr_t pointer ) { - auto interface_ = static_cast< interface_base< uintptr_t >* >( iface ); - - //msvc is retarded - ( *interface_ )( ( void* )pointer ); - m_container.push_back( interface_ ); - } - - void create( void* iface, const std::string& name ) { - auto* interface_ = static_cast< interface_base< uintptr_t >* >( iface ); - auto ptr = g_factory.find_interface( name ); - if( !ptr ) - return; - - ( *interface_ )( ptr ); - m_container.push_back( interface_ ); - } - - void __cdecl initialize( ); - void __cdecl uninitialize( ); - - private: - //restore the vmts to their original - void restore( ) { - for( const auto& it : m_container ) { - it->m_hook->restore( ); - } - } - - private: - std::vector< interface_base< uintptr_t >* > m_container; - }; - - bool create_interfaces( client * ); -} - -extern tf2::client cl; diff --git a/tf2/listener.cpp b/tf2/listener.cpp deleted file mode 100644 index c48b900..0000000 --- a/tf2/listener.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "listener.hpp" -#include "interfaces.h" -#include "base_cheat.h" -#include "ctx.hpp" -#include "settings.h" -#undef PlaySound - -//how can you listen if youre deaf - -generic_listener_t::generic_listener_t( const char* name, void( *function )( IGameEvent* ) ) : - m_function( function ), m_name( name ) { } - -generic_listener_t::~generic_listener_t( ) { - if( m_registered ) - cl.m_event_mgr( )->RemoveListener( this ); - -} - -void generic_listener_t::init( ) { - cl.m_event_mgr( )->AddListener( this, m_name, false ); - m_registered = true; -} - -namespace listeners -{ - - void player_hurt( IGameEvent* e ) { - if( !cl.m_panic && e ) { - int user_id = e->GetInt( xors( "userid" ) ); - int attacker = e->GetInt( xors( "attacker" ) ); - int attacker_id = cl.m_engine( )->GetPlayerForUserID( attacker ); - int player_id = cl.m_engine( )->GetPlayerForUserID( user_id ); - - - //if( attacker_id == cl.m_engine( )->GetLocalPlayer( ) && user_id != attacker_id ) { - g_cheat.visuals.store_hit( ); - - //} - } - } - -} \ No newline at end of file diff --git a/tf2/listener.hpp b/tf2/listener.hpp deleted file mode 100644 index 1ee442f..0000000 --- a/tf2/listener.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once -#include "sdk.h" - -struct generic_listener_t : public IGameEventListener2 { - generic_listener_t( const char* event_name, - void( *function )( IGameEvent* ) ); - - generic_listener_t( ) = default; - - ~generic_listener_t( ); - - void init( ); - - void FireGameEvent( IGameEvent* event ) override { m_function( event ); } - int GetEventDebugID( ) override { return 0x2a; } -private: - void( *m_function )( IGameEvent* ); - const char* m_name{ }; - bool m_registered{ }; -}; - -namespace listeners { - extern void player_hurt( IGameEvent* e ); -} \ No newline at end of file diff --git a/tf2/math.cpp b/tf2/math.cpp deleted file mode 100644 index e3e7436..0000000 --- a/tf2/math.cpp +++ /dev/null @@ -1,267 +0,0 @@ -#include -#include "math.h" -#include "interfaces.h" - -using _m128 = __m128; - -namespace math -{ - uint32_t md5_pseudorandom( uint32_t seed ) { - using fn = uint32_t( __thiscall * )( uint32_t seed ); - - static auto func = pattern::first_code_match< fn >( cl.m_chl.dll( ), xors( "55 8B EC 83 E4 F8 83 EC 70 6A 58" ) ); - if( !func ) { - return 0; - } - - return func( seed ); - } - - static const __declspec( align( 16 ) ) uint32_t g_simd_component_mask[ 4 ][ 4 ] = { - { 0xFFFFFFFF, 0, 0, 0 }, - { 0, 0xFFFFFFFF, 0, 0 }, - { 0, 0, 0xFFFFFFFF, 0 }, - { 0, 0, 0, 0xFFFFFFFF } - }; - - void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ) { - //SSE concat transforms - turbo mode engaged - - _m128 last_mask = *( _m128* )( &g_simd_component_mask[ 3 ] ); - _m128 row_a0 = _mm_loadu_ps( in[ 0 ] ); - _m128 row_a1 = _mm_loadu_ps( in[ 1 ] ); - _m128 row_a2 = _mm_loadu_ps( in[ 2 ] ); - - _m128 row_b0 = _mm_loadu_ps( in2[ 0 ] ); - _m128 row_b1 = _mm_loadu_ps( in2[ 1 ] ); - _m128 row_b2 = _mm_loadu_ps( in2[ 2 ] ); - - _m128 a0 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 0, 0, 0, 0 ) ); - _m128 a1 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 1, 1, 1, 1 ) ); - _m128 a2 = _mm_shuffle_ps( row_a0, row_a0, _MM_SHUFFLE( 2, 2, 2, 2 ) ); - - _m128 mul00 = _mm_mul_ps( a0, row_b0 ); - _m128 mul01 = _mm_mul_ps( a1, row_b1 ); - _m128 mul02 = _mm_mul_ps( a2, row_b2 ); - _m128 out0 = _mm_add_ps( mul00, _mm_add_ps( mul01, mul02 ) ); - - a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); - a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); - a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); - - _m128 mul10 = _mm_mul_ps( a0, row_b0 ); - _m128 mul11 = _mm_mul_ps( a1, row_b1 ); - _m128 mul12 = _mm_mul_ps( a2, row_b2 ); - _m128 out1 = _mm_add_ps( mul10, _mm_add_ps( mul11, mul12 ) ); - - a0 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 0, 0, 0, 0 ) ); - a1 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 1, 1, 1, 1 ) ); - a2 = _mm_shuffle_ps( row_a2, row_a2, _MM_SHUFFLE( 2, 2, 2, 2 ) ); - - _m128 mul20 = _mm_mul_ps( a0, row_b0 ); - _m128 mul21 = _mm_mul_ps( a0, row_b1 ); - _m128 mul22 = _mm_mul_ps( a0, row_b2 ); - _m128 out2 = _mm_add_ps( mul20, _mm_add_ps( mul21, mul22 ) ); - - a0 = _mm_and_ps( row_a0, last_mask ); - a1 = _mm_and_ps( row_a1, last_mask ); - a2 = _mm_and_ps( row_a2, last_mask ); - - out0 = _mm_add_ps( out0, a0 ); - out1 = _mm_add_ps( out1, a1 ); - out2 = _mm_add_ps( out2, a2 ); - - *( _m128* )( out[ 0 ] ) = out0; - *( _m128* )( out[ 1 ] ) = out1; - *( _m128* )( out[ 2 ] ) = out2; - } - - void math::set_matrix_position( vec3_t pos, matrix3x4& matrix ) { - for( size_t i{ }; i < 3; ++i ) { - matrix[ i ][ 3 ] = pos[ i ]; - } - } - - vec3_t math::get_matrix_position( const matrix3x4& src ) { - return vec3_t( src[ 0 ][ 3 ], src[ 1 ][ 3 ], src[ 2 ][ 3 ] ); - } - - void angle_matrix( vec3_t angles, matrix3x4& matrix ) { - float sr, sp, sy, cr, cp, cy; - - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - sr = sinf( angles.z * M_PIRAD ); - cr = cosf( angles.z * M_PIRAD ); - - matrix[ 0 ][ 0 ] = cp * cy; - matrix[ 1 ][ 0 ] = cp * sy; - matrix[ 2 ][ 0 ] = -sp; - - float crcy = cr * cy; - float crsy = cr * sy; - float srcy = sr * cy; - float srsy = sr * sy; - matrix[ 0 ][ 1 ] = sp * srcy - crsy; - matrix[ 1 ][ 1 ] = sp * srsy + crcy; - matrix[ 2 ][ 1 ] = sr * cp; - - matrix[ 0 ][ 2 ] = ( sp*crcy + srsy ); - matrix[ 1 ][ 2 ] = ( sp*crsy - srcy ); - matrix[ 2 ][ 2 ] = cr * cp; - - matrix[ 0 ][ 3 ] = 0.f; - matrix[ 1 ][ 3 ] = 0.f; - matrix[ 2 ][ 3 ] = 0.f; - } - - void angle_imatrix( vec3_t angles, matrix3x4& matrix ) { - float sr, sp, sy, cr, cp, cy; - - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - sr = sinf( angles.z * M_PIRAD ); - cr = cosf( angles.z * M_PIRAD ); - - matrix[ 0 ][ 0 ] = cp * cy; - matrix[ 0 ][ 1 ] = cp * sy; - matrix[ 0 ][ 2 ] = -sp; - matrix[ 1 ][ 0 ] = sr * sp*cy + cr * -sy; - matrix[ 1 ][ 1 ] = sr * sp*sy + cr * cy; - matrix[ 1 ][ 2 ] = sr * cp; - matrix[ 2 ][ 0 ] = ( cr*sp*cy + -sr * -sy ); - matrix[ 2 ][ 1 ] = ( cr*sp*sy + -sr * cy ); - matrix[ 2 ][ 2 ] = cr * cp; - matrix[ 0 ][ 3 ] = 0.f; - matrix[ 1 ][ 3 ] = 0.f; - matrix[ 2 ][ 3 ] = 0.f; - } - - void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ) { - angle_matrix( angles, matrix ); - set_matrix_position( origin, matrix ); - } - - vec3_t matrix_angles( const matrix3x4& matrix ) { - //thx strackoverflow - vec3_t angles; - float forward[ 3 ]; - float left[ 3 ]; - float up[ 3 ]; - - forward[ 0 ] = matrix[ 0 ][ 0 ]; - forward[ 1 ] = matrix[ 1 ][ 0 ]; - forward[ 2 ] = matrix[ 2 ][ 0 ]; - left[ 0 ] = matrix[ 0 ][ 1 ]; - left[ 1 ] = matrix[ 1 ][ 1 ]; - left[ 2 ] = matrix[ 2 ][ 1 ]; - up[ 2 ] = matrix[ 2 ][ 2 ]; - - float xy_dist = sqrtf( forward[ 0 ] * forward[ 0 ] + forward[ 1 ] * forward[ 1 ] ); - - if( xy_dist > 0.001f ) { - angles.y = RAD2DEG( atan2f( forward[ 1 ], forward[ 0 ] ) ); - angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); - angles.z = RAD2DEG( atan2f( left[ 2 ], up[ 2 ] ) ); - } - else { - angles.y = RAD2DEG( atan2f( -left[ 0 ], left[ 1 ] ) ); - angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) ); - - angles.z = 0; - } - - return angles; - } - - void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ) { - angles.y += degrees; - angles.clamp( ); - - vec3_t rotated( 0, degrees, 0 ); - matrix3x4 rotated_matrix; - angle_matrix( rotated, rotated_matrix ); - - vec3_t delta = get_matrix_position( matrix ) - origin; - vec3_t out = vector_transform( delta, rotated_matrix ); - - matrix3x4 bone_rotation, matrix_out; - memcpy( &bone_rotation, &matrix, sizeof( matrix3x4 ) ); - - set_matrix_position( vec3_t( ), bone_rotation ); - concat_transforms( rotated_matrix, bone_rotation, matrix_out ); - auto angles_out = matrix_angles( matrix_out ); - angle_matrix( angles_out, matrix, out ); - } - - float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ) { - vec3_t u = s2 - s1; - vec3_t v = k2 - k1; - vec3_t w = s1 - k1; - float a = u.dot( u ); - float b = u.dot( v ); - float c = v.dot( v ); - float d = u.dot( w ); - float e = v.dot( w ); - float D = a * c - b * b; - float sc, sN, sD = D; - float tc, tN, tD = D; - - if( D < SMALL_NUM ) { - sN = 0.0f; - sD = 1.0f; - tN = e; - tD = c; - } - else { - sN = ( b*e - c * d ); - tN = ( a*e - b * d ); - if( sN < 0.0f ) { - sN = 0.0f; - tN = e; - tD = c; - } - else if( sN > sD ) { - sN = sD; - tN = e + b; - tD = c; - } - } - - if( tN < 0.0f ) { - tN = 0.0; - - if( -d < 0.0f ) - sN = 0.0; - else if( -d > a ) - sN = sD; - else { - sN = -d; - sD = a; - } - } - else if( tN > tD ) { - tN = tD; - - if( ( -d + b ) < 0.0f ) - sN = 0; - else if( ( -d + b ) > a ) - sN = sD; - else { - sN = ( -d + b ); - sD = a; - } - } - - sc = ( abs( sN ) < SMALL_NUM ? 0.0f : sN / sD ); - tc = ( abs( tN ) < SMALL_NUM ? 0.0f : tN / tD ); - - vec3_t dP = w + ( u * sc ) - ( v * tc ); - - return dP.length( ); - } -} \ No newline at end of file diff --git a/tf2/math.h b/tf2/math.h deleted file mode 100644 index c5a107f..0000000 --- a/tf2/math.h +++ /dev/null @@ -1,157 +0,0 @@ -#pragma once -#include -#include "util.hpp" -#include "pattern.hpp" -#include "sdk.h" - -static constexpr long double M_PI = 3.14159265358979323846f; -static constexpr long double M_RADPI = 57.295779513082f; -static constexpr long double M_PIRAD = 0.01745329251f; -static constexpr float SMALL_NUM = 0.00000001f; -static constexpr float M_PI_F = ( ( float )( M_PI ) ); -__forceinline float RAD2DEG( float x ) { return( ( float )( x ) * ( float )( 180.f / M_PI_F ) ); } -__forceinline float DEG2RAD( float x ) { return( ( float )( x ) * ( float )( M_PI_F / 180.f ) ); } - -namespace { - //make a random generator and seed it with a p random number - static std::random_device rd; - static std::mt19937 gen( rd( ) ); -} - -NAMESPACE_REGION( math ) - -#undef min -#undef max - -template < typename t > -t min( const t& t1, const t& t2 ) { - return t1 < t2 ? t1 : t2; -} - -template < typename t, typename... ts_ > -t min( const t& t1, const t& t2, ts_&&... ts ) { - return t1 < t2 ? - min( t1, std::forward< ts_ >( ts )... ) : - min( t2, std::forward< ts_ >( ts )... ); -} - -template < typename t > -t max( const t& t1, const t& t2 ) { - return t1 > t2 ? t1 : t2; -} - -template < typename t, typename... ts_ > -t max( const t& t1, const t& t2, ts_&&... ts ) { - return t1 > t2 ? - max( t1, std::forward< ts_ >( ts )... ) : - max( t2, std::forward< ts_ >( ts )... ); -} - -// todo - dex; make 2 random generator funcs here, this one only works for floats normally - -template < typename t > -__forceinline t random_number( t min, t max ) { - if constexpr( !std::is_integral_v< t > ) { - std::uniform_real_distribution< t > dist( min, max ); - return dist( gen ); - } - else { - std::uniform_int_distribution< t > dist( min, max ); - return dist( gen ); - } -} - -__forceinline vec3_t get_rotated_pos( vec3_t start, float rotation, float distance ) { - float rad = DEG2RAD( rotation ); - start.x += cos( rad ) * distance; - start.y += sin( rad ) * distance; - - return start; -} - -__forceinline vec3_t vector_angles( const vec3_t& start, const vec3_t& end ) { - vec3_t delta = end - start; - - float magnitude = sqrtf( delta.x * delta.x + delta.y * delta.y ); - float pitch = atan2f( -delta.z, magnitude ) * M_RADPI; - float yaw = atan2f( delta.y, delta.x ) * M_RADPI; - - vec3_t angle( pitch, yaw, 0.0f ); - return angle.clamp( ); -} - - -__forceinline vec3_t vector_angles( const vec3_t& v ) { - float magnitude = sqrtf( v.x * v.x + v.y * v.y ); - float pitch = atan2f( -v.z, magnitude ) * M_RADPI; - float yaw = atan2f( v.y, v.x ) * M_RADPI; - - vec3_t angle( pitch, yaw, 0.0f ); - return angle; -} - -__forceinline vec3_t angle_vectors( const vec3_t& angles ) { - float sp, sy, cp, cy; - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - - return vec3_t{ cp * cy, cp * sy, -sp }; -} - -__forceinline void angle_vectors( const vec3_t& angles, vec3_t* forward, vec3_t* right, vec3_t* up ) { - float sr, sp, sy, cr, cp, cy; - - sp = sinf( angles.x * M_PIRAD ); - cp = cosf( angles.x * M_PIRAD ); - sy = sinf( angles.y * M_PIRAD ); - cy = cosf( angles.y * M_PIRAD ); - sr = sinf( angles.z * M_PIRAD ); - cr = cosf( angles.z * M_PIRAD ); - - if( forward ) { - forward->x = cp * cy; - forward->y = cp * sy; - forward->z = -sp; - } - - if( right ) { - right->x = -1 * sr * sp * cy + -1 * cr * -sy; - right->y = -1 * sr * sp * sy + -1 * cr * cy; - right->z = -1 * sr * cp; - } - - if( up ) { - up->x = cr * sp * cy + -sr * -sy; - up->y = cr * sp * sy + -sr * cy; - up->z = cr * cp; - } -} - -__forceinline float find_closest_step( float angle, float step ) { - int steps = ( int )( angle / step + 0.5f ); - - return steps * step; -} - -__forceinline vec3_t vector_transform( const vec3_t& in, const matrix3x4& matrix ) { - vec3_t out; - for( int i{ }; i < 3; i++ ) - out[ i ] = in.dot( ( const vec3_t& )matrix[ i ] ) + matrix[ i ][ 3 ]; - - return out; -} - -extern void concat_transforms( const matrix3x4& in, const matrix3x4& in2, matrix3x4& out ); -extern void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ); -extern void set_matrix_position( vec3_t pos, matrix3x4& src ); -extern vec3_t get_matrix_position( const matrix3x4& pos ); -extern vec3_t matrix_angles( const matrix3x4& matrix ); -extern void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ); -extern void angle_imatrix( vec3_t angles, matrix3x4& matrix ); -extern void angle_matrix( vec3_t angles, matrix3x4& matrix ); -extern uint32_t md5_pseudorandom( uint32_t seed ); -extern float __vectorcall dist_segment_to_segment( vec3_t s1, vec3_t s2, vec3_t k1, vec3_t k2 ); - -END_REGION \ No newline at end of file diff --git a/tf2/mem.hpp b/tf2/mem.hpp deleted file mode 100644 index 22e8fbf..0000000 --- a/tf2/mem.hpp +++ /dev/null @@ -1,66 +0,0 @@ -#pragma once -#include -#include "util.hpp" - -#define get_baseptr( ) ( ( uintptr_t )( _AddressOfReturnAddress( ) ) - sizeof( uintptr_t ) ) - -class stack_t { - uintptr_t m_ptr; - -public: - __forceinline stack_t( ) : m_ptr( get_baseptr( ) ) { } - - __forceinline stack_t( uintptr_t ptr ) : m_ptr( ptr ) { } - - template < typename t = uintptr_t > - __forceinline t get( ) { - return ( t )m_ptr; - } - - template < typename t = uintptr_t > - __forceinline t return_address( ) { - return *( t* )( m_ptr + sizeof( void* ) ); - } - - template < typename t = uintptr_t > - __forceinline t address_of_return_address( ) { - return ( t )( m_ptr + sizeof( uintptr_t ) ); - } - - __forceinline stack_t& next( ) { - return *( stack_t* )( m_ptr ); - } - - template < typename t = uintptr_t > - __forceinline t local( size_t at ) { - return ( t )( m_ptr - at ); - } - - template < typename t = uintptr_t > - __forceinline t arg( size_t at ) { - return ( t )( m_ptr + at ); - } -}; - -namespace util { - template < typename t = uint8_t > - __forceinline t* memcpy( t* dst, t* src, size_t size = sizeof( t ) ) { - __movsb( - ( uint8_t* )dst, - ( uint8_t* )src, - size - ); - - return dst; - } - - __forceinline void* memset( uint8_t* dst, uint8_t val, size_t size ) { - __stosb( - dst, - val, - size - ); - - return dst; - } -} \ No newline at end of file diff --git a/tf2/movement.cpp b/tf2/movement.cpp deleted file mode 100644 index e1dd335..0000000 --- a/tf2/movement.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "movement.h" -#include "interfaces.h" -#include "settings.h" - -namespace features { - void c_movement::bhop( ) { - if( !g_settings.misc.bunny_hop ) - return; - - if( g_ctx.m_local->m_nMoveType( ) == MOVETYPE_LADDER || - g_ctx.m_local->m_nMoveType( ) == MOVETYPE_NOCLIP ) - return; - - //jump like you nohat -> WELL THERES FUCKING HATS IN THIS GAME ISNT THERE CUNT - if( m_cmd->m_buttons & IN_JUMP && !( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { - m_cmd->m_buttons &= ~IN_JUMP; - } - } - - - //ehhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh lazy - void c_movement::autostrafe( ) { - if( !g_settings.misc.auto_strafe ) - return; - - float velocity = g_ctx.m_local->m_vecVelocity( ).length2d( ); - auto cmd = g_ctx.get_last_cmd( ); - - if( cmd && m_cmd->m_buttons & IN_JUMP && velocity > 1.0f ) { - if( !cmd->m_forwardmove && !cmd->m_sidemove ) { - if( !cmd->m_mousedx ) { - cmd->m_forwardmove = std::min< float >( 450.f, 5850.f / velocity ); - cmd->m_sidemove = ( m_cmd->m_cmd_nr % 2 ) == 0 ? -450.f : 450.f; - } - else { - cmd->m_sidemove = m_cmd->m_mousedx < 0.f ? -450.f : 450.f; - } - } - } - } -} diff --git a/tf2/movement.h b/tf2/movement.h deleted file mode 100644 index d32fb2b..0000000 --- a/tf2/movement.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include "sdk.h" - -namespace features { - class c_movement { - public: - void update( user_cmd_t* cmd ) { - if ( !cmd ) return; - m_cmd = cmd; - - bhop( ); - } - - private: - void bhop( ); - void autostrafe( ); - user_cmd_t* m_cmd; - }; -} \ No newline at end of file diff --git a/tf2/netvar_proxy.hpp b/tf2/netvar_proxy.hpp deleted file mode 100644 index ea18a4d..0000000 --- a/tf2/netvar_proxy.hpp +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "dt_recv.h" - -//dont leave things out of namespaces -namespace hooks -{ - class c_netvar_proxy { - public: - c_netvar_proxy( RecvProp* target_property, RecvVarProxyFn new_proxy ) { - m_target = target_property; - m_original = target_property->m_ProxyFn; - m_target->m_ProxyFn = new_proxy; - } - - c_netvar_proxy( ) = default; - - void init( RecvProp* target, RecvVarProxyFn new_proxy ) { - m_target = target; - m_original = target->m_ProxyFn; - m_target->m_ProxyFn = new_proxy; - } - - ~c_netvar_proxy( ) { - if( !m_target ) return; - m_target->m_ProxyFn = m_original; - } - - RecvVarProxyFn get_old_function( ) const { - return m_original; - } - - private: - //overcomplicated... - RecvProp * m_target; - RecvVarProxyFn m_original; - }; -} \ No newline at end of file diff --git a/tf2/netvars.cpp b/tf2/netvars.cpp deleted file mode 100644 index 2a064bd..0000000 --- a/tf2/netvars.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "netvars.h" -#include "interfaces.h" - -tf2::c_netvars g_netvars; - -NAMESPACE_REGION( tf2 ) - -void c_netvars::init( ) { - for( auto client_class = cl.m_chl( )->GetAllClasses( ); - !!client_class; - client_class = client_class->m_next - ) { - auto table = client_class->m_rt_table; - m_tables.push_back( table ); - } -} - -RecvTable* c_netvars::get_table( hash_t hash ) const { - if( m_tables.empty( ) ) return nullptr; - - for( auto& table : m_tables ) { - if( !table ) continue; - - if( hash == hash::fnv1a( table->m_pNetTableName ) ) { - return table; - } - } - - return nullptr; -} - -//iterating this too much results in a stack overflow, so thats cool -RecvProp* c_netvars::get_prop( hash_t data, hash_t name ) const { - RecvProp* prop{ }; - RecvTable* child{ }; - - auto table = get_table( data ); - if( !table ) return nullptr; - - for( int i{ }; i < table->m_nProps; ++i ) { - prop = &table->m_pProps[ i ]; - child = prop->GetDataTable( ); - - if( child && child->m_nProps ) { - auto tmp = get_prop( hash::fnv1a( child->m_pNetTableName ), name ); - if( tmp ) return tmp; - } - - if( name != hash::fnv1a( prop->m_pVarName ) ) - continue; - - return prop; - } - - return nullptr; -} - -std::ptrdiff_t c_netvars::get_entry( hash_t name, RecvTable* table ) const { - std::ptrdiff_t ret{ }; - RecvProp* prop; - RecvTable* child; - - for( int i{ }; i < table->m_nProps; ++i ) { - prop = &table->m_pProps[ i ]; - child = prop->GetDataTable( ); - - if( child && child->m_nProps ) { - auto tmp = get_entry( name, child ); - if( tmp ) ret += prop->GetOffset( ) + tmp; - } - - if( name != hash::fnv1a( prop->m_pVarName ) ) - continue; - - return prop->GetOffset( ) + ret; - } - - return ret; -} - -std::ptrdiff_t c_netvars::get_netvar( hash_t data, hash_t name ) const { - std::ptrdiff_t ret{ }; - auto table = get_table( data ); - if( !table ) return 0; - - ret = get_entry( name, table ); -#ifdef DEBUG - printf( "%s:\t\t 0x%05x\n", name.c_str( ), ret ); -#endif - return ret; -} - -END_REGION \ No newline at end of file diff --git a/tf2/netvars.h b/tf2/netvars.h deleted file mode 100644 index 54b92be..0000000 --- a/tf2/netvars.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once -#include - -#include "dt_recv.h" -#include "util.hpp" -#include "fnv.hpp" - -class RecvTable; - -#define NETVAR( funcname, name, table, extra, type ) \ -__forceinline auto& funcname( ) { \ - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ - return get< type >( offset + extra ); \ -} - -#define PNETVAR( funcname, name, table, extra, type ) \ -__forceinline type* funcname( ) { \ - static std::ptrdiff_t offset = g_netvars.get_netvar( fnv( table ), fnv( name ) ); \ - return reinterpret_cast< type* >( uintptr_t( this ) + offset + extra ); \ -} - -#define OFFSET( funcname, offset, type ) \ -__forceinline auto& funcname( ) { \ - return get< type >( offset ); \ -} - -NAMESPACE_REGION( tf2 ) - -class c_netvars { -public: - void init( ); - //search through the netvar list - std::ptrdiff_t get_netvar( hash_t table, hash_t hash ) const; - RecvProp* get_prop( hash_t table, hash_t name ) const; -public: - std::ptrdiff_t get_entry( hash_t hash, RecvTable* table ) const; - RecvTable* get_table( hash_t hash ) const; -private: - std::vector< RecvTable* > m_tables; -}; - -END_REGION - -extern tf2::c_netvars g_netvars; \ No newline at end of file diff --git a/tf2/on_screen_size_changed.cpp b/tf2/on_screen_size_changed.cpp deleted file mode 100644 index 580e2db..0000000 --- a/tf2/on_screen_size_changed.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "hooks.h" - -void __fastcall hooks::on_screen_size_changed( void* ecx_, void* edx_, int old_w, int old_h ) { - static auto old_fn = cl.m_surface->get_old_function< decltype( &hooks::on_screen_size_changed ) >( 116 ); - - old_fn( ecx_, nullptr, old_w, old_h ); - - g_fonts.initialize( ); -} \ No newline at end of file diff --git a/tf2/override_mouse_input.cpp b/tf2/override_mouse_input.cpp deleted file mode 100644 index d3a4b9b..0000000 --- a/tf2/override_mouse_input.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "hooks.h" -#include "base_cheat.h" -#include "ctx.hpp" - -void __fastcall hooks::override_mouse_input( void* ecx_, void* edx_, float* x, float* y ) { - static auto omi_o = cl.m_clientmode->get_old_function< decltype( &hooks::override_mouse_input ) >( 20 ); - omi_o( ecx_, edx_, x, y ); - - if( cl.m_panic ) return; - - if( g_ctx.run_frame( ) && g_ctx.m_local->is_alive( ) ) { - g_cheat.aim( x, y ); - } -} \ No newline at end of file diff --git a/tf2/override_view.cpp b/tf2/override_view.cpp deleted file mode 100644 index 2e22e58..0000000 --- a/tf2/override_view.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "base_cheat.h" -#include "ctx.hpp" -#include "hooks.h" -#include "settings.h" -void __fastcall hooks::override_view( void* ecx_, void* edx_, CViewSetup* setup ) { - static auto override_view_o = cl.m_clientmode->get_old_function< decltype( &hooks::override_view ) >( 16 ); - if( cl.m_panic ) { - return override_view_o( ecx_, nullptr, setup ); - } - - g_ctx.m_fov = setup->m_flFov; - if( g_ctx.run_frame( ) && g_ctx.m_local->is_valid( ) ) { - setup->m_flFov = g_settings.misc.fov_changer( ); - } - g_cheat.extra.thirdperson( ); - override_view_o( ecx_, nullptr, setup ); -} \ No newline at end of file diff --git a/tf2/paint.cpp b/tf2/paint.cpp deleted file mode 100644 index 144847b..0000000 --- a/tf2/paint.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "hooks.h" -#include "interfaces.h" -#include "search.h" -#include "graphics.h" -#include "settings.h" -#include "base_cheat.h" - - -void __fastcall hooks::paint_traverse( void *ecx_, void *edx_, unsigned int panel, bool forcerepaint, bool allowforce ) { - static auto paint_o = cl.m_panel->get_old_function< decltype( hooks::paint_traverse )* >( 41 ); - paint_o( ecx_, edx_, panel, forcerepaint, allowforce ); - - if ( cl.m_panic /*|| !g_ctx->run_frame( ) this will disable esp when dead u dummie!!!*/ ) { - return; - } - - static uint32_t focus_overlay_panel{ }; - if ( !focus_overlay_panel ) { - std::string panelname( cl.m_panel( )->GetName( panel ) ); - if ( panelname.find( "FocusOverlayPanel" ) != std::string::npos ) { //matsystemtoppanel is glitched the fuck out in tf2 - focus_overlay_panel = panel; //hovewer this draws on shit other than the main screen - } //so we should get paint working - } - - if ( panel == focus_overlay_panel ) { //i still wonder why dont we do this in paint - //dank 2007 esp here - cl.m_panel( )->SetMouseInputEnabled( panel, g_settings.menu.open || g_con->m_open ); - } -} - -void __fastcall hooks::paint( void* ecx_, void* edx_, int mode ) { - static auto engine_paint_o = cl.m_vgui->get_old_function< decltype( hooks::paint )* >( 13 ); - static auto start_d = pattern::first_code_match< void( __thiscall* )( void* ) >( cl.m_surface.dll( ), "55 8B EC 64 A1 ? ? ? ? 6A FF 68 ? ? ? ? 50 64 89 25 ? ? ? ? 83 EC 14" ); - static auto finish_d = pattern::first_code_match< void( __thiscall* )( void* ) >( cl.m_surface.dll( ), "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 64 89 25 ? ? ? ? 51 56 6A 00" ); - - engine_paint_o( ecx_, edx_, mode ); - - if ( cl.m_panic ) return; - - if ( mode & PAINT_UIPANELS ) { - start_d( cl.m_surface( ) ); - - //did you say lazy? - - g_renderer.draw_box( 0, 0, 1, 1, clr_t( 0, 0, 0, 1 ) ); - if( !g_settings.misc.hide_from_obs ) - g_cheat.visuals( ); - - finish_d( cl.m_surface( ) ); - } -} \ No newline at end of file diff --git a/tf2/pattern.hpp b/tf2/pattern.hpp deleted file mode 100644 index 0bc4b1b..0000000 --- a/tf2/pattern.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#pragma warning ( disable : 4018 ) - -namespace pattern -{ - inline bool bin_match( uint8_t* code, uint8_t* pattern, size_t size ) { - for( size_t j = 0; j < size; j++ ) { - if( pattern[ j ] && code[ j ] != pattern[ j ] ) { - return false; - } - } - return true; - } - - template< typename t = uintptr_t > static t first_match( uintptr_t start, std::string sig, size_t len, std::ptrdiff_t offset = 0 ) { - std::istringstream iss( sig ); - std::vector< std::string > tokens{ std::istream_iterator< std::string >{ iss }, std::istream_iterator< std::string >{} }; - std::vector< uint8_t > sig_bytes; - - for( const auto& hex_byte : tokens ) { - sig_bytes.push_back( static_cast< uint8_t >( std::strtoul( hex_byte.c_str( ), nullptr, 16 ) ) ); - } - - if( sig_bytes.empty( ) || sig_bytes.size( ) < 2 ) { - return t{ }; - } - - auto sig_data = sig_bytes.data( ); - auto sig_size = sig_bytes.size( ); - - for( size_t i{ }; i < len; i++ ) { - uint8_t* code_ptr = reinterpret_cast< uint8_t* >( start + i ); - - if( bin_match( code_ptr, sig_data, sig_size ) ) { - return( ( t )( start + i + offset ) ); - } - } - - return t{ }; - } - - //ultimately the function you want to call to sigscan ( ida style ) - template< typename t = uintptr_t > static t first_code_match( HMODULE start, std::string sig, std::ptrdiff_t offset = 0 ) { - auto dos_hdr = reinterpret_cast< PIMAGE_DOS_HEADER >( start ); - - if( !dos_hdr ) return t{ }; - - //DOS header, verifies if module is valid - if( dos_hdr->e_magic != 0x5a4d ) { - return t{ }; - } - - auto nt_hdrs = reinterpret_cast< PIMAGE_NT_HEADERS >( reinterpret_cast< uintptr_t >( dos_hdr ) + dos_hdr->e_lfanew ); - - return first_match< t >( reinterpret_cast< uintptr_t >( dos_hdr ) + nt_hdrs->OptionalHeader.BaseOfCode, sig, nt_hdrs->OptionalHeader.SizeOfCode, offset ); - } -}; \ No newline at end of file diff --git a/tf2/prediction.cpp b/tf2/prediction.cpp deleted file mode 100644 index c9e2493..0000000 --- a/tf2/prediction.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "prediction.h" -#include "sdk.h" -#include "interfaces.h" - -void features::c_prediction::run_prediction( user_cmd_t* cmd ) { - static uintptr_t addr_of_runcommand = cl.m_prediction->get_function( 17 ); - static uint32_t pseudo_random_offset = pattern::first_code_match( cl.m_chl.dll( ), "55 8B EC 8B 45 08 85 C0 75 0C", 0x1 ); - static char* move_data = reinterpret_cast< char* >( malloc( 0x256 ) ); - - if ( !cmd || !g_ctx.m_local ) return; - - int flags = g_ctx.m_local->get_flags( ); - int cmd_buttons = cmd->m_buttons; - - auto set_random_seed = reinterpret_cast< void( __cdecl* )( uint32_t ) >( pseudo_random_offset ); - - *reinterpret_cast< user_cmd_t** >( uintptr_t( g_ctx.m_local ) + 0x107c ) = cmd; - - if ( cmd->m_impulse ) { - *reinterpret_cast< uint8_t* >( uintptr_t( g_ctx.m_local ) + 0x1124 ) = cmd->m_impulse; - } - - /*void __cdecl SetButtonState(int a1) - { - int v1; // ecx@0 - int v2; // edx@1 - - v2 = a1 ^ *(_DWORD *)(v1 + 0x1078); - *(_DWORD *)(v1 + 0x106C) = *(_DWORD *)(v1 + 0x1078); - *(_DWORD *)(v1 + 0x1078) = a1; - *(_DWORD *)(v1 + 0x1070) = a1 & v2; - *(_DWORD *)(v1 + 0x1074) = v2 & ~a1; - }*/ - auto v2 = cmd->m_buttons ^ *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1078 ); - - *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x106c ) = *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1078 ); - *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1078 ) = cmd->m_buttons; - *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1070 ) = cmd->m_buttons & v2; - *reinterpret_cast< int* >( uintptr_t( g_ctx.m_local ) + 0x1074 ) = v2 &~ cmd->m_buttons; - - cl.m_globals->curtime = g_ctx.m_local->get_tick_base( ) * cl.m_globals->interval_per_tick; - cl.m_globals->frametime = cl.m_globals->interval_per_tick; - - set_random_seed( cmd->m_random_seed ); - **reinterpret_cast< uintptr_t** >( addr_of_runcommand + 0x2b + 0x2 ) = uintptr_t( g_ctx.m_local ); - - cl.m_movement( )->StartTrackPredictionErrors( reinterpret_cast< uintptr_t* >( g_ctx.m_local ) ); - - int tick_base = g_ctx.m_local->get_tick_base( ); - - static auto setup_move = cl.m_prediction->get_function< void( __thiscall* )( void*, c_base_player*, user_cmd_t*, IMoveHelper*, CMoveData* ) >( 18 ); - static auto finish_move = cl.m_prediction->get_function< void( __thiscall* )( void*, c_base_player*, user_cmd_t*, CMoveData* ) >( 19 ); - setup_move( cl.m_prediction( ), g_ctx.m_local, cmd, cl.m_movehelper, reinterpret_cast< CMoveData* >( move_data ) ); - cl.m_movement( )->ProcessMovement( reinterpret_cast< uintptr_t* >( g_ctx.m_local ), reinterpret_cast< CMoveData* >( move_data ) ); - finish_move( cl.m_prediction( ), g_ctx.m_local, cmd, reinterpret_cast< CMoveData* >( move_data ) ); - - g_ctx.m_local->m_nTickBase( ); - - cl.m_movement( )->FinishTrackPredictionErrors( reinterpret_cast< uintptr_t* >( g_ctx.m_local ) ); - - set_random_seed( 0xfffffff ); - **reinterpret_cast< uintptr_t*** >( addr_of_runcommand + 0x2b + 0x2 ) = nullptr; - *reinterpret_cast< user_cmd_t** >( uintptr_t( g_ctx.m_local ) + 0x107c ) = nullptr; - - cl.m_globals->curtime = g_ctx.m_local->get_tick_base( ) * cl.m_globals->interval_per_tick; - cl.m_globals->frametime = cl.m_globals->interval_per_tick; - - g_ctx.m_local->m_nTickBase( ); - cmd->m_buttons = cmd_buttons; -} \ No newline at end of file diff --git a/tf2/prediction.h b/tf2/prediction.h deleted file mode 100644 index e71ac24..0000000 --- a/tf2/prediction.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -class user_cmd_t; -class c_base_player; -namespace features -{ - class c_prediction { - public: - void run_prediction( user_cmd_t* cmd ); - }; -} \ No newline at end of file diff --git a/tf2/process_movement.cpp b/tf2/process_movement.cpp deleted file mode 100644 index c6f186e..0000000 --- a/tf2/process_movement.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "hooks.h" -#include "interfaces.h" - -void __fastcall hooks::process_movement( void* thisptr, void* edx_, c_base_player* player, CMoveData* move ) { - static auto old_fn = cl.m_movement->get_old_function< decltype( hooks::process_movement )* >( 1 ); - - if ( cl.m_input( )->IsButtonDown( MOUSE_MIDDLE ) ) { - move->m_outStepHeight = -1.0f; - } - - return old_fn( thisptr, edx_, player, move ); -} \ No newline at end of file diff --git a/tf2/projectile_pred.cpp b/tf2/projectile_pred.cpp deleted file mode 100644 index c54f712..0000000 --- a/tf2/projectile_pred.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "projectile_pred.h" -#include "sdk.h" -#include "interfaces.h" - -namespace util -{ - - vec3_t c_projectile_pred::predict_player( c_base_player* player ) { - if ( !player || !player->is_valid( ) ) return vec3_t{ }; - - static auto sv_gravity = cl.m_cvar( )->FindVar( "sv_gravity" ); //unnecessary for now - auto local = g_ctx.m_local; //will be used for stuff like grenades - //will also need to calculate friction etc - auto weapon = local->get_active_weapon( ); - if ( !weapon ) return player->get_origin( ); - - float projectile_speed = get_projectile_speed( weapon ); - - vec3_t player_vel = player->get_velocity( ); - vec3_t projectile_vel = vec3_t( ); - - float estimated_travel_time = ( local->get_eye_pos( ) - player->get_origin( ) ).length( ) / projectile_speed + cl.m_globals->interval_per_tick; - vec3_t estimated_predicted_pos = player->get_origin( ) + player_vel * estimated_travel_time; - - return estimated_predicted_pos; - } - - float c_projectile_pred::get_projectile_speed( c_base_weapon* weapon ) { - if ( !weapon ) - return -1.f; - /* - this is completely hardcoded - if you can find a better way to figure this out - then please tell me - -- nave - */ - - int id = weapon->GetClientClass( )->m_class_id; - - float BeginCharge; - float Charge; - - //return flSpeed; - switch ( id ) { - case ClientClassIDs::CTFGrenadeLauncher: - return 840.0f; - case ClientClassIDs::CTFRocketLauncher_DirectHit: - return 1980.0f; - case ClientClassIDs::CTFRocketLauncher: - case ClientClassIDs::CTFRocketLauncher_Mortar: - return 1100.0f; - case ClientClassIDs::CTFFlareGun: - return 1450.0f; - case ClientClassIDs::CTFBat_Wood: - return 1940.0f; - case ClientClassIDs::CTFSyringeGun: - return 990.0f; - case ClientClassIDs::CTFCompoundBow: { - return 0.f; //need more shit, cba now - } - - default: - return -1.0f; - } - - return -1.0f; - } -} - -util::c_projectile_pred projectile_pred; \ No newline at end of file diff --git a/tf2/projectile_pred.h b/tf2/projectile_pred.h deleted file mode 100644 index bd1b3d8..0000000 --- a/tf2/projectile_pred.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -class c_base_weapon; -class c_base_player; -class vec3_t; -namespace util -{ - class c_projectile_pred { - public: - vec3_t predict_player( c_base_player* ); - private: - float get_projectile_speed( c_base_weapon* ); - }; -} - -extern util::c_projectile_pred projectile_pred; \ No newline at end of file diff --git a/tf2/renderer.cpp b/tf2/renderer.cpp deleted file mode 100644 index 8f5e8e7..0000000 --- a/tf2/renderer.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "renderer.hpp" -#include "interfaces.h" - -#undef CreateFont - - -drawings::c_fonts g_fonts; -drawings::c_drawings g_renderer; - -NAMESPACE_REGION( drawings ) - -c_fonts::font_t::font_t( std::string name, int size, - int weight, ulong_t flags ) : - m_name( name ), m_size( size ), - m_weight( weight ), m_flags( flags ) { - g_fonts.m_container.push_back( this ); -}; - -void c_fonts::font_t::initialize( ) { - m_font = cl.m_surface( )->CreateFnt( ); - cl.m_surface( )->SetFontGlyphSet( - m_font, m_name.c_str( ), m_size, - m_weight, 0, 0, - m_flags - ); -} - -void c_fonts::initialize( ) { - for( auto& it : m_container ) { - it->initialize( ); - } -} - -void c_drawings::draw_string( const wchar_t* text, HFont font, int x, int y, const clr_t& color ) { - cl.m_surface( )->DrawSetTextPos( x, y ); - cl.m_surface( )->DrawSetTextFont( font ); - cl.m_surface( )->DrawSetTextColor( color ); - cl.m_surface( )->DrawPrintText( text, wcslen( text ) ); -} - -void c_drawings::draw_rect( int x, int y, int w, int h, const clr_t& color ) { - cl.m_surface( )->DrawSetColor( color ); - cl.m_surface( )->DrawFilledRect( x, y, x + w, y + h ); -} - -void c_drawings::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { - cl.m_surface( )->DrawSetColor( clr ); - cl.m_surface( )->DrawLine( x, y, x1, y1 ); -} - -void c_drawings::draw_box( int x, int y, int w, int h, const clr_t& clr ) { - draw_line( x, y, x + w, y, clr ); - draw_line( x + w, y, x + w, y + h, clr ); - draw_line( x, y + h, x + w + 1, y + h, clr ); - draw_line( x, y, x, y + h, clr ); -} - -void c_drawings::draw_circle( int x, int y, int r, const clr_t& col, int res ) { - cl.m_surface( )->DrawSetColor( col ); - cl.m_surface( )->DrawOutlinedCircle( x, y, r, res ); -} - -void c_drawings::draw_filled_circle( int x, int y, int r, const clr_t& col, int res ) { - vertex_t* v = ( vertex_t* )( _alloca( res * sizeof( vertex_t ) ) ); - const float step = M_PI * 2.0f / res; - - for( size_t i{ }; i < res; ++i ) { - float theta = i * step; - float x_off = r * cos( theta ); - float y_off = r * sin( theta ); - v[ i ].init( x + x_off, y + y_off ); - } - - draw_polygon( res, v, col ); -} - -void c_drawings::draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& clr ) { - draw_line( ( int )begin.x, ( int )begin.y, ( int )end.x, ( int )end.y, clr ); -} - -void c_drawings::draw_polygon( int count, vertex_t* vertices, const clr_t& col ) { - static int texture = cl.m_surface( )->CreateNewTextureID( true ); - - clr_t buf( 255, 255, 255 ); - - cl.m_surface( )->DrawSetTextureRGBA( texture, ( byte* )( &buf ), 1, 1 ); - cl.m_surface( )->DrawSetColor( col ); - cl.m_surface( )->DrawSetTexture( texture ); - - cl.m_surface( )->DrawTexturedPolygon( count, vertices ); -} - -END_REGION \ No newline at end of file diff --git a/tf2/renderer.hpp b/tf2/renderer.hpp deleted file mode 100644 index 1c86511..0000000 --- a/tf2/renderer.hpp +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once -#include -#include -#include - -#include "util.hpp" -#include "sdk.h" - -enum e_font_style : size_t { - -}; - -enum FontAlign_t : size_t { - ALIGN_CENTER, - ALIGN_LEFT, - ALIGN_RIGHT -}; - -NAMESPACE_REGION( drawings ) - - -class c_fonts { -protected: - struct font_t { - friend class c_fonts; - font_t( std::string name, int size, - int weight, ulong_t flags ); - - operator HFont( ) { - return m_font; - } - - private: - void initialize( ); - - HFont m_font; - std::string m_name; - int m_size; - int m_weight; - ulong_t m_flags; - }; - - std::vector< font_t* > m_container; - friend struct c_fonts::font_t; -public: - void initialize( ); - - font_t f_esp_small{ xors( "Tahoma" ), 11, 500, FONTFLAG_OUTLINE }; - font_t f_bold{ xors( "Verdana" ), 18, 900, FONTFLAG_DROPSHADOW | FONTFLAG_ANTIALIAS }; - font_t f_12{ xors( "Verdana" ), 12, 700, 128 }; - font_t f_14{ xors( "Verdana" ), 14, 700, 128 }; - font_t f_16{ xors( "Verdana" ), 16, 700, 128 }; - font_t f_18{ xors( "Verdana" ), 18, 700, 128 }; -}; - - - -//im going to fill ur triangles -class c_drawings { -private: - //dumb hacky fix for template functions - void draw_string( const wchar_t* msg, HFont font, int x, int y, const clr_t& color ); - -public: - void draw_line( const vec2_t& begin, const vec2_t& end, const clr_t& color ); - void draw_line( int x, int y, int x1, int y2, const clr_t& color ); - void draw_rect( int x, int y, int w, int h, const clr_t& color ); - void draw_box( int x, int y, int w, int h, const clr_t& color ); //thicc - void draw_polygon( int count, vertex_t* vertices, const clr_t& col ); - void draw_circle( int x, int y, int r, const clr_t& col, int res = 48 ); - void draw_filled_circle( int x, int y, int r, const clr_t& col, int res = 48 ); - - template < FontAlign_t align = ALIGN_LEFT > //fuck ur sprintf nigga varargs nigga - void draw_string( HFont font, int x, int y, const clr_t& color, const wchar_t* msg, ... ) { - wchar_t* buffer = ( wchar_t* )_alloca( 2048 ); - va_list list{ }; - int wide, tall; - - memset( buffer, 0, 2048 ); - - __crt_va_start( list, msg ); - vswprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - cl.m_surface( )->GetTextSize( - font, buffer, wide, tall ); - - switch( align ) { - case ALIGN_CENTER: - x -= wide / 2; - break; - case ALIGN_RIGHT: - x -= wide; - break; - default: break; - } - - draw_string( buffer, font, x, y, color ); - } - - template < FontAlign_t align = ALIGN_LEFT > //debatable whether it should be center or not - void draw_string( HFont font, int x, int y, const clr_t& color, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - auto wide_str = util::ascii_to_unicode( buffer ); - draw_string< align >( font, x, y, color, wide_str.c_str( ) ); - } -}; - -END_REGION - -extern drawings::c_fonts g_fonts; -extern drawings::c_drawings g_renderer; \ No newline at end of file diff --git a/tf2/scene_end.cpp b/tf2/scene_end.cpp deleted file mode 100644 index bb88311..0000000 --- a/tf2/scene_end.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "hooks.h" -#include "settings.h" -#include "base_cheat.h" -#include "ctx.hpp" - -void __fastcall hooks::scene_end( void* ecx_, void* edx_ ) { - static auto scene_end_o = cl.m_render_view->get_old_function< decltype( &hooks::scene_end ) >( 9 ); - scene_end_o( edx_, 0 ); - - if( !cl.m_panic && g_ctx.m_local && g_settings.visuals.chams.enabled( ) && g_settings.visuals.chams.ignore_z( ) ) { - g_ctx.m_drawing_screneend = true; - for( int i = 1; i < cl.m_globals->maxclients; ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - if( ent && ent->is_valid( ) ) { - if( ent == g_ctx.m_local && ent->m_bIsScoped( ) ) { - continue; - } - int team = ent->m_iTeamNum( ); - bool enemy = team != g_ctx.m_local->m_iTeamNum( ); - if( enemy || g_settings.visuals.chams.friendlies( ) ) { - IMaterial* mat = g_settings.visuals.chams.flat ? g_cheat.chams.m_materials.m_chams_flat : g_cheat.chams.m_materials.m_chams; - fclr_t clr_vis = enemy ? g_settings.visuals.chams.color_visible_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_visible_friendly( ).to_fclr( ); - fclr_t clr_hid = enemy ? g_settings.visuals.chams.color_hidden_enemy( ).to_fclr( ) : g_settings.visuals.chams.color_hidden_friendly( ).to_fclr( ); - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, true ); - //g_cheat.chams.m_materials.force_material( mat, clr_hid ); - ent->ce( )->DrawModel( 0x1, 255 ); - mat->SetMaterialVarFlag( MATERIAL_VAR_IGNOREZ, false ); - //g_cheat.chams.m_materials.force_material( mat, clr_vis ); - ent->ce( )->DrawModel( 0x1, 255 ); - cl.m_model_render( )->ForcedMaterialOverride( nullptr ); - } - } - } - - g_ctx.m_drawing_screneend = false; - } -} \ No newline at end of file diff --git a/tf2/sdk.h b/tf2/sdk.h deleted file mode 100644 index 4db8a8f..0000000 --- a/tf2/sdk.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#define CLIENT_DLL - -#include -#include -#include - -#include "vector.hpp" - -#include "color.hpp" -#include "IClientMode.h" -#include "CHLClient.h" -#include "IEngineVGui.h" -#include "IClientEntityList.h" -#include "IEngineTrace.h" -#include "CGlobalVarsBase.h" -#include "ICvar.h" -#include "IVDebugOverlay.h" -#include "IVEngineClient.h" -#include "IPlayerInfoManager.h" -#include "CBasePlayer.h" -#include "IPanel.h" -#include "ISurface.h" -#include "GlowObject.h" -#include "IInputSystem.h" -#include "IVRenderView.h" -#include "CBaseWeapon.h" -#include "IVModelInfo.h" -#include "IGameMovement.h" -#include "IMaterialSystem.hpp" -#include "IGameEventManager.h" -#include "CInput.hpp" -#include "KeyValues.h" \ No newline at end of file diff --git a/tf2/settings.cpp b/tf2/settings.cpp deleted file mode 100644 index 144c74a..0000000 --- a/tf2/settings.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "settings.h" - -SettingHolder holder_{ "" }; -c_settings settings; \ No newline at end of file diff --git a/tf2/settings.h b/tf2/settings.h deleted file mode 100644 index 3f9fbac..0000000 --- a/tf2/settings.h +++ /dev/null @@ -1,276 +0,0 @@ -#pragma once -#include "simple_settings.h" -#include "strings.hpp" -#include "color.hpp" -#include -//later i will implement a way to load all config files - -namespace data -{ - - - extern SettingHolder holder_; - - - class legitbot_settings : SettingHolder { - public: - using SettingHolder::SettingHolder; - - con_var< float > m_fov{ this, fnv( "fov" ), 5.f }; - con_var< float > m_speed{ this, fnv( "speed" ), 10.f }; - con_var< float > m_assist_strength{ this, fnv( "assist_strength" ), 0.f }; - con_var< int > m_hitbox{ this, fnv( "hitbox" ), 0 }; - con_var< int > m_bone{ this, fnv( "bone" ), 0 }; - }; - - - class c_settings { - public: - - void load( ) { - switch( menu.cur_setting ) { - case 0: - holder_.load( "", xors( "./tf/cfg/scout.cfg" ) ); - break; - case 1: - holder_.load( "", xors( "./tf/cfg/soldier.cfg" ) ); - break; - case 2: - holder_.load( "", xors( "./tf/cfg/pyro.cfg" ) ); - break; - case 3: - holder_.load( "", xors( "./tf/cfg/demo.cfg" ) ); - break; - case 4: - holder_.load( "", xors( "./tf/cfg/heavy.cfg" ) ); - break; - case 5: - holder_.load( "", xors( "./tf/cfg/engineer.cfg" ) ); - break; - case 6: - holder_.load( "", xors( "./tf/cfg/medic.cfg" ) ); - break; - case 7: - holder_.load( "", xors( "./tf/cfg/sniper.cfg" ) ); - break; - case 8: - holder_.load( "", xors( "./tf/cfg/spy.cfg" ) ); - break; - case 9: - holder_.load( "", xors( "./tf/cfg/money_rage1.cfg" ) ); - break; - case 10: - holder_.load( "", xors( "./tf/cfg/money_rage2.cfg" ) ); - break; - } - - menu.anti_untrusted = true; - } - - void save( ) { - switch( menu.cur_setting ) { - case 0: - holder_.load( "", xors( "./tf/cfg/scout.cfg" ) ); - break; - case 1: - holder_.load( "", xors( "./tf/cfg/soldier.cfg" ) ); - break; - case 2: - holder_.load( "", xors( "./tf/cfg/pyro.cfg" ) ); - break; - case 3: - holder_.load( "", xors( "./tf/cfg/demo.cfg" ) ); - break; - case 4: - holder_.load( "", xors( "./tf/cfg/heavy.cfg" ) ); - break; - case 5: - holder_.load( "", xors( "./tf/cfg/engineer.cfg" ) ); - break; - case 6: - holder_.load( "", xors( "./tf/cfg/medic.cfg" ) ); - break; - case 7: - holder_.load( "", xors( "./tf/cfg/sniper.cfg" ) ); - break; - case 8: - holder_.load( "", xors( "./tf/cfg/spy.cfg" ) ); - break; - case 9: - holder_.load( "", xors( "./tf/cfg/money_rage1.cfg" ) ); - break; - case 10: - holder_.load( "", xors( "./tf/cfg/money_rage2.cfg" ) ); - break; - } - } - - void copy_to_clipboard( ) { - holder_.save( "", xors( "./tf/cfg/money_temp.cfg" ) ); - std::vector< uint8_t > file_data; - FILE* f = fopen( xors( "./tf/cfg/money_temp.cfg" ), "r" ); - size_t size = 0; - fseek( f, 0, SEEK_END ); - size = ftell( f ); - - char* buf = ( char* )malloc( size ); - fread( buf, 1, size, f ); - fclose( f ); - for( size_t i{ }; i < size; ++i ) { - file_data.push_back( buf[ i ] ); - } - - free( buf ); - - EmptyClipboard( ); - OpenClipboard( nullptr ); - - auto g = GlobalAlloc( GMEM_FIXED, size ); - memcpy( g, file_data.data( ), size ); - - SetClipboardData( CF_TEXT, g ); - CloseClipboard( ); - //DeleteFileA( xors( "./tf/cfg/money_temp.cfg" ) ); - } - - void load_from_clipboard( ) { - FILE* f = fopen( xors( "./tf/cfg/money_temp.cfg" ), "wb" ); - auto data = GetClipboardData( CF_TEXT ); - - auto size = GlobalSize( data ); - fwrite( data, 1, size, f ); - fclose( f ); - - holder_.load( "", xors( "./tf/cfg/money_temp.cfg" ) ); - - CloseClipboard( ); - //DeleteFileA( xors( "./tf/cfg/money_temp.cfg" ) ); - } - - struct { - con_var< bool > enabled{ &holder_, fnv( "legit_active" ), false }; - con_var< size_t > sample_size{ &holder_, fnv( "legit_sample_size" ), 12 }; - con_var< float > smooth_factor{ &holder_, fnv( "legit_smooth_factor" ), 1.0f }; - con_var< bool > dynamic_smoothing{ &holder_, fnv( "legit_dynamic_smoothing" ), false }; - con_var< bool > assist{ &holder_, fnv( "legit_assist" ), false }; - con_var< bool > friendlies{ &holder_, fnv( "legit_friendlies" ), false }; - con_var< int > activation_type{ &holder_, fnv( "legit_activation_type" ), 1 }; - con_var< int > key{ &holder_, fnv( "legit_key" ), 0 }; - con_var< bool > backtracking{ &holder_, fnv( "legit_backtracking" ), 0 }; - con_var< float > backtracking_time{ &holder_, fnv( "legit_bt_time" ), 0.2f }; - con_var< float > backtracking_fov{ &holder_, fnv( "legit_bt_fov" ), 5.0f }; - con_var< bool > backtracking_target{ &holder_, fnv( "legit_bt_target" ), false }; - con_var< bool > backtracking_visualize{ &holder_, fnv( "legit_bt_visualize" ), 0 }; - con_var< clr_t > backtracking_col{ &holder_, fnv( "legit_bt_col" ), clr_t( 255, 255, 255, 120 ) }; - con_var< bool > triggerbot{ &holder_, fnv( "legit_triggerbot" ), false }; - con_var< int > trigger_key{ &holder_, fnv( "legit_triggerkey" ), 0 }; - con_var< float > trigger_delay{ &holder_, fnv( "legit_triggerdelay" ), 0.f }; - legitbot_settings secondary{ &holder_, "legit_primary" }; - legitbot_settings melee{ &holder_, "legit_melee" }; - legitbot_settings primary{ &holder_, "legit_secondary" }; - legitbot_settings* active = &primary; - } legit; - - struct { - struct { - con_var< bool > enabled{ &holder_, fnv( "visuals_chams_enabled" ), 0 }; - con_var< bool > flat{ &holder_, fnv( "visuals_chams_flat" ), 0 }; - con_var< bool > ignore_z{ &holder_, fnv( "visuals_chams_ignore_z" ), 0 }; - con_var< float > reflectivity{ &holder_, fnv( "visuals_chams_reflectivity" ), 1.0f }; - con_var< float > shine{ &holder_, fnv( "visuals_chams_shine" ), 1.0f }; - con_var< bool > friendlies{ &holder_, fnv( "visuals_chams_friendlies" ), 0 }; - con_var< clr_t > color_visible_friendly{ &holder_, fnv( "visuals_chams_color_friendly" ), clr_t( 0, 255, 255 ) }; - con_var< clr_t > color_visible_enemy{ &holder_, fnv( "visuals_chams_color_enemy" ), clr_t( 255, 255, 0 ) }; - con_var< clr_t > color_hidden_friendly{ &holder_, fnv( "visuals_chams_color_h_friendly" ), clr_t( 0, 0, 255 ) }; - con_var< clr_t > color_hidden_enemy{ &holder_, fnv( "visuals_chams_color_h_enemy" ), clr_t( 255, 0, 0 ) }; - } chams; - - con_var< int > activation_type{ &holder_, fnv( "visuals_activation" ), false }; - //players - con_var< bool > box{ &holder_, fnv( "visuals_box" ), false }; - con_var< bool > dormant{ &holder_, fnv( "visuals_dormant" ), false }; - con_var< bool > health{ &holder_, fnv( "visuals_health" ), false }; - con_var< bool > weapon{ &holder_, fnv( "visuals_weapon" ), false }; - con_var< bool > name{ &holder_, fnv( "visuals_name" ), false }; - con_var< bool > out_of_pov{ &holder_, fnv( "visuals_out_of_pov" ), false }; - con_var< float > out_of_pov_radius{ &holder_, fnv( "visuals_out_of_pov_radius" ), 0.75f }; - con_var< int > out_of_pov_size{ &holder_, fnv( "visuals_out_of_pov_size" ), 25 }; - con_var< bool > friendlies{ &holder_, fnv( "visuals_friendlies" ), false }; - con_var< bool > skeleton{ &holder_, fnv( "visuals_skeleton" ) }; - con_var< bool > glow{ &holder_, fnv( "visuals_glow" ), false }; - con_var< bool > conditions{ &holder_, fnv( "visuals_conditions" ), false }; //conditions - con_var< bool > resolver_indicator{ &holder_, fnv( "visuals_resolver_indicator" ), false }; - con_var< bool > ammo{ &holder_, fnv( "visuals_ammo" ), false }; - con_var< bool > player_class{ &holder_, fnv( "visuals_player_class" ) }; - con_var< bool > floating_ragdolls{ &holder_, fnv( "visuals_floating_ragdolls" ) }; //dont remember - con_var< bool > sound{ &holder_, fnv( "visuals_sound" ), false }; - con_var< clr_t > box_enemy{ &holder_, fnv( "visuals_clr_enemy" ), clr_t( 0, 255, 255 ) }; - con_var< clr_t > box_friendly{ &holder_, fnv( "visuals_clr_friendly" ), clr_t( 255, 0, 255 ) }; - con_var< clr_t > glow_enemy{ &holder_, fnv( "visuals_glow_enemy" ), clr_t( 255, 0, 255, 150 ) }; - con_var< clr_t > glow_friendly{ &holder_, fnv( "visuals_glow_friendly" ), clr_t( 255, 120, 0, 150 ) }; - con_var< clr_t > skeleton_enemy{ &holder_, fnv( "visuals_skeleton_enemy" ), clr_t( 255, 255, 255 ) }; - con_var< clr_t > skeleton_friendly{ &holder_, fnv( "visuals_skeleton_friendly" ), clr_t( 255, 255, 255 ) }; - con_var< int > bullet_tracers{ &holder_, fnv( "visuals_bullet_tracers" ), 0 }; - con_var< int > sound_range{ &holder_, fnv( "visuals_sound_range" ), 360 }; - con_var< int > key{ &holder_, fnv( "visuals_key" ), 0 }; - con_var< bool > hitmarkers{ &holder_, fnv( "visuals_hitmarkers" ), false }; - - - //world - con_var< bool > world_modulate{ &holder_, fnv( "visuals_world_modulate" ), false }; - con_var< bool > night_mode{ &holder_, fnv( "visuals_night_mode" ), false }; - con_var< bool > transparent_props{ &holder_, fnv( "visuals_transparent_props" ), false }; - con_var< int > projectile_esp{ &holder_, fnv( "visuals_projectile_esp" ), 0 }; //projectile_esp - con_var< int > building_esp{ &holder_, fnv( "visuals_building_esp" ), 0 };//building_esp - con_var< bool > building_owner{ &holder_, fnv( "visuals_building_owner" ), false }; //building_owner - con_var< clr_t > projectile_esp_clr{ &holder_, fnv( "visuals_projectile_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; - con_var< clr_t > building_esp_clr{ &holder_, fnv( "visuals_building_esp_clr" ), clr_t( 255, 255, 255, 180 ) }; - con_var< bool > fullbright{ &holder_, fnv( "visuals_fullbright" ), false }; - con_var< bool > objective_info{ &holder_, fnv( "visuals_objective_info" ), false }; //objective_info - - //local - con_var< bool > draw_spread{ &holder_, fnv( "misc_draw_spread" ), false }; - con_var< bool > grenade_prediction{ &holder_, fnv( "visuals_grenade_prediction" ), false }; - con_var< bool > spec_list{ &holder_, fnv( "visuals_spec_list" ), false }; - - bool active = true; - } visuals; - - struct { - con_var< bool > watermark{ &holder_, fnv( "misc_watermark" ), false }; - con_var< bool > bunny_hop{ &holder_, fnv( "misc_bhop" ), false }; - con_var< bool > auto_strafe{ &holder_, fnv( "misc_autostrafe" ), false }; - con_var< int > viewmodel_fov{ &holder_, fnv( "misc_viewmodel_fov" ), 0 }; - con_var< int > fov_changer{ &holder_, fnv( "fov_changer" ), 90 }; - con_var< bool > thirdperson{ &holder_, fnv( "misc_thirdperson" ), false }; - con_var< int > thirdperson_key{ &holder_, fnv( "misc_tp_key" ), 0 }; - - con_var< bool > no_recoil{ &holder_, fnv( "misc_no_recoil" ), false }; - con_var< bool > no_sound{ &holder_, fnv( "misc_no_sound" ), false }; - con_var< bool > no_scope{ &holder_, fnv( "misc_no_scope" ), false }; - con_var< bool > transparent_vm{ &holder_, fnv( "misc_transparent_vm" ), false }; - con_var< bool > hide_from_obs{ &holder_, fnv( "misc_hide_from_obs" ), false }; - con_var< bool > disable_post_process{ &holder_, fnv( "misc_disable_post_process" ), false }; - - bool recorder_enable = false; - } misc; - - struct { - con_var< uint8_t > menu_color_1r{ &holder_, fnv( "menu_color_1r" ), 231 }; - con_var< uint8_t > menu_color_1g{ &holder_, fnv( "menu_color_1g" ), 105 }; - con_var< uint8_t > menu_color_1b{ &holder_, fnv( "menu_color_1b" ), 105 }; - - con_var< uint8_t > menu_color_2r{ &holder_, fnv( "menu_color_2r" ), 0xf4 }; - con_var< uint8_t > menu_color_2g{ &holder_, fnv( "menu_color_2g" ), 0x7c }; - con_var< uint8_t > menu_color_2b{ &holder_, fnv( "menu_color_2b" ), 0xa8 }; - - bool auto_class_settings = false; - bool anti_untrusted = true; - bool open = false; - bool logs_enable = false; - int cur_setting = 0; - } menu; - }; -} - -extern data::c_settings g_settings; \ No newline at end of file diff --git a/tf2/shut_down.cpp b/tf2/shut_down.cpp deleted file mode 100644 index 149fbf6..0000000 --- a/tf2/shut_down.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "hooks.h" -#include "chams.h" -#include "base_cheat.h" - -void __fastcall hooks::shut_down( void* ecx_, void* edx_ ) { - static auto original_fn = cl.m_chl->get_old_function< decltype( &shut_down ) >( 3 ); - - cl.m_engine( )->ClientCmd_Unrestricted( xors( "host_writeconfig" ) ); - //fuck you - abort( ); - - //how about fuck you instead dumb fucking tentacle hentai lookin ass mofo - - //g_cheat.chams.m_materials.destroy_materials( ); - return original_fn( ecx_, edx_ ); -} \ No newline at end of file diff --git a/tf2/simple_settings.cpp b/tf2/simple_settings.cpp deleted file mode 100644 index 9d1d1de..0000000 --- a/tf2/simple_settings.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "settings.h" - -SettingHolder data::holder_{ "fucking_nerd" }; -data::c_settings g_settings; - -#pragma warning(disable: 4996) - -void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ) { - auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); - auto data = reinterpret_cast< const uint8_t* >( src ); - - for( size_t i = 0; i < size; i++ ) - sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); - - WritePrivateProfileStringA( path, name, buffer, filename ); -} - -void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ) { - auto buffer = reinterpret_cast< char* >( _alloca( size * 2 + 1 ) ); - auto data = reinterpret_cast< uint8_t* >( dest ); - - GetPrivateProfileStringA( path, name, "", buffer, size * 2 + 1, filename ); - - if( *buffer == 0 ) - return; - - for( size_t i = 0; i < size; i++ ) { - unsigned temp; - sscanf( &buffer[ 2 * i ], "%02X", &temp ); - data[ i ] = temp; - } -} \ No newline at end of file diff --git a/tf2/simple_settings.h b/tf2/simple_settings.h deleted file mode 100644 index db9b814..0000000 --- a/tf2/simple_settings.h +++ /dev/null @@ -1,204 +0,0 @@ -#pragma once -#include -#include -#include -#include - -#include "util.hpp" -#include "fnv.hpp" - -//nama stuff -extern void simple_save( const char* path, const char* name, const void* src, size_t size, const char* filename ); -extern void simple_load( const char* path, const char* name, void* dest, size_t size, const char* filename ); - -class ISettingNode { -public: - virtual ~ISettingNode( ) = default; - - virtual void load( const char* path, const char* file ) = 0; - virtual void save( const char* path, const char* file ) const = 0; - virtual void register_( ISettingNode* node_ptr ) = 0; - virtual bool has_nodes( ) { return false; } - virtual hash_t get_hash( ) { return 0; } -}; - -class SettingHolder : public ISettingNode { -public: - __forceinline SettingHolder( const char* name ) : name_( name ) {} - __forceinline SettingHolder( SettingHolder* holder_ptr, const char* name ) : name_( name ) { holder_ptr->register_( this ); } - - void register_( ISettingNode* node_ptr ) override { - setting_nodes_.push_back( node_ptr ); - } - - void load( const char* path, const char* file ) override { - char full_path[ 64 ]; - strcpy_s( full_path, path ); - strcat_s( full_path, "_" ); - strcat_s( full_path, name_ ); - for( auto x : setting_nodes_ ) - x->load( full_path, file ); - } - - void save( const char* path, const char* file ) const override { - char full_path[ 64 ]; - strcpy_s( full_path, path ); - strcat_s( full_path, "_" ); - strcat_s( full_path, name_ ); - for( auto x : setting_nodes_ ) - x->save( full_path, file ); - } - - auto& get_nodes( ) { - return setting_nodes_; - } - - virtual bool has_nodes( ) { - return true; - } - -private: - const char* name_; - bool has_nodes_; - std::vector setting_nodes_; -}; - -class ISetting : public ISettingNode { - void register_( ISettingNode* node_ptr ) override {} -public: - virtual void set( float value ) = 0; - virtual void set( int value ) = 0; - virtual void set( ulong_t value ) = 0; - virtual std::string get_string( ) = 0; - virtual hash_t get_hash( ) = 0; - virtual std::string get_data_string( ) = 0; - virtual void load_from_string( const std::string& ) = 0; -}; - -template < size_t L > -class SettingString : ISetting { -public: - __forceinline SettingString( SettingHolder* holder_ptr, hash_t hash ) : - m_name( name ), m_value( "" ) { - holder_ptr->register_( this ); - }; - - void load( const char* path, const char* file ) override { - GetPrivateProfileStringA( path, std::to_string( m_name ).c_str( ), "", m_value, L, file ); - } - - void save( const char* path, const char* file ) const override { - WritePrivateProfileStringA( path, std::to_string( m_name ).c_str( ), m_value, file ); - } - - char* get( ) { - return m_value; - } - -private: - char m_value[ L ]; - hash_t m_name; -}; - -template < typename T > -class con_var : public ISetting { -public: - __forceinline con_var( SettingHolder* holder_ptr, hash_t name ) : - name_( name ), - is_float_( std::is_floating_point_v< T > ), - is_integral_( std::is_integral_v< T > ) { - holder_ptr->register_( this ); - } - __forceinline con_var( SettingHolder* holder_ptr, hash_t name, const T& rhs ) : - value_( rhs ), - name_( name ), - is_float_( std::is_floating_point_v< T > ), - is_integral_( std::is_integral_v< T > ) { - holder_ptr->register_( this ); - } - - void load( const char* path, const char* file ) override { simple_load( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } - - void save( const char* path, const char* file ) const override { simple_save( path, std::to_string( name_ ).c_str( ), &value_, sizeof( value_ ), file ); } - - __forceinline operator T&( ) { return value_; } - __forceinline T* operator &( ) { return &value_; } - - __forceinline T& operator ()( ) { return value_; } - - virtual std::string get_string( ) { - if constexpr( std::is_arithmetic_v< T > ) { - return std::to_string( value_ ); - } - else { - return util::to_hex_str( *( ulong_t* )( &value_ ) ); - } - } - - virtual void set( float value ) { - if constexpr( std::is_arithmetic_v< T > ) { - value_ = ( T )( value ); - } - } - - virtual void set( int value ) { - if constexpr( std::is_arithmetic_v< T > ) { - value_ = ( T )( value ); - } - else { - value_ = *( T* )( &value ); - } - } - - virtual void set( ulong_t value ) { - if constexpr( sizeof( T ) == sizeof( ulong_t ) ) { - *( ulong_t* )( &value_ ) = value; - return; - } - - memcpy( &value_, &value, sizeof( value_ ) ); - } - - virtual hash_t get_hash( ) { - return name_; - } - - __forceinline bool is_floating_point( ) { - return is_float_; - } - - __forceinline bool is_integral( ) { - return is_integral_; - } - - virtual std::string get_data_string( ) override { - auto buffer = reinterpret_cast< char* >( _alloca( sizeof( T ) * 2 + 1 ) ); - auto data = reinterpret_cast< const uint8_t* >( &value_ ); - - for( size_t i = 0; i < sizeof( T ); i++ ) - sprintf( &buffer[ 2 * i ], "%02X", data[ i ] ); - - return buffer; - } - - virtual void load_from_string( const std::string& str ) override { - auto data = reinterpret_cast< uint8_t* >( &value_ ); - auto buffer = str.data( ); - - if( *buffer == 0 ) - return; - - for( size_t i = 0; i < sizeof( T ); i++ ) { - unsigned temp; - sscanf( &buffer[ 2 * i ], "%02X", &temp ); - data[ i ] = temp; - } - } - - -private: - hash_t name_; - bool is_float_; - bool is_integral_; - T value_; -}; \ No newline at end of file diff --git a/tf2/strings.hpp b/tf2/strings.hpp deleted file mode 100644 index dfdeb8b..0000000 --- a/tf2/strings.hpp +++ /dev/null @@ -1,162 +0,0 @@ -//-------------------------------------------------------------------------------- -//-- XorCompileTime.hpp -// -// Author: frk -// Date: 12.12.2015 -// -//-------------------------------------------------------------------------------- - -#pragma once -#include -#include -#include - -#define BEGIN_NAMESPACE( x ) namespace x { -#define END_NAMESPACE } - -BEGIN_NAMESPACE( strenc ) - -constexpr auto time = __TIME__; -constexpr auto seed = static_cast< int >( time[ 7 ] ) + static_cast< int >( time[ 6 ] ) * 10 + static_cast< int >( time[ 4 ] ) * 60 + static_cast< int >( time[ 3 ] ) * 600 + static_cast< int >( time[ 1 ] ) * 3600 + static_cast< int >( time[ 0 ] ) * 36000; - -// 1988, Stephen Park and Keith Miller -// "Random Number Generators: Good Ones Are Hard To Find", considered as "minimal standard" -// Park-Miller 31 bit pseudo-random number generator, implemented with G. Carta's optimisation: -// with 32-bit math and without division - -template < int N > -struct RandomGenerator { -private: - static constexpr unsigned a = 16807; // 7^5 - static constexpr unsigned m = 2147483647; // 2^31 - 1 - - static constexpr unsigned s = RandomGenerator< N - 1 >::value; - static constexpr unsigned lo = a * ( s & 0xFFFF ); // Multiply lower 16 bits by 16807 - static constexpr unsigned hi = a * ( s >> 16 ); // Multiply higher 16 bits by 16807 - static constexpr unsigned lo2 = lo + ( ( hi & 0x7FFF ) << 16 ); // Combine lower 15 bits of hi with lo's upper bits - static constexpr unsigned hi2 = hi >> 15; // Discard lower 15 bits of hi - static constexpr unsigned lo3 = lo2 + hi; - -public: - static constexpr unsigned max = m; - static constexpr unsigned value = lo3 > m ? lo3 - m : lo3; -}; - -template <> -struct RandomGenerator< 0 > { - static constexpr unsigned value = seed; -}; - -template < int N, int M > -struct RandomInt { - static constexpr auto value = RandomGenerator< N + 1 >::value % M; -}; - -template < int N > -struct RandomChar { - static const char value = static_cast< char >( 1 + RandomInt< N, 0x7F - 1 >::value ); -}; - -template < size_t N, int K > -struct XorString { -private: - const char _key; - std::array< char, N + 1 > _encrypted; - bool decrypted = false; - - constexpr char enc( char c ) const { - return c ^ _key; - } - - char dec( char c ) const { - return c ^ _key; - } - -public: - template < size_t... Is > - constexpr __forceinline XorString( const char* const str, std::index_sequence< Is... > ) : _key( RandomChar< K >::value ), _encrypted{ enc( str[ Is ] )... } { - } - - __forceinline const char* decrypt( void ) { - if( !decrypted ) { - for( size_t i = 0; i < N; ++i ) { - _encrypted[ i ] = dec( _encrypted[ i ] ); - } - _encrypted[ N ] = '\0'; - decrypted = true; - } - printf( "N: %u K: %d str: %s address: %08x\n", N, K, _encrypted.data( ), _encrypted.data( ) ); - - return _encrypted.data( ); - } -}; - -//-------------------------------------------------------------------------------- -//-- Note: XorStr will __NOT__ work directly with functions like printf. -// To work with them you need a wrapper function that takes a const char* -// as parameter and passes it to printf and alike. -// -// The Microsoft Compiler/Linker is not working correctly with variadic -// templates! -// -// Use the functions below or use std::cout (and similar)! -//-------------------------------------------------------------------------------- - -static auto w_printf = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_printf_s = [ ]( const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vprintf_s( fmt, args ); - va_end( args ); -}; - -static auto w_sprintf = [ ]( char* buf, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf( buf, fmt, args ); - va_end( args ); -}; - -static auto w_sprintf_s = [ ]( char* buf, size_t buf_size, const char* fmt, ... ) { - va_list args; - va_start( args, fmt ); - vsprintf_s( buf, buf_size, fmt, args ); - va_end( args ); -}; - -//for compatibility with debug mode -struct debug_ret { -private: - const char* ret; - -public: - debug_ret( const char* str ) : ret( str ) { }; - - auto decrypt( ) { - return ret; - } -}; - -constexpr size_t strlen_ct( const char* const str ) { - size_t out = 1; - - for( ; str[ out ] != '\0'; ++out ); - - return out; -} - -#if 0 -#define xors_raw( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ) ) -#define xors( s ) ( strenc::XorString< strenc::strlen_ct( s ), __COUNTER__ >( s, std::make_index_sequence< sizeof( s ) - 1>() ).decrypt() ) -#else -#define xors_raw( s ) ( [ ]{ strenc::debug_ret ret{ s }; return ret; }( ) ) -#define xors( s ) ( s ) -#endif - -END_NAMESPACE \ No newline at end of file diff --git a/tf2/test_cso2.vcxproj b/tf2/test_cso2.vcxproj deleted file mode 100644 index 52b6d12..0000000 --- a/tf2/test_cso2.vcxproj +++ /dev/null @@ -1,377 +0,0 @@ - - - - - Debug - Win32 - - - pHit - Win32 - - - pHit - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - {DD486C1B-C911-42B8-AB24-A9102A23DC02} - Win32Proj - test_cso2 - 10.0.16299.0 - tf2_base - - - - DynamicLibrary - true - v141 - Unicode - - - DynamicLibrary - false - v141 - true - MultiByte - - - DynamicLibrary - false - v141 - true - MultiByte - - - DynamicLibrary - true - v141 - Unicode - - - DynamicLibrary - false - v141 - true - Unicode - - - DynamicLibrary - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - true - $(SolutionDir)\bin\ - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - true - - - false - $(SolutionDir)\bin\$(Configuration)\ - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - false - $(SolutionDir)\bin\$(Configuration)\ - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath) - C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86;$(LibraryPath) - - - false - - - false - - - - - - Level2 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - false - /Zc:threadSafeInit- %(AdditionalOptions) /std:c++latest - - - Windows - true - - - - - - - Level3 - Disabled - _DEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) - /Zc:threadSafeInit- /std:c++latest %(AdditionalOptions) - - - Windows - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) - C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 - /Zc:threadSafeInit- %(AdditionalOptions) /std:c++latest - AnySuitable - - - Windows - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) - C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 - /Zc:threadSafeInit- %(AdditionalOptions) /std:c++latest - AnySuitable - - - Windows - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) - C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 - - - Windows - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - NDEBUG;_WINDOWS;_USRDLL;TEST_CSO2_EXPORTS;%(PreprocessorDefinitions) - C:\HL-SDK\mp\game\shared;C:\HL-SDK\mp\game\client;C:\HL-SDK\mp\common;C:\HL-SDK\mp\common\xbox;C:\HL-SDK\mp\public\tier3;C:\HL-SDK\mp\public\tier2;C:\HL-SDK\mp\public\tier1;C:\HL-SDK\mp\public\tier0;C:\HL-SDK\mp\public;C:\HL-SDK\mp\tier1 - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tf2/test_cso2.vcxproj.filters b/tf2/test_cso2.vcxproj.filters deleted file mode 100644 index d9d322d..0000000 --- a/tf2/test_cso2.vcxproj.filters +++ /dev/null @@ -1,428 +0,0 @@ - - - - - - - features - - - sdk - - - data - - - util - - - features - - - context - - - hooks - - - hooks - - - util - - - sdk - - - hooks - - - hooks - - - util - - - sdk - - - features - - - hooks - - - util - - - util - - - util - - - hooks - - - - util - - - util - - - data - - - hooks - - - sdk - - - features - - - features - - - features - - - features - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - hooks - - - features - - - features - - - util - - - hooks\hookers - - - features - - - - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - data - - - data - - - data - - - features - - - data - - - data - - - util - - - features - - - sdk - - - sdk - - - sdk - - - features - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - sdk - - - protection - - - context - - - util - - - hooks - - - util - - - sdk - - - sdk - - - sdk - - - util - - - sdk - - - sdk - - - sdk - - - features - - - sdk - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - menu - - - util - - - util - - - util - - - util - - - util - - - - - protection - - - util - - - - - util - - - sdk - - - sdk - - - util - - - hooks\hookers - - - sdk - - - sdk - - - sdk - - - util - - - sdk - - - features - - - features - - - features - - - features - - - hooks\hookers - - - - - {3662005c-363b-4165-98d1-4cd08efa5aec} - - - {9b96d956-b922-4bc1-a7fd-448a79007f56} - - - {971e8665-630e-40f6-a426-a9c59476dd28} - - - {7abe95b2-6694-4252-9044-b0a3b6ca500d} - - - {280b6489-8704-41f7-98d1-76e4510e59b1} - - - {45735c33-3420-447c-9257-46d489466c79} - - - {8f34dc36-01d7-4458-a53a-f3698e843b94} - - - {bf4d8bec-9f02-4e3b-99bd-a328befb5cd3} - - - {2c764ae7-bdc8-4a36-b752-8ac395c2c006} - - - \ No newline at end of file diff --git a/tf2/ui.h b/tf2/ui.h deleted file mode 100644 index bafb2ce..0000000 --- a/tf2/ui.h +++ /dev/null @@ -1,374 +0,0 @@ -#pragma once -#include "ui_base_item.h" -#include "ui_menu.h" -#include "ui_form.h" -#include "ui_render.h" -#include "ui_checkbox.h" -#include "ui_tab_manager.h" -#include "ui_slider.h" -#include "ui_dropdown.h" -#include "ui_key_picker.h" -#include "ui_button.h" -#include "ui_color_picker.h" -#include "ui_label.h" -//#include "ui_itemlist.h" -//#include "ui_itemlist_def.h" - -#include "settings.h" -#include "base_cheat.h" - -namespace ui -{ - int current_category = 0; - - static std::string date_str = __DATE__; - auto menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "quebot" ), - __DATE__ ); - - static void render( ) { - static bool was_setup = false; - if( !was_setup ) { - std::transform( date_str.begin( ), date_str.end( ), date_str.begin( ), - [ ]( char c ) { return ::tolower( c ); } - ); - - menu.reset( ); - menu = std::make_shared< ui::c_menu >( 10, 10, 580, 470, xors( "moneybot - tf2" ), - date_str.c_str( ) ); - auto tab_sheet = std::make_shared< ui::c_tab_manager >( ); - - //todo: replace with icons? - auto tab_legit = std::make_shared< ui::c_tab_sheet >( xors( "legit" ), &icons::sprite_legit ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_main = std::make_shared< ui::c_tab_sheet >( xors( "main" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.enabled ) ); - auto activation_dropdown = std::make_shared< ui::c_dropdown< > >( - 0, 0, 120, xors( "activation type" ), - &g_settings.legit.activation_type, - &ui::dropdowns::activation_types_aimbot ); - activation_dropdown->add_item( std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.key ) )->set_cond( - [ ]( ) { return g_settings.legit.activation_type == 1; } ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.legit.friendlies ) ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "aim assist" ), &g_settings.legit.assist ) ); - - main_form->add_item( activation_dropdown ); - } - - auto smooth_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "smoothing" ) ); { - smooth_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dynamic smoothing" ), &g_settings.legit.dynamic_smoothing ) ); - smooth_form->add_item( std::make_shared< ui::c_slider< size_t > >( 0, 0, 120, 2, 28, xors( "sample size" ), &g_settings.legit.sample_size ) ); - smooth_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.1f, 2.0f, xors( "multiplier" ), &g_settings.legit.smooth_factor ) ); - } - - auto backtracking_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "backtracking" ) ); { - backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.backtracking ) ); - backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "target" ), &g_settings.legit.backtracking_target ) ); - auto visualize_checkbox = backtracking_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "visualize" ), &g_settings.legit.backtracking_visualize ) ); - visualize_checkbox->add_item( std::make_shared< ui::c_color_picker >( 175, 2, 15, &g_settings.legit.backtracking_col ) ); - visualize_checkbox->set_cond( [ ] { return !g_settings.misc.hide_from_obs( ); } ); - - backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 50.f, xors( "max fov" ), &g_settings.legit.backtracking_fov ) ); - backtracking_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "max time" ), &g_settings.legit.backtracking_time, "s" ) ); - } - - auto triggerbot_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "triggerbot" ) ); { - triggerbot_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.legit.triggerbot ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.legit.trigger_key ) ); - - triggerbot_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 0.2f, xors( "trigger delay" ), &g_settings.legit.trigger_delay, "s" ) - )->set_cond( [ ] { return g_settings.legit.triggerbot( ); } ); - } - - left_column->add_item( main_form ); - left_column->add_item( smooth_form ); - - right_column->add_item( backtracking_form ); - right_column->add_item( triggerbot_form ); - - subtab_main->add_item( left_column ); - subtab_main->add_item( right_column ); - } - - //make a subtab for each weapon type? - auto subtab_weapons = std::make_shared< ui::c_tab_sheet >( xors( "weapons" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto general_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "general" ) ); { - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.primary.m_fov ) ); - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.primary.m_speed ) ); - general_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bone - dropdown" ), &g_settings.legit.primary.m_bone, &ui::dropdowns::aimbot_bone ) ); - general_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.primary.m_assist_strength ) ); - } - - auto snipers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "snipers" ) ); { - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.melee.m_fov ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.melee.m_speed ) ); - snipers_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bone - dropdown" ), &g_settings.legit.melee.m_bone, &ui::dropdowns::aimbot_bone ) ); - snipers_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.melee.m_assist_strength ) ); - } - - auto rifles_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "rifles" ) ); { - rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 40.f, xors( "fov" ), &g_settings.legit.secondary.m_fov ) ); - rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 50.f, xors( "speed" ), &g_settings.legit.secondary.m_speed ) ); - rifles_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bone - dropdown" ), &g_settings.legit.secondary.m_bone, &ui::dropdowns::aimbot_bone ) ); - rifles_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 140, 0.f, 1.f, xors( "assist strength" ), &g_settings.legit.secondary.m_assist_strength ) ); - } - - - - left_column->add_item( general_form ); - left_column->add_item( snipers_form ); - right_column->add_item( rifles_form ); - - subtab_weapons->add_item( left_column ); - subtab_weapons->add_item( right_column ); - } - - subtab_sheet->add_item( subtab_weapons ); - subtab_sheet->add_item( subtab_main ); - - tab_legit->add_item( subtab_sheet ); - } - - - auto tab_rage = std::make_shared< ui::c_tab_sheet >( xors( "rage" ), &icons::sprite_rage ); { - - - - } - - - auto tab_visuals = std::make_shared< ui::c_tab_sheet >( xors( "visuals" ), &icons::sprite_visuals ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_players = std::make_shared< ui::c_tab_sheet >( xors( "players" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "main" ) ); { - main_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "activation type" ), &g_settings.visuals.activation_type, &dropdowns::activation_type_visuals ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.visuals.key ) )->set_cond( [ ]( ) { return g_settings.visuals.activation_type > 1; } ); - main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.friendlies ) ); - } - - auto player_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "players" ) ); { - auto box_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "box" ), &g_settings.visuals.box ) ); - box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 4, 15, &g_settings.visuals.box_enemy( ) ) ); - box_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -9, 15, &g_settings.visuals.box_friendly( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.friendlies; } ); - - auto glow_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "glow - test" ), &g_settings.visuals.glow ) ); - glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.glow_enemy ) ); - glow_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.glow_friendly ) )->set_cond( - [ ]( ) { return g_settings.visuals.friendlies || g_settings.visuals.chams.friendlies; } ); - glow_checkbox->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); - - auto skeleton_checkbox = player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "skeleton" ), &g_settings.visuals.skeleton ) ); - skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 160, 2, 15, &g_settings.visuals.skeleton_enemy ) ); - skeleton_checkbox->add_item( std::make_shared< ui::c_color_picker >( 180, -11, 15, &g_settings.visuals.skeleton_friendly ) )->set_cond( - [ ]( ) { return g_settings.visuals.friendlies; } ); - - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant" ), &g_settings.visuals.dormant ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "health" ), &g_settings.visuals.health ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "name" ), &g_settings.visuals.name ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "weapon" ), &g_settings.visuals.weapon ) ); - - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "ammo" ), &g_settings.visuals.ammo ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "conditions - close" ), &g_settings.visuals.conditions ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "class" ), &g_settings.visuals.player_class ) ); - //player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "resolver indicator - when i add hvh" ), &g_settings.visuals.resolver_indicator ) ); - player_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "sound" ), &g_settings.visuals.sound ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs; } ); - player_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 220, 500, &g_settings.visuals.sound_range ) )->set_cond( [ ]( ) { return g_settings.visuals.sound && !g_settings.misc.hide_from_obs; } ); - } - - auto hud_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "hud" ) ); { - hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "out of pov - weird angles" ), &g_settings.visuals.out_of_pov ) ); - hud_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.25f, 1.f, &g_settings.visuals.out_of_pov_radius ) - )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); - - hud_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 15, 40, &g_settings.visuals.out_of_pov_size, xors( "px" ) ) - )->set_cond( [ ]( ) { return g_settings.visuals.out_of_pov( ); } ); - //hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hitmarkers - not done" ), &g_settings.visuals.hitmarkers ) ); no need - hud_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "spectator list" ), &g_settings.visuals.spec_list ) ); - } - - auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ) ); { - //other_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "bullet tracers - not done" ), &g_settings.visuals.bullet_tracers, &dropdowns::tracer_type ) ); no bullet_impact event or any equivalent - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "floating ragdolls - hopefully" ), &g_settings.visuals.floating_ragdolls ) ); - } - - auto chams_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "chams - crash" ), 170 ); { - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.visuals.chams.enabled( ) ) ); - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "through walls" ), &g_settings.visuals.chams.ignore_z( ) ) ); - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "friendlies" ), &g_settings.visuals.chams.friendlies( ) ) ); - chams_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "flat" ), &g_settings.visuals.chams.flat( ) ) )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); - chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "reflectivity" ), &g_settings.visuals.chams.reflectivity ) - )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat && !g_settings.misc.hide_from_obs; } ); - - chams_form->add_item( std::make_shared< ui::c_slider< float > >( 0, 0, 120, 0.f, 1.f, xors( "shine" ), &g_settings.visuals.chams.shine ) - )->set_cond( [ ]( ) { return !g_settings.visuals.chams.flat && !g_settings.misc.hide_from_obs; } ); - - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies visible" ), &g_settings.visuals.chams.color_visible_friendly( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.chams.friendlies( ); } ); - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "friendlies hidden" ), &g_settings.visuals.chams.color_hidden_friendly( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.chams.friendlies( ) && g_settings.visuals.chams.ignore_z( ); } ); - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies visible" ), &g_settings.visuals.chams.color_visible_enemy( ) ) ); - chams_form->add_item( std::make_shared< ui::c_color_picker >( 0, 0, 120, xors( "enemies hidden" ), &g_settings.visuals.chams.color_hidden_enemy( ) ) )->set_cond( - [ ]( ) { return g_settings.visuals.chams.ignore_z( ); } ); - } - - chams_form->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); - - left_column->add_item( main_form ); - left_column->add_item( player_form ); - - right_column->add_item( hud_form ); - right_column->add_item( other_form ); - right_column->add_item( chams_form ); - - subtab_players->add_item( left_column ); - subtab_players->add_item( right_column ); - } - - auto subtab_other = std::make_shared< ui::c_tab_sheet >( xors( "other" ) ); { - auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); - auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - - auto world_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "world" ) ); { - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "world modulate - not done" ), &g_settings.visuals.world_modulate ) - )->set_cond( [ ]( ) { return !g_settings.misc.hide_from_obs( ); } ); - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "night mode - not done" ), &g_settings.visuals.night_mode ) - )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent props - maybe" ), &g_settings.visuals.transparent_props ) //maybe? - )->set_cond( [ ]( ) { return g_settings.visuals.world_modulate && !g_settings.misc.hide_from_obs( ); } ); - - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fullbright - not done" ), &g_settings.visuals.fullbright ) ); - world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "projectiles" ), &g_settings.visuals.projectile_esp, &dropdowns::world_esp_type ) - )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.building_esp_clr( ) ) ); - - world_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 120, xors( "buildings" ), &g_settings.visuals.building_esp, &dropdowns::world_esp_type ) - )->add_item( std::make_shared< ui::c_color_picker >( 180, 4, 15, &g_settings.visuals.building_esp_clr( ) ) ); - - world_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "building owner - not done" ), &g_settings.visuals.building_owner ) - )->set_cond( [ ]( ) { return g_settings.visuals.building_esp == 1 || g_settings.visuals.building_esp == 3; } ); - } - - //auto local_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "local player" ) ); { - // local_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "projectile prediction - hopefully" ), &g_settings.visuals.grenade_prediction( ) ) ); - //} - - auto view_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "view" ) ); { - view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "watermark" ), &g_settings.misc.watermark ) ); - view_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "thirdperson - crash" ), &g_settings.misc.thirdperson( ) ) )->add_item( - std::make_shared< ui::c_key_picker_small >( 195, 0, &g_settings.misc.thirdperson_key ) - ); - view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 0, 40, xors( "viewmodel fov" ), &g_settings.misc.viewmodel_fov( ) ) ); - view_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 120, 90, 130, xors( "view fov - broken" ), &g_settings.misc.fov_changer( ) ) ); - } - - auto removals_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "removals" ) ); { - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no scope - not done" ), &g_settings.misc.no_scope ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "transparent viewmodel - hopefully" ), &g_settings.misc.transparent_vm ) ); - removals_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "no post processing - not done" ), &g_settings.misc.disable_post_process ) ); - } - - left_column->add_item( world_form ); - //left_column->add_item( local_form ); - - right_column->add_item( view_form ); - right_column->add_item( removals_form ); - - subtab_other->add_item( left_column ); - subtab_other->add_item( right_column ); - } - - subtab_sheet->add_item( subtab_other ); - subtab_sheet->add_item( subtab_players ); - - tab_visuals->add_item( subtab_sheet ); - } - - - auto tab_misc = std::make_shared< ui::c_tab_sheet >( xors( "miscellaneous" ), &icons::sprite_misc ); { - auto subtab_sheet = std::make_shared< ui::c_subtab_manager >( ); - - auto subtab_general = std::make_shared< ui::c_tab_sheet >( xors( "general" ) ); { - auto column_left = subtab_general->add_item( std::make_shared< ui::base_item >( 0, 0, 0, 0 ) ); - auto column_right = subtab_general->add_item( std::make_shared< ui::base_item >( 220, -5, 0, 0 ) ); - - auto movement_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "movement" ) ); { - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "auto strafe" ), &g_settings.misc.auto_strafe ) ); - movement_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "bhop" ), &g_settings.misc.bunny_hop( ) ) ); - } - - auto identity_form = std::make_shared< ui::c_form >( 0, 1, 215, 0, xors( "timeshift - not done" ) ); { - //enabled (key) - //on attack - //value - } - - - auto helpers_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "helpers - not done" ) ); { - //no push - //auto backstab - // - } - - auto other_form = std::make_shared< ui::c_form >( 0, 0, 215, 0, xors( "other" ) ); { - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "remove gun sounds" ), &g_settings.misc.no_sound ) ); - other_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "hide from obs" ), &g_settings.misc.hide_from_obs ) ); - //other_form->add_item( std::make_shared< ui::c_button >( 0, 0, 120, 20, xors( "unlock hidden cvars" ), [ ]( ) { g_cheat.extra.unlock_hidden_cvars( ); } ) ); - } - - column_left->add_item( movement_form ); - column_right->add_item( identity_form ); - column_right->add_item( helpers_form ); - column_left->add_item( other_form ); - - } - subtab_sheet->add_item( subtab_general ); - - tab_misc->add_item( subtab_sheet ); - } - - - auto tab_config = std::make_shared< ui::c_tab_sheet >( xors( "config" ), &icons::sprite_config ); { - auto cfg_form = std::make_shared< ui::c_form >( 0, 10, 200, 93, xors( "config" ) ); - cfg_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 180, xors( "setting" ), &g_settings.menu.cur_setting, &dropdowns::configs ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 0, 0, 85, 20, xors( "save" ), [ ]( ) { g_settings.save( ); } ) ); - cfg_form->add_item( std::make_shared< ui::c_button >( 95, -25, 85, 20, xors( "load" ), [ ]( ) { g_settings.load( ); } ) ); - //cfg_form->add_item( std::make_shared< ui::c_button >( 0, -25, 85, 20, xors( "to clipboard" ), [ ]( ) { g_settings.copy_to_clipboard( ); } ) ); - //cfg_form->add_item( std::make_shared< ui::c_button >( 95, -50, 85, 20, xors( "from clipboard" ), [ ]( ) { g_settings.load_from_clipboard( ); } ) ); - cfg_form->add_item( std::make_shared< ui::c_checkbox >( 0, -25, xors( "anti-untrusted" ), &g_settings.menu.anti_untrusted ) ); - - tab_config->add_item( cfg_form ); - } - - tab_sheet->add_item( tab_config ); - tab_sheet->add_item( tab_misc ); - tab_sheet->add_item( tab_visuals ); - tab_sheet->add_item( tab_rage ); - tab_sheet->add_item( tab_legit ); - - menu->add_item( tab_sheet ); - - was_setup = true; - } - - render_item( menu.get( ) ); - - //reset the menu if home is pressed for debugging purposes - if( g_input.is_key_pressed( KEYS_END ) ) { - menu.reset( ); - menu = std::make_shared< c_menu >( 10, 10, 580, 470, xors( "golden cheat" ) ); - was_setup = false; - } - - } -} \ No newline at end of file diff --git a/tf2/ui_base_item.h b/tf2/ui_base_item.h deleted file mode 100644 index 68c2198..0000000 --- a/tf2/ui_base_item.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include -#include -#include - -#include "ui_draw.h" - -namespace ui -{ - //the offset between each item - constexpr int ITEM_OFFSET = 5; - - class base_item : public std::enable_shared_from_this< base_item > { - public: - base_item( ) { } - base_item( int x, int y, int w, int h, const char* name = nullptr ) : - m_x( x ), m_y( y ), m_width( w ), m_height( h ) { - if( name ) { - strcpy( m_text, name ); - } - } - - virtual void render( ) { }; - virtual bool is_hovered( ) { return false; } - virtual bool is_form( ) const { return false; } - - virtual void reset( ) { - m_y_offset = 0; - } - - virtual int get_total_height( ) const { - return m_height; - } - - void set_y_offset( int offset ) { - m_y_offset = offset; - } - - int get_y_offset( ) const { - return m_y_offset; - } - - auto add_item( std::shared_ptr< base_item > item ) { - item.get( )->m_parent = shared_from_this( ); - m_items.emplace( m_items.begin( ), item ); - - return item; - } - - auto& get_items( ) { return m_items; } - auto get_parent( ) { return m_parent; } - - virtual int x( ) const { return m_x; } - virtual int y( ) const { return m_y; } - virtual int w( ) const { return m_width; } - virtual int h( ) const { return m_height; } - - void set_x( int x ) { m_x = x; } - void set_y( int y ) { m_y = y; } - - void set_width( int w ) { m_width = w; } - void set_height( int h ) { m_height = h; } - - bool get_visible( ) const { - if( m_cond && !m_cond( ) ) { - return false; - } - - return m_visible; - } - - void set_cond( std::function< bool( ) > func ) { - m_cond = func; - } - - void set_visible( bool vis ) { m_visible = vis; } - void set_text( const char* text ) { - strcpy( m_text, text ); - } - auto get_text( ) const { - return m_text; - } - - std::shared_ptr< base_item > find_item( const char* name ) { - if( !m_items.empty( ) ) { - for( auto& it : m_items ) { - if( it->get_text( ) && !strcmp( it->get_text( ), name ) ) { - return it; - } - - auto it_find = it->find_item( name ); - if( it_find != it ) return it_find; - } - } - - return shared_from_this( ); - } - - auto get_top_parent( ) { - for( auto parent = m_parent; ; - parent = parent->get_parent( ) ) { - if( !parent->get_parent( ) ) { - return parent; - } - } - - return shared_from_this( ); - } - - int get_relative_x( ) { - int x = m_x; - for( auto parent = get_parent( ); !!parent; - parent = parent->get_parent( ) ) { - x += parent->x( ); - } - - return x; - } - - int get_relative_y( ) { - int y = m_y + get_y_offset( ); - for( auto parent = get_parent( ); !!parent; - parent = parent->get_parent( ) ) { - y += parent->y( ) + parent->get_y_offset( ); - } - - return y; - } - - void set_disabled( bool disabled ) { - m_disabled = disabled; - - for( auto& it : m_items ) { - it->set_disabled( disabled ); - } - } - - void set_disabled_callbacks( bool disabled ) { - auto top = get_top_parent( ); - - top->set_disabled( disabled ); - - m_disabled = false; - } - - protected: - int m_x{ }; - int m_y{ }; - - int m_width{ }; - int m_height{ }; - - //current y position for rendering - int m_y_offset{ }; - - bool m_visible = true; - bool m_disabled = false; - char m_text[ 256 ]{ }; - - std::shared_ptr< base_item > m_parent; - std::vector< std::shared_ptr< base_item > > m_items; - std::function< bool( ) > m_cond; - }; -} \ No newline at end of file diff --git a/tf2/ui_button.h b/tf2/ui_button.h deleted file mode 100644 index 022fc67..0000000 --- a/tf2/ui_button.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include - -#include "ui_base_item.h" - -namespace ui -{ - class c_button : public base_item { - public: - c_button( int x, int y, int w, int h, const char* name, std::function< void( ) > fn ) : - base_item( x, y, w, h, name ), m_fn( fn ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ); - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y - 1, m_width + 1, m_height + 1, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - ui_draw_rect( x, y, m_width, m_height, ui_get_bg_col( ) ); - if ( !m_mouse_held ) { - m_fn( ); - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - - ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), m_text ); - } - - protected: - std::function< void( ) > m_fn; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/tf2/ui_checkbox.h b/tf2/ui_checkbox.h deleted file mode 100644 index 50cad1c..0000000 --- a/tf2/ui_checkbox.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_checkbox : public base_item { - public: - c_checkbox( int x, int y, const char* txt, bool* setting ) : - base_item( x, y, 16, 16, txt ), m_setting( setting ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int rel_x = get_relative_x( ); - int rel_y = get_relative_y( ); - - return mouse_x >= rel_x && mouse_x <= rel_x + m_width - && mouse_y >= rel_y && mouse_y <= rel_y + m_height; - } - - inline void render_checkbox( const int& x, const int& y ) { - clr_t col = ui_get_bg_col( ); - if ( is_hovered( ) ) { - col = *m_setting ? ui_get_accent_col( ) * 0.8f : ui_get_bg_col( ) * 1.3f; - } - else if ( *m_setting ) { - col = ui_get_accent_col( ); - } - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_rect( x + 1, y + 1, m_width - 2, m_height - 2, col ); - - //ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); - } - - inline void input( ) { - bool mouse_presesed = g_input.is_key_pressed( KEYS_MOUSE1 ); - - if ( is_hovered( ) && mouse_presesed ) { - if ( !m_mouse_held ) { - *m_setting = !*m_setting; - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - render_checkbox( x, y ); - input( ); - - - ui_draw_string( x + m_width + 6, y + 2, false, ui_get_text_col( ), m_text ); - } - - protected: - bool* m_setting; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/tf2/ui_color_picker.h b/tf2/ui_color_picker.h deleted file mode 100644 index 2711d29..0000000 --- a/tf2/ui_color_picker.h +++ /dev/null @@ -1,201 +0,0 @@ -#pragma once - -#include "ui_base_item.h" -#include "d3d.hpp" - -namespace ui -{ - class c_color_picker : public base_item { - static constexpr int BOX_WIDTH = 106; - static constexpr int BOX_HEIGHT = 125; - public: - c_color_picker( int x, int y, int w, const char* name, clr_t* setting ) : - base_item( x, y, w, 4, name ), m_setting( setting ), - m_has_text( true ) { } - - c_color_picker( int x, int y, int w, clr_t* setting ) : - base_item( x, y, w, 8, xors( "COLOR_PICKER" ) ), m_setting( setting ), - m_has_text( false ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ); - - int cursor_x, cursor_y; - ui_get_cursor_pos( cursor_x, cursor_y ); - - if ( m_has_text ) y += 12; - - if ( !m_active ) { - return cursor_x >= x && cursor_x <= x + m_width - && cursor_y >= y && cursor_y <= y + m_height; - } - - return cursor_x >= x && cursor_x <= x + BOX_WIDTH + 23 - && cursor_y >= y && cursor_y <= y + BOX_HEIGHT + 2; - } - - virtual int get_total_height( ) const override { - return m_has_text ? ( m_height + 12 ) : m_height; - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_active ) { - m_mouse_held = true; - } - - m_active = true; - } - else if ( m_active && !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_active = false; - } - else { - m_mouse_held = false; - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - - m_hue = m_setting->hue( ); - if ( m_hue > 1.0f ) { - m_hue -= 359.f; - } - - m_saturation = m_setting->saturation( ); - m_brightness = m_setting->brightness( ) / 255.f; - m_alpha = m_setting->a( ); - } - - void output( ) { - *m_setting = clr_t::from_hsb( m_hue, m_saturation, m_brightness ); - m_setting->a( ) = m_alpha; - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - if ( m_has_text ) { - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - y += 12; - } - - input( ); - - if ( m_active ) { - RECT old_rect; - g_d3d.get_device( )->GetScissorRect( &old_rect ); - - RECT new_rect{ - x - 1, y - 1, - x + BOX_WIDTH + 22, - y + BOX_HEIGHT + 2 - }; - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - clr_t bg_col( 0, 0, 0, 90 ); - ui_draw_rect( x, y, BOX_WIDTH + 20, BOX_HEIGHT, bg_col ); - ui_draw_outlined_rect( x - 1, y - 1, BOX_WIDTH + 22, BOX_HEIGHT + 2, ui_get_accent_col( ) ); - - for ( int i{ }; i < 100; i += 3 ) { - for ( int i2{ }; i2 < 100; i2 += 3 ) { - ui_draw_rect( x + i + 1, y + i2 + 1, 3, 3, - clr_t::from_hsb( m_hue, float( i2 ) * 0.01f, float( i ) * 0.01f ) ); - } - } - - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && !m_mouse_held - && mouse_x > x && mouse_x <= x + 100 - && mouse_y > y && mouse_y <= y + 100 ) { - - int mouse_x_c = std::clamp( mouse_x, x, x + 100 ); - int mouse_y_c = std::clamp( mouse_y, y, y + 100 ); - - int delta_y = std::clamp( mouse_y_c - y, 0, 100 ); - int delta_x = std::clamp( mouse_x_c - x, 0, 100 ); - - m_saturation = float( delta_y ) * 0.01f; - m_brightness = float( delta_x ) * 0.01f; - } - - auto is_hue_slider_hovered = [&]( ) -> bool { - return mouse_x > x + 110 && mouse_x < x + 122 - && mouse_y > y && mouse_y < y + 100; - }; - - auto draw_slider_hue = [&]( ) { - for ( int i{ }; i < 100; ++i ) { - auto cur_col = clr_t::from_hsb( float( i ) * 0.01f, m_saturation, m_brightness ); - - ui_draw_rect( x + 110, y + i + 1, 12, 2, cur_col ); - } - - ui_draw_outlined_rect( x + 109, y + int( m_hue * 100.f ) + 1, 14, 3, - is_hue_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); - }; - - auto is_alpha_slider_hovered = [&]( ) -> bool { - return mouse_x > x + 1 && mouse_x < x + 122 - && mouse_y > y + 110 && mouse_y < y + 124; - }; - - auto draw_slider_alpha = [&]( ) { - for ( int i{ 121 }; i >= 0; --i ) { - auto col = *m_setting; - col.a( ) = ( int )( float( i ) * 255.f / 121.f ); - - ui_draw_rect( x + i + 1, y + 110, 1, 12, col ); - } - - int a_pos = ( int )( float( m_alpha ) * 121.f / 255.f ); - ui_draw_outlined_rect( x + 1 + a_pos, y + 109, 3, 14, - is_alpha_slider_hovered( ) ? ui_get_text_col( ) : ui_get_disabled_col( ) ); - }; - - draw_slider_hue( ); - if ( is_hue_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - int delta = std::clamp( mouse_y - y, 0, 100 ); - m_hue = float( delta ) * 0.01f; - } - - draw_slider_alpha( ); - if ( is_alpha_slider_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - int delta = std::clamp( mouse_x - x, 0, 121 ); - m_alpha = ( int )( float( delta ) * 255.f / 121.f ); - } - - output( ); - - g_d3d.get_device( )->SetScissorRect( &old_rect ); - } - else { - if ( is_hovered( ) ) { - ui_draw_rect( x - 1, y - 1, m_width + 2, m_height + 2, ui_get_text_col( ) ); - } - ui_draw_rect( x, y, m_width, m_height, *m_setting ); - } - } - - protected: - clr_t* m_setting = nullptr; - bool m_active = false; - bool m_mouse_held = false; - float m_saturation = 1.0f; - float m_brightness = 1.0f; - float m_hue = 0.f; - uint8_t m_alpha = 255; - bool m_has_text = false; - }; -} \ No newline at end of file diff --git a/tf2/ui_draw.h b/tf2/ui_draw.h deleted file mode 100644 index 4686bf0..0000000 --- a/tf2/ui_draw.h +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once -#include "color.hpp" -#include "d3d.hpp" -#include "icons.hpp" -#include "d3d_sprite.hpp" -#include "input_system.hpp" - -namespace ui -{ - extern float get_tf2_frametime( ); - /*__forceinline auto ui_get_background_texture( ) { - static auto buffer = std::make_shared< byte[ 512 ] >( ); - static auto color = D3DCOLOR_RGBA( 27, 27, 27, 233 ); - static auto color_bright = D3DCOLOR_RGBA( 31, 31, 31, 255 ); - static IDirect3DTexture9* texture; - - if ( !texture ) { - for ( int i = 0; i < 512; i += 4 ) { - *( ulong_t* )( uintptr_t( buffer.get( ) ) + i ) = !( i % 12 ) ? color : color_bright; - } - - D3DXCreateTextureFromFileInMemory( g_d3d.get_device( ), buffer.get( ), 512, &texture ); - } - - return texture; - }*/ - - static float anim_time{ }; - - __forceinline void set_animtime( float animtime ) { - anim_time = animtime; - } - - __forceinline void setup_sprites( IDirect3DDevice9* device ) { - //fuck msvc - icons::sprite_legit.init( device, icons::legit_icon, icons::legit_size, 66, 66 ); - icons::sprite_rage.init( device, icons::rage_icon, icons::rage_size, 66, 66 ); - icons::sprite_visuals.init( device, icons::raw::visuals_raw, icons::visuals_size, 66, 66 ); - icons::sprite_misc.init( device, icons::misc_icon, icons::misc_size, 66, 66 ); - icons::sprite_config.init( device, icons::config_icon, icons::config_size, 66, 66 ); - } - - __forceinline clr_t ui_get_accent_col( ) { - clr_t col_start = { - g_settings.menu.menu_color_1r, - g_settings.menu.menu_color_1g, - g_settings.menu.menu_color_1b - }; - - clr_t col_end = { - g_settings.menu.menu_color_2r, - g_settings.menu.menu_color_2g, - g_settings.menu.menu_color_2b - }; - - clr_t col = clr_t::blend( col_start, col_end, anim_time ); - - return col; - } - - __forceinline clr_t& ui_get_disabled_col( ) { - static clr_t col = clr_t( 61, 61, 61, 255 ); - return col; - } - - __forceinline clr_t& ui_get_bg_col( ) { - static clr_t col = clr_t( 24, 25, 27, 255 ); - return col; - } - - __forceinline clr_t& ui_get_text_col( ) { - static clr_t col = clr_t( 221, 221, 221, 255 ); - return col; - } - - __forceinline void ui_draw_gradient( int x, int y, int w, int h, clr_t start, - clr_t end, GradientType_t type = GRADIENT_HORIZONTAL ) { - - g_d3d.draw_gradient( start, end, x, y, w, h, type ); - } - - __forceinline void ui_draw_line( int x, int y, int x1, int y1, clr_t color ) { - g_d3d.draw_line( color, x, y, x1, y1 ); - } - - __forceinline void ui_draw_rect( int x, int y, int w, int h, clr_t color ) { - g_d3d.draw_filled_rect( color, x, y, w, h ); - } - - __forceinline void ui_draw_outlined_rect( int x, int y, int w, int h, clr_t color ) { - g_d3d.draw_rect( color, x, y, w, h ); - } - - __forceinline void ui_draw_circle( int x, int y, int r, clr_t color, int res = 48 ) { - g_d3d.draw_circle( color, x, y, r, res ); - } - - __forceinline void ui_draw_filled_circle( int x, int y, int r, clr_t color, int res = 48 ) { - g_d3d.draw_filled_circle( color, x, y, r, res ); - } - - __forceinline void ui_draw_string( int x, int y, bool center, clr_t color, const char* str, ... ) { - char buf[ 2048 ]{ }; - va_list list{ }; - - __crt_va_start( list, str ); - vsprintf_s( buf, 2048, str, list ); - __crt_va_end( list ); - - g_d3d.draw_text( d3d::fonts.f_menu, color, x, y, - center ? ALIGN_CENTER : ALIGN_LEFT, D3DFONTFLAG_DROPSHADOW, buf ); - } - - __forceinline void ui_get_text_size( int& w, int& h, const char* text, ... ) { - char* buf = ( char* )_alloca( 2048 ); - va_list list{ }; - - __crt_va_start( list, text ); - vsprintf_s( buf, 2048, text, list ); - __crt_va_end( list ); - - w = g_d3d.get_text_width( d3d::fonts.f_menu, 0, buf ); - h = g_d3d.get_text_height( d3d::fonts.f_menu, 0, buf ); - } - - __forceinline void ui_get_cursor_pos( int& x, int& y ) { - g_input.get_cursor_pos( x, y ); - } - - __forceinline float ui_get_frametime( ) { - return get_tf2_frametime( ); - } - - __forceinline void ui_draw_cursor( ) { - const clr_t black( 0, 0, 0, 255 ), accent( ui_get_accent_col( ) ); - int x, y; - ui_get_cursor_pos( x, y ); - - - for( int i{ }; i <= 9; ++i ) { - ui_draw_line( x, y, x + i, y + 11, accent ); - } - - for( int i{ }; i <= 7; ++i ) { - ui_draw_line( x, y + 9 + i, x + i, y + 9, accent ); - } - - for( int i{ }; i <= 3; ++i ) { - ui_draw_line( x + 6 + i, y + 11, x, y + i, accent ); - } - - ui_draw_line( x + 5, y + 11, x + 8, y + 18, accent ); - ui_draw_line( x + 4, y + 11, x + 7, y + 18, accent ); - - ui_draw_line( x, y, x, y + 17, black ); - ui_draw_line( x, y + 17, x + 3, y + 14, black ); - ui_draw_line( x + 4, y + 14, x + 7, y + 19, black ); - ui_draw_line( x + 7, y + 18, x + 9, y + 18, black ); - ui_draw_line( x + 10, y + 18, x + 7, y + 12, black ); - ui_draw_line( x + 7, y + 12, x + 11, y + 12, black ); - ui_draw_line( x + 11, y + 12, x, y, black ); - } -} \ No newline at end of file diff --git a/tf2/ui_dropdown.h b/tf2/ui_dropdown.h deleted file mode 100644 index 0c4e990..0000000 --- a/tf2/ui_dropdown.h +++ /dev/null @@ -1,217 +0,0 @@ -#pragma once -#include "ui_dropdown_item.h" - -namespace ui -{ - template < typename t = int > - class c_dropdown : public base_item { - public: - c_dropdown( int x, int y, int w, const char* name, t* setting, - std::vector< dropdowns::dropdown_item_t< t > >* items, size_t max_items = 8 ) : - base_item( x, y, w, 16, name ), m_dropdown_items( items ), m_setting( setting ), - m_max_items( max_items ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - inline bool is_any_item_hovered( ) { - if ( m_disabled || !m_active ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + m_height + 12; - int h = m_height * ( std::min< size_t >( - m_dropdown_items->size( ), m_max_items ) ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - virtual int get_total_height( ) const override { - return m_height + 13; - } - - void draw_box( const int& x, const int& y, const char* str, bool hovered = false ) { - ui_draw_rect( x, y, m_width, m_height, hovered ? ui_get_disabled_col( ) : ui_get_bg_col( ) ); - ui_draw_line( x, y + m_height, x + m_width, y + m_height, ui_get_accent_col( ) ); - - ui_draw_string( x + m_width / 2, y + 2, true, ui_get_text_col( ), str ); - } - - void update_value( ) { - for ( auto& it : *m_dropdown_items ) { - if ( it.m_value == *m_setting ) { - m_selected_item = ⁢ - } - } - } - - void draw_items( const int& x, const int& y ) { - auto& items = *m_dropdown_items; - auto it = &items.front( ); - int offset = m_height + 1; - int hovered = 0; - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - auto is_hovered = [ & ] ( int y_offset ) { - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y + y_offset && mouse_y <= y + y_offset + m_height; - }; - - - for ( size_t i = items.size( ) > m_max_items ? m_curr_scroll : 0; - i < std::min< size_t >( m_dropdown_items->size( ), m_max_items + m_curr_scroll ); - ++i, offset += m_height + 1 - ) { - it = &items.at( i ); - - draw_box( x, y + offset, it->m_name ); - - if ( is_hovered( offset ) ) { - hovered = offset; - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - m_selected_item = it; - *m_setting = it->m_value; - m_active = false; - m_enable_time = GetTickCount( ) * 0.001f + 0.220f; - m_enable_next_frame = true; - } - } - } - - if ( hovered ) { - ui_draw_outlined_rect( x - 1, y - 1 + hovered, - m_width + 1, m_height + 1, ui_get_text_col( ) ); - } - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = !m_active; - } - m_mouse_held = true; - } - else if ( !is_any_item_hovered( ) ) { - m_mouse_held = false; - } - - if ( !is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) && !is_any_item_hovered( ) ) { - m_active = false; - } - - if ( GetTickCount( ) * 0.001f > m_enable_time && m_enable_next_frame ) { - set_disabled_callbacks( false ); - m_enable_next_frame = false; - } - - - active_changed = m_active != active_backup; - //disable input on all items - if ( active_changed ) { - if ( !m_active ) { - m_enable_time = GetTickCount( ) * 0.001f + 0.220f; - m_enable_next_frame = true; - } - else { - set_disabled_callbacks( true ); - } - } - - if ( m_selected_item ) { - *m_setting = m_selected_item->m_value; - } - - if ( m_active && m_dropdown_items->size( ) > m_max_items ) { - int scroll_input = g_input.get_scroll_state( ); - - if ( m_curr_scroll > 0 || scroll_input < 0 ) //we dont want scroll to loop around from 0 to max - m_curr_scroll -= scroll_input; //because positive is scroll up, we gotta flip it - - if ( m_curr_scroll > m_dropdown_items->size( ) - m_max_items ) - m_curr_scroll = m_dropdown_items->size( ) - m_max_items; - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - bool restore = false; - RECT prev_rect{ }; - - if ( m_active ) { - restore = true; - g_d3d.get_device( )->GetScissorRect( &prev_rect ); - - RECT new_rect{ - prev_rect.left, - prev_rect.top, - g_d3d.m_width, - g_d3d.m_height, - }; - - g_d3d.get_device( )->SetScissorRect( &new_rect ); - - draw_items( x, y + 11 ); - - - //draw scrollbar - size_t total_items = m_dropdown_items->size( ); - if ( total_items > m_max_items ) { - const size_t height = ( m_height + 1 ) * m_max_items; - const float slider_step = ( float )( height ) / float( total_items - m_max_items + 1 ); - - size_t slider_pos = static_cast< size_t >( slider_step * m_curr_scroll ); - ui_draw_rect( x + m_width - 1, y + slider_pos + m_height + 13, 2, ( int )slider_step, ui_get_accent_col( ) ); - } - } - - update_value( ); - input( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, - is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - if ( m_selected_item ) { - ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), m_selected_item->m_name ); - } - - if( restore ) { - g_d3d.get_device( )->SetScissorRect( &prev_rect ); - } - } - - protected: - std::vector< dropdowns::dropdown_item_t< t > >* m_dropdown_items{ }; - dropdowns::dropdown_item_t< t >* m_selected_item{ }; - bool m_active = false; - bool m_mouse_held = false; - t* m_setting{ }; - size_t m_max_items{ }; - size_t m_curr_scroll{ }; - float m_enable_time{ }; - int m_enable_next_frame{ }; - }; -} \ No newline at end of file diff --git a/tf2/ui_dropdown_item.h b/tf2/ui_dropdown_item.h deleted file mode 100644 index f77a732..0000000 --- a/tf2/ui_dropdown_item.h +++ /dev/null @@ -1,83 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - namespace dropdowns - { - template < typename t = int > - struct dropdown_item_t { - const char* m_name; - t m_value; - }; - - static std::vector< dropdown_item_t< > > activation_types_aimbot = { - { xors( "always" ), 0 }, - { xors( "on key" ), 1 }, - }; - - static std::vector< dropdown_item_t< > > silent_aimbot_types = { - { xors( "none" ), 0 }, - { xors( "client-side" ), 1 }, - { xors( "server-side" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > hitboxes = { - { "head", 0 }, - { "neck", 1 }, - { "pelvis", 3 }, - { "chest", 6 }, - { "thorax", 5 }, - }; - - static std::vector< dropdown_item_t< > > tracer_type = { - { xors( "none" ), 0 }, - { xors( "line" ), 1 }, - { xors( "beam" ), 2 } - }; - - static std::vector< dropdown_item_t< > > world_esp_type = { - { xors( "off" ), 0 }, - { xors( "name" ), 1 }, - { xors( "glow" ), 2 }, - { xors( "both" ), 3 } - }; - - static std::vector< dropdown_item_t< > > weapon_esp_types = { - { xors( "none" ), 0 }, - { xors( "icon" ), 1 }, - { xors( "name" ), 2 }, - }; - - static std::vector< dropdown_item_t< > > activation_type_visuals = { - { xors( "never" ), 0 }, - { xors( "always" ), 1 }, - { xors( "on hold" ), 2 }, - { xors( "toggle" ), 3 }, - }; - - static std::vector< dropdown_item_t< > > aimbot_bone = { - { "head", 0 }, - { "neck", 1 }, - { "pelvis", 3 }, - { "chest", 6 }, - { "thorax", 5 }, - }; - - static std::vector< dropdown_item_t< > > configs = { - { xors( "scout" ), 0 }, - { xors( "soldier" ), 1 }, - { xors( "pyro" ), 2 }, - { xors( "demo" ), 3 }, - { xors( "heavy" ), 4 }, - { xors( "engineer" ), 5 }, - { xors( "medic" ), 6 }, - { xors( "sniper" ), 7 }, - { xors( "spy" ), 8 }, - { xors( "rage 1" ), 9 }, - { xors( "rage 2" ), 10 }, - }; - - } -} \ No newline at end of file diff --git a/tf2/ui_form.h b/tf2/ui_form.h deleted file mode 100644 index 0791528..0000000 --- a/tf2/ui_form.h +++ /dev/null @@ -1,187 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_form : public base_item { - public: - c_form( int x, int y, int w, int h, const char* name, int max_h = 0, bool collapse = false ) : - base_item( x, y, w, h, name ), m_dynamic( !h ), m_max_height( max_h ), m_collapse( collapse ) { }; - - virtual int x( ) const override { - return m_x + 10; - } - - virtual int y( ) const override { - return m_y + m_scroll_offset + 9; - } - - virtual bool is_form( ) const override { - return true; - } - - virtual bool is_hovered( ) override { - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int x = get_relative_x( ); - int y = get_relative_y( ); - - return mouse_x > x && mouse_x < x + w( ) - && mouse_y > y && mouse_y < y + h( ); - } - - bool is_collapse_hovered( ) { - if( !m_collapse ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - int x = get_relative_x( ) + m_width - 8; - int y = get_relative_y( ) + 2; - - return mouse_x >= x && mouse_x <= x + 5 - && mouse_y >= y && mouse_y <= y + 7; - } - - bool is_collapsed( ) { - return ( m_collapse && !m_open ); - } - - inline void update_size( ) { - if ( !m_dynamic ) return; - - int total_height{ ITEM_OFFSET * 2 }; - for ( auto& it : m_items ) { - if ( it->get_visible( ) ) { - auto item_height = it->get_total_height( ) + ITEM_OFFSET; - if( m_max_height && total_height + item_height > m_max_height ) { - total_height = m_max_height; - break; - } - total_height += it->get_total_height( ) + ITEM_OFFSET; - } - } - - m_height = total_height; - } - - virtual int get_total_height( ) const override { - if( !m_open && m_collapse ) return 18; - return m_height + 5; - } - - int get_total_item_height( ) { - int total_height{ ITEM_OFFSET * 2 }; - for( auto& it : m_items ) { - if( it->get_visible( ) ) { - auto item_height = it->get_total_height( ) + ITEM_OFFSET; - total_height += it->get_total_height( ) + ITEM_OFFSET; - } - } - - return total_height; - } - - void input( ) { - if( m_collapse ) { - bool hovered = is_collapse_hovered( ); - bool clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - if( hovered && clicked ) { - if( !m_was_pressed ) { - m_open ^= 1; - } - m_was_pressed = true; - } - else { - m_was_pressed = false; - } - } - - if( m_max_height && get_total_item_height( ) > m_max_height ) { - if( !m_disabled && is_hovered( ) ) { - auto scroll_state = g_input.get_scroll_state( ); - if( !!scroll_state && m_was_hovered ) { - scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; - } - m_scroll_offset = std::clamp( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ), 0 ); - } - } - else { - m_scroll_offset = 0; - } - } - - virtual void render( ) override { - update_size( ); - input( ); - int x = get_relative_x( ); - int y = get_relative_y( ); - - int text_w, text_h; - ui_get_text_size( text_w, text_h, m_text ); - - if( m_collapse ) { - if( !m_open && m_collapse ) { - ui_draw_outlined_rect( x, y, m_width, 14, ui_get_accent_col( ) ); - ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); - ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); - - int button_x = x + m_width - 6; - int button_y = y + 2; - - ui_draw_string( button_x, button_y, true, - is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "+" ); - return; - } - } - - for( int i{ }; i < 8; ++i ) { - clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); - ui_draw_rect( x, y + i, m_width, m_height - i * 2, col ); - } - - ui_draw_outlined_rect( x, y, m_width, m_height, ui_get_accent_col( ) ); - - if( m_max_height && get_total_item_height( ) > m_height ) { - const size_t height = get_total_height( ) - 20; - const float delta = ( float )( get_total_item_height( ) - height + 1 ); - const float slider_step = ( ( float )( height ) / delta ); - const float slider_height = slider_step * 13.f; - - size_t slider_pos = static_cast< size_t >( slider_step * m_scroll_offset ); - ui_draw_rect( x + m_width - 7, y + 8, 4, height, ui_get_disabled_col( ) ); - ui_draw_rect( x + m_width - 7, y - slider_pos + 8, 4, ( int )slider_height + 1, ui_get_accent_col( ) ); - } - - if( is_hovered( ) != m_was_hovered ) { - bool backup = m_disabled; - if( !backup ) { - set_disabled( !is_hovered( ) ); - } - m_disabled = backup; - } - - ui_draw_line( x + 3, y, x + text_w + 1, y, ui_get_bg_col( ) ); - ui_draw_string( x + 3, y - 7, false, ui_get_text_col( ), m_text ); - if( m_collapse ) { - int button_x = x + m_width - 6; - int button_y = y + 2; - - ui_draw_string( button_x, button_y, true, - is_collapse_hovered( ) ? ui_get_accent_col( ) : ui_get_text_col( ), "-" ); - } - - m_was_hovered = is_hovered( ); - } - - protected: - bool m_dynamic{ }; - bool m_was_hovered{ }; - int m_max_height{ }; - int m_scroll_offset{ }; - bool m_was_pressed{ }; - bool m_collapse{ }; - bool m_open{ true }; - }; -} \ No newline at end of file diff --git a/tf2/ui_key_picker.h b/tf2/ui_key_picker.h deleted file mode 100644 index 03aed84..0000000 --- a/tf2/ui_key_picker.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_key_picker : public base_item { - public: - c_key_picker( int x, int y, int w, const char* name, int* setting ) : - base_item( x, y, w, 16, name ), m_setting( setting ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + 12; - int h = m_height; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - - return mouse_x >= x && mouse_x <= x + m_width - && mouse_y >= y && mouse_y <= y + h; - } - - virtual int get_total_height( ) const override { - return m_height + 12; - } - - void input( ) { - bool active_backup = m_active; - bool active_changed = false; - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = true; - } - m_mouse_held = true; - } - - if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { - m_active = false; - *m_setting = KEYS_NONE; - } - - if ( m_active && !m_mouse_held ) { - int key = g_input.is_any_key_pressed( ); - if ( key != KEYS_NONE ) { - *m_setting = key; - m_active = false; - } - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - input( ); - - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_draw_rect( x, y + 13, m_width, m_height, ui_get_disabled_col( ) ); - ui_draw_outlined_rect( x - 1, y + 12, m_width + 1, m_height + 1, - is_hovered( ) || m_active ? ui_get_text_col( ) : ui_get_accent_col( ) ); - - ui_draw_string( x + m_width / 2, y + 14, true, ui_get_text_col( ), - g_input.get_key_name( ( VirtualKeys_t )*m_setting ) ); - } - - protected: - int* m_setting{ }; - bool m_active{ }; - bool m_mouse_held{ }; - }; - - //skEeT PiCkErS - class c_key_picker_small : public base_item { - public: - c_key_picker_small( int x, int y, int* setting ) : - base_item( x, y, 0, 0, xors( "KEY_PICKER" ) ), m_setting( setting ) { } - - virtual int get_total_height( ) const override { - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int w, h; - ui_get_text_size( w, h, name ); - - return h; - } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int x = get_relative_x( ); - int y = get_relative_y( ); - int mouse_x, mouse_y; - int w, h; - - ui_get_text_size( w, h, "[%s]", name ); - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= x - w && mouse_x <= x - && mouse_y >= y && mouse_y <= y + h; - } - - void input( ) { - - bool active_backup = m_active; - bool active_changed = false; - - if ( g_input.is_key_pressed( KEYS_ESCAPE ) ) { - m_active = false; - *m_setting = KEYS_NONE; - } - - if ( m_active && !m_mouse_held ) { - int key = g_input.is_any_key_pressed( ); - if ( key != KEYS_NONE ) { - *m_setting = key; - m_active = false; - } - } - - if ( is_hovered( ) && g_input.is_key_pressed( KEYS_MOUSE1 ) ) { - if ( !m_mouse_held ) { - m_active = true; - } - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - - active_changed = active_backup != m_active; - if ( active_changed ) { - set_disabled_callbacks( m_active ); - } - } - - virtual void render( ) override { - const char* name = g_input.get_short_name( ( VirtualKeys_t )*m_setting ); - int x = get_relative_x( ); - int y = get_relative_y( ); - - int w, h; - ui_get_text_size( w, h, "[%s]", name ); - - input( ); - - ui_draw_string( x - w, y, false, is_hovered( ) || m_active ? - ui_get_accent_col( ) : ui_get_text_col( ), "[%s]", name ); - } - - protected: - int* m_setting; - bool m_active{ }; - bool m_mouse_held{ }; - }; -} \ No newline at end of file diff --git a/tf2/ui_label.h b/tf2/ui_label.h deleted file mode 100644 index 9df46b5..0000000 --- a/tf2/ui_label.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_label : public base_item { - public: - c_label( int x, int y, const char* text ) : - base_item( x, y, 0, 16, text ) { } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - - ui_draw_string( x + 2, y + 2, false, ui_get_text_col( ), m_text ); - } - }; -} \ No newline at end of file diff --git a/tf2/ui_menu.h b/tf2/ui_menu.h deleted file mode 100644 index aae68a9..0000000 --- a/tf2/ui_menu.h +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_menu : public base_item { - public: - c_menu( int start_x, int start_y, int width, - int height, const char* name, const char* right_text = nullptr ) : - base_item( start_x, start_y, width, height, name ), - m_right_text( right_text ) { } - - virtual bool is_hovered( ) override { - if( m_disabled ) return false; - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= m_x && mouse_x <= m_x + w( ) - && mouse_y >= m_y && mouse_y <= m_y + 19; - } - - virtual int y( ) const override { - return m_y + 19; - } - - inline void input( ) { - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - - if( is_hovered( ) ) { - m_mouse_held = true; - } - - if( !mouse_clicked ) { - m_mouse_held = is_hovered( ); - } - - if( m_mouse_held && !mouse_clicked ) { - m_drag_offset_y = mouse_y - m_y; - m_drag_offset_x = mouse_x - m_x; - } - - if( m_mouse_held && mouse_clicked ) { - m_x = mouse_x - m_drag_offset_x; - m_y = mouse_y - m_drag_offset_y; - } - } - - virtual void render( ) override { - constexpr auto top_height = 19; - - input( ); - - //draw a c00l shadow - ui_draw_outlined_rect( m_x, m_y + 1, m_width + 1, m_height, clr_t( 0, 0, 0, 166 ) ); - - ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, ui_get_bg_col( ) * 1.2f ); - if( is_hovered( ) ) { - ui_draw_rect( m_x + 1, m_y + 1, m_width - 1, top_height - 2, clr_t( 61, 61, 61 ) ); - } - - for( int i{ }; i < 8; ++i ) { - clr_t col = ui_get_bg_col( ) * ( 0.72f + i * 0.04f ); - ui_draw_rect( m_x, m_y + i + top_height - 1, m_width, m_height - i * 2 - top_height + 1, col ); - } - ui_draw_outlined_rect( m_x, m_y, m_width, m_height, ui_get_accent_col( ) ); - - if( m_right_text ) { - ui_draw_string( m_x + 5, m_y + 4, false, ui_get_text_col( ), m_text ); - - int width, height; - ui_get_text_size( width, height, m_right_text ); - - ui_draw_string( m_x + m_width - 5 - width, m_y + 4, false, ui_get_text_col( ), m_right_text ); - } - else { - ui_draw_string( m_x + m_width / 2, m_y + 4, true, ui_get_text_col( ), m_text ); - } - } - - protected: - int m_drag_offset_x{ }; - int m_drag_offset_y{ }; - bool m_mouse_held{ }; - const char* m_right_text{ }; - }; -} \ No newline at end of file diff --git a/tf2/ui_render.h b/tf2/ui_render.h deleted file mode 100644 index f67f16b..0000000 --- a/tf2/ui_render.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - //recursively render all items - static void render_item( base_item* item, int offset = 0, bool allow_rect = true ) { - if( !item->get_visible( ) ) return; - - item->reset( ); - item->render( ); - bool reset = false; - RECT original; - - if( allow_rect && item->is_form( ) ) { - auto device = g_d3d.get_device( ); - device->GetScissorRect( &original ); - - auto x = item->get_relative_x( ); - auto y = item->get_relative_y( ); - - RECT new_rect{ - x, - y + 4, - x + item->w( ), - y + item->get_total_height( ) - 7 - }; - - device->SetScissorRect( &new_rect ); - reset = true; - } - - bool draw = true; - if( item->is_form( ) ) { - auto form_cast = static_cast< c_form* >( item ); - draw = !form_cast->is_collapsed( ); - } - - if( item->get_items( ).size( ) && draw ) { - //madr0fl - int* height_offset = ( int* )_alloca( sizeof( int ) * item->get_items( ).size( ) ); - int cur_offset = 0; - for( int i = ( int )item->get_items( ).size( ) - 1; i >= 0; --i ) { - auto& cur_item = item->get_items( )[ i ]; - height_offset[ i ] = cur_offset; - cur_offset += cur_item->get_visible( ) ? cur_item->get_total_height( ) + ITEM_OFFSET : 0; - } - - int i{ }; - for( auto& it : item->get_items( ) ) { - item->set_y_offset( height_offset[ i ] ); - render_item( it.get( ), height_offset[ i ], !reset && allow_rect ); - ++i; - } - } - - if( reset ) { - auto device = g_d3d.get_device( ); - device->SetScissorRect( &original ); - } - } -} \ No newline at end of file diff --git a/tf2/ui_slider.h b/tf2/ui_slider.h deleted file mode 100644 index 0e55a73..0000000 --- a/tf2/ui_slider.h +++ /dev/null @@ -1,165 +0,0 @@ -#pragma once - -#include "ui_base_item.h" - -namespace ui -{ - template < typename t > - class c_slider : public base_item { - public: - c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, t full, const char* suffix = 0 ) : - base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( full ), m_has_text( true ) { }; - - c_slider( int x, int y, int w, t min, t max, const char* text, t* setting, const char* suffix = 0 ) : - base_item( x, y, w, 5, text ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( true ) { }; - - c_slider( int x, int y, int w, t min, t max, t* setting, const char* suffix = 0 ) : - base_item( x, y, w, 5, nullptr ), m_setting( setting ), m_suffix( suffix ), - m_min( float( min ) ), m_max( float( max ) ), m_full( max ), m_has_text( false ) { } - - virtual bool is_hovered( ) override { - if ( m_disabled ) return false; - - int x = get_relative_x( ); - int y = get_relative_y( ) + ( m_has_text ? 11 : 2 ); - - int mouse_x, mouse_y; - ui_get_cursor_pos( mouse_x, mouse_y ); - - if( !m_has_text ) { - x += 4; - return mouse_x >= x && mouse_x <= x + m_width - 8 - && mouse_y >= y && mouse_y <= y + m_height + 2; - } - - return mouse_x >= x - 1 && mouse_x <= x + m_width + 1 - && mouse_y >= y && mouse_y <= y + m_height + 2; - } - - void input( ) { - bool mouse_clicked = g_input.is_key_pressed( KEYS_MOUSE1 ); - bool hovered = is_hovered( ); - float progress = 0.f; - int x = get_relative_x( ); - int y = get_relative_y( ) + 2; - int mouse_x, mouse_y; - - *m_setting = ( t )( std::clamp< float >( *m_setting, m_min, m_max ) ); - ui_get_cursor_pos( mouse_x, mouse_y ); - - if ( hovered && mouse_clicked ) { - - float progress{ }; - - if( m_has_text ) { - progress = std::clamp< float >( float( mouse_x - x ) / ( m_width - 3 ), 0.f, 1.0f ); - } - else { - progress = std::clamp< float >( float( mouse_x - x - 4 ) / ( m_width - 10 ), 0.f, 1.0f ); - } - - *m_setting = progress == 1.0f ? m_full : ( t )( ( ( m_max - m_min ) * progress ) + m_min ); - } - - if( !m_has_text ) { - bool y_hover = mouse_y >= y && mouse_y <= y + m_height + 1; - - bool minus_hovered = mouse_x >= x - 1 && mouse_x <= x + 3 && y_hover; - bool plus_hovered = mouse_x >= x + m_width - 2 && mouse_x <= x + m_width + 2 && y_hover; - - if( mouse_clicked ) { - if( !m_mouse_held ) { - if( !std::is_floating_point< t >::value ) { - if( minus_hovered ) *m_setting -= ( t )1; - if( plus_hovered ) *m_setting += ( t )1; - } - else if( m_max - m_min <= 2.0f ) { - if( minus_hovered ) *m_setting -= ( t )0.1f; - if( plus_hovered ) *m_setting += ( t )0.1f; - } - } - - m_mouse_held = true; - } - else { - m_mouse_held = false; - } - } - }; - - void draw_slider( int x, int y ) { - float val = float( *m_setting ); - float progress = ( val - m_min ) / ( m_max - m_min ); - - ui_draw_rect( x, y, m_width, m_height, ui_get_disabled_col( ) ); - - ui_draw_rect( x, y, ( int )( ( m_width - 3 ) * progress ), m_height, ui_get_accent_col( ) ); - ui_draw_rect( x + ( int )( ( m_width - 3 ) * progress ), y, 3, m_height, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); - } - - void draw_slider_small( int x, int y ) { - float val = float( *m_setting ); - float progress = ( val - m_min ) / ( m_max - m_min ); - x -= 1; //i couldnt be fucked - - ui_draw_rect( x + 5, y, m_width - 8, m_height, ui_get_disabled_col( ) ); - - ui_draw_rect( x + 5, y, ( int )( ( m_width - 10 ) * progress ), m_height, ui_get_accent_col( ) ); - ui_draw_rect( x + ( int )( ( m_width - 10 ) * progress ) + 3, y, 3, m_height, - is_hovered( ) ? ui_get_text_col( ) : ui_get_accent_col( ) * 0.7f ); - - ui_draw_string( x, y - 3, false, ui_get_text_col( ), "-" ); - ui_draw_string( x + m_width - 2, y - 3, false, ui_get_text_col( ), "+" ); - - char val_str[ 12 ]; - if( m_suffix ) - sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); - else - sprintf_s( val_str, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); - - ui_draw_string( x + ( int )( ( m_width - 8 ) * progress ) + 3, y + 2, true, ui_get_text_col( ), val_str ); - } - - virtual int get_total_height( ) const override { - return m_height + ( m_has_text ? 12 : 6 ); - } - - virtual void render( ) override { - int x = get_relative_x( ); - int y = get_relative_y( ); - int text_w, text_h; - char val[ 12 ]; - - input( ); - - //weird hacky fix for floating point vars - if ( m_suffix ) - sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d %s" : "%0.2f %s", *m_setting, m_suffix ); - else - sprintf_s( val, 12, t( 0.1f ) == t( 0 ) ? "%d" : "%0.2f", *m_setting ); - - if( m_has_text ) { - ui_draw_string( x + 2, y, false, ui_get_text_col( ), m_text ); - ui_get_text_size( text_w, text_h, val ); - ui_draw_string( x + m_width - text_w - 1, y, false, ui_get_text_col( ), val ); - draw_slider( x, y + 12 ); - } - else { - draw_slider_small( x, y + 2 ); - } - } - - - protected: - t* m_setting; - t m_full; - float m_min; - float m_max; - bool m_has_text = true; - const char* m_suffix; - bool m_mouse_held = false; - }; -} \ No newline at end of file diff --git a/tf2/ui_tab_manager.h b/tf2/ui_tab_manager.h deleted file mode 100644 index 76258c8..0000000 --- a/tf2/ui_tab_manager.h +++ /dev/null @@ -1,227 +0,0 @@ -#pragma once -#include "ui_base_item.h" - - - -namespace ui -{ - namespace { - constexpr int BUTTON_WIDTH = 120; - constexpr int BUTTON_HEIGHT = 80; - - constexpr int SUBTAB_HEIGHT = 25; - } - - class c_tab_sheet : public base_item { - public: - c_tab_sheet( const char* tab_name ) : - base_item( 0, 0, 0, 0, tab_name ), - m_fade_progress( 0 ) { }; - - c_tab_sheet( const char* tab_name, d3d::c_sprite* sprite ) : - base_item( 0, 0, 0, 0, tab_name ), m_sprite( sprite ), - m_fade_progress( 0.f ) { }; - - virtual void render( ) override { }; - virtual bool is_hovered( ) override { - return false; - }; - - public: - float m_fade_progress{ }; - d3d::c_sprite* m_sprite{ }; - }; - - - class c_tab_manager : public base_item { - public: - c_tab_manager( ) : base_item( BUTTON_WIDTH + 11, 0, 0, 0, - xors( "TAB_MANAGER" ) ) { }; - - virtual bool is_hovered( ) override { - return false; - } - - inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { - if ( hovered ) { - constexpr float frequency = 1.f / 0.3f; - const float step = ui_get_frametime( ) * frequency; - - item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); - } - else { - item->m_fade_progress = 0.f; - } - } - - auto get_selected_tab( ) { - return m_selected_tab; - } - - void draw_tab_button( decltype( m_parent )& button, int start, bool hovered ) { - auto item = ( c_tab_sheet* )button.get( ); - auto text = item->get_text( ); - auto parent_x = m_parent->x( ) + 5; - auto parent_y = m_parent->y( ) + 5; - int item_height = BUTTON_HEIGHT; - - scale_button_fade( item, hovered ); - - ui_draw_rect( parent_x, parent_y + start, BUTTON_WIDTH + 1, - item_height + 1, ui_get_bg_col( ) ); - - ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, - parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, - ui_get_disabled_col( ) ); - - if( hovered ) { - ui_draw_line( parent_x + BUTTON_WIDTH - 8, parent_y + start - 1, - parent_x + BUTTON_WIDTH - 8, parent_y + start + BUTTON_HEIGHT + 2, - ui_get_accent_col( ) * ( item->m_fade_progress + 0.2f ) * 0.8f ); - } - - if( item->m_sprite ) { - auto sprite_color = hovered ? ui_get_text_col( ) * ( ( item->m_fade_progress + 0.3f ) * 0.7f ) : ui_get_disabled_col( ); - item->m_sprite->draw( parent_x + ( BUTTON_WIDTH - 8 ) / 2 - 2, - parent_y + BUTTON_HEIGHT / 2 + start, sprite_color ); - } - else { - g_con->log( "sprite is null" ); - } - } - - inline bool is_button_hovered( int start ) { - auto item_x = m_parent->x( ) + 5; - auto item_y = m_parent->y( ) + 5 + start; - int item_height = BUTTON_HEIGHT; - int mouse_x, mouse_y; - - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= item_x && mouse_x <= item_x + BUTTON_WIDTH - 8 - && mouse_y >= item_y && mouse_y <= item_y + item_height; - } - - virtual void render( ) override { - if ( !m_items.empty( ) ) { - int cur_y{ 10 }; - for ( auto& it : m_items ) { - it->set_visible( false ); - bool hovered = is_button_hovered( cur_y ); - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { - //fix items that disable input mess it up when changing tabs - set_disabled_callbacks( false ); - m_selected_tab = it; - } - - draw_tab_button( it, cur_y, hovered || it == m_selected_tab ); - cur_y += BUTTON_HEIGHT + 4; - } - } - - if ( !m_selected_tab ) { - m_selected_tab = m_items.front( ); - } - - m_selected_tab->set_visible( true ); - } - - protected: - decltype( m_parent ) m_selected_tab{ }; - }; - - - class c_subtab_manager : public base_item { - public: - c_subtab_manager( ) : base_item( 0, 35, 0, 5, - xors( "SUBTAB_MANAGER" ) ) { } - - virtual bool is_hovered( ) override { return false; } - - int get_button_width( ) { - int width = get_top_parent( )->w( ) - BUTTON_WIDTH - 26; - - if ( !m_items.empty( ) ) - return ( int )std::ceilf( float( width ) / float( m_items.size( ) ) ); - - return width; - } - - inline void scale_button_fade( c_tab_sheet* item, bool hovered ) { - if ( hovered ) { - constexpr float frequency = 1.f / 0.3f; - const float step = ui_get_frametime( ) * frequency; - - item->m_fade_progress = std::clamp( item->m_fade_progress + step, 0.f, 0.8f ); - } - else { - item->m_fade_progress = 0.f; - } - } - - auto get_selected_tab( ) { - return m_selected_tab; - } - - void render_button( decltype( m_parent )& button, int start, bool hovered ) { - auto item = ( c_tab_sheet* )button.get( ); - auto item_x = get_relative_x( ) + start - 2; - auto item_y = get_relative_y( ) + 3 - m_y; - auto width = get_button_width( ); - - scale_button_fade( item, hovered ); - clr_t tab_clr = ui_get_disabled_col( ); - - //ui_draw_rect( item_x, item_y, get_button_width( ), SUBTAB_HEIGHT, ui_get_bg_col( ) ); - ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, tab_clr ); - if ( hovered ) { - clr_t col = ui_get_accent_col( ); - col.a( ) *= item->m_fade_progress; - ui_draw_rect( item_x + 1, item_y + SUBTAB_HEIGHT - 2, width, 2, col ); - } - - ui_draw_string( item_x + width / 2, item_y + 4, true, ui_get_text_col( ), item->get_text( ) ); - } - - bool is_button_hovered( decltype( m_parent )& button, int start ) { - int item_x = get_relative_x( ) + start - 2; - int item_y = get_relative_y( ) + 3 - m_y - 3; - int item_w = get_button_width( ); - int mouse_x, mouse_y; - - ui_get_cursor_pos( mouse_x, mouse_y ); - - return mouse_x >= item_x && mouse_x <= item_x + item_w && - mouse_y >= item_y && mouse_y <= item_y + SUBTAB_HEIGHT; - } - - virtual void render( ) override { - if ( !m_items.empty( ) ) { - int start = 2; - int width = get_button_width( ); - - for ( auto& it : m_items ) { - it->set_visible( false ); - bool hovered = is_button_hovered( it, start ); - if ( g_input.is_key_pressed( KEYS_MOUSE1 ) && hovered ) { - //fix items that disable input mess it up when changing tabs - set_disabled_callbacks( false ); - m_selected_tab = it; - } - - render_button( it, start, hovered || it == m_selected_tab ); - start += width; - } - - if ( !m_selected_tab ) { - m_selected_tab = m_items.front( ); - } - - m_selected_tab->set_visible( true ); - } - } - - protected: - decltype( m_parent ) m_selected_tab; - }; -} \ No newline at end of file diff --git a/tf2/ui_text_input.h b/tf2/ui_text_input.h deleted file mode 100644 index f486106..0000000 --- a/tf2/ui_text_input.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include "ui_base_item.h" - -namespace ui -{ - class c_text_input : public base_item { - c_text_input( int x, int y, int w, const char* name, size_t max_chars, char* str ) : - base_item( x, y, w, 16, name ), m_length( max_chars ), m_str( str ) { } - - virtual bool is_hovered( ) override { - - } - - void input( ) { - static float last_press[ KEYS_MAX ]{ }; - - int key = g_input.is_any_key_pressed( ); - if ( key == KEYS_BACK ) { - if ( strlen( m_str ) ) { - m_str[ strlen( m_str ) - 1 ] = 0; - } - } - if ( key != KEYS_NONE ) { - float cur_time = GetTickCount( ) * 0.001f; - if ( std::abs( cur_time - last_press[ key ] ) > 0.1f ) { - - auto scan_code = MapVirtualKeyA( key, MAPVK_VK_TO_VSC ); - uword_t ascii; - ToAscii( key, scan_code, 0, &ascii, 0 ); - char str[ 2 ] = { ( char )ascii, 0 }; - strcat_s( m_str, m_length, str ); - - last_press[ key ] = cur_time; - } - } - } - - virtual void render( ) override { - - } - - protected: - size_t m_length{ }; - char* m_str{ }; - - }; -} \ No newline at end of file diff --git a/tf2/util.cpp b/tf2/util.cpp deleted file mode 100644 index 424df71..0000000 --- a/tf2/util.cpp +++ /dev/null @@ -1,223 +0,0 @@ -#include "util.hpp" - -#include "interfaces.h" -#include "CBasePlayer.h" -#include "pattern.hpp" -#include "ctx.hpp" -#include "settings.h" -#include "math.h" -#include "base_cheat.h" - -float TICK_INTERVAL( ) { - return cl.m_globals->interval_per_tick; -} - -int TIME_TO_TICKS( float dt ) { - return static_cast< int >( 0.5f + dt / TICK_INTERVAL( ) ); -} - -float TICKS_TO_TIME( int tick ) { - return tick * TICK_INTERVAL( ); -} - -bool util::is_low_fps( ) { - return cl.m_globals->frametime > cl.m_globals->interval_per_tick; -} - -int util::get_closest_player( ) { - float cur_fov{ 360.f }; - int ret{ -1 }; - vec3_t viewangles{ }; - vec3_t local_pos{ }; - - bool friendlies = g_settings.legit.friendlies; - - local_pos = g_ctx.m_local->get_eye_pos( ); - cl.m_engine( )->GetViewAngles( viewangles ); - - for( int i{ 1 }; i < cl.m_globals->maxclients; ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - - if( !ent ) continue; - if( ent == g_ctx.m_local ) continue; - if( !ent->is_valid( ) ) continue; - int team = ent->get_team( ); - if( team == g_ctx.m_local->get_team( ) && !friendlies ) { - continue; - } - - auto ang = math::vector_angles( local_pos, ent->get_hitbox_position( 0 ) ); - ang.clamp( ); - - float fov = ( viewangles - ang ).clamp( ).length2d( ); - if( fov < cur_fov ) { - ret = i; - cur_fov = fov; - } - } - - return ret; -} - -void util::clip_trace_to_player( IClientEntity* player, vec3_t& src, vec3_t& end, - unsigned mask, CTraceFilter* filter, CGameTrace* tr ) { - CGameTrace player_trace; - Ray_t ray; - float smallest_fraction = tr->fraction; - - ray.Init( src, end ); - - if( !filter->ShouldHitEntity( player, mask ) ) { - return; - } - - cl.m_trace( )->clip_ray_to_ent( ray, mask | CONTENTS_HITBOX, player, &player_trace ); - - if( player_trace.fraction < smallest_fraction ) { - *tr = player_trace; - smallest_fraction = player_trace.fraction; - } -} - - -bool util::trace_ray( vec3_t& start, vec3_t& end, IClientEntity* a, IClientEntity* b ) { - CGameTrace tr; - Ray_t ray; - CTraceFilter filter; - - filter.pSkip = a; - - ray.Init( start, end ); - - cl.m_trace( )->trace_ray( ray, 0x46004003 | CONTENTS_HITBOX, &filter, &tr ); - clip_trace_to_player( b, start, end, ( unsigned )0x46004003, &filter, &tr ); - - return tr.m_pEnt == b || tr.fraction > 0.98f; -} - -void util::set_random_seed( int seed ) { - using fn = int( __cdecl* )( int ); - fn fn_ptr = ( fn )( GetProcAddress( - GetModuleHandleA( xors( "vstdlib.dll" ) ), - xors( "RandomSeed" ) ) ); - - fn_ptr( seed ); -} - -float util::get_random_float( float min, float max ) { - using fn = float( *)( float, float ); - fn fn_ptr = ( fn )( GetProcAddress( - GetModuleHandleA( xors( "vstdlib.dll" ) ), - xors( "RandomFloat" ) ) ); - - return fn_ptr( min, max ); -} - -vec3_t util::get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ) { - set_random_seed( ( seed & 0xff ) + 1 ); - - float rand_a = get_random_float( 0.0f, 1.0f ); - float pi_rand_a = get_random_float( 0.f, 2.f * M_PI ); - float rand_b = get_random_float( 0.f, 1.0f ); - float pi_rand_b = get_random_float( 0.f, 2.f * M_PI ); - - float spread_x = cos( pi_rand_a ) * ( rand_a * inaccuracy ) + cos( pi_rand_b ) * ( rand_b * spread ); - float spread_y = sin( pi_rand_a ) * ( rand_a * inaccuracy ) + sin( pi_rand_b ) * ( rand_b * spread ); - - vec3_t forward, right, up; - math::angle_vectors( angles, &forward, &right, &up ); - - vec3_t spread_dir = forward + ( right * spread_x ) + ( up * spread_y ); - spread_dir.normalize_vector( ); - - return spread_dir; -} - -bool __vectorcall util::intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ) { - auto dist = math::dist_segment_to_segment( eye_pos, end_pos, min, max ); - - return ( dist < radius ); -} - -float util::get_total_latency( ) { - auto nci = cl.m_engine( )->GetNetChannelInfo( ); - - if( nci ) { - float latency = nci->GetLatency( 0 ) + nci->GetLatency( 1 ); - return latency; - } - - return 0.f; -} - -float util::get_lerptime( ) { - static cvar_t* cl_interpolate = cl.m_cvar( )->FindVar( xors( "cl_interpolate" ) ); - static cvar_t* cl_interp = cl.m_cvar( )->FindVar( xors( "cl_interp" ) ); - static cvar_t* cl_updaterate = cl.m_cvar( )->FindVar( xors( "cl_updaterate" ) ); - static cvar_t* cl_interp_ratio = cl.m_cvar( )->FindVar( xors( "cl_interp_ratio" ) ); - - if( cl_interp && cl_interpolate && cl_updaterate && cl_interp_ratio ) { - bool interpolate = cl_interpolate->get_int( ); - if( interpolate ) { - float interp = cl_interp->get_float( ); - float interp_ratio = cl_interp_ratio->get_float( ); - float updaterate = cl_updaterate->get_float( ); - - return std::max< float >( interp, interp_ratio / updaterate ); - } - } - - return 0.f; -} - -bool util::is_tick_valid( int tickcount ) { - float latency = get_total_latency( ); - float correct = std::clamp( latency + get_lerptime( ), 0.f, 1.f ); - float delta = correct - ( g_ctx.pred_time( ) - TICKS_TO_TIME( tickcount ) ); - - - return std::abs( delta ) < 0.2f; -} - -void util::disable_pvs( ) { - for( int i{ 1 }; i < 65; ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - - if( !ent || !ent->is_valid( ) ) - continue; - - if( ent == g_ctx.m_local ) - continue; - - *( int* )( uintptr_t( ent ) + 0xa30 ) = cl.m_globals->framecount; - *( int* )( uintptr_t( ent ) + 0xa28 ) = 0; - } -} - -vec2_t util::screen_transform( vec3_t world ) { - vec3_t tmp; cl.m_overlay( )->ScreenPosition( world, tmp ); - const matrix3x4& w2s_matrix = cl.m_engine( )->GetWorldToScreenMatrix( ); - float w = w2s_matrix[ 3 ][ 3 ]; - for( int i{ }; i < 3; i++ ) { - w += w2s_matrix[ 3 ][ i ] * world[ i ]; - } - if( w < 0.001f ) return{ 10000.f, 10000.f }; - - return{ tmp.x, tmp.y }; -} - -const char* util::object_index_to_name( int index ) { - index = std::clamp( index, 0, 65 ); - - switch( index ) { - case 89: - return xors( "teleporter" ); - case 86: - return xors( "dispenser" ); - case 88: - return xors( "sentry" ); - default: - return xors( "none" ); - } -} - diff --git a/tf2/util.hpp b/tf2/util.hpp deleted file mode 100644 index 7aaa007..0000000 --- a/tf2/util.hpp +++ /dev/null @@ -1,100 +0,0 @@ -#pragma once -#include -#include -#include "strings.hpp" - -#define NAMESPACE_REGION( x ) namespace x { -#define END_REGION } - -extern int TIME_TO_TICKS( float dt ); -extern float TICKS_TO_TIME( int tick ); -extern float TICK_INTERVAL( ); - -//WEE WOO WEE WOO ITS THE DWORD POLICE -using ulong_t = unsigned long; -using uword_t = unsigned short; - -class IClientEntity; -class CTraceFilter; -class CGameTrace; -class vec3_t; -class vec2_t; - -NAMESPACE_REGION( util ) - -template < typename t > -struct reverse_iterable { - reverse_iterable( t&& it ) : - iterable( it ) { } - - t& iterable; - inline auto begin( ) { - return std::rbegin( iterable ); - } - - inline auto end( ) { - return std::rend( iterable ); - } -}; - -template< typename t > -reverse_iterable< t > -reverse_iterator( t&& iter ) { - return reverse_iterable< t >{ iter }; -} - -template < typename fn > __forceinline fn get_vfunc( void* classbase, int index ) { - if( !classbase ) return fn{ }; - return ( fn )( *( uintptr_t** )classbase )[ index ]; -} - -template < size_t index, typename ret, class ... args_ > -__forceinline ret get_vfunc( void* thisptr, args_... args ) { - using fn = ret( __thiscall* )( void*, args_... ); - - auto fn_ptr = ( fn )( *( uintptr_t** )thisptr )[ index ]; - return fn_ptr( thisptr, args... ); -} - -__forceinline std::string unicode_to_ascii( const std::wstring& unicode ) { - std::string ascii_str( unicode.begin( ), unicode.end( ) ); - return ascii_str; -} - -__forceinline std::wstring ascii_to_unicode( const std::string& ascii ) { - std::wstring unicode_str( ascii.begin( ), ascii.end( ) ); - return unicode_str; -} - -template < typename integer > -__forceinline auto to_hex_str( const integer& w, - size_t hex_len = sizeof( integer ) << 1 ) { - constexpr char* hex_digits = xors( "0123456789abcdef" ); - std::string rc( hex_len, 0 ); - - for( size_t i{ }, j{ ( hex_len - 1 ) * 4 }; i < hex_len; ++i, j -= 4 ) - rc[ i ] = hex_digits[ ( w >> j ) & 0x0f ]; - - return rc; -} - -extern void clip_trace_to_player( IClientEntity* player, vec3_t& src, vec3_t& end, - unsigned mask, CTraceFilter* filter, CGameTrace* trace ); - -extern bool trace_ray( vec3_t& start, vec3_t& end, IClientEntity* a, IClientEntity* b ); -extern bool is_low_fps( ); -extern bool is_tick_valid( int tickcount ); -extern void set_random_seed( int seed ); -extern vec3_t get_spread_dir( float inaccuracy, float spread, vec3_t angles, int seed ); -extern float get_random_float( float min, float max ); -extern bool __vectorcall intersects_hitbox( vec3_t eye_pos, vec3_t end_pos, vec3_t min, vec3_t max, float radius ); -extern bool hitchance( int target, const vec3_t& angles, int percentage ); -extern bool hitchance( int target, const vec3_t& angle, int percentage, int hi ); -extern float get_total_latency( ); -extern float get_lerptime( ); -extern int get_closest_player( ); -extern vec2_t screen_transform( vec3_t world ); -extern const char* object_index_to_name( int index ); -extern void disable_pvs( ); - -END_REGION \ No newline at end of file diff --git a/tf2/vector.hpp b/tf2/vector.hpp deleted file mode 100644 index af24136..0000000 --- a/tf2/vector.hpp +++ /dev/null @@ -1,334 +0,0 @@ -#pragma once -#include -#include - - -class vec2_t { -public: - vec2_t( ) { - x = y = 0.0f; - } - - vec2_t( float X, float Y ) { - x = X; y = Y; - } - - vec2_t( float* v ) { - x = v[ 0 ]; y = v[ 1 ]; - } - - vec2_t( const float* v ) { - x = v[ 0 ]; y = v[ 1 ]; - } - - vec2_t( const vec2_t& v ) { - x = v.x; y = v.y; - } - - vec2_t& operator=( const vec2_t& v ) { - x = v.x; y = v.y; return *this; - } - - float& operator[]( int i ) { - return ( ( float* )this )[ i ]; - } - - float operator[]( int i ) const { - return ( ( float* )this )[ i ]; - } - - vec2_t& operator+=( const vec2_t& v ) { - x += v.x; y += v.y; return *this; - } - - vec2_t& operator-=( const vec2_t& v ) { - x -= v.x; y -= v.y; return *this; - } - - vec2_t& operator*=( const vec2_t& v ) { - x *= v.x; y *= v.y; return *this; - } - - vec2_t& operator/=( const vec2_t& v ) { - x /= v.x; y /= v.y; return *this; - } - - vec2_t& operator+=( float v ) { - x += v; y += v; return *this; - } - - vec2_t& operator-=( float v ) { - x -= v; y -= v; return *this; - } - - vec2_t& operator*=( float v ) { - x *= v; y *= v; return *this; - } - - vec2_t& operator/=( float v ) { - x /= v; y /= v; return *this; - } - - vec2_t operator+( const vec2_t& v ) const { - return vec2_t( x + v.x, y + v.y ); - } - - vec2_t operator-( const vec2_t& v ) const { - return vec2_t( x - v.x, y - v.y ); - } - - vec2_t operator*( const vec2_t& v ) const { - return vec2_t( x * v.x, y * v.y ); - } - - vec2_t operator/( const vec2_t& v ) const { - return vec2_t( x / v.x, y / v.y ); - } - - vec2_t operator+( float v ) const { - return vec2_t( x + v, y + v ); - } - - vec2_t operator-( float v ) const { - return vec2_t( x - v, y - v ); - } - - vec2_t operator*( float v ) const { - return vec2_t( x * v, y * v ); - } - - vec2_t operator/( float v ) const { - return vec2_t( x / v, y / v ); - } - - void set( float X = 0.0f, float Y = 0.0f ) { - x = X; y = Y; - } - - float length( void ) const { - return sqrtf( x * x + y * y ); - } - - float lengthsqr( void ) const { - return ( x * x + y * y ); - } - - float dist_to( const vec2_t& v ) const { - return ( *this - v ).length( ); - } - - float dist_to_sqr( const vec2_t& v ) const { - return ( *this - v ).lengthsqr( ); - } - - float dot( const vec2_t& v ) const { - return ( x * v.x + y * v.y ); - } - - bool is_zero( void ) const { - return ( x > -FLT_EPSILON && x < FLT_EPSILON && - y > -FLT_EPSILON && y < FLT_EPSILON ); - } - - operator bool( ) const noexcept { - return !is_zero( ); - } - -public: - float x, y; -}; - -class vec3_t { -public: - vec3_t( ) { - x = y = z = 0.0f; - } - - vec3_t( float X, float Y, float Z ) { - x = X; y = Y; z = Z; - } - - vec3_t( float* v ) { - x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; - } - - vec3_t( const float* v ) { - x = v[ 0 ]; y = v[ 1 ]; z = v[ 2 ]; - } - - vec3_t( const vec3_t& v ) { - x = v.x; y = v.y; z = v.z; - } - - vec3_t( const vec2_t& v ) { - x = v.x; y = v.y; z = 0.0f; - } - - __forceinline vec3_t& operator=( const vec3_t& v ) { - x = v.x; y = v.y; z = v.z; return *this; - } - - __forceinline vec3_t& operator=( const vec2_t& v ) { - x = v.x; y = v.y; z = 0.0f; return *this; - } - - float& operator[]( int i ) { - return ( ( float* )this )[ i ]; - } - - __forceinline float operator[]( int i ) const { - return ( ( float* )this )[ i ]; - } - - vec3_t& operator+=( const vec3_t& v ) { - x += v.x; y += v.y; z += v.z; return *this; - } - - vec3_t& operator-=( const vec3_t& v ) { - x -= v.x; y -= v.y; z -= v.z; return *this; - } - - vec3_t& operator*=( const vec3_t& v ) { - x *= v.x; y *= v.y; z *= v.z; return *this; - } - - vec3_t& operator/=( const vec3_t& v ) { - x /= v.x; y /= v.y; z /= v.z; return *this; - } - - vec3_t& operator+=( float v ) { - x += v; y += v; z += v; return *this; - } - - vec3_t& operator-=( float v ) { - x -= v; y -= v; z -= v; return *this; - } - - vec3_t& operator*=( float v ) { - x *= v; y *= v; z *= v; return *this; - } - - vec3_t& operator/=( float v ) { - x /= v; y /= v; z /= v; return *this; - } - - __forceinline vec3_t operator+( const vec3_t& v ) const { - return vec3_t( x + v.x, y + v.y, z + v.z ); - } - - __forceinline vec3_t operator-( const vec3_t& v ) const { - return vec3_t( x - v.x, y - v.y, z - v.z ); - } - - __forceinline vec3_t operator*( const vec3_t& v ) const { - return vec3_t( x * v.x, y * v.y, z * v.z ); - } - - __forceinline vec3_t operator/( const vec3_t& v ) const { - return vec3_t( x / v.x, y / v.y, z / v.z ); - } - - __forceinline vec3_t operator+( float v ) const { - return vec3_t( x + v, y + v, z + v ); - } - - __forceinline vec3_t operator-( float v ) const { - return vec3_t( x - v, y - v, z - v ); - } - - __forceinline vec3_t operator*( float v ) const { - return vec3_t( x * v, y * v, z * v ); - } - - __forceinline vec3_t operator/( float v ) const { - return vec3_t( x / v, y / v, z / v ); - } - - __forceinline float length( ) const { - return sqrtf( x * x + y * y + z * z ); - } - - __forceinline float lengthsqr( ) const { - return ( x * x + y * y + z * z ); - } - - __forceinline float length2d( ) const { - return sqrtf( x * x + y * y ); - } - - __forceinline float length2dsqr( ) const { - return ( x * x + y * y ); - } - - __forceinline float dist_to( const vec3_t& v ) const { - return ( *this - v ).length( ); - } - - __forceinline float dist_to_sqr( const vec3_t& v ) const { - return ( *this - v ).lengthsqr( ); - } - - __forceinline float dot( const vec3_t& v ) const { - return ( x * v.x + y * v.y + z * v.z ); - } - - __forceinline float fov_to( vec3_t to ) { - const float from_length = length( ); - const float to_length = to.length( ); - - if( from_length && to_length ) { - return acos( dot( to ) / from_length * to_length ); - } - - return 0.f; - } - - vec3_t cross( const vec3_t& v ) const { - return vec3_t( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); - } - - bool is_zero( ) const { - return ( x > -FLT_EPSILON && x < FLT_EPSILON && - y > -FLT_EPSILON && y < FLT_EPSILON && - z > -FLT_EPSILON && z < FLT_EPSILON ); - } - - operator bool( ) const { - return !is_zero( ); - } - - inline void normalize_vector( ) { - vec3_t& v = *this; - - float iradius = 1.f / ( this->length( ) + FLT_EPSILON ); //FLT_EPSILON - - v.x *= iradius; - v.y *= iradius; - v.z *= iradius; - } - - vec3_t abs( ) const { - return vec3_t{ std::abs( x ), std::abs( y ), std::abs( z ) }; - } - - vec3_t clamp( ) { - for( size_t axis{ }; axis < 2; axis++ ) { - auto &cur_axis = operator[]( axis ); - if( !std::isfinite( cur_axis ) ) { - cur_axis = 0.f; - } - } - - x = std::clamp( x, -89.f, 89.f ); - y = std::clamp( std::remainder( y, 360.f ), -180.f, 180.f ); - z = 0.f; - return *this; - } - -public: - float x, y, z; -}; - -__forceinline vec3_t operator*( float f, const vec3_t& v ) { - return v * f; -} diff --git a/tf2/visuals.hpp b/tf2/visuals.hpp deleted file mode 100644 index 2f8e9f3..0000000 --- a/tf2/visuals.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once -#include -#include "vector.hpp" -#include "color.hpp" -#include -#include "strings.hpp" -#include "IVRenderView.h" -class c_base_player; - -namespace features -{ - class c_visuals { - private: - static const clr_t esp_green( uint8_t alpha = 255 ) { - return clr_t( 1, 216, 62, alpha ); - } - static const clr_t esp_red( uint8_t alpha = 255 ) { - return clr_t( 240, 0, 0, alpha ); - } - static const clr_t esp_blue( uint8_t alpha = 255 ) { - return clr_t( 84, 173, 247, alpha ); - } - - void draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ); - void draw_line( int x, int y, int x1, int y1, const clr_t& clr ); - void draw_rect( int x, int y, int w, int h, const clr_t& clr ); - void draw_filled_rect( int x, int y, int w, int h, const clr_t& clr ); - void draw_circle( int x, int y, int r, const clr_t& clr, int res = 48 ); - - void draw_really_big_string( int x, int y, const clr_t& clr, const char* msg, ... ); - void draw_string( int x, int y, int align, bool big, const clr_t& clr, const char* msg, ... ); - - - void draw_local( ); - void draw_players( ); - void draw_world( ); - - void draw_hits( ); - void spectator_list( ); - //void throwable_prediction( ); - - void invalidate_glow( ); - - vec3_t m_stored_pos[ 65 ]{ }; - float m_anim_progress[ 65 ]{ }; - float m_last_hit{ }; - int m_ent_dmg[ 65 ]{ }; - public: - void update_glow( ); - void world_modulate( ); - void update_position( int index, const vec3_t& pos ); - void out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ); - void store_hit( ); - void operator()( ); - }; -} \ No newline at end of file diff --git a/tf2/visuals_draw.cpp b/tf2/visuals_draw.cpp deleted file mode 100644 index 87c476b..0000000 --- a/tf2/visuals_draw.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "d3d.hpp" -#include "interfaces.h" -#include "renderer.hpp" -#include "visuals.hpp" -#include "settings.h" - -namespace features -{ - void c_visuals::draw_line( const vec2_t& a, const vec2_t& b, const clr_t& clr ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_line( clr, a.x, a.y, b.x, b.y ); - else - g_renderer.draw_line( a, b, clr ); - } - - void c_visuals::draw_line( int x, int y, int x1, int y1, const clr_t& clr ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_line( clr, x, y, x1, y1 ); - else - g_renderer.draw_line( x, y, x1, y1, clr ); - } - - void c_visuals::draw_rect( int x, int y, int w, int h, const clr_t& clr ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_rect( clr, x, y, w, h ); - else - g_renderer.draw_box( x, y, w, h, clr ); - } - - void c_visuals::draw_filled_rect( int x, int y, int w, int h, const clr_t& col ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_filled_rect( col, x, y, w, h ); - else - g_renderer.draw_rect( x, y, w, h, col ); - } - - void c_visuals::draw_circle( int x, int y, int r, const clr_t& col, int res ) { - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_circle( col, x, y, r, res ); - else - g_renderer.draw_circle( x, y, r, col, res ); - } - - void c_visuals::draw_string( int x, int y, int align, bool big, const clr_t& col, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - switch( align ) { - case ALIGN_CENTER: - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_CENTER >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); - else - g_renderer.draw_string< ALIGN_CENTER >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); - - break; - case ALIGN_LEFT: - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_LEFT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); - else - g_renderer.draw_string< ALIGN_LEFT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); - - break; - case ALIGN_RIGHT: - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_RIGHT >( big ? ::d3d::fonts.f_12 : ::d3d::fonts.f_esp_small, col, x, y, big ? D3DFONTFLAG_DROPSHADOW : D3DFONTFLAG_OUTLINE, buffer ); - else - g_renderer.draw_string< ALIGN_RIGHT >( big ? g_fonts.f_12 : g_fonts.f_esp_small, x, y, col, buffer ); - - break; - } - } - - void c_visuals::draw_really_big_string( int x, int y, const clr_t& col, const char* msg, ... ) { - char* buffer = ( char* )_alloca( 1024 ); - va_list list{ }; - - memset( buffer, 0, 1024 ); - - __crt_va_start( list, msg ); - vsprintf_s( buffer, 1024, msg, list ); - __crt_va_end( list ); - - if( g_settings.misc.hide_from_obs ) - g_d3d.draw_text< ALIGN_LEFT >( ::d3d::fonts.f_18, col, x, y, D3DFONTFLAG_OUTLINE, buffer ); - else - g_renderer.draw_string< ALIGN_LEFT >( g_fonts.f_bold, x, y, col, msg ); - } -} \ No newline at end of file diff --git a/tf2/visuals_local.cpp b/tf2/visuals_local.cpp deleted file mode 100644 index 7f549d9..0000000 --- a/tf2/visuals_local.cpp +++ /dev/null @@ -1,207 +0,0 @@ -#include - -#include "visuals.hpp" -#include "ctx.hpp" -#include "base_cheat.h" -#include "renderer.hpp" -#include "input_system.hpp" -#include "math.h" -#include "settings.h" -#include "interfaces.h" -namespace features -{ - void c_visuals::draw_local( ) { - int screen_w, screen_h; - cl.m_engine( )->GetScreenSize( screen_w, screen_h ); - - int cur_pos{ }; - - - if( g_settings.misc.no_scope( ) && - g_ctx.m_local->m_bIsScoped( ) ) { - int w, h; - cl.m_engine( )->GetScreenSize( w, h ); - - draw_line( 0, h / 2, w, h / 2, clr_t( 0, 0, 0 ) ); - draw_line( w / 2, 0, w / 2, h, clr_t( 0, 0, 0 ) ); - } - spectator_list( ); - //throwable_prediction( ); -- sometime when i can be fucked - } - - void c_visuals::spectator_list( ) { - if( !g_settings.visuals.spec_list ) - return; - - std::vector< std::string > spec_list; - - for( size_t i{ }; i < 65; ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - if( ent && ent->is_player( ) && !ent->ce( )->is_dormant( ) ) { - auto spec_handle = ent->m_hObserverTarget( ); - auto spec_ent = cl.m_entlist( )->get_entity_from_handle< c_base_player >( spec_handle ); - - if( spec_ent == g_ctx.m_local ) { - char player_name[ 32 ]; - ent->get_name_safe( player_name ); - spec_list.push_back( player_name ); - } - } - } - - int screen_w, screen_h; - cl.m_engine( )->GetScreenSize( screen_w, screen_h ); - - int cur_pos{ }; - - if( g_settings.misc.watermark ) { - cur_pos = 20; - } - - for( auto& it : spec_list ) { - draw_string( screen_w - 3, cur_pos, ALIGN_RIGHT, true, clr_t( 255, 255, 255 ), it.c_str( ) ); - cur_pos += 10; - } - } - //i wanna do this - /* - void c_visuals::throwable_prediction( ) { - static auto sv_gravity = cl.m_cvar( )->FindVar( xors( "sv_gravity" ) ); - - if( !g_settings.visuals.grenade_prediction ) - return; - - - /* - auto get_detonate_time = [ ]( int defindex ) { - switch( defindex ) { - case WEAPON_FLASHBANG: - case WEAPON_HEGRENADE: - return 1.5f; - case WEAPON_INCGRENADE: - case WEAPON_MOLOTOV: - return molotov_detonate_time->get_float( ); - case WEAPON_DECOY: - return 5.f; - default: return 3.f; - } - }; - - auto draw_3d_line = [ this ]( const vec3_t& start, const vec3_t& end, clr_t col, bool circle = false ) { - vec2_t start_w2s = util::screen_transform( start ); - vec2_t end_w2s = util::screen_transform( end ); - - draw_line( start_w2s, end_w2s, col ); - if( circle ) - draw_rect( end_w2s.x - 1, end_w2s.y - 1, 2, 2, clr_t( 230, 230, 230 ) ); - }; - - auto clip_velocity = [ ]( const vec3_t& in, const vec3_t& normal, vec3_t& out, float overbounce ) { - int blocked = 0; - float angle = normal[ 2 ]; - - if( angle > 0.f ) - blocked |= 1; - - if( !angle ) - blocked |= 2; - - float backoff = in.dot( normal ) * overbounce; - - for( int i{ }; i < 3; ++i ) { - out[ i ] = in[ i ] - ( normal[ i ] * backoff ); - - if( out[ i ] > -0.1f && out[ i ] < 0.1f ) { - out[ i ] = 0.f; - } - } - - return blocked; - }; - - auto weapon = g_ctx.m_local->get_active_weapon( ); - if( !weapon ) return; - - int def_index = weapon->m_iItemDefinitionIndex( ); - if( weapon->has_trajectory( ) ) - return; - - auto wpn_info = weapon->get_wpn_info( ); - - vec3_t throw_ang, forward; - cl.m_engine( )->GetViewAngles( throw_ang ); - throw_ang.x -= ( 90.f - abs( throw_ang.x ) ) * 0.11111111f; - throw_ang.x = std::remainderf( throw_ang.x, 360.f ); - - forward = math::angle_vectors( throw_ang ); - - float throw_strength = weapon->m_flThrowStrength( ); - float throw_velocity = std::min( std::max( wpn_info->throw_velocity * 0.9f, 15.f ), 750.f ); - - float throw_height = ( throw_strength * 12.f ) - 12.f; - float v68 = throw_velocity * ( ( 0.7f * throw_strength ) + 0.3f ); - - vec3_t start_pos = g_ctx.m_local->get_eye_pos( ) + vec3_t( 0, 0, throw_height ); - vec3_t end_pos = start_pos + ( forward * 22.f ); - - CTraceFilter filter; - filter.pSkip = g_ctx.m_local; - - CGameTrace trace; - Ray_t ray; - ray.Init( start_pos, end_pos, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - - cl.m_trace( )->trace_ray( ray, CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_MOVEABLE | CONTENTS_CURRENT_90, &filter, &trace ); - end_pos = trace.endpos - forward * 6.f; - vec3_t throw_pos = g_ctx.m_local->m_vecVelocity( ) * 1.25f + forward * v68; - - //draw_3d_line( start_pos, end_pos, clr_t( 255, 255, 255 ) ); - float gravity = sv_gravity->get_float( ) * 0.4f; - - player_info_t info{ }; - - for( int ticks = TIME_TO_TICKS( get_detonate_time( def_index ) ); ticks >= 0; --ticks ) { - auto throw_dir = vec3_t( throw_pos.x, throw_pos.y, ( throw_pos.z + ( throw_pos.z - ( gravity * TICK_INTERVAL( ) ) ) ) * 0.5f ); - auto temp = throw_dir * TICK_INTERVAL( ); - throw_pos.z -= gravity * TICK_INTERVAL( ); - - vec3_t src = end_pos, end = end_pos + temp; - Ray_t ray; - ray.Init( src, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - - cl.m_trace( )->trace_ray( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); - if( trace.allsolid ) - throw_pos = vec3_t( ); - - end_pos = trace.endpos; - draw_3d_line( src, end_pos, clr_t( 66, 143, 244 ) ); - - if( trace.fraction != 1.f ) { - float surf_elasticity = 1.f; - vec3_t throw_pos2{ }; - clip_velocity( throw_pos, trace.plane.normal, throw_pos2, 2.f ); - - if( trace.m_pEnt && cl.m_engine( )->GetPlayerInfo( trace.m_pEnt->index( ), &info ) ) { - surf_elasticity = 0.3f; - } - - throw_pos2 *= std::clamp( surf_elasticity * 0.45f, 0.f, 0.9f ); - end = end_pos + throw_pos2 * ( ( 1.f - trace.fraction ) * TICK_INTERVAL( ) ); - - if( def_index == WEAPON_MOLOTOV || def_index == WEAPON_INCGRENADE ) { - if( trace.plane.normal.z >= cos( DEG2RAD( molotov_detonate_slope->get_float( ) ) ) ) { - return; - } - } - - ray.Init( end_pos, end, vec3_t( -2.f, -2.f, -2.f ), vec3_t( 2.f, 2.f, 2.f ) ); - cl.m_trace( )->trace_ray( ray, CONTENTS_SOLID | CONTENTS_MOVEABLE | CONTENTS_MONSTER | CONTENTS_CURRENT_90, &filter, &trace ); - - draw_3d_line( end_pos, end, clr_t( 66, 143, 244 ), true ); - end_pos = trace.endpos; - throw_pos = throw_pos2; - } - } - }*/ - -} \ No newline at end of file diff --git a/tf2/visuals_objects.cpp b/tf2/visuals_objects.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/tf2/visuals_players.cpp b/tf2/visuals_players.cpp deleted file mode 100644 index 8b9aaf9..0000000 --- a/tf2/visuals_players.cpp +++ /dev/null @@ -1,551 +0,0 @@ -#include - -#include "visuals.hpp" -#include "ctx.hpp" -#include "base_cheat.h" -#include "renderer.hpp" -#include "input_system.hpp" -#include "math.h" -#include "settings.h" -#include "interfaces.h" -//2k lines of code here -int screen_w, screen_h; - -namespace features -{ - void c_visuals::update_position( int index, const vec3_t& pos ) { - m_stored_pos[ index ] = pos; - if( m_anim_progress[ index ] <= 0.3f && g_settings.visuals.dormant ) { - m_anim_progress[ index ] = 0.3f; - } - } - - void c_visuals::store_hit( ) { - if( !g_settings.visuals.hitmarkers ) - return; - - cl.m_surface( )->play_sound( xors( "buttons\\arena_switch_press_02.wav" ) ); - m_last_hit = cl.m_globals->curtime; - } - - - void c_visuals::draw_hits( ) { - if( !g_settings.visuals.hitmarkers || !g_ctx.run_frame( ) ) - return; - - static const clr_t col_start = clr_t( 231, 75, 75, 255 ); - static const clr_t col_end = clr_t( 0xf4, 0x7c, 0xa8, 255 ); - - float delta = ( cl.m_globals->curtime - m_last_hit ) * 1.5f; - if( std::abs( delta ) > 1.0f ) return; - - clr_t blend = clr_t::blend( col_start, col_end, delta ); - if( delta > 0.75f ) { - blend.a( ) = 255 * ( 1.0f - delta ) * 4.f; - } - - auto get_rotated_point = [ ]( vec2_t point, float rotation, float distance ) { - float rad = DEG2RAD( rotation ); - - point.x += sin( rad ) * distance; - point.y += cos( rad ) * distance; - - return point; - }; - - - for( size_t i{ }; i < 2; ++i ) { - float rotation = 135.f + i * 90.f; - - vec2_t center = { screen_w * 0.5f, screen_h * 0.5f }; - vec2_t start = get_rotated_point( center, rotation, 8.f ); - vec2_t end = get_rotated_point( center, rotation, 17.f ); - - vec2_t rot_start = get_rotated_point( center, rotation - 180.f, 8.f ); - vec2_t rot_end = get_rotated_point( center, rotation - 180.f, 17.f ); - - draw_line( start, end, blend ); - draw_line( rot_start, rot_end, blend ); - } - } - - struct box_t { - int x, y, w, h; - }; - - box_t get_box( c_base_player* ent ) { - const matrix3x4& matrix = ent->m_CollisionGroup( ); - - vec3_t min = ent->m_vecMins( ); - vec3_t max = ent->m_vecMaxs( ); - - std::array< vec3_t, 8 > point_list = { - vec3_t{ min.x, min.y, min.z }, - vec3_t{ min.x, max.y, min.z }, - vec3_t{ max.x, max.y, min.z }, - vec3_t{ max.x, min.y, min.z }, - vec3_t{ max.x, max.y, max.z }, - vec3_t{ min.x, max.y, max.z }, - vec3_t{ min.x, min.y, max.z }, - vec3_t{ max.x, min.y, max.z } - }; - - std::array< float, 8 > x_points; - std::array< float, 8 > y_points; - - vec2_t origin = util::screen_transform( ent->m_vecOrigin( ) ); - - for( auto& it : point_list ) { - vec3_t backup = it; - for( int i{ }; i < 3; ++i ) { - it[ i ] = backup.dot( ( const vec3_t& )( matrix[ i ] ) ) + matrix[ i ][ 3 ]; - } - } - - for( size_t i{ }; i < 8; ++i ) { - vec2_t w2s = util::screen_transform( point_list[ i ] ); - x_points[ i ] = w2s.x; - y_points[ i ] = w2s.y; - } - - std::sort( x_points.begin( ), x_points.end( ) ); - std::sort( y_points.begin( ), y_points.end( ) ); - - int x = ( int )x_points.front( ); - int w = ( int )x_points.back( ) - x; - - int y = ( int )y_points.front( ); - int h = ( int )y_points.back( ) - y; - - return { x - ( int )origin.x, y - ( int )origin.y, w, h }; - } - - void c_visuals::out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ) { - vec2_t screen; - vec2_t circle; - - auto find_point = [ ]( vec2_t& point, float deg_x, float deg_y ) { - float x2 = screen_w / 2.f; - float y2 = screen_h / 2.f; - - float d = sqrt( pow( point.x - x2, 2 ) + pow( point.y - y2, 2 ) ); - float r_x = deg_x / d; - float r_y = deg_y / d; - - point.x = r_x * point.x + ( 1.f - r_x ) * x2; - point.y = r_y * point.y + ( 1.f - r_y ) * y2; - }; - - auto get_screen_point = [ ]( vec2_t& screen, const vec3_t& delta ) { - decltype( auto ) w2s_matrix = cl.m_engine( )->GetWorldToScreenMatrix( ); - float x; - float w; - float y; - - screen.x = w2s_matrix[ 0 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 0 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 0 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 0 ][ 3 ]; - screen.y = w2s_matrix[ 1 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 1 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 1 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 1 ][ 3 ]; - w = w2s_matrix[ 3 ][ 0 ] * delta[ 0 ] + w2s_matrix[ 3 ][ 1 ] * delta[ 1 ] + w2s_matrix[ 3 ][ 2 ] * delta[ 2 ] + w2s_matrix[ 3 ][ 3 ]; - - if( w < 0.001f ) { - float invw = -1.0f / w; - screen.x *= invw; - screen.y *= invw; - } - else { - float invw = 1.0f / w; - screen.x *= invw; - screen.y *= invw; - } - - x = float( screen_w ) / 2.f; - y = float( screen_h ) / 2.f; - x += 0.5f * screen.x * screen_w + 0.5f; - y -= 0.5f * screen.y * screen_h + 0.5f; - screen.x = x; - screen.y = y; - }; - - screen = util::screen_transform( pos );//get_screen_point( screen, pos ); - circle = util::screen_transform( pos );// get_screen_point( circle, pos ); - - float radius = g_settings.visuals.out_of_pov_radius * 0.49f; - - float ratio = g_settings.visuals.out_of_pov_radius; - - float w = screen_w * ratio + screen_h * ( 1.0f - ratio ); - - find_point( screen, w * radius, - float( screen_h ) * radius ); - - auto min = std::min< int >( screen_w, screen_h ) * radius; - find_point( circle, float( min ), float( min ) ); - - auto rot_around_center = [ ]( vec2_t start, float rot ) { - float rad = rot * ( M_PI / 180.f ); - - start.x += sin( rad ) * float( g_settings.visuals.out_of_pov_size ); - start.y += cos( rad ) * float( g_settings.visuals.out_of_pov_size ); - - return start; - }; - - float delta_x = ( float( screen_w / 2 ) - circle.x ); - float delta_y = ( float( screen_h / 2 ) - circle.y ); - - auto hyp = sqrt( delta_x * delta_x + delta_y * delta_y ); - - float cos_ = delta_x / hyp; - - float deg = RAD2DEG( acos( cos_ ) ); - - if( screen.y < screen_h / 2 ) { - deg *= -1.f; - } - - auto rotated_pos_1 = rot_around_center( screen, deg + 115 ); - auto rotated_pos_2 = rot_around_center( screen, deg + 65 ); - - col.a( ) *= 0.8f; - - vertex_t v[ ] = { - { screen }, - { rotated_pos_1 }, - { rotated_pos_2 } - }; - - if( !g_settings.misc.hide_from_obs ) - g_renderer.draw_polygon( 3, v, col ); - else { - draw_line( screen, rotated_pos_1, col ); - draw_line( screen, rotated_pos_2, col ); - draw_line( rotated_pos_1, rotated_pos_2, col ); - } - } - - void c_visuals::update_glow( ) { - if( !g_settings.visuals.active || g_settings.misc.hide_from_obs ) - return; - - static auto glow_object_manager = *pattern::first_code_match< GlowObjectManager_t** >( cl.m_chl.dll( ), xors ( "8B 0D ? ? ? ? A1 ? ? ? ? 56 8B 37" ) ) + 0x2; - if( !glow_object_manager ) return; - - static bool invalidated; - if( !g_settings.visuals.glow ) { - if( !invalidated ) { - invalidate_glow( ); - invalidated = true; - } - return; - } - - invalidated = false; - for( int i{ }; i < 64; ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - if( !ent ) continue; - - - if( !ent->is_valid( ) ) { - continue; - } - - if( ent->is_enemy( ) || g_settings.visuals.friendlies ) { - ent->m_bGlowEnabled( ) = true; - ent->update_glow_effect( ); - } - } - - if( !glow_object_manager->data.Count( ) ) return; //data count crashed yea lazy cool cool? cool - for( int i{ }; i < glow_object_manager->data.Count( ); ++i ) { - auto ent = ( c_base_player* )cl.m_entlist( )->get_entity_from_handle( glow_object_manager->data[ i ].ent_ptr ); - if( ent && ent->is_valid( ) && ( ent->is_enemy( ) || g_settings.visuals.friendlies( ) ) ) { - clr_t clr = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.glow_friendly : g_settings.visuals.glow_enemy; - clr.a( ) = 200; - glow_object_manager->data[ i ].glow_color = clr.to_fclr( ); - } - } - - } - - void c_visuals::invalidate_glow( ) { - for( int i{ }; i < 64; i++ ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - if( !ent ) continue; - if( ent->get_client_class( )->m_class_id == CTFPlayer ) { - ent->m_bGlowEnabled( ) = false; - ent->destroy_glow_effect( ); - } - } - } - - inline clr_t blend_clr( clr_t in, float progress ) { - static const clr_t clr_gray = { 160, 160, 160, 255 }; - int a = in.a( ); - - clr_t ret = clr_t::blend( clr_gray, in, 0.1f + progress * 0.9f ); - ret.a( ) = a; - return ret; - } - - void c_visuals::draw_players( ) { - static constexpr float anim_rate = 1.0f / 0.3f; - static float pov_progress[ 65 ]{ }; - - auto resource = c_base_player::get_player_resource( ); - - for( int i{ }; i < 65; ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< c_base_player >( i ); - - if( !ent || !ent->is_player( ) || !ent->is_alive( ) || ent == g_ctx.m_local ) - continue; - - if( i == ( g_ctx.m_local->m_hObserverTarget( ) & 0xfff ) ) - continue; - - if( ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) && - !g_settings.visuals.friendlies( ) ) - continue; - - float rate = cl.m_globals->frametime * anim_rate; - float& anim = m_anim_progress[ i ]; - float alpha = anim; - bool dormant = ent->ce( )->is_dormant( ); - int health = ent->m_iHealth( ); - auto origin = ent->m_vecOrigin( ); - auto box = get_box( ent ); - int right_pos = 0; - int bottom_pos = 0; - bool too_distant = true; - if( g_ctx.m_local ) - too_distant = ent->m_vecOrigin( ).dist_to( g_ctx.m_local->m_vecOrigin( ) ) > 2500.f; - - if( !dormant ) { - update_position( i, origin ); - anim = 1.0f; - } - else { - if( anim < 0.3f && g_settings.visuals.dormant && !too_distant ) { - rate *= 0.01f; - } - anim = std::clamp( anim -= rate, 0.f, 1.0f ); - if( m_anim_progress[ i ] <= 0.f ) - continue; - } - - clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? - g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; - - if( dormant ) { - col = blend_clr( col, anim ); - col.a( ) *= anim; - } - - auto w2s_cur_origin = util::screen_transform( m_stored_pos[ i ] ); - - box.x += w2s_cur_origin.x; - box.y += w2s_cur_origin.y; - - if( box.x > screen_w || box.x + box.w < 0 || - box.y > screen_h || box.y + box.h < 0 ) { - if( g_settings.visuals.out_of_pov ) { - auto& anim = pov_progress[ i ]; - anim = std::clamp( anim += cl.m_globals->frametime * anim_rate, 0.f, 1.0f ); - if( dormant ) - anim = std::clamp( anim -= cl.m_globals->frametime * anim_rate, 0.f, 1.0f ); - else - anim = std::clamp( anim += cl.m_globals->frametime * anim_rate, 0.f, 1.0f ); - - col.a( ) *= anim; - out_of_fov( ent, origin, col ); - } - continue; - } - - pov_progress[ i ] = 0.f; - - if( g_settings.visuals.skeleton( ) && !dormant ) { - clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.skeleton_friendly : g_settings.visuals.skeleton_enemy; - col.a( ) *= alpha; - - auto hdr = cl.m_modelinfo( )->GetStudioModel( ent->ce( )->get_model( ) ); - if( hdr ) { - matrix3x4 matrix[ 128 ]; - ent->ce( )->setup_bones( matrix, 128, 0x100, 0.f ); - - for( size_t bone{ }; bone < hdr->numbones; ++bone ) { - auto b = hdr->GetBone( bone ); - if( b && b->flags & 0x100 && b->parent != -1 ) { - vec3_t child = vec3_t{ matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] }; - vec3_t parent = vec3_t{ matrix[ b->parent ][ 0 ][ 3 ], matrix[ b->parent ][ 1 ][ 3 ], matrix[ b->parent ][ 2 ][ 3 ] }; - - auto child_screen = util::screen_transform( child ); - auto parent_screen = util::screen_transform( parent ); - - draw_line( child_screen, parent_screen, col ); - } - } - } - } - - if( g_settings.visuals.box( ) ) { - auto alpha_ = col.a( ); - float percent = float( alpha_ ) / 255.f; - draw_rect( box.x + 1, box.y + 1, box.w - 2, box.h - 2, clr_t( 0, 0, 0, 180 * alpha * percent ) ); - draw_rect( box.x, box.y, box.w, box.h, col ); - } - - if( g_settings.visuals.health( ) ) { - auto fill = box.h - 1; - fill *= std::clamp( health, 0, 100 ) * 0.01f; - - auto hp_col = clr_t( - std::min< int >( 510 * ( 100 - health ) / 100, 255 ), - std::min< int >( 510 * health / 100, 255 ), - 0, - 255 * alpha ); - - draw_filled_rect( box.x - 4, box.y, 3, box.h + 1, clr_t( 0, 0, 0, 170 * alpha ) ); - draw_filled_rect( box.x - 3, box.y + box.h - fill, 1, fill, hp_col ); - - if( health != 100 ) - draw_string( box.x - 2, box.y + 1 + box.h - fill - 3, ALIGN_CENTER, false, clr_t( 255, 255, 255, 255 * alpha ), "%d", health ); - } - - if( g_settings.visuals.name( ) ) { - draw_string( box.x + box.w / 2, box.y - 12, ALIGN_CENTER, true, - blend_clr( clr_t( 255, 255, 255, alpha * 255 ), anim ), ent->get_info( ).name ); - } - - if( g_settings.visuals.player_class( ) ) { - int x_pos = box.x + box.w + 2; - int y_pos = box.y - 1 + right_pos; - draw_string( x_pos, y_pos, ALIGN_LEFT, false, - blend_clr( esp_green( 255 * alpha ), anim ), ent->get_class_name( ) ); - - right_pos += 9; - } - - if( g_settings.visuals.weapon( ) ) { - auto weapon = ent->get_active_weapon( ); - if( weapon ) { //magic font - int max = weapon->get_max_clip_1( ); - - if( g_settings.visuals.ammo && max > 1 && g_settings.visuals.weapon == 1 && !g_settings.misc.hide_from_obs ) { - auto progress = float( weapon->m_iClip1( ) ) / max; - float fill = box.w - 2.f; - float percent = fill * progress; - - draw_filled_rect( box.x, box.y + box.h + 3 + bottom_pos, - box.w, 3, clr_t( 0, 0, 0, 180 * alpha ) ); - - draw_filled_rect( box.x + 1, box.y + box.h + 4 + bottom_pos, - percent, 1, blend_clr( clr_t( 66, 143, 244, 255 * alpha ), anim ) ); - - if( progress < 0.25f ) { - draw_string( - box.x + percent, box.y + box.h + 2 + bottom_pos, ALIGN_LEFT, false, - clr_t( 255, 255, 255, 180 * alpha ), "%d", weapon->m_iClip1( ) ); - } - - bottom_pos += 4; - } - - /*if( g_settings.visuals.weapon == 1 && !g_settings.misc.hide_from_obs ) { - g_renderer.draw_string< ALIGN_CENTER >( 0xa1, box.x + box.w / 2, box.y + box.h + bottom_pos + 3, - clr_t( 255, 255, 255, alpha * 255 ), "%c", weapon->get_hud_icon( ) ); - }*/ - else { - char wep_str[ 64 ]; - if( g_settings.visuals.ammo( ) && weapon->m_iClip1( ) > -1 ) - sprintf_s< 64 >( wep_str, "%s [%d]", weapon->get_print_name( ), weapon->m_iClip1( ) ); - else - sprintf_s< 64 >( wep_str, "%s", weapon->get_print_name( ) ); - - draw_string( box.x + box.w / 2, box.y + box.h + 3 + bottom_pos, ALIGN_CENTER, false, - clr_t( 255, 255, 255, alpha * 255 ), wep_str ); - } - } - } - - if( g_settings.visuals.conditions( ) ) { - int x_pos = box.x + box.w + 3; - int y_pos = box.y - 1; - - switch( ent->m_nPlayerCond( ) ) { - case TFCond_Slowed: - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "slow" ) ); - right_pos += 9; - break; - case TFCond_Zoomed: //dont work too lazy - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "scoped" ) ); - right_pos += 9; - break; - case TFCond_Bonked: - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "bonk" ) ); - right_pos += 9; - break; - case TFCond_Disguised: - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "disg" ) ); - right_pos += 9; - break; - case TFCond_Cloaked: - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "cloak" ) ); - right_pos += 9; - break; - case TFCond_Ubercharged: - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "uber" ) ); - right_pos += 9; - break; - case TFCond_UberchargeFading: - draw_string( x_pos, y_pos + right_pos, ALIGN_LEFT, false, clr_t( 255, 255, 255, 255 * alpha ), xors( "uber" ) ); - right_pos += 9; - break; - } - - } - - } - } - - void c_visuals::operator()( ) { - cl.m_engine( )->GetScreenSize( screen_w, screen_h ); - if( g_ctx.run_frame( ) ) { - draw_local( ); - } - - if( !g_ctx.m_local ) - return; - - switch( g_settings.visuals.activation_type( ) ) { - case 0: - g_settings.visuals.active = false; - break; - case 1: - g_settings.visuals.active = true; - break; - case 2: - g_settings.visuals.active = g_input.is_key_pressed( g_settings.visuals.key ); - break; - case 3: { - static bool held = false; - bool pressed = g_input.is_key_pressed( g_settings.visuals.key ); - if( pressed ) { - if( !held ) - g_settings.visuals.active ^= 1; - held = true; - } - else held = false; - } - break; - default: - g_settings.visuals.active = false; - break; - } - - if( g_settings.visuals.active ) { - draw_players( ); - } - - draw_world( ); - draw_hits( ); - } -} \ No newline at end of file diff --git a/tf2/visuals_world.cpp b/tf2/visuals_world.cpp deleted file mode 100644 index b727798..0000000 --- a/tf2/visuals_world.cpp +++ /dev/null @@ -1,344 +0,0 @@ -#include -#include -#include "ctx.hpp" -#include "visuals.hpp" -#include "interfaces.h" -#include "renderer.hpp" -#include "base_cheat.h" -#include "settings.h" -namespace features -{ - void fix_static_props( ) { - static auto cvar = cl.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) ); - static bool fixed{ }; - if( !fixed ) { - cvar->m_flags |= 0; - cvar->set_value( 1 ); - - fixed = true; - } - } - - - void c_visuals::draw_world( ) { - if( !g_settings.visuals.active ) - return; - - static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) ); - - - for( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) { - auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i ); - if( !ent ) continue; - - auto client_class = ent->get_client_class( ); - if( !client_class ) continue; - - int class_id = client_class->m_class_id; - std::string name = ""; - - auto is_object = [ &name ]( int class_id ) -> bool { - switch( class_id ) { - case CObjectSentrygun: - name = xors( "sentry" ); - return true; - case CObjectDispenser: - name = xors( "dispenser" ); - return true; - case CObjectTeleporter: - name = xors( "teleporter" ); - return true; - default: - return false; - } - - return false; - }; - - auto is_projectile = [ &name ]( int class_id ) -> bool { - switch( class_id ) { - case CTFProjectile_Arrow: - name = xors( "arrow" ); - return true; - case CTFProjectile_Cleaver: - name = xors( "cleaver" ); - return true; - case CTFProjectile_EnergyBall: - name = xors( "energy ball" ); - return true; - case CTFProjectile_EnergyRing: - name = xors( "energy ring" ); - return true; - case CTFProjectile_Flare: - name = xors( "flare" ); - return true; - case CTFProjectile_HealingBolt: - name = xors( "healing bolt" ); - return true; - case CTFProjectile_Jar: - name = xors( "jar" ); - return true; - case CTFProjectile_JarMilk: - name = xors( "jar milk" ); - return true; - case CTFGrenadePipebombProjectile: - name = xors( "pipe bomb" ); - return true; - case CTFProjectile_Rocket: - name = xors( "rocket" ); - return true; - case CTFProjectile_Throwable: - name = xors( "throwable" ); - return true; - case CTFProjectile_ThrowableBreadMonster: - name = xors( "bread monster" ); - return true; - case CTFProjectile_ThrowableBrick: - name = xors( "brick" ); - return true; - case CTFProjectile_ThrowableRepel: - name = xors( "repel" ); - return true; - case CTFProjectile_SentryRocket: - name = xors( "rocket" ); - return true; - default: - return false; - } - return false; - }; - - //objects - if( is_object( class_id ) ) { - - //wont work - if( ( g_settings.visuals.building_esp == 2 || g_settings.visuals.building_esp == 3 ) && !g_settings.misc.hide_from_obs ) { - //*( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - - if( g_settings.visuals.building_esp == 1 || g_settings.visuals.building_esp == 3 ) { - auto pos = ent->get_abs_origin( ); - auto w2s = util::screen_transform( pos ); - //currently they are not cute - //auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); - draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, - g_settings.visuals.building_esp_clr, name.c_str( ) ); - - //later - - //if( g_settings.visuals.building_owner( ) ) - // draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.building_esp_clr, cutie->get_info( ).name ); - } - } - - - - - //projectiles - if( is_projectile( class_id ) ) { - //wont work - if( ( g_settings.visuals.projectile_esp == 2 || g_settings.visuals.projectile_esp == 3 ) && !g_settings.misc.hide_from_obs ) { - //*( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - - if( g_settings.visuals.projectile_esp == 1 || g_settings.visuals.projectile_esp == 3 ) { - auto pos = ent->get_abs_origin( ); - auto w2s = util::screen_transform( pos ); - //again not cute - //auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); - draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, - g_settings.visuals.projectile_esp_clr, name.c_str( ) ); - - //later when i can be fucked - - //if( g_settings.visuals.building_owner( ) ) - // draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.projectile_esp_clr, cutie->get_info( ).name ); - } - } - - - - - - /*if( class_id == CObjectTeleporter || class_id == CObjectDispenser || class_id == CObjectSentrygun ) { - auto owner = ( int )ent->as< c_base_weapon >( )->m_hBuilder( ) & 0xfff; - if( owner <= 0 || owner > 64 ) { - auto origin = ent->get_render_origin( ); - if( origin ) { - bool draw = g_settings.visuals.grenade_esp( ) == 1; - bool glow = g_settings.visuals.grenade_esp( ) == 2; - - if( draw || g_settings.visuals.grenade_esp == 3 ) { - if( !glow && !g_settings.misc.hide_from_obs ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false; - } - - auto w2s = util::screen_transform( origin ); - auto name = util::object_index_to_name( class_id ); - - draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, - g_settings.visuals.grenade_esp_clr( ), name ); - } - if( ( glow || g_settings.visuals.grenade_esp == 3 ) && !g_settings.misc.hide_from_obs ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - } - } - }*/ - /*else { - if( g_settings.visuals.weapon_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) { - auto model = ent->get_model( ); - if( !model ) continue; - - std::string name = xors( "Rocket" ); - - auto hdr = cl.m_modelinfo( )->GetStudioModel( model ); - if( !hdr ) - continue; - - if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) ) - continue; - - - - - if( strstr( hdr->name, xors( "JarGas" ) ) ) { - name = xors( "jargas" ); - } - else if( strstr( hdr->name, xors( "Cleaver" ) ) ) { - name = xors( "Cleaver" ); - } - else if( strstr( hdr->name, xors( "JarMilk" ) ) ) { - name = xors( "Milk" ); - } - else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) { - name = xors( "molotov" ); - } - - if( ( g_settings.visuals.weapon_esp == 2 || g_settings.visuals.weapon_esp == 3 ) && !g_settings.misc.hide_from_obs ) { - *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true; - } - - if( g_settings.visuals.weapon_esp == 1 || g_settings.visuals.weapon_esp == 3 ) { - auto pos = ent->get_render_origin( ); - auto w2s = util::screen_transform( pos ); - auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) ); - draw_string( w2s.x, w2s.y, ALIGN_CENTER, false, - g_settings.visuals.grenade_esp_clr, name.c_str( ) ); - - if( g_settings.visuals.grenade_owner( ) ) - draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.grenade_esp_clr, cutie->get_info( ).name ); - } - } - } - }*/ - - } -} - - - void c_visuals::world_modulate( ) { - static std::unordered_map< MaterialHandle_t, fclr_t > world_materials; - static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2; - static c_base_player* local_player = nullptr; - static auto night_mode = false; - static bool modulated = false; - static bool alpha = false; - - if( !g_settings.visuals.world_modulate || !cl.m_engine( )->IsInGame( ) || g_settings.misc.hide_from_obs ) { - modulated = false; - if( !world_materials2.empty( ) ) { - for( auto& it : world_materials2 ) { - auto mat = cl.m_mat_system( )->GetMaterial( it.first ); - if( !mat ) continue; - - auto original_col = it.second; - mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) ); - mat->AlphaModulate( original_col.a( ) ); - } - - world_materials.clear( ); - world_materials2.clear( ); - } - - return; - } - - if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) { - fix_static_props( ); - - if( local_player == g_ctx.m_local && - night_mode == g_settings.visuals.night_mode( ) && - alpha == g_settings.visuals.transparent_props( ) && - modulated == g_settings.visuals.world_modulate( ) ) - return; - - - for( auto i = cl.m_mat_system( )->FirstMaterial( ); - i != cl.m_mat_system( )->InvalidMaterial( ); - i = cl.m_mat_system( )->NextMaterial( i ) ) { - - auto mat = cl.m_mat_system( )->GetMaterial( i ); - if( !mat ) continue; - - const char* group = mat->GetTextureGroupName( ); - bool is_world = strstr( group, xors( "World" ) ); - bool is_sky = strstr( group, xors( "Sky" ) ); - bool is_prop = strstr( group, xors( "StaticProp" ) ); - - if( is_world || is_sky || is_prop ) { - const char* name = mat->GetName( ); - if( world_materials.find( i ) == world_materials.end( ) ) { - fclr_t clr; - - mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) ); - clr.a( ) = mat->GetAlphaModulation( ); - - world_materials.emplace( i, clr ); - world_materials2.emplace( i, clr ); - } - - fclr_t new_color; - - new_color = world_materials2.find( i )->second; - bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate; - - if( is_world ) { - if( apply ) { - new_color.r( ) *= 0.15f; - new_color.g( ) *= 0.15f; - new_color.b( ) *= 0.15f; - } - } - else if( is_prop ) { - if( apply ) { - new_color.r( ) *= 0.3f; - new_color.g( ) *= 0.3f; - new_color.b( ) *= 0.3f; - } - if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) { - new_color.a( ) *= 0.6f; - } - } - else if( is_sky ) { - if( apply ) { - new_color = fclr_t( 0.f, 0.f, 0.f ); - } - } - - if( !( world_materials.at( i ) == new_color ) ) { - mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) ); - mat->AlphaModulate( new_color.a( ) ); - - world_materials.at( i ) = new_color; - } - } - } - - modulated = g_settings.visuals.world_modulate; - night_mode = g_settings.visuals.night_mode; - alpha = g_settings.visuals.transparent_props; - local_player = g_ctx.m_local; - } - } -} \ No newline at end of file diff --git a/tf2/vmt.h b/tf2/vmt.h deleted file mode 100644 index f2a39ac..0000000 --- a/tf2/vmt.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once -#include -#include "util.hpp" - -// todo - dex; rewrite this, VirtualQuery (except for custom codeptr / readptr) and VirtualProtect shouldnt be used -// and we need to copy rtti over too or stuff will break later on - -// correct me if im wrong, but the vtable isnt replaced, instead the original is edited during hooking, rtti should be intact and accessable by game -// class could definetly do with a rewrite tho! - -// ^ you're corrct, but changing page rights and replacing ptrs direclty in rdata (or usually the heap, since thats where vmts go) is not a safe solution -// copying table + aligning it to compensate for rtti is safer -// vac loves scanning memory regions but it doesnt really do much outside of game servers (only loads some shit for checking DEP and stuff) - -// trash - -//llama is a fucking nigger -//true - -namespace hooks -{ - class c_vmt { - uintptr_t* m_table; - uintptr_t* m_original; - std::vector< uintptr_t > m_new; - public: - int count( ) { - int vfunc_count{ }; - - while( m_original[ vfunc_count ] ) { - vfunc_count++; - }; - - return vfunc_count; - } - - c_vmt( void* table ) { - if( !table ) { - return; - } - - this->m_table = reinterpret_cast< uintptr_t* >( table ); - this->m_original = *reinterpret_cast< uintptr_t** >( this->m_table ); - - for( int i = -1; i < this->count( ); ++i ) { - this->m_new.push_back( this->m_original[ i ] ); - } - - auto data = this->m_new.data( ); - *this->m_table = uintptr_t( &data[ 1 ] ); - } - - ~c_vmt( ) { } - - template< typename T = uintptr_t > T get_function( int index ) { - return( ( T )( this->m_new.at( index + 1 ) ) ); - } - - template< typename T = uintptr_t > T get_old_function( int index ) { - return( ( T )( this->m_original[ index ] ) ); - } - - void hook( int index, uintptr_t new_func ) { - this->m_new.at( index + 1 ) = new_func; - } - - void unhook( int index ) { - this->m_new.at( index + 1 ) = this->m_original[ index ]; - } - - void hook( int index, void* new_func ) { - hook( index, reinterpret_cast< uintptr_t >( new_func ) ); - } - - void restore( ) const { - *this->m_table = uintptr_t( m_original ); - } - }; -} \ No newline at end of file diff --git a/tf2/window_procedure.cpp b/tf2/window_procedure.cpp deleted file mode 100644 index b67f9bb..0000000 --- a/tf2/window_procedure.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "hooks.h" -#include "input_system.hpp" -#include "settings.h" - -//im pretty sure half this shit is redundant rn but idrc - - -decltype( &hooks::window_procedure ) hooks::window_procedure_o; -long __stdcall hooks::window_procedure( HWND hwnd, uint32_t msg, uint32_t wparam, long lparam ) { - if( cl.m_panic ) { - return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); - } - - if( msg == WM_ACTIVATE && wparam == WA_INACTIVE ) { - g_input.clear_keys( ); - } - - if( msg == WM_MOUSEMOVE ) { - g_input.capture_mouse_move( lparam ); - g_con->get_input( )->capture_mouse_move( lparam ); - } - static auto con_pressed = false; - if( g_con->get_input( )->is_key_pressed( KEYS_HOME ) ) { - if( !con_pressed ) { - if( !g_con->m_open ) { - g_con->m_consuming_input = true; - } - - g_con->m_open ^= 1; - } - con_pressed = true; - } - else con_pressed = false; - - if( g_con->get_input( )->register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) ) { - if( g_con->m_open ) return false; - } - - if( !g_con->m_open ) { - static bool was_pressed = false; - if( g_input.is_key_pressed( KEYS_INSERT ) ) { - if( !was_pressed ) { - g_settings.menu.open ^= 1; - - was_pressed = true; - } - } - else { - was_pressed = false; - } - - if( g_input.register_key_press( VirtualKeyEvents_t( msg ), VirtualKeys_t( wparam ) ) - && g_settings.menu.open ) { - return false; - } - } - - return CallWindowProcA( ( WNDPROC )window_procedure_o, hwnd, msg, wparam, lparam ); -} \ No newline at end of file diff --git a/tf2/x86.hpp b/tf2/x86.hpp deleted file mode 100644 index e96c469..0000000 --- a/tf2/x86.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include - -namespace x86 -{ - enum class reg : size_t { - eax = 0, - ecx, - edx, - ebx, - esp, - ebp, - esi, - edi, - - /* - x64: - r8, - r9, - r10, - r11, - r12, - r13, - r14, - r15,*/ - }; - - enum instruction : uint8_t { - retn_imm16 = 0xc2, - retn = 0xc3, - fs = 0x64, - //its big nigga season - call = 0xff - }; - - __forceinline static uint32_t encode_mov_imm32( x86::reg dreg ) { - return ( 0xb8 + ( size_t( dreg ) ) ); - } - - __forceinline static uint32_t encode_push_reg( x86::reg dreg ) { - return ( 0x50 | ( ( size_t( dreg ) ) & 7 ) ); - } - - __forceinline static uint32_t encode_pop_reg( x86::reg dreg ) { - return ( 0x58 | ( ( size_t( dreg ) ) & 7 ) ); - } -}; \ No newline at end of file -- cgit v1.2.3